Chromium Code Reviews| Index: base/numerics/safe_numerics_unittest.cc |
| diff --git a/base/numerics/safe_numerics_unittest.cc b/base/numerics/safe_numerics_unittest.cc |
| index 861f5159284c0541fcf5beb5dfc28b4c4e20276d..3a37a1c92e673afe56a89400ff768a3ddb8dbb4d 100644 |
| --- a/base/numerics/safe_numerics_unittest.cc |
| +++ b/base/numerics/safe_numerics_unittest.cc |
| @@ -63,7 +63,7 @@ Dst GetMaxConvertibleToFloat() { |
| // Helper macros to wrap displaying the conversion types and line numbers. |
| #define TEST_EXPECTED_VALIDITY(expected, actual) \ |
| - EXPECT_EQ(expected, CheckedNumeric<Dst>(actual).validity()) \ |
| + EXPECT_EQ(expected, CheckedNumeric<Dst>(actual).IsValid()) \ |
|
brucedawson
2016/05/20 21:00:57
Now that expected has only two values it might mak
jschuh
2016/05/20 21:19:05
Done.
|
| << "Result test: Value " << +(actual).ValueUnsafe() << " as " << dst \ |
| << " on line " << line; |
| @@ -82,43 +82,32 @@ static void TestSpecializedArithmetic( |
| numeric_limits<Dst>::is_signed, |
| int>::type = 0) { |
| typedef numeric_limits<Dst> DstLimits; |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, |
| - -CheckedNumeric<Dst>(DstLimits::min())); |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()).Abs()); |
| + TEST_EXPECTED_VALIDITY(false, -CheckedNumeric<Dst>(DstLimits::min())); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()).Abs()); |
| TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::max()) + -1); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()) + -1); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::max()) + -1); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()) + -1); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max()); |
| + false, CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max()); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()) - 1); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::min()) - -1); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()) - 1); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::min()) - -1); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_OVERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); |
| + false, CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max()); |
| + false, CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max()); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()) * 2); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()) * 2); |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()) / -1); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()) / -1); |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); |
| // Modulus is legal only for integers. |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); |
| TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); |
| - TEST_EXPECTED_VALIDITY(RANGE_INVALID, CheckedNumeric<Dst>(-1) % -2); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(-1) % -2); |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); |
| TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); |
| // Test all the different modulus combinations. |
| @@ -138,19 +127,16 @@ static void TestSpecializedArithmetic( |
| !numeric_limits<Dst>::is_signed, |
| int>::type = 0) { |
| typedef numeric_limits<Dst> DstLimits; |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::min()).Abs()); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()) + -1); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::min()) - 1); |
| + TEST_EXPECTED_VALIDITY(true, -CheckedNumeric<Dst>(DstLimits::min())); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::min()).Abs()); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()) + -1); |
| + TEST_EXPECTED_VALIDITY(false, CheckedNumeric<Dst>(DstLimits::min()) - 1); |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) * 2); |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| + TEST_EXPECTED_VALIDITY(true, |
| CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs()); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_VALID, |
| + true, |
| CheckedNumeric<typename SignedIntegerForSize<Dst>::type>( |
| std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min()) |
| .UnsignedAbs()); |
| @@ -176,29 +162,22 @@ void TestSpecializedArithmetic( |
| int line, |
| typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { |
| typedef numeric_limits<Dst> DstLimits; |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); |
| + TEST_EXPECTED_VALIDITY(true, -CheckedNumeric<Dst>(DstLimits::min())); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::min()).Abs()); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::min()).Abs()); |
| TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::min()) + -1); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::max()) + 1); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::min()) + -1); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::max()) + 1); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max()); |
| + false, CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max()); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_OVERFLOW, |
| - CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); |
| + false, CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_UNDERFLOW, |
| - CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max()); |
| + false, CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max()); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::min()) * 2); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::min()) * 2); |
| TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2); |
| EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating()); |
| @@ -258,17 +237,15 @@ static void TestArithmetic(const char* dst, int line) { |
| TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1)); |
| TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1)); |
| TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::min()) + 1); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::min()) + 1); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max()); |
| + false, CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max()); |
| // Generic subtraction. |
| TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1)); |
| TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1)); |
| TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, |
| - CheckedNumeric<Dst>(DstLimits::max()) - 1); |
| + TEST_EXPECTED_VALIDITY(true, CheckedNumeric<Dst>(DstLimits::max()) - 1); |
| // Generic multiplication. |
| TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); |
| @@ -278,7 +255,7 @@ static void TestArithmetic(const char* dst, int line) { |
| TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0)); |
| TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1)); |
| TEST_EXPECTED_VALIDITY( |
| - RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max()); |
| + false, CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max()); |
| // Generic division. |
| TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1); |
| @@ -349,18 +326,18 @@ struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_VALUE_PRESERVING> { |
| "Comparison must be sign preserving and value preserving"); |
| const CheckedNumeric<Dst> checked_dst = SrcLimits::max(); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst); |
| + TEST_EXPECTED_VALIDITY(true, checked_dst); |
| if (MaxExponent<Dst>::value > MaxExponent<Src>::value) { |
| if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) { |
| // At least twice larger type. |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, SrcLimits::max() * checked_dst); |
| + TEST_EXPECTED_VALIDITY(true, SrcLimits::max() * checked_dst); |
| } else { // Larger, but not at least twice as large. |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, SrcLimits::max() * checked_dst); |
| - TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst + 1); |
| + TEST_EXPECTED_VALIDITY(false, SrcLimits::max() * checked_dst); |
| + TEST_EXPECTED_VALIDITY(true, checked_dst + 1); |
| } |
| } else { // Same width type. |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + 1); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + 1); |
| } |
| TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); |
| @@ -389,9 +366,9 @@ struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> { |
| "Destination must be narrower than source"); |
| const CheckedNumeric<Dst> checked_dst; |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + SrcLimits::max()); |
| TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst - SrcLimits::max()); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst - SrcLimits::max()); |
| TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); |
| TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); |
| @@ -418,7 +395,7 @@ struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> { |
| TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); |
| TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); |
| } else { |
| - TEST_EXPECTED_VALIDITY(RANGE_INVALID, checked_dst - static_cast<Src>(1)); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst - static_cast<Src>(1)); |
| TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); |
| } |
| } |
| @@ -436,8 +413,8 @@ struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> { |
| const CheckedNumeric<Dst> checked_dst; |
| TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max()); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + static_cast<Src>(-1)); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + -SrcLimits::max()); |
| TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); |
| TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); |
| @@ -459,9 +436,9 @@ struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> { |
| const CheckedNumeric<Dst> checked_dst; |
| TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + SrcLimits::max()); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + static_cast<Src>(-1)); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + -SrcLimits::max()); |
| TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); |
| TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); |
| @@ -501,7 +478,7 @@ struct TestNumericConversion<Dst, Src, UNSIGN_TO_SIGN_NARROW_OR_EQUAL> { |
| const CheckedNumeric<Dst> checked_dst; |
| TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); |
| - TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); |
| + TEST_EXPECTED_VALIDITY(false, checked_dst + SrcLimits::max()); |
| TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min()); |
| TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); |