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

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: format 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 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) +
94 CheckedNumeric<Dst>(DstLimits::min()) + -1); 95 -DstLimits::max());
95 TEST_EXPECTED_VALIDITY(
96 RANGE_UNDERFLOW,
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, 99 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) -
102 CheckedNumeric<Dst>(DstLimits::min()) - -1); 100 -DstLimits::max());
103 TEST_EXPECTED_VALIDITY( 101 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) -
104 RANGE_OVERFLOW, 102 DstLimits::max());
105 CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
106 TEST_EXPECTED_VALIDITY(
107 RANGE_UNDERFLOW,
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_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs());
151 CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs()); 140 TEST_EXPECTED_SUCCESS(
152 TEST_EXPECTED_VALIDITY(
153 RANGE_VALID,
154 CheckedNumeric<typename SignedIntegerForSize<Dst>::type>( 141 CheckedNumeric<typename SignedIntegerForSize<Dst>::type>(
155 std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min()) 142 std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min())
156 .UnsignedAbs()); 143 .UnsignedAbs());
157 144
158 // Modulus is legal only for integers. 145 // Modulus is legal only for integers.
159 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 146 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
160 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 147 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
161 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); 148 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2);
162 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 149 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
163 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 150 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
164 // Test all the different modulus combinations. 151 // Test all the different modulus combinations.
165 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 152 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
166 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 153 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
167 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 154 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
168 CheckedNumeric<Dst> checked_dst = 1; 155 CheckedNumeric<Dst> checked_dst = 1;
169 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 156 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
170 } 157 }
171 158
172 // Floating point arithmetic. 159 // Floating point arithmetic.
173 template <typename Dst> 160 template <typename Dst>
174 void TestSpecializedArithmetic( 161 void TestSpecializedArithmetic(
175 const char* dst, 162 const char* dst,
176 int line, 163 int line,
177 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 164 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
178 typedef numeric_limits<Dst> DstLimits; 165 typedef numeric_limits<Dst> DstLimits;
179 TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); 166 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min()));
180 167
181 TEST_EXPECTED_VALIDITY(RANGE_VALID, 168 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).Abs());
182 CheckedNumeric<Dst>(DstLimits::min()).Abs());
183 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 169 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
184 170
185 TEST_EXPECTED_VALIDITY(RANGE_VALID, 171 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + -1);
186 CheckedNumeric<Dst>(DstLimits::min()) + -1); 172 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + 1);
187 TEST_EXPECTED_VALIDITY(RANGE_VALID, 173 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) +
188 CheckedNumeric<Dst>(DstLimits::max()) + 1); 174 -DstLimits::max());
189 TEST_EXPECTED_VALIDITY(
190 RANGE_UNDERFLOW,
191 CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());
192 175
193 TEST_EXPECTED_VALIDITY( 176 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) -
194 RANGE_OVERFLOW, 177 -DstLimits::max());
195 CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); 178 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) -
196 TEST_EXPECTED_VALIDITY( 179 DstLimits::max());
197 RANGE_UNDERFLOW,
198 CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());
199 180
200 TEST_EXPECTED_VALIDITY(RANGE_VALID, 181 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) * 2);
201 CheckedNumeric<Dst>(DstLimits::min()) * 2);
202 182
203 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2); 183 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2);
204 EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating()); 184 EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating());
205 } 185 }
206 186
207 // Generic arithmetic tests. 187 // Generic arithmetic tests.
208 template <typename Dst> 188 template <typename Dst>
209 static void TestArithmetic(const char* dst, int line) { 189 static void TestArithmetic(const char* dst, int line) {
210 typedef numeric_limits<Dst> DstLimits; 190 typedef numeric_limits<Dst> DstLimits;
211 191
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 // Generic absolute value. 231 // Generic absolute value.
252 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs()); 232 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs());
253 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs()); 233 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs());
254 TEST_EXPECTED_VALUE(DstLimits::max(), 234 TEST_EXPECTED_VALUE(DstLimits::max(),
255 CheckedNumeric<Dst>(DstLimits::max()).Abs()); 235 CheckedNumeric<Dst>(DstLimits::max()).Abs());
256 236
257 // Generic addition. 237 // Generic addition.
258 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1)); 238 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1));
259 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1)); 239 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1));
260 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1)); 240 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1));
261 TEST_EXPECTED_VALIDITY(RANGE_VALID, 241 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + 1);
262 CheckedNumeric<Dst>(DstLimits::min()) + 1); 242 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) +
263 TEST_EXPECTED_VALIDITY( 243 DstLimits::max());
264 RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max());
265 244
266 // Generic subtraction. 245 // Generic subtraction.
267 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1)); 246 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1));
268 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1)); 247 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1));
269 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1)); 248 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1));
270 TEST_EXPECTED_VALIDITY(RANGE_VALID, 249 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1);
271 CheckedNumeric<Dst>(DstLimits::max()) - 1);
272 250
273 // Generic multiplication. 251 // Generic multiplication.
274 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); 252 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1));
275 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1)); 253 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1));
276 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2)); 254 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
277 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0)); 255 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0));
278 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0)); 256 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0));
279 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1)); 257 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1));
280 TEST_EXPECTED_VALIDITY( 258 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) *
281 RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max()); 259 DstLimits::max());
282 260
283 // Generic division. 261 // Generic division.
284 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1); 262 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1);
285 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 263 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
286 TEST_EXPECTED_VALUE(DstLimits::min() / 2, 264 TEST_EXPECTED_VALUE(DstLimits::min() / 2,
287 CheckedNumeric<Dst>(DstLimits::min()) / 2); 265 CheckedNumeric<Dst>(DstLimits::min()) / 2);
288 TEST_EXPECTED_VALUE(DstLimits::max() / 2, 266 TEST_EXPECTED_VALUE(DstLimits::max() / 2,
289 CheckedNumeric<Dst>(DstLimits::max()) / 2); 267 CheckedNumeric<Dst>(DstLimits::max()) / 2);
290 268
291 TestSpecializedArithmetic<Dst>(dst, line); 269 TestSpecializedArithmetic<Dst>(dst, line);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 // Not floating to integral and... 320 // Not floating to integral and...
343 (!(DstLimits::is_integer && SrcLimits::is_iec559) && 321 (!(DstLimits::is_integer && SrcLimits::is_iec559) &&
344 // Same sign, same numeric, source is narrower or same. 322 // Same sign, same numeric, source is narrower or same.
345 ((SrcLimits::is_signed == DstLimits::is_signed && 323 ((SrcLimits::is_signed == DstLimits::is_signed &&
346 sizeof(Dst) >= sizeof(Src)) || 324 sizeof(Dst) >= sizeof(Src)) ||
347 // Or signed destination and source is smaller 325 // Or signed destination and source is smaller
348 (DstLimits::is_signed && sizeof(Dst) > sizeof(Src)))), 326 (DstLimits::is_signed && sizeof(Dst) > sizeof(Src)))),
349 "Comparison must be sign preserving and value preserving"); 327 "Comparison must be sign preserving and value preserving");
350 328
351 const CheckedNumeric<Dst> checked_dst = SrcLimits::max(); 329 const CheckedNumeric<Dst> checked_dst = SrcLimits::max();
352 TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst); 330 TEST_EXPECTED_SUCCESS(checked_dst);
353 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) { 331 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) {
354 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) { 332 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) {
355 // At least twice larger type. 333 // At least twice larger type.
356 TEST_EXPECTED_VALIDITY(RANGE_VALID, SrcLimits::max() * checked_dst); 334 TEST_EXPECTED_SUCCESS(SrcLimits::max() * checked_dst);
357 335
358 } else { // Larger, but not at least twice as large. 336 } else { // Larger, but not at least twice as large.
359 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, SrcLimits::max() * checked_dst); 337 TEST_EXPECTED_FAILURE(SrcLimits::max() * checked_dst);
360 TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst + 1); 338 TEST_EXPECTED_SUCCESS(checked_dst + 1);
361 } 339 }
362 } else { // Same width type. 340 } else { // Same width type.
363 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + 1); 341 TEST_EXPECTED_FAILURE(checked_dst + 1);
364 } 342 }
365 343
366 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 344 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
367 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 345 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
368 if (SrcLimits::is_iec559) { 346 if (SrcLimits::is_iec559) {
369 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1)); 347 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1));
370 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 348 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
371 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 349 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
372 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 350 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
373 } else if (numeric_limits<Src>::is_signed) { 351 } else if (numeric_limits<Src>::is_signed) {
374 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 352 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
375 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 353 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
376 } 354 }
377 } 355 }
378 }; 356 };
379 357
380 template <typename Dst, typename Src> 358 template <typename Dst, typename Src>
381 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> { 359 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> {
382 static void Test(const char *dst, const char *src, int line) { 360 static void Test(const char *dst, const char *src, int line) {
383 typedef numeric_limits<Src> SrcLimits; 361 typedef numeric_limits<Src> SrcLimits;
384 typedef numeric_limits<Dst> DstLimits; 362 typedef numeric_limits<Dst> DstLimits;
385 static_assert(SrcLimits::is_signed == DstLimits::is_signed, 363 static_assert(SrcLimits::is_signed == DstLimits::is_signed,
386 "Destination and source sign must be the same"); 364 "Destination and source sign must be the same");
387 static_assert(sizeof(Dst) < sizeof(Src) || 365 static_assert(sizeof(Dst) < sizeof(Src) ||
388 (DstLimits::is_integer && SrcLimits::is_iec559), 366 (DstLimits::is_integer && SrcLimits::is_iec559),
389 "Destination must be narrower than source"); 367 "Destination must be narrower than source");
390 368
391 const CheckedNumeric<Dst> checked_dst; 369 const CheckedNumeric<Dst> checked_dst;
392 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 370 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
393 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 371 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
394 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst - SrcLimits::max()); 372 TEST_EXPECTED_FAILURE(checked_dst - SrcLimits::max());
395 373
396 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 374 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
397 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 375 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
398 if (SrcLimits::is_iec559) { 376 if (SrcLimits::is_iec559) {
399 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 377 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
400 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 378 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
401 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 379 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
402 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 380 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
403 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 381 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
404 if (DstLimits::is_integer) { 382 if (DstLimits::is_integer) {
405 if (SrcLimits::digits < DstLimits::digits) { 383 if (SrcLimits::digits < DstLimits::digits) {
406 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, 384 TEST_EXPECTED_RANGE(RANGE_OVERFLOW,
407 static_cast<Src>(DstLimits::max())); 385 static_cast<Src>(DstLimits::max()));
408 } else { 386 } else {
409 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); 387 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
410 } 388 }
411 TEST_EXPECTED_RANGE( 389 TEST_EXPECTED_RANGE(
412 RANGE_VALID, 390 RANGE_VALID,
413 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>())); 391 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
414 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min())); 392 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min()));
415 } 393 }
416 } else if (SrcLimits::is_signed) { 394 } else if (SrcLimits::is_signed) {
417 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1)); 395 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1));
418 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 396 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
419 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 397 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
420 } else { 398 } else {
421 TEST_EXPECTED_VALIDITY(RANGE_INVALID, checked_dst - static_cast<Src>(1)); 399 TEST_EXPECTED_FAILURE(checked_dst - static_cast<Src>(1));
422 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 400 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
423 } 401 }
424 } 402 }
425 }; 403 };
426 404
427 template <typename Dst, typename Src> 405 template <typename Dst, typename Src>
428 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> { 406 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> {
429 static void Test(const char *dst, const char *src, int line) { 407 static void Test(const char *dst, const char *src, int line) {
430 typedef numeric_limits<Src> SrcLimits; 408 typedef numeric_limits<Src> SrcLimits;
431 typedef numeric_limits<Dst> DstLimits; 409 typedef numeric_limits<Dst> DstLimits;
432 static_assert(sizeof(Dst) >= sizeof(Src), 410 static_assert(sizeof(Dst) >= sizeof(Src),
433 "Destination must be equal or wider than source."); 411 "Destination must be equal or wider than source.");
434 static_assert(SrcLimits::is_signed, "Source must be signed"); 412 static_assert(SrcLimits::is_signed, "Source must be signed");
435 static_assert(!DstLimits::is_signed, "Destination must be unsigned"); 413 static_assert(!DstLimits::is_signed, "Destination must be unsigned");
436 414
437 const CheckedNumeric<Dst> checked_dst; 415 const CheckedNumeric<Dst> checked_dst;
438 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max()); 416 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max());
439 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); 417 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
440 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); 418 TEST_EXPECTED_FAILURE(checked_dst + -SrcLimits::max());
441 419
442 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 420 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
443 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 421 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
444 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 422 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
445 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 423 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
446 } 424 }
447 }; 425 };
448 426
449 template <typename Dst, typename Src> 427 template <typename Dst, typename Src>
450 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> { 428 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> {
451 static void Test(const char *dst, const char *src, int line) { 429 static void Test(const char *dst, const char *src, int line) {
452 typedef numeric_limits<Src> SrcLimits; 430 typedef numeric_limits<Src> SrcLimits;
453 typedef numeric_limits<Dst> DstLimits; 431 typedef numeric_limits<Dst> DstLimits;
454 static_assert((DstLimits::is_integer && SrcLimits::is_iec559) || 432 static_assert((DstLimits::is_integer && SrcLimits::is_iec559) ||
455 (sizeof(Dst) < sizeof(Src)), 433 (sizeof(Dst) < sizeof(Src)),
456 "Destination must be narrower than source."); 434 "Destination must be narrower than source.");
457 static_assert(SrcLimits::is_signed, "Source must be signed."); 435 static_assert(SrcLimits::is_signed, "Source must be signed.");
458 static_assert(!DstLimits::is_signed, "Destination must be unsigned."); 436 static_assert(!DstLimits::is_signed, "Destination must be unsigned.");
459 437
460 const CheckedNumeric<Dst> checked_dst; 438 const CheckedNumeric<Dst> checked_dst;
461 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 439 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
462 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 440 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
463 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); 441 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
464 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); 442 TEST_EXPECTED_FAILURE(checked_dst + -SrcLimits::max());
465 443
466 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 444 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
467 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 445 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
468 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 446 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
469 if (SrcLimits::is_iec559) { 447 if (SrcLimits::is_iec559) {
470 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 448 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
471 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 449 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
472 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 450 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
473 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 451 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
474 if (DstLimits::is_integer) { 452 if (DstLimits::is_integer) {
(...skipping 19 matching lines...) Expand all
494 static void Test(const char *dst, const char *src, int line) { 472 static void Test(const char *dst, const char *src, int line) {
495 typedef numeric_limits<Src> SrcLimits; 473 typedef numeric_limits<Src> SrcLimits;
496 typedef numeric_limits<Dst> DstLimits; 474 typedef numeric_limits<Dst> DstLimits;
497 static_assert(sizeof(Dst) <= sizeof(Src), 475 static_assert(sizeof(Dst) <= sizeof(Src),
498 "Destination must be narrower or equal to source."); 476 "Destination must be narrower or equal to source.");
499 static_assert(!SrcLimits::is_signed, "Source must be unsigned."); 477 static_assert(!SrcLimits::is_signed, "Source must be unsigned.");
500 static_assert(DstLimits::is_signed, "Destination must be signed."); 478 static_assert(DstLimits::is_signed, "Destination must be signed.");
501 479
502 const CheckedNumeric<Dst> checked_dst; 480 const CheckedNumeric<Dst> checked_dst;
503 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 481 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
504 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 482 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
505 TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min()); 483 TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min());
506 484
507 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 485 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
508 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 486 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
509 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 487 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
510 } 488 }
511 }; 489 };
512 490
513 // Helper macro to wrap displaying the conversion types and line numbers 491 // Helper macro to wrap displaying the conversion types and line numbers
514 #define TEST_NUMERIC_CONVERSION(d, s, t) \ 492 #define TEST_NUMERIC_CONVERSION(d, s, t) \
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 753
776 CheckedNumeric<int> too_large = std::numeric_limits<int>::max(); 754 CheckedNumeric<int> too_large = std::numeric_limits<int>::max();
777 EXPECT_TRUE(too_large.IsValid()); 755 EXPECT_TRUE(too_large.IsValid());
778 too_large += d; 756 too_large += d;
779 EXPECT_FALSE(too_large.IsValid()); 757 EXPECT_FALSE(too_large.IsValid());
780 too_large -= d; 758 too_large -= d;
781 EXPECT_FALSE(too_large.IsValid()); 759 EXPECT_FALSE(too_large.IsValid());
782 too_large /= d; 760 too_large /= d;
783 EXPECT_FALSE(too_large.IsValid()); 761 EXPECT_FALSE(too_large.IsValid());
784 } 762 }
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