Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1531)

Unified Diff: Source/wtf/MathExtrasTest.cpp

Issue 653293003: CL for perf tryjob (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/wtf/MathExtras.h ('k') | Tools/run-perf-test.cfg » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « Source/wtf/MathExtras.h ('k') | Tools/run-perf-test.cfg » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698