diff options
Diffstat (limited to 'deps/v8/test/unittests/utils-unittest.cc')
-rw-r--r-- | deps/v8/test/unittests/utils-unittest.cc | 113 |
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 |