Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: base/numerics/safe_numerics_unittest.cc

Issue 2529413002: Loosen restrictions on CheckedNumeric bitwise operators (Closed)
Patch Set: more tests Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) << (sizeof(Dst) * CHAR_BIT)); 215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) << (sizeof(Dst) * CHAR_BIT));
216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1); 216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1);
217 TEST_EXPECTED_VALUE(static_cast<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1), 217 TEST_EXPECTED_VALUE(static_cast<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1),
218 CheckedNumeric<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1)); 218 CheckedNumeric<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1));
219 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0); 219 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0);
220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1); 220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1);
221 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT)); 221 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT));
222 TEST_EXPECTED_VALUE(0, 222 TEST_EXPECTED_VALUE(0,
223 CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT - 1)); 223 CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT - 1));
224 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one); 224 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one);
225 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & static_cast<Dst>(1)); 225 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & 1);
226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & static_cast<Dst>(0)); 226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0);
227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & static_cast<Dst>(1)); 227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & 1);
228 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & static_cast<Dst>(0)); 228 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0);
229 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | static_cast<Dst>(1)); 229 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | static_cast<Dst>(0)); 230 CheckNum(DstLimits::max()) & -1);
231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | static_cast<Dst>(1)); 231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 1);
232 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | static_cast<Dst>(0)); 232 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 0);
233 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ static_cast<Dst>(1)); 233 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | 1);
234 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ static_cast<Dst>(0)); 234 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | 0);
235 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ static_cast<Dst>(1)); 235 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
236 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ static_cast<Dst>(0)); 236 CheckedNumeric<Dst>(0) | static_cast<Dst>(-1));
237 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ 1);
238 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ 0);
239 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ 1);
240 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ 0);
241 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
242 CheckedNumeric<Dst>(0) ^ static_cast<Dst>(-1));
237 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0)); 243 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0));
238 } 244 }
239 245
240 // Floating point arithmetic. 246 // Floating point arithmetic.
241 template <typename Dst> 247 template <typename Dst>
242 void TestSpecializedArithmetic( 248 void TestSpecializedArithmetic(
243 const char* dst, 249 const char* dst,
244 int line, 250 int line,
245 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 251 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
246 typedef numeric_limits<Dst> DstLimits; 252 typedef numeric_limits<Dst> DstLimits;
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 EXPECT_EQ(static_cast<decltype(d)>(-.5), d); 905 EXPECT_EQ(static_cast<decltype(d)>(-.5), d);
900 auto e = CheckMod(CheckNum(20), 3).ValueOrDie(); 906 auto e = CheckMod(CheckNum(20), 3).ValueOrDie();
901 EXPECT_EQ(static_cast<decltype(e)>(2), e); 907 EXPECT_EQ(static_cast<decltype(e)>(2), e);
902 auto f = CheckLsh(1, CheckNum(2)).ValueOrDie(); 908 auto f = CheckLsh(1, CheckNum(2)).ValueOrDie();
903 EXPECT_EQ(static_cast<decltype(f)>(4), f); 909 EXPECT_EQ(static_cast<decltype(f)>(4), f);
904 auto g = CheckRsh(4, CheckNum(2)).ValueOrDie(); 910 auto g = CheckRsh(4, CheckNum(2)).ValueOrDie();
905 EXPECT_EQ(static_cast<decltype(g)>(1), g); 911 EXPECT_EQ(static_cast<decltype(g)>(1), g);
906 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); 912 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie();
907 EXPECT_EQ(static_cast<decltype(h)>(1), h); 913 EXPECT_EQ(static_cast<decltype(h)>(1), h);
908 } 914 }
OLDNEW
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698