Index: base/numerics/safe_numerics_unittest.cc |
diff --git a/base/numerics/safe_numerics_unittest.cc b/base/numerics/safe_numerics_unittest.cc |
index bdececb19364c75b2eb9813ec4c6467f529f34d9..6f9a966c0156431e654e71d483d81083fe555690 100644 |
--- a/base/numerics/safe_numerics_unittest.cc |
+++ b/base/numerics/safe_numerics_unittest.cc |
@@ -18,7 +18,10 @@ |
using std::numeric_limits; |
using base::CheckedNumeric; |
using base::checked_cast; |
+using base::SizeT; |
+using base::StrictNumeric; |
using base::saturated_cast; |
+using base::strict_cast; |
using base::internal::MaxExponent; |
using base::internal::RANGE_VALID; |
using base::internal::RANGE_INVALID; |
@@ -239,6 +242,9 @@ static void TestArithmetic(const char* dst, int line) { |
TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); |
TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1)); |
TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2)); |
+ TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0)); |
+ 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()); |
@@ -556,9 +562,27 @@ TEST(SafeNumerics, CastTests) { |
double double_small = 1.0; |
double double_large = numeric_limits<double>::max(); |
double double_infinity = numeric_limits<float>::infinity(); |
+ double double_large_int = numeric_limits<int>::max(); |
+ double double_small_int = numeric_limits<int>::min(); |
- // Just test that the cast compiles, since the other tests cover logic. |
+ // Just test that the casts compile, since the other tests cover logic. |
EXPECT_EQ(0, checked_cast<int>(static_cast<size_t>(0))); |
+ EXPECT_EQ(0, strict_cast<int>(static_cast<char>(0))); |
+ EXPECT_EQ(0, strict_cast<int>(static_cast<unsigned char>(0))); |
+ EXPECT_EQ(0U, strict_cast<unsigned>(static_cast<unsigned char>(0))); |
+ EXPECT_EQ(1ULL, static_cast<uint64_t>(StrictNumeric<size_t>(1U))); |
+ EXPECT_EQ(1ULL, static_cast<uint64_t>(SizeT(1U))); |
+ EXPECT_EQ(1U, static_cast<size_t>(StrictNumeric<unsigned>(1U))); |
+ |
+ EXPECT_TRUE(CheckedNumeric<uint64_t>(StrictNumeric<unsigned>(1U)).IsValid()); |
+ EXPECT_TRUE(CheckedNumeric<int>(StrictNumeric<unsigned>(1U)).IsValid()); |
+ EXPECT_FALSE(CheckedNumeric<unsigned>(StrictNumeric<int>(-1)).IsValid()); |
+ |
+ // These casts and coercions will fail to compile: |
+ // EXPECT_EQ(0, strict_cast<int>(static_cast<size_t>(0))); |
+ // EXPECT_EQ(0, strict_cast<size_t>(static_cast<int>(0))); |
+ // EXPECT_EQ(1ULL, StrictNumeric<size_t>(1)); |
+ // EXPECT_EQ(1, StrictNumeric<size_t>(1U)); |
// Test various saturation corner cases. |
EXPECT_EQ(saturated_cast<int>(small_negative), |
@@ -572,5 +596,7 @@ TEST(SafeNumerics, CastTests) { |
EXPECT_EQ(saturated_cast<int>(double_large), numeric_limits<int>::max()); |
EXPECT_EQ(saturated_cast<float>(double_large), double_infinity); |
EXPECT_EQ(saturated_cast<float>(-double_large), -double_infinity); |
+ EXPECT_EQ(numeric_limits<int>::min(), saturated_cast<int>(double_small_int)); |
+ EXPECT_EQ(numeric_limits<int>::max(), saturated_cast<int>(double_large_int)); |
} |