210 lines
7.2 KiB
Solidity
210 lines
7.2 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity >=0.6.2 <0.9.0;
|
|
|
|
import "ds-test/test.sol";
|
|
import "./StdMath.sol";
|
|
|
|
abstract contract StdAssertions is DSTest {
|
|
event log_array(uint256[] val);
|
|
event log_array(int256[] val);
|
|
event log_array(address[] val);
|
|
event log_named_array(string key, uint256[] val);
|
|
event log_named_array(string key, int256[] val);
|
|
event log_named_array(string key, address[] val);
|
|
|
|
function fail(string memory err) internal virtual {
|
|
emit log_named_string("Error", err);
|
|
fail();
|
|
}
|
|
|
|
function assertFalse(bool data) internal virtual {
|
|
assertTrue(!data);
|
|
}
|
|
|
|
function assertFalse(bool data, string memory err) internal virtual {
|
|
assertTrue(!data, err);
|
|
}
|
|
|
|
function assertEq(bool a, bool b) internal virtual {
|
|
if (a != b) {
|
|
emit log("Error: a == b not satisfied [bool]");
|
|
emit log_named_string(" Expected", b ? "true" : "false");
|
|
emit log_named_string(" Actual", a ? "true" : "false");
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertEq(bool a, bool b, string memory err) internal virtual {
|
|
if (a != b) {
|
|
emit log_named_string("Error", err);
|
|
assertEq(a, b);
|
|
}
|
|
}
|
|
|
|
function assertEq(bytes memory a, bytes memory b) internal virtual {
|
|
assertEq0(a, b);
|
|
}
|
|
|
|
function assertEq(bytes memory a, bytes memory b, string memory err) internal virtual {
|
|
assertEq0(a, b, err);
|
|
}
|
|
|
|
function assertEq(uint256[] memory a, uint256[] memory b) internal virtual {
|
|
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
|
|
emit log("Error: a == b not satisfied [uint[]]");
|
|
emit log_named_array(" Expected", b);
|
|
emit log_named_array(" Actual", a);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertEq(int256[] memory a, int256[] memory b) internal virtual {
|
|
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
|
|
emit log("Error: a == b not satisfied [int[]]");
|
|
emit log_named_array(" Expected", b);
|
|
emit log_named_array(" Actual", a);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertEq(address[] memory a, address[] memory b) internal virtual {
|
|
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
|
|
emit log("Error: a == b not satisfied [address[]]");
|
|
emit log_named_array(" Expected", b);
|
|
emit log_named_array(" Actual", a);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertEq(uint256[] memory a, uint256[] memory b, string memory err) internal virtual {
|
|
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
|
|
emit log_named_string("Error", err);
|
|
assertEq(a, b);
|
|
}
|
|
}
|
|
|
|
function assertEq(int256[] memory a, int256[] memory b, string memory err) internal virtual {
|
|
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
|
|
emit log_named_string("Error", err);
|
|
assertEq(a, b);
|
|
}
|
|
}
|
|
|
|
function assertEq(address[] memory a, address[] memory b, string memory err) internal virtual {
|
|
if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) {
|
|
emit log_named_string("Error", err);
|
|
assertEq(a, b);
|
|
}
|
|
}
|
|
|
|
// Legacy helper
|
|
function assertEqUint(uint256 a, uint256 b) internal virtual {
|
|
assertEq(uint256(a), uint256(b));
|
|
}
|
|
|
|
function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta) internal virtual {
|
|
uint256 delta = stdMath.delta(a, b);
|
|
|
|
if (delta > maxDelta) {
|
|
emit log("Error: a ~= b not satisfied [uint]");
|
|
emit log_named_uint(" Expected", b);
|
|
emit log_named_uint(" Actual", a);
|
|
emit log_named_uint(" Max Delta", maxDelta);
|
|
emit log_named_uint(" Delta", delta);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err) internal virtual {
|
|
uint256 delta = stdMath.delta(a, b);
|
|
|
|
if (delta > maxDelta) {
|
|
emit log_named_string("Error", err);
|
|
assertApproxEqAbs(a, b, maxDelta);
|
|
}
|
|
}
|
|
|
|
function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta) internal virtual {
|
|
uint256 delta = stdMath.delta(a, b);
|
|
|
|
if (delta > maxDelta) {
|
|
emit log("Error: a ~= b not satisfied [int]");
|
|
emit log_named_int(" Expected", b);
|
|
emit log_named_int(" Actual", a);
|
|
emit log_named_uint(" Max Delta", maxDelta);
|
|
emit log_named_uint(" Delta", delta);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err) internal virtual {
|
|
uint256 delta = stdMath.delta(a, b);
|
|
|
|
if (delta > maxDelta) {
|
|
emit log_named_string("Error", err);
|
|
assertApproxEqAbs(a, b, maxDelta);
|
|
}
|
|
}
|
|
|
|
function assertApproxEqRel(
|
|
uint256 a,
|
|
uint256 b,
|
|
uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100%
|
|
) internal virtual {
|
|
if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too.
|
|
|
|
uint256 percentDelta = stdMath.percentDelta(a, b);
|
|
|
|
if (percentDelta > maxPercentDelta) {
|
|
emit log("Error: a ~= b not satisfied [uint]");
|
|
emit log_named_uint(" Expected", b);
|
|
emit log_named_uint(" Actual", a);
|
|
emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18);
|
|
emit log_named_decimal_uint(" % Delta", percentDelta, 18);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertApproxEqRel(
|
|
uint256 a,
|
|
uint256 b,
|
|
uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100%
|
|
string memory err
|
|
) internal virtual {
|
|
if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too.
|
|
|
|
uint256 percentDelta = stdMath.percentDelta(a, b);
|
|
|
|
if (percentDelta > maxPercentDelta) {
|
|
emit log_named_string("Error", err);
|
|
assertApproxEqRel(a, b, maxPercentDelta);
|
|
}
|
|
}
|
|
|
|
function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta) internal virtual {
|
|
if (b == 0) return assertEq(a, b); // If the expected is 0, actual must be too.
|
|
|
|
uint256 percentDelta = stdMath.percentDelta(a, b);
|
|
|
|
if (percentDelta > maxPercentDelta) {
|
|
emit log("Error: a ~= b not satisfied [int]");
|
|
emit log_named_int(" Expected", b);
|
|
emit log_named_int(" Actual", a);
|
|
emit log_named_decimal_uint(" Max % Delta", maxPercentDelta, 18);
|
|
emit log_named_decimal_uint(" % Delta", percentDelta, 18);
|
|
fail();
|
|
}
|
|
}
|
|
|
|
function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err) internal virtual {
|
|
if (b == 0) return assertEq(a, b, err); // If the expected is 0, actual must be too.
|
|
|
|
uint256 percentDelta = stdMath.percentDelta(a, b);
|
|
|
|
if (percentDelta > maxPercentDelta) {
|
|
emit log_named_string("Error", err);
|
|
assertApproxEqRel(a, b, maxPercentDelta);
|
|
}
|
|
}
|
|
}
|