Skip to content

Commit ed7e94c

Browse files
committed
refactor(math-overflow): allow easily testing checked_add with more types
1 parent 9eca414 commit ed7e94c

File tree

1 file changed

+40
-32
lines changed

1 file changed

+40
-32
lines changed

test/test-math-overflow.cpp

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,55 @@
77
#include <quick-lint-js/util/math-overflow.h>
88
#include <quick-lint-js/util/narrow-cast.h>
99

10-
using int_limits = std::numeric_limits<int>;
11-
1210
namespace quick_lint_js {
1311
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});
1924
}
2025

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);
3137
}
3238

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);
4350
}
4451

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);
4957
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);
5159
}
5260
}
5361
}

0 commit comments

Comments
 (0)