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

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

Issue 2003693002: Simplify validity detection in SafeNumerics tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: macros Created 4 years, 7 months 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 | « no previous file | 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 return SrcLimits::max(); 56 return SrcLimits::max();
57 Src max = SrcLimits::max() / 2 + (SrcLimits::is_integer ? 1 : 0); 57 Src max = SrcLimits::max() / 2 + (SrcLimits::is_integer ? 1 : 0);
58 while (max != static_cast<Src>(static_cast<Dst>(max))) { 58 while (max != static_cast<Src>(static_cast<Dst>(max))) {
59 max /= 2; 59 max /= 2;
60 } 60 }
61 return static_cast<Dst>(max); 61 return static_cast<Dst>(max);
62 } 62 }
63 63
64 // Helper macros to wrap displaying the conversion types and line numbers. 64 // Helper macros to wrap displaying the conversion types and line numbers.
65 #define TEST_EXPECTED_VALIDITY(expected, actual) \ 65 #define TEST_EXPECTED_VALIDITY(expected, actual) \
66 EXPECT_EQ(expected, CheckedNumeric<Dst>(actual).validity()) \ 66 EXPECT_EQ(expected, CheckedNumeric<Dst>(actual).IsValid()) \
67 << "Result test: Value " << +(actual).ValueUnsafe() << " as " << dst \ 67 << "Result test: Value " << +(actual).ValueUnsafe() << " as " << dst \
68 << " on line " << line; 68 << " on line " << line;
69 69
70 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual)
71 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual)
72
70 #define TEST_EXPECTED_VALUE(expected, actual) \ 73 #define TEST_EXPECTED_VALUE(expected, actual) \
71 EXPECT_EQ(static_cast<Dst>(expected), \ 74 EXPECT_EQ(static_cast<Dst>(expected), \
72 CheckedNumeric<Dst>(actual).ValueUnsafe()) \ 75 CheckedNumeric<Dst>(actual).ValueUnsafe()) \
73 << "Result test: Value " << +((actual).ValueUnsafe()) << " as " << dst \ 76 << "Result test: Value " << +((actual).ValueUnsafe()) << " as " << dst \
74 << " on line " << line; 77 << " on line " << line;
75 78
76 // Signed integer arithmetic. 79 // Signed integer arithmetic.
77 template <typename Dst> 80 template <typename Dst>
78 static void TestSpecializedArithmetic( 81 static void TestSpecializedArithmetic(
79 const char* dst, 82 const char* dst,
80 int line, 83 int line,
81 typename std::enable_if<numeric_limits<Dst>::is_integer && 84 typename std::enable_if<numeric_limits<Dst>::is_integer &&
82 numeric_limits<Dst>::is_signed, 85 numeric_limits<Dst>::is_signed,
83 int>::type = 0) { 86 int>::type = 0) {
84 typedef numeric_limits<Dst> DstLimits; 87 typedef numeric_limits<Dst> DstLimits;
85 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, 88 TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::min()));
86 -CheckedNumeric<Dst>(DstLimits::min())); 89 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()).Abs());
87 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW,
88 CheckedNumeric<Dst>(DstLimits::min()).Abs());
89 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 90 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
90 91
91 TEST_EXPECTED_VALIDITY(RANGE_VALID, 92 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1);
92 CheckedNumeric<Dst>(DstLimits::max()) + -1); 93 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) + -1);
93 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW,
94 CheckedNumeric<Dst>(DstLimits::min()) + -1);
95 TEST_EXPECTED_VALIDITY( 94 TEST_EXPECTED_VALIDITY(
brucedawson 2016/05/20 21:28:58 Your search/replace missed a bunch of these, that
jschuh 2016/05/20 21:56:48 Done.
96 RANGE_UNDERFLOW, 95 false, CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());
97 CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());
98 96
99 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 97 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) - 1);
100 CheckedNumeric<Dst>(DstLimits::min()) - 1); 98 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) - -1);
101 TEST_EXPECTED_VALIDITY(RANGE_VALID,
102 CheckedNumeric<Dst>(DstLimits::min()) - -1);
103 TEST_EXPECTED_VALIDITY( 99 TEST_EXPECTED_VALIDITY(
104 RANGE_OVERFLOW, 100 false, CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
105 CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
106 TEST_EXPECTED_VALIDITY( 101 TEST_EXPECTED_VALIDITY(
107 RANGE_UNDERFLOW, 102 false, CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());
108 CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());
109 103
110 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 104 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) * 2);
111 CheckedNumeric<Dst>(DstLimits::min()) * 2);
112 105
113 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, 106 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) / -1);
114 CheckedNumeric<Dst>(DstLimits::min()) / -1);
115 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); 107 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2);
116 108
117 // Modulus is legal only for integers. 109 // Modulus is legal only for integers.
118 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 110 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
119 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 111 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
120 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); 112 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2);
121 TEST_EXPECTED_VALIDITY(RANGE_INVALID, CheckedNumeric<Dst>(-1) % -2); 113 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2);
122 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 114 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
123 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 115 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
124 // Test all the different modulus combinations. 116 // Test all the different modulus combinations.
125 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 117 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
126 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 118 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
127 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 119 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
128 CheckedNumeric<Dst> checked_dst = 1; 120 CheckedNumeric<Dst> checked_dst = 1;
129 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 121 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
130 } 122 }
131 123
132 // Unsigned integer arithmetic. 124 // Unsigned integer arithmetic.
133 template <typename Dst> 125 template <typename Dst>
134 static void TestSpecializedArithmetic( 126 static void TestSpecializedArithmetic(
135 const char* dst, 127 const char* dst,
136 int line, 128 int line,
137 typename std::enable_if<numeric_limits<Dst>::is_integer && 129 typename std::enable_if<numeric_limits<Dst>::is_integer &&
138 !numeric_limits<Dst>::is_signed, 130 !numeric_limits<Dst>::is_signed,
139 int>::type = 0) { 131 int>::type = 0) {
140 typedef numeric_limits<Dst> DstLimits; 132 typedef numeric_limits<Dst> DstLimits;
141 TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); 133 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min()));
142 TEST_EXPECTED_VALIDITY(RANGE_VALID, 134 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).Abs());
143 CheckedNumeric<Dst>(DstLimits::min()).Abs()); 135 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) + -1);
144 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 136 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) - 1);
145 CheckedNumeric<Dst>(DstLimits::min()) + -1);
146 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW,
147 CheckedNumeric<Dst>(DstLimits::min()) - 1);
148 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) * 2); 137 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) * 2);
149 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); 138 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2);
150 TEST_EXPECTED_VALIDITY(RANGE_VALID, 139 TEST_EXPECTED_VALIDITY(true,
151 CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs()); 140 CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs());
152 TEST_EXPECTED_VALIDITY( 141 TEST_EXPECTED_VALIDITY(
153 RANGE_VALID, 142 true,
154 CheckedNumeric<typename SignedIntegerForSize<Dst>::type>( 143 CheckedNumeric<typename SignedIntegerForSize<Dst>::type>(
155 std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min()) 144 std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min())
156 .UnsignedAbs()); 145 .UnsignedAbs());
157 146
158 // Modulus is legal only for integers. 147 // Modulus is legal only for integers.
159 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 148 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
160 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 149 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
161 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); 150 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2);
162 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 151 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
163 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 152 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
164 // Test all the different modulus combinations. 153 // Test all the different modulus combinations.
165 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 154 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
166 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 155 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
167 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 156 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
168 CheckedNumeric<Dst> checked_dst = 1; 157 CheckedNumeric<Dst> checked_dst = 1;
169 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 158 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
170 } 159 }
171 160
172 // Floating point arithmetic. 161 // Floating point arithmetic.
173 template <typename Dst> 162 template <typename Dst>
174 void TestSpecializedArithmetic( 163 void TestSpecializedArithmetic(
175 const char* dst, 164 const char* dst,
176 int line, 165 int line,
177 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 166 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
178 typedef numeric_limits<Dst> DstLimits; 167 typedef numeric_limits<Dst> DstLimits;
179 TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); 168 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min()));
180 169
181 TEST_EXPECTED_VALIDITY(RANGE_VALID, 170 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).Abs());
182 CheckedNumeric<Dst>(DstLimits::min()).Abs());
183 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 171 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
184 172
185 TEST_EXPECTED_VALIDITY(RANGE_VALID, 173 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + -1);
186 CheckedNumeric<Dst>(DstLimits::min()) + -1); 174 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + 1);
187 TEST_EXPECTED_VALIDITY(RANGE_VALID,
188 CheckedNumeric<Dst>(DstLimits::max()) + 1);
189 TEST_EXPECTED_VALIDITY( 175 TEST_EXPECTED_VALIDITY(
190 RANGE_UNDERFLOW, 176 false, CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());
191 CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());
192 177
193 TEST_EXPECTED_VALIDITY( 178 TEST_EXPECTED_VALIDITY(
194 RANGE_OVERFLOW, 179 false, CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
195 CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
196 TEST_EXPECTED_VALIDITY( 180 TEST_EXPECTED_VALIDITY(
197 RANGE_UNDERFLOW, 181 false, CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());
198 CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());
199 182
200 TEST_EXPECTED_VALIDITY(RANGE_VALID, 183 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) * 2);
201 CheckedNumeric<Dst>(DstLimits::min()) * 2);
202 184
203 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2); 185 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2);
204 EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating()); 186 EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating());
205 } 187 }
206 188
207 // Generic arithmetic tests. 189 // Generic arithmetic tests.
208 template <typename Dst> 190 template <typename Dst>
209 static void TestArithmetic(const char* dst, int line) { 191 static void TestArithmetic(const char* dst, int line) {
210 typedef numeric_limits<Dst> DstLimits; 192 typedef numeric_limits<Dst> DstLimits;
211 193
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 // Generic absolute value. 233 // Generic absolute value.
252 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs()); 234 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs());
253 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs()); 235 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs());
254 TEST_EXPECTED_VALUE(DstLimits::max(), 236 TEST_EXPECTED_VALUE(DstLimits::max(),
255 CheckedNumeric<Dst>(DstLimits::max()).Abs()); 237 CheckedNumeric<Dst>(DstLimits::max()).Abs());
256 238
257 // Generic addition. 239 // Generic addition.
258 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1)); 240 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1));
259 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1)); 241 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1));
260 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1)); 242 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1));
261 TEST_EXPECTED_VALIDITY(RANGE_VALID, 243 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + 1);
262 CheckedNumeric<Dst>(DstLimits::min()) + 1);
263 TEST_EXPECTED_VALIDITY( 244 TEST_EXPECTED_VALIDITY(
264 RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max()); 245 false, CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max());
265 246
266 // Generic subtraction. 247 // Generic subtraction.
267 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1)); 248 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1));
268 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1)); 249 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1));
269 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1)); 250 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1));
270 TEST_EXPECTED_VALIDITY(RANGE_VALID, 251 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1);
271 CheckedNumeric<Dst>(DstLimits::max()) - 1);
272 252
273 // Generic multiplication. 253 // Generic multiplication.
274 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); 254 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1));
275 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1)); 255 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1));
276 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2)); 256 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
277 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0)); 257 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0));
278 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0)); 258 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0));
279 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1)); 259 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1));
280 TEST_EXPECTED_VALIDITY( 260 TEST_EXPECTED_VALIDITY(
281 RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max()); 261 false, CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max());
282 262
283 // Generic division. 263 // Generic division.
284 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1); 264 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1);
285 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 265 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
286 TEST_EXPECTED_VALUE(DstLimits::min() / 2, 266 TEST_EXPECTED_VALUE(DstLimits::min() / 2,
287 CheckedNumeric<Dst>(DstLimits::min()) / 2); 267 CheckedNumeric<Dst>(DstLimits::min()) / 2);
288 TEST_EXPECTED_VALUE(DstLimits::max() / 2, 268 TEST_EXPECTED_VALUE(DstLimits::max() / 2,
289 CheckedNumeric<Dst>(DstLimits::max()) / 2); 269 CheckedNumeric<Dst>(DstLimits::max()) / 2);
290 270
291 TestSpecializedArithmetic<Dst>(dst, line); 271 TestSpecializedArithmetic<Dst>(dst, line);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 // Not floating to integral and... 322 // Not floating to integral and...
343 (!(DstLimits::is_integer && SrcLimits::is_iec559) && 323 (!(DstLimits::is_integer && SrcLimits::is_iec559) &&
344 // Same sign, same numeric, source is narrower or same. 324 // Same sign, same numeric, source is narrower or same.
345 ((SrcLimits::is_signed == DstLimits::is_signed && 325 ((SrcLimits::is_signed == DstLimits::is_signed &&
346 sizeof(Dst) >= sizeof(Src)) || 326 sizeof(Dst) >= sizeof(Src)) ||
347 // Or signed destination and source is smaller 327 // Or signed destination and source is smaller
348 (DstLimits::is_signed && sizeof(Dst) > sizeof(Src)))), 328 (DstLimits::is_signed && sizeof(Dst) > sizeof(Src)))),
349 "Comparison must be sign preserving and value preserving"); 329 "Comparison must be sign preserving and value preserving");
350 330
351 const CheckedNumeric<Dst> checked_dst = SrcLimits::max(); 331 const CheckedNumeric<Dst> checked_dst = SrcLimits::max();
352 TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst); 332 TEST_EXPECTED_SUCCESS(checked_dst);
353 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) { 333 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) {
354 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) { 334 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) {
355 // At least twice larger type. 335 // At least twice larger type.
356 TEST_EXPECTED_VALIDITY(RANGE_VALID, SrcLimits::max() * checked_dst); 336 TEST_EXPECTED_SUCCESS(SrcLimits::max() * checked_dst);
357 337
358 } else { // Larger, but not at least twice as large. 338 } else { // Larger, but not at least twice as large.
359 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, SrcLimits::max() * checked_dst); 339 TEST_EXPECTED_FAILURE(SrcLimits::max() * checked_dst);
360 TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst + 1); 340 TEST_EXPECTED_SUCCESS(checked_dst + 1);
361 } 341 }
362 } else { // Same width type. 342 } else { // Same width type.
363 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + 1); 343 TEST_EXPECTED_FAILURE(checked_dst + 1);
364 } 344 }
365 345
366 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 346 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
367 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 347 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
368 if (SrcLimits::is_iec559) { 348 if (SrcLimits::is_iec559) {
369 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1)); 349 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1));
370 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 350 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
371 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 351 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
372 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 352 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
373 } else if (numeric_limits<Src>::is_signed) { 353 } else if (numeric_limits<Src>::is_signed) {
374 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 354 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
375 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 355 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
376 } 356 }
377 } 357 }
378 }; 358 };
379 359
380 template <typename Dst, typename Src> 360 template <typename Dst, typename Src>
381 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> { 361 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> {
382 static void Test(const char *dst, const char *src, int line) { 362 static void Test(const char *dst, const char *src, int line) {
383 typedef numeric_limits<Src> SrcLimits; 363 typedef numeric_limits<Src> SrcLimits;
384 typedef numeric_limits<Dst> DstLimits; 364 typedef numeric_limits<Dst> DstLimits;
385 static_assert(SrcLimits::is_signed == DstLimits::is_signed, 365 static_assert(SrcLimits::is_signed == DstLimits::is_signed,
386 "Destination and source sign must be the same"); 366 "Destination and source sign must be the same");
387 static_assert(sizeof(Dst) < sizeof(Src) || 367 static_assert(sizeof(Dst) < sizeof(Src) ||
388 (DstLimits::is_integer && SrcLimits::is_iec559), 368 (DstLimits::is_integer && SrcLimits::is_iec559),
389 "Destination must be narrower than source"); 369 "Destination must be narrower than source");
390 370
391 const CheckedNumeric<Dst> checked_dst; 371 const CheckedNumeric<Dst> checked_dst;
392 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 372 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
393 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 373 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
394 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst - SrcLimits::max()); 374 TEST_EXPECTED_FAILURE(checked_dst - SrcLimits::max());
395 375
396 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 376 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
397 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 377 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
398 if (SrcLimits::is_iec559) { 378 if (SrcLimits::is_iec559) {
399 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 379 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
400 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 380 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
401 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 381 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
402 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 382 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
403 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 383 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
404 if (DstLimits::is_integer) { 384 if (DstLimits::is_integer) {
405 if (SrcLimits::digits < DstLimits::digits) { 385 if (SrcLimits::digits < DstLimits::digits) {
406 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, 386 TEST_EXPECTED_RANGE(RANGE_OVERFLOW,
407 static_cast<Src>(DstLimits::max())); 387 static_cast<Src>(DstLimits::max()));
408 } else { 388 } else {
409 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); 389 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
410 } 390 }
411 TEST_EXPECTED_RANGE( 391 TEST_EXPECTED_RANGE(
412 RANGE_VALID, 392 RANGE_VALID,
413 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>())); 393 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
414 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min())); 394 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min()));
415 } 395 }
416 } else if (SrcLimits::is_signed) { 396 } else if (SrcLimits::is_signed) {
417 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1)); 397 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1));
418 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 398 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
419 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 399 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
420 } else { 400 } else {
421 TEST_EXPECTED_VALIDITY(RANGE_INVALID, checked_dst - static_cast<Src>(1)); 401 TEST_EXPECTED_FAILURE(checked_dst - static_cast<Src>(1));
422 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 402 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
423 } 403 }
424 } 404 }
425 }; 405 };
426 406
427 template <typename Dst, typename Src> 407 template <typename Dst, typename Src>
428 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> { 408 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> {
429 static void Test(const char *dst, const char *src, int line) { 409 static void Test(const char *dst, const char *src, int line) {
430 typedef numeric_limits<Src> SrcLimits; 410 typedef numeric_limits<Src> SrcLimits;
431 typedef numeric_limits<Dst> DstLimits; 411 typedef numeric_limits<Dst> DstLimits;
432 static_assert(sizeof(Dst) >= sizeof(Src), 412 static_assert(sizeof(Dst) >= sizeof(Src),
433 "Destination must be equal or wider than source."); 413 "Destination must be equal or wider than source.");
434 static_assert(SrcLimits::is_signed, "Source must be signed"); 414 static_assert(SrcLimits::is_signed, "Source must be signed");
435 static_assert(!DstLimits::is_signed, "Destination must be unsigned"); 415 static_assert(!DstLimits::is_signed, "Destination must be unsigned");
436 416
437 const CheckedNumeric<Dst> checked_dst; 417 const CheckedNumeric<Dst> checked_dst;
438 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max()); 418 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max());
439 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); 419 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
440 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); 420 TEST_EXPECTED_FAILURE(checked_dst + -SrcLimits::max());
441 421
442 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 422 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
443 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 423 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
444 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 424 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
445 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 425 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
446 } 426 }
447 }; 427 };
448 428
449 template <typename Dst, typename Src> 429 template <typename Dst, typename Src>
450 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> { 430 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> {
451 static void Test(const char *dst, const char *src, int line) { 431 static void Test(const char *dst, const char *src, int line) {
452 typedef numeric_limits<Src> SrcLimits; 432 typedef numeric_limits<Src> SrcLimits;
453 typedef numeric_limits<Dst> DstLimits; 433 typedef numeric_limits<Dst> DstLimits;
454 static_assert((DstLimits::is_integer && SrcLimits::is_iec559) || 434 static_assert((DstLimits::is_integer && SrcLimits::is_iec559) ||
455 (sizeof(Dst) < sizeof(Src)), 435 (sizeof(Dst) < sizeof(Src)),
456 "Destination must be narrower than source."); 436 "Destination must be narrower than source.");
457 static_assert(SrcLimits::is_signed, "Source must be signed."); 437 static_assert(SrcLimits::is_signed, "Source must be signed.");
458 static_assert(!DstLimits::is_signed, "Destination must be unsigned."); 438 static_assert(!DstLimits::is_signed, "Destination must be unsigned.");
459 439
460 const CheckedNumeric<Dst> checked_dst; 440 const CheckedNumeric<Dst> checked_dst;
461 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 441 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
462 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 442 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
463 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); 443 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
464 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); 444 TEST_EXPECTED_FAILURE(checked_dst + -SrcLimits::max());
465 445
466 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 446 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
467 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 447 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
468 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 448 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
469 if (SrcLimits::is_iec559) { 449 if (SrcLimits::is_iec559) {
470 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 450 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
471 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 451 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
472 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 452 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
473 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 453 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
474 if (DstLimits::is_integer) { 454 if (DstLimits::is_integer) {
(...skipping 19 matching lines...) Expand all
494 static void Test(const char *dst, const char *src, int line) { 474 static void Test(const char *dst, const char *src, int line) {
495 typedef numeric_limits<Src> SrcLimits; 475 typedef numeric_limits<Src> SrcLimits;
496 typedef numeric_limits<Dst> DstLimits; 476 typedef numeric_limits<Dst> DstLimits;
497 static_assert(sizeof(Dst) <= sizeof(Src), 477 static_assert(sizeof(Dst) <= sizeof(Src),
498 "Destination must be narrower or equal to source."); 478 "Destination must be narrower or equal to source.");
499 static_assert(!SrcLimits::is_signed, "Source must be unsigned."); 479 static_assert(!SrcLimits::is_signed, "Source must be unsigned.");
500 static_assert(DstLimits::is_signed, "Destination must be signed."); 480 static_assert(DstLimits::is_signed, "Destination must be signed.");
501 481
502 const CheckedNumeric<Dst> checked_dst; 482 const CheckedNumeric<Dst> checked_dst;
503 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 483 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
504 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 484 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
505 TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min()); 485 TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min());
506 486
507 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 487 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
508 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 488 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
509 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 489 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
510 } 490 }
511 }; 491 };
512 492
513 // Helper macro to wrap displaying the conversion types and line numbers 493 // Helper macro to wrap displaying the conversion types and line numbers
514 #define TEST_NUMERIC_CONVERSION(d, s, t) \ 494 #define TEST_NUMERIC_CONVERSION(d, s, t) \
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 755
776 CheckedNumeric<int> too_large = std::numeric_limits<int>::max(); 756 CheckedNumeric<int> too_large = std::numeric_limits<int>::max();
777 EXPECT_TRUE(too_large.IsValid()); 757 EXPECT_TRUE(too_large.IsValid());
778 too_large += d; 758 too_large += d;
779 EXPECT_FALSE(too_large.IsValid()); 759 EXPECT_FALSE(too_large.IsValid());
780 too_large -= d; 760 too_large -= d;
781 EXPECT_FALSE(too_large.IsValid()); 761 EXPECT_FALSE(too_large.IsValid());
782 too_large /= d; 762 too_large /= d;
783 EXPECT_FALSE(too_large.IsValid()); 763 EXPECT_FALSE(too_large.IsValid());
784 } 764 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698