diff --git a/.gas-snapshot b/.gas-snapshot index 461ebb55..518bed2e 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -103,9 +103,10 @@ LibDecimalFloatGtTest:testGtXNotY(int256,int256,int256,int256) (runs: 5101, μ: LibDecimalFloatGtTest:testGtXPositiveYNegative(int256,int256,int256,int256) (runs: 5101, μ: 11846, ~: 11803) LibDecimalFloatGtTest:testGtXPositiveYZero(int256,int256,int256) (runs: 5101, μ: 8970, ~: 8743) LibDecimalFloatGtTest:testGtZero(int256,int256) (runs: 5101, μ: 3437, ~: 3437) -LibDecimalFloatImplementationNormalizeTest:testExamples() (gas: 158985) -LibDecimalFloatImplementationNormalizeTest:testIsNormalizedReference(int256,int256) (runs: 5101, μ: 3516, ~: 3522) -LibDecimalFloatImplementationNormalizeTest:testNormalized(int256,int256) (runs: 5101, μ: 8977, ~: 8940) +LibDecimalFloatImplementationNormalizeTest:testExamples() (gas: 157225) +LibDecimalFloatImplementationNormalizeTest:testIdempotent(int256,int256) (runs: 5101, μ: 9458, ~: 9419) +LibDecimalFloatImplementationNormalizeTest:testIsNormalizedReference(int256,int256) (runs: 5101, μ: 3549, ~: 3555) +LibDecimalFloatImplementationNormalizeTest:testNormalized(int256,int256) (runs: 5101, μ: 8934, ~: 8895) LibDecimalFloatImplementationWithTargetExponentTest:testWithTargetExponentExamples() (gas: 12292) LibDecimalFloatImplementationWithTargetExponentTest:testWithTargetExponentLargerExponentOverflowRescaleRevert(int256,int256,int256) (runs: 5098, μ: 12560, ~: 12463) LibDecimalFloatImplementationWithTargetExponentTest:testWithTargetExponentLargerExponentVeryLargeDiffRevert(int256,int256,int256) (runs: 5101, μ: 11365, ~: 11301) diff --git a/test/src/lib/implementation/LibDecimalFloatImplementation.normalize.t.sol b/test/src/lib/implementation/LibDecimalFloatImplementation.normalize.t.sol index c7ac754d..2981dbfe 100644 --- a/test/src/lib/implementation/LibDecimalFloatImplementation.normalize.t.sol +++ b/test/src/lib/implementation/LibDecimalFloatImplementation.normalize.t.sol @@ -43,9 +43,22 @@ contract LibDecimalFloatImplementationNormalizeTest is Test { checkNormalized(1e37, 0, 1e37, 0); checkNormalized(type(int256).max, 0, 5.7896044618658097711785492504343953926e37, 39); checkNormalized(type(int256).min, 0, -5.7896044618658097711785492504343953926e37, 39); + checkNormalized(42, 0, 42e36, -36); + checkNormalized(42e36, -36, 42e36, -36); for (int256 i = 76; i >= 0; i--) { checkNormalized(int256(10 ** uint256(i)), 0, 1e37, i - 37); } } + + /// Normalization should be idempotent. + function testIdempotent(int256 signedCoefficient, int256 exponent) external pure { + exponent = bound(exponent, EXPONENT_MIN, EXPONENT_MAX); + (int256 normalizedSignedCoefficient, int256 normalizedExponent) = + LibDecimalFloatImplementation.normalize(signedCoefficient, exponent); + (int256 actualSignedCoefficient, int256 actualExponent) = + LibDecimalFloatImplementation.normalize(normalizedSignedCoefficient, normalizedExponent); + assertEq(actualSignedCoefficient, normalizedSignedCoefficient); + assertEq(actualExponent, normalizedExponent); + } }