|
7 | 7 | #include <quick-lint-js/util/math-overflow.h>
|
8 | 8 | #include <quick-lint-js/util/narrow-cast.h>
|
9 | 9 |
|
10 |
| -using int_limits = std::numeric_limits<int>; |
11 |
| - |
12 | 10 | namespace quick_lint_js {
|
13 | 11 | namespace {
|
14 |
| -TEST(test_math_checked_add_int, small_in_range) { |
15 |
| - EXPECT_EQ(checked_add(2, 3), 5); |
16 |
| - EXPECT_EQ(checked_add(-2, -3), -5); |
17 |
| - EXPECT_EQ(checked_add(-2, 3), 1); |
18 |
| - EXPECT_EQ(checked_add(2, -3), -1); |
| 12 | +template <class BoolVector16> |
| 13 | +class test_math_checked_add_signed : public ::testing::Test {}; |
| 14 | +using signed_types = ::testing::Types<int>; |
| 15 | +TYPED_TEST_SUITE(test_math_checked_add_signed, signed_types, |
| 16 | + ::testing::internal::DefaultNameGenerator); |
| 17 | + |
| 18 | +TYPED_TEST(test_math_checked_add_signed, small_in_range) { |
| 19 | + using I = TypeParam; |
| 20 | + EXPECT_EQ(checked_add(I{2}, I{3}), I{5}); |
| 21 | + EXPECT_EQ(checked_add(I{-2}, I{-3}), I{-5}); |
| 22 | + EXPECT_EQ(checked_add(I{-2}, I{3}), I{1}); |
| 23 | + EXPECT_EQ(checked_add(I{2}, I{-3}), I{-1}); |
19 | 24 | }
|
20 | 25 |
|
21 |
| -TEST(test_math_checked_add_int, near_min) { |
22 |
| - int low = int_limits::lowest(); |
23 |
| - EXPECT_EQ(checked_add(low, 0), low); |
24 |
| - EXPECT_EQ(checked_add(0, low), low); |
25 |
| - EXPECT_EQ(checked_add(low + 1, -1), low); |
26 |
| - EXPECT_EQ(checked_add(-1, low + 1), low); |
27 |
| - EXPECT_EQ(checked_add(low + 3, -1), low + 2); |
28 |
| - EXPECT_EQ(checked_add(-1, low + 3), low + 2); |
29 |
| - EXPECT_EQ(checked_add(low + 100, -100), low); |
30 |
| - EXPECT_EQ(checked_add(-100, low + 100), low); |
| 26 | +TYPED_TEST(test_math_checked_add_signed, near_min) { |
| 27 | + using I = TypeParam; |
| 28 | + I low = std::numeric_limits<I>::lowest(); |
| 29 | + EXPECT_EQ(checked_add(low, I{0}), low); |
| 30 | + EXPECT_EQ(checked_add(I{0}, low), low); |
| 31 | + EXPECT_EQ(checked_add(low + I{1}, I{-1}), low); |
| 32 | + EXPECT_EQ(checked_add(I{-1}, low + I{1}), low); |
| 33 | + EXPECT_EQ(checked_add(low + I{3}, I{-1}), low + I{2}); |
| 34 | + EXPECT_EQ(checked_add(I{-1}, low + I{3}), low + I{2}); |
| 35 | + EXPECT_EQ(checked_add(low + I{100}, I{-100}), low); |
| 36 | + EXPECT_EQ(checked_add(I{-100}, low + I{100}), low); |
31 | 37 | }
|
32 | 38 |
|
33 |
| -TEST(test_math_checked_add_int, near_max) { |
34 |
| - int high = (int_limits::max)(); |
35 |
| - EXPECT_EQ(checked_add(high, 0), high); |
36 |
| - EXPECT_EQ(checked_add(0, high), high); |
37 |
| - EXPECT_EQ(checked_add(high - 1, 1), high); |
38 |
| - EXPECT_EQ(checked_add(1, high - 1), high); |
39 |
| - EXPECT_EQ(checked_add(high - 3, 1), high - 2); |
40 |
| - EXPECT_EQ(checked_add(1, high - 3), high - 2); |
41 |
| - EXPECT_EQ(checked_add(high - 100, 100), high); |
42 |
| - EXPECT_EQ(checked_add(100, high - 100), high); |
| 39 | +TYPED_TEST(test_math_checked_add_signed, near_max) { |
| 40 | + using I = TypeParam; |
| 41 | + I high = (std::numeric_limits<I>::max)(); |
| 42 | + EXPECT_EQ(checked_add(high, I{0}), high); |
| 43 | + EXPECT_EQ(checked_add(I{0}, high), high); |
| 44 | + EXPECT_EQ(checked_add(high - I{1}, I{1}), high); |
| 45 | + EXPECT_EQ(checked_add(I{1}, high - I{1}), high); |
| 46 | + EXPECT_EQ(checked_add(high - I{3}, I{1}), high - I{2}); |
| 47 | + EXPECT_EQ(checked_add(I{1}, high - I{3}), high - I{2}); |
| 48 | + EXPECT_EQ(checked_add(high - I{100}, I{100}), high); |
| 49 | + EXPECT_EQ(checked_add(I{100}, high - I{100}), high); |
43 | 50 | }
|
44 | 51 |
|
45 |
| -TEST(test_math_checked_add_int, over_max) { |
46 |
| - int high = (int_limits::max)(); |
47 |
| - EXPECT_EQ(checked_add(high, 1), std::nullopt); |
48 |
| - EXPECT_EQ(checked_add(1, high), std::nullopt); |
| 52 | +TYPED_TEST(test_math_checked_add_signed, over_max) { |
| 53 | + using I = TypeParam; |
| 54 | + I high = (std::numeric_limits<I>::max)(); |
| 55 | + EXPECT_EQ(checked_add(high, I{1}), std::nullopt); |
| 56 | + EXPECT_EQ(checked_add(I{1}, high), std::nullopt); |
49 | 57 | EXPECT_EQ(checked_add(high, high), std::nullopt);
|
50 |
| - EXPECT_EQ(checked_add(high / 2 + 1, high / 2 + 1), std::nullopt); |
| 58 | + EXPECT_EQ(checked_add(high / I{2} + I{1}, high / I{2} + I{1}), std::nullopt); |
51 | 59 | }
|
52 | 60 | }
|
53 | 61 | }
|
|
0 commit comments