@@ -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