| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <type_traits> | 9 #include <type_traits> |
| 10 | 10 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 | 99 |
| 100 // Helper macros to wrap displaying the conversion types and line numbers. | 100 // Helper macros to wrap displaying the conversion types and line numbers. |
| 101 #define TEST_EXPECTED_VALIDITY(expected, actual) \ | 101 #define TEST_EXPECTED_VALIDITY(expected, actual) \ |
| 102 EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid()) \ | 102 EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid()) \ |
| 103 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ | 103 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ |
| 104 << dst << " on line " << line | 104 << dst << " on line " << line |
| 105 | 105 |
| 106 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual) | 106 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual) |
| 107 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual) | 107 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual) |
| 108 | 108 |
| 109 #define TEST_EXPECTED_VALUE(expected, actual) \ | 109 // We have to handle promotions, so infer the underlying type below from actual. |
| 110 EXPECT_EQ(static_cast<Dst>(expected), \ | 110 #define TEST_EXPECTED_VALUE(expected, actual) \ |
| 111 ((actual) \ | 111 EXPECT_EQ(static_cast<typename std::decay<decltype(actual)>::type::type>( \ |
| 112 .template Cast<Dst>() \ | 112 expected), \ |
| 113 .template ValueOrDie<Dst, LogOnFailure>())) \ | 113 ((actual) \ |
| 114 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ | 114 .template ValueOrDie< \ |
| 115 typename std::decay<decltype(actual)>::type::type, \ |
| 116 LogOnFailure>())) \ |
| 117 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ |
| 115 << dst << " on line " << line | 118 << dst << " on line " << line |
| 116 | 119 |
| 117 // Test the simple pointer arithmetic overrides. | 120 // Test the simple pointer arithmetic overrides. |
| 118 template <typename Dst> | 121 template <typename Dst> |
| 119 void TestStrictPointerMath() { | 122 void TestStrictPointerMath() { |
| 120 Dst dummy_value = 0; | 123 Dst dummy_value = 0; |
| 121 Dst* dummy_ptr = &dummy_value; | 124 Dst* dummy_ptr = &dummy_value; |
| 122 static const Dst kDummyOffset = 2; // Don't want to go too far. | 125 static const Dst kDummyOffset = 2; // Don't want to go too far. |
| 123 EXPECT_EQ(dummy_ptr + kDummyOffset, | 126 EXPECT_EQ(dummy_ptr + kDummyOffset, |
| 124 dummy_ptr + StrictNumeric<Dst>(kDummyOffset)); | 127 dummy_ptr + StrictNumeric<Dst>(kDummyOffset)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 136 static void TestSpecializedArithmetic( | 139 static void TestSpecializedArithmetic( |
| 137 const char* dst, | 140 const char* dst, |
| 138 int line, | 141 int line, |
| 139 typename std::enable_if<numeric_limits<Dst>::is_integer && | 142 typename std::enable_if<numeric_limits<Dst>::is_integer && |
| 140 numeric_limits<Dst>::is_signed, | 143 numeric_limits<Dst>::is_signed, |
| 141 int>::type = 0) { | 144 int>::type = 0) { |
| 142 using DstLimits = numeric_limits<Dst>; | 145 using DstLimits = numeric_limits<Dst>; |
| 143 TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest())); | 146 TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest())); |
| 144 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); | 147 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); |
| 145 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); | 148 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); |
| 149 TEST_EXPECTED_VALUE(DstLimits::max(), |
| 150 MakeCheckedNum(-DstLimits::max()).Abs()); |
| 146 | 151 |
| 147 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1); | 152 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1); |
| 148 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); | 153 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); |
| 149 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + | 154 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + |
| 150 DstLimits::lowest()); | 155 DstLimits::lowest()); |
| 151 | 156 |
| 152 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); | 157 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); |
| 153 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1); | 158 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1); |
| 154 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - | 159 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - |
| 155 DstLimits::lowest()); | 160 DstLimits::lowest()); |
| 156 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - | 161 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - |
| 157 DstLimits::max()); | 162 DstLimits::max()); |
| 158 | 163 |
| 159 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2); | 164 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2); |
| 160 | 165 |
| 161 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1); | 166 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1); |
| 162 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); | 167 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); |
| 163 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1); | 168 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1); |
| 169 TEST_EXPECTED_VALUE(DstLimits::lowest(), |
| 170 MakeCheckedNum(DstLimits::lowest()).UnsignedAbs()); |
| 171 TEST_EXPECTED_VALUE(DstLimits::max(), |
| 172 MakeCheckedNum(DstLimits::max()).UnsignedAbs()); |
| 173 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs()); |
| 174 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs()); |
| 175 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).UnsignedAbs()); |
| 164 | 176 |
| 165 // Modulus is legal only for integers. | 177 // Modulus is legal only for integers. |
| 166 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); | 178 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); |
| 167 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); | 179 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); |
| 168 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); | 180 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); |
| 169 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2); | 181 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2); |
| 170 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); | 182 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); |
| 171 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); | 183 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); |
| 172 // Test all the different modulus combinations. | 184 // Test all the different modulus combinations. |
| 173 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); | 185 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); | 226 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); |
| 215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); | 227 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); |
| 216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); | 228 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); |
| 217 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2); | 229 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2); |
| 218 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); | 230 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); |
| 219 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs()); | 231 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs()); |
| 220 TEST_EXPECTED_SUCCESS( | 232 TEST_EXPECTED_SUCCESS( |
| 221 CheckedNumeric<typename std::make_signed<Dst>::type>( | 233 CheckedNumeric<typename std::make_signed<Dst>::type>( |
| 222 std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()) | 234 std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()) |
| 223 .UnsignedAbs()); | 235 .UnsignedAbs()); |
| 236 TEST_EXPECTED_VALUE(DstLimits::lowest(), |
| 237 MakeCheckedNum(DstLimits::lowest()).UnsignedAbs()); |
| 238 TEST_EXPECTED_VALUE(DstLimits::max(), |
| 239 MakeCheckedNum(DstLimits::max()).UnsignedAbs()); |
| 240 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs()); |
| 241 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs()); |
| 224 | 242 |
| 225 // Modulus is legal only for integers. | 243 // Modulus is legal only for integers. |
| 226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); | 244 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); |
| 227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); | 245 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); |
| 228 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); | 246 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); |
| 229 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); | 247 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); |
| 230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); | 248 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); |
| 231 // Test all the different modulus combinations. | 249 // Test all the different modulus combinations. |
| 232 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); | 250 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); |
| 233 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); | 251 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); |
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); | 1056 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); |
| 1039 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); | 1057 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); |
| 1040 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); | 1058 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); |
| 1041 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); | 1059 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); |
| 1042 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); | 1060 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); |
| 1043 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); | 1061 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); |
| 1044 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); | 1062 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); |
| 1045 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); | 1063 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); |
| 1046 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); | 1064 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); |
| 1047 } | 1065 } |
| OLD | NEW |