Index: Source/wtf/MathExtrasTest.cpp |
diff --git a/Source/wtf/MathExtrasTest.cpp b/Source/wtf/MathExtrasTest.cpp |
index 7a46ec02c1c83f9caf2db244d6b5f35089b6d58f..034573f3234dd259f4d2ba934c59994fe40d0692 100644 |
--- a/Source/wtf/MathExtrasTest.cpp |
+++ b/Source/wtf/MathExtrasTest.cpp |
@@ -88,45 +88,54 @@ TEST(MathExtrasTest, clampToIntLongLong) |
EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
} |
-TEST(MathExtrasTest, clampToIntegerFloat) |
+TEST(MathExtrasTest, clampToIntFloat) |
{ |
- // This test is inaccurate as floats will round the min / max integer |
- // due to the narrow mantissa. However it will properly checks within |
- // (close to the extreme) and outside the integer range. |
- float maxInt = std::numeric_limits<int>::max(); |
- float minInt = std::numeric_limits<int>::min(); |
- float overflowInt = maxInt * 1.1; |
- float underflowInt = minInt * 1.1; |
+ float maxInt = static_cast<float>(std::numeric_limits<int>::max()); |
+ float minInt = static_cast<float>(std::numeric_limits<int>::min()); |
+ float overflowInt = maxInt * 1.1f; |
+ float underflowInt = minInt * 1.1f; |
EXPECT_GT(overflowInt, maxInt); |
EXPECT_LT(underflowInt, minInt); |
- // If maxInt == 2^31 - 1 (ie on I32 architecture), the closest float used to represent it is 2^31. |
- EXPECT_NEAR(clampToInteger(maxInt), maxInt, 1); |
- EXPECT_EQ(minInt, clampToInteger(minInt)); |
+ EXPECT_EQ(maxInt, clampTo<int>(maxInt)); |
+ EXPECT_EQ(minInt, clampTo<int>(minInt)); |
+ |
+ EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
+ EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
- EXPECT_NEAR(clampToInteger(overflowInt), maxInt, 1); |
- EXPECT_EQ(minInt, clampToInteger(underflowInt)); |
+ // This value and the value one greater are typically represented the same |
+ // way when stored in a 32-bit float. Make sure clamping does not cause us |
+ // to erroneously jump to the larger value. |
+ int nearFloatPrecisionLimit = 2147483520; |
+ EXPECT_EQ(nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(nearFloatPrecisionLimit), 0, nearFloatPrecisionLimit + 1)); |
+ EXPECT_EQ(-nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(-nearFloatPrecisionLimit), -nearFloatPrecisionLimit - 1, 0)); |
} |
-TEST(MathExtrasTest, clampToIntegerDouble) |
+TEST(MathExtrasTest, clampToIntDouble) |
{ |
- double maxInt = std::numeric_limits<int>::max(); |
- double minInt = std::numeric_limits<int>::min(); |
- double overflowInt = maxInt + 1; |
- double underflowInt = minInt - 1; |
- |
+ int maxInt = std::numeric_limits<int>::max(); |
+ int minInt = std::numeric_limits<int>::min(); |
+ double almostOverflowInt = maxInt - 0.5; |
+ double overflowInt = maxInt + 0.5; |
+ double almostUnderflowInt = minInt + 0.5; |
+ double underflowInt = minInt - 0.5; |
+ |
+ EXPECT_LT(almostOverflowInt, maxInt); |
EXPECT_GT(overflowInt, maxInt); |
+ EXPECT_GT(almostUnderflowInt, minInt); |
EXPECT_LT(underflowInt, minInt); |
- EXPECT_EQ(maxInt, clampToInteger(maxInt)); |
- EXPECT_EQ(minInt, clampToInteger(minInt)); |
+ EXPECT_EQ(maxInt, clampTo<int>(static_cast<double>(maxInt))); |
+ EXPECT_EQ(minInt, clampTo<int>(static_cast<double>(minInt))); |
- EXPECT_EQ(clampToInteger(overflowInt), maxInt); |
- EXPECT_EQ(clampToInteger(underflowInt), minInt); |
+ EXPECT_EQ(maxInt - 1, clampTo<int>(almostOverflowInt)); |
+ EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
+ EXPECT_EQ(minInt + 1, clampTo<int>(almostUnderflowInt)); |
+ EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
} |
-TEST(MathExtrasTest, clampToFloat) |
+TEST(MathExtrasTest, clampToFloatDouble) |
{ |
double maxFloat = std::numeric_limits<float>::max(); |
double minFloat = -maxFloat; |
@@ -136,17 +145,39 @@ TEST(MathExtrasTest, clampToFloat) |
EXPECT_GT(overflowFloat, maxFloat); |
EXPECT_LT(underflowFloat, minFloat); |
- EXPECT_EQ(maxFloat, clampToFloat(maxFloat)); |
- EXPECT_EQ(minFloat, clampToFloat(minFloat)); |
+ EXPECT_EQ(maxFloat, clampTo<float>(maxFloat)); |
+ EXPECT_EQ(minFloat, clampTo<float>(minFloat)); |
- EXPECT_EQ(maxFloat, clampToFloat(overflowFloat)); |
- EXPECT_EQ(minFloat, clampToFloat(underflowFloat)); |
+ EXPECT_EQ(maxFloat, clampTo<float>(overflowFloat)); |
+ EXPECT_EQ(minFloat, clampTo<float>(underflowFloat)); |
- EXPECT_EQ(maxFloat, clampToFloat(std::numeric_limits<float>::infinity())); |
- EXPECT_EQ(minFloat, clampToFloat(-std::numeric_limits<float>::infinity())); |
+ EXPECT_EQ(maxFloat, clampTo<float>(std::numeric_limits<float>::infinity())); |
+ EXPECT_EQ(minFloat, clampTo<float>(-std::numeric_limits<float>::infinity())); |
} |
-TEST(MathExtrasTest, clampToUnsignedLong) |
+TEST(MathExtrasTest, clampToDouble) |
+{ |
+ EXPECT_EQ(0.0, clampTo<double>(0)); |
+ EXPECT_EQ(0.0, clampTo<double>(0.0f)); |
+ EXPECT_EQ(0.0, clampTo<double>(0ULL)); |
+ EXPECT_EQ(3.5, clampTo<double>(std::numeric_limits<unsigned long long>::max(), 0.0, 3.5)); |
+} |
+ |
+TEST(MathExtrasText, clampToLongLongDouble) |
+{ |
+ double overflowLL = static_cast<double>(std::numeric_limits<long long>::max()) * 2; |
+ EXPECT_EQ(std::numeric_limits<long long>::max(), clampTo<long long>(overflowLL)); |
+ EXPECT_EQ(std::numeric_limits<long long>::min(), clampTo<long long>(-overflowLL)); |
+} |
+ |
+TEST(MathExtrasText, clampToUnsignedLongLongDouble) |
+{ |
+ double overflowULL = static_cast<double>(std::numeric_limits<unsigned long long>::max()) * 2; |
+ EXPECT_EQ(std::numeric_limits<unsigned long long>::max(), clampTo<unsigned long long>(overflowULL)); |
+ EXPECT_EQ(std::numeric_limits<unsigned long long>::min(), clampTo<unsigned long long>(-overflowULL)); |
+} |
+ |
+TEST(MathExtrasTest, clampToUnsignedUnsignedLong) |
{ |
if (sizeof(unsigned long) == sizeof(unsigned)) |
return; |
@@ -162,7 +193,7 @@ TEST(MathExtrasTest, clampToUnsignedLong) |
EXPECT_EQ(0u, clampTo<unsigned>(-1)); |
} |
-TEST(MathExtrasTest, clampToUnsignedLongLong) |
+TEST(MathExtrasTest, clampToUnsignedUnsignedLongLong) |
{ |
unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max(); |
unsigned long long overflowUnsigned = maxUnsigned + 1; |
@@ -175,6 +206,36 @@ TEST(MathExtrasTest, clampToUnsignedLongLong) |
EXPECT_EQ(0u, clampTo<unsigned>(-1)); |
} |
+TEST(MathExtrasTest, clampToLongLongUnsignedLongLong) |
+{ |
+ long long maxLongLongLL = std::numeric_limits<long long>::max(); |
+ unsigned long long maxLongLongULL = maxLongLongLL; |
+ unsigned long long overflowLongLong = maxLongLongULL + 1; |
+ |
+ EXPECT_GT(overflowLongLong, maxLongLongULL); |
+ |
+ EXPECT_EQ(maxLongLongLL, clampTo<long long>(maxLongLongULL)); |
+ EXPECT_EQ(maxLongLongLL - 1, clampTo<long long>(maxLongLongULL - 1)); |
+ EXPECT_EQ(maxLongLongLL, clampTo<long long>(overflowLongLong)); |
+ |
+ EXPECT_EQ(-3LL, clampTo<long long>(2ULL, -5LL, -3LL)); |
+} |
+ |
+TEST(MathExtrasTest, clampToUnsignedLongLongInt) |
+{ |
+ EXPECT_EQ(0ULL, clampTo<unsigned long long>(-1)); |
+ EXPECT_EQ(0ULL, clampTo<unsigned long long>(0)); |
+ EXPECT_EQ(1ULL, clampTo<unsigned long long>(1)); |
+} |
+ |
+TEST(MathExtrasTest, clampToUnsignedLongLongUnsignedLongLong) |
+{ |
+ EXPECT_EQ(0ULL, clampTo<unsigned long long>(0ULL)); |
+ EXPECT_EQ(1ULL, clampTo<unsigned long long>(0ULL, 1ULL, 2ULL)); |
+ EXPECT_EQ(2ULL, clampTo<unsigned long long>(3ULL, 1ULL, 2ULL)); |
+ EXPECT_EQ(0xFFFFFFFFFFFFFFF5ULL, clampTo<unsigned long long>(0xFFFFFFFFFFFFFFF5ULL)); |
+} |
+ |
// Make sure that various +-inf cases are handled properly (they aren't |
// by default on VS). |
TEST(MathExtrasTest, infinityMath) |