Skip to content

Commit 83c6e5b

Browse files
authored
feat: add assertApproxEqAbsDecimal assertions (#191)
* feat: add assertApproxEqAbsDecimal assertions * feat: add assertApproxEqRelDecimal assertions
1 parent 4a650f2 commit 83c6e5b

File tree

2 files changed

+352
-0
lines changed

2 files changed

+352
-0
lines changed

src/StdAssertions.sol

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,31 @@ abstract contract StdAssertions is DSTest {
124124
}
125125
}
126126

127+
function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) internal virtual {
128+
uint256 delta = stdMath.delta(a, b);
129+
130+
if (delta > maxDelta) {
131+
emit log("Error: a ~= b not satisfied [uint]");
132+
emit log_named_decimal_uint(" Expected", b, decimals);
133+
emit log_named_decimal_uint(" Actual", a, decimals);
134+
emit log_named_decimal_uint(" Max Delta", maxDelta, decimals);
135+
emit log_named_decimal_uint(" Delta", delta, decimals);
136+
fail();
137+
}
138+
}
139+
140+
function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, string memory err)
141+
internal
142+
virtual
143+
{
144+
uint256 delta = stdMath.delta(a, b);
145+
146+
if (delta > maxDelta) {
147+
emit log_named_string("Error", err);
148+
assertApproxEqAbsDecimal(a, b, maxDelta, decimals);
149+
}
150+
}
151+
127152
function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta) internal virtual {
128153
uint256 delta = stdMath.delta(a, b);
129154

@@ -146,6 +171,31 @@ abstract contract StdAssertions is DSTest {
146171
}
147172
}
148173

174+
function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals) internal virtual {
175+
uint256 delta = stdMath.delta(a, b);
176+
177+
if (delta > maxDelta) {
178+
emit log("Error: a ~= b not satisfied [int]");
179+
emit log_named_decimal_int(" Expected", b, decimals);
180+
emit log_named_decimal_int(" Actual", a, decimals);
181+
emit log_named_decimal_uint(" Max Delta", maxDelta, decimals);
182+
emit log_named_decimal_uint(" Delta", delta, decimals);
183+
fail();
184+
}
185+
}
186+
187+
function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, string memory err)
188+
internal
189+
virtual
190+
{
191+
uint256 delta = stdMath.delta(a, b);
192+
193+
if (delta > maxDelta) {
194+
emit log_named_string("Error", err);
195+
assertApproxEqAbsDecimal(a, b, maxDelta, decimals);
196+
}
197+
}
198+
149199
function assertApproxEqRel(
150200
uint256 a,
151201
uint256 b,
@@ -181,6 +231,43 @@ abstract contract StdAssertions is DSTest {
181231
}
182232
}
183233

234+
function assertApproxEqRelDecimal(
235+
uint256 a,
236+
uint256 b,
237+
uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
238+
uint256 decimals
239+
) internal virtual {
240+
if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too.
241+
242+
uint256 percentDelta = stdMath.percentDelta(a, b);
243+
244+
if (percentDelta > maxPercentDelta) {
245+
emit log("Error: a ~= b not satisfied [uint]");
246+
emit log_named_decimal_uint(" Expected", b, decimals);
247+
emit log_named_decimal_uint(" Actual", a, decimals);
248+
emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18);
249+
emit log_named_decimal_uint(" % Delta", percentDelta, 18);
250+
fail();
251+
}
252+
}
253+
254+
function assertApproxEqRelDecimal(
255+
uint256 a,
256+
uint256 b,
257+
uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
258+
uint256 decimals,
259+
string memory err
260+
) internal virtual {
261+
if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too.
262+
263+
uint256 percentDelta = stdMath.percentDelta(a, b);
264+
265+
if (percentDelta > maxPercentDelta) {
266+
emit log_named_string("Error", err);
267+
assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals);
268+
}
269+
}
270+
184271
function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta) internal virtual {
185272
if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too.
186273

@@ -206,4 +293,33 @@ abstract contract StdAssertions is DSTest {
206293
assertApproxEqRel(a, b, maxPercentDelta);
207294
}
208295
}
296+
297+
function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals) internal virtual {
298+
if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too.
299+
300+
uint256 percentDelta = stdMath.percentDelta(a, b);
301+
302+
if (percentDelta > maxPercentDelta) {
303+
emit log("Error: a ~= b not satisfied [int]");
304+
emit log_named_decimal_int(" Expected", b, decimals);
305+
emit log_named_decimal_int(" Actual", a, decimals);
306+
emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18);
307+
emit log_named_decimal_uint(" % Delta", percentDelta, 18);
308+
fail();
309+
}
310+
}
311+
312+
function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, string memory err)
313+
internal
314+
virtual
315+
{
316+
if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too.
317+
318+
uint256 percentDelta = stdMath.percentDelta(a, b);
319+
320+
if (percentDelta > maxPercentDelta) {
321+
emit log_named_string("Error", err);
322+
assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals);
323+
}
324+
}
209325
}

0 commit comments

Comments
 (0)