summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/utils-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/utils-unittest.cc')
-rw-r--r--deps/v8/test/unittests/utils-unittest.cc113
1 files changed, 113 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/utils-unittest.cc b/deps/v8/test/unittests/utils-unittest.cc
new file mode 100644
index 0000000000..65088d873b
--- /dev/null
+++ b/deps/v8/test/unittests/utils-unittest.cc
@@ -0,0 +1,113 @@
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <limits>
+
+#include "src/utils.h"
+#include "testing/gtest-support.h"
+
+namespace v8 {
+namespace internal {
+
+template <typename T>
+class UtilsTest : public ::testing::Test {};
+
+typedef ::testing::Types<signed char, unsigned char,
+ short, // NOLINT(runtime/int)
+ unsigned short, // NOLINT(runtime/int)
+ int, unsigned int, long, // NOLINT(runtime/int)
+ unsigned long, // NOLINT(runtime/int)
+ long long, // NOLINT(runtime/int)
+ unsigned long long, // NOLINT(runtime/int)
+ int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t,
+ int64_t, uint64_t>
+ IntegerTypes;
+
+TYPED_TEST_CASE(UtilsTest, IntegerTypes);
+
+TYPED_TEST(UtilsTest, SaturateSub) {
+ TypeParam min = std::numeric_limits<TypeParam>::min();
+ TypeParam max = std::numeric_limits<TypeParam>::max();
+ EXPECT_EQ(SaturateSub<TypeParam>(min, 0), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(max, 0), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(max, min), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(min, max), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(min, max / 3), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(min + 1, 2), min);
+ if (std::numeric_limits<TypeParam>::is_signed) {
+ EXPECT_EQ(SaturateSub<TypeParam>(min, min), static_cast<TypeParam>(0));
+ EXPECT_EQ(SaturateSub<TypeParam>(0, min), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(max / 3, min), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(max / 5, min), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(min / 3, max), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(min / 9, max), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(max, min / 3), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(min, max / 3), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(max / 3 * 2, min / 2), max);
+ EXPECT_EQ(SaturateSub<TypeParam>(min / 3 * 2, max / 2), min);
+ } else {
+ EXPECT_EQ(SaturateSub<TypeParam>(min, min), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(0, min), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(0, max), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(max / 3, max), min);
+ EXPECT_EQ(SaturateSub<TypeParam>(max - 3, max), min);
+ }
+ TypeParam test_cases[] = {static_cast<TypeParam>(min / 23),
+ static_cast<TypeParam>(max / 3),
+ 63,
+ static_cast<TypeParam>(min / 6),
+ static_cast<TypeParam>(max / 55),
+ static_cast<TypeParam>(min / 2),
+ static_cast<TypeParam>(max / 2),
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 42};
+ TRACED_FOREACH(TypeParam, x, test_cases) {
+ TRACED_FOREACH(TypeParam, y, test_cases) {
+ if (std::numeric_limits<TypeParam>::is_signed) {
+ EXPECT_EQ(SaturateSub<TypeParam>(x, y), x - y);
+ } else {
+ EXPECT_EQ(SaturateSub<TypeParam>(x, y), y > x ? min : x - y);
+ }
+ }
+ }
+}
+
+TYPED_TEST(UtilsTest, SaturateAdd) {
+ TypeParam min = std::numeric_limits<TypeParam>::min();
+ TypeParam max = std::numeric_limits<TypeParam>::max();
+ EXPECT_EQ(SaturateAdd<TypeParam>(min, min), min);
+ EXPECT_EQ(SaturateAdd<TypeParam>(max, max), max);
+ EXPECT_EQ(SaturateAdd<TypeParam>(min, min / 3), min);
+ EXPECT_EQ(SaturateAdd<TypeParam>(max / 8 * 7, max / 3 * 2), max);
+ EXPECT_EQ(SaturateAdd<TypeParam>(min / 3 * 2, min / 8 * 7), min);
+ EXPECT_EQ(SaturateAdd<TypeParam>(max / 20 * 18, max / 25 * 18), max);
+ EXPECT_EQ(SaturateAdd<TypeParam>(min / 3 * 2, min / 3 * 2), min);
+ EXPECT_EQ(SaturateAdd<TypeParam>(max - 1, 2), max);
+ EXPECT_EQ(SaturateAdd<TypeParam>(max - 100, 101), max);
+ TypeParam test_cases[] = {static_cast<TypeParam>(min / 23),
+ static_cast<TypeParam>(max / 3),
+ 63,
+ static_cast<TypeParam>(min / 6),
+ static_cast<TypeParam>(max / 55),
+ static_cast<TypeParam>(min / 2),
+ static_cast<TypeParam>(max / 2),
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 42};
+ TRACED_FOREACH(TypeParam, x, test_cases) {
+ TRACED_FOREACH(TypeParam, y, test_cases) {
+ EXPECT_EQ(SaturateAdd<TypeParam>(x, y), x + y);
+ }
+ }
+}
+
+} // namespace internal
+} // namespace v8