| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Intel Corporation | 2 * Copyright (C) 2012 Intel Corporation |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| 23 * THE POSSIBILITY OF SUCH DAMAGE. | 23 * THE POSSIBILITY OF SUCH DAMAGE. |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #include "wtf/MathExtras.h" | 26 #include "wtf/MathExtras.h" |
| 27 | 27 |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 | 29 |
| 30 namespace WTF { | 30 namespace WTF { |
| 31 | 31 |
| 32 TEST(MathExtrasTest, Lrint) | 32 TEST(MathExtrasTest, Lrint) { |
| 33 { | 33 EXPECT_EQ(-8, lrint(-7.5)); |
| 34 EXPECT_EQ(-8, lrint(-7.5)); | 34 EXPECT_EQ(-8, lrint(-8.5)); |
| 35 EXPECT_EQ(-8, lrint(-8.5)); | 35 EXPECT_EQ(0, lrint(-0.5)); |
| 36 EXPECT_EQ(0, lrint(-0.5)); | 36 EXPECT_EQ(0, lrint(0.5)); |
| 37 EXPECT_EQ(0, lrint(0.5)); | 37 EXPECT_EQ(0, lrint(-0.5)); |
| 38 EXPECT_EQ(0, lrint(-0.5)); | 38 EXPECT_EQ(1, lrint(1.3)); |
| 39 EXPECT_EQ(1, lrint(1.3)); | 39 EXPECT_EQ(2, lrint(1.7)); |
| 40 EXPECT_EQ(2, lrint(1.7)); | 40 EXPECT_EQ(0, lrint(0)); |
| 41 EXPECT_EQ(0, lrint(0)); | 41 EXPECT_EQ(0, lrint(-0)); |
| 42 EXPECT_EQ(0, lrint(-0)); | 42 if (sizeof(long int) == 8) { |
| 43 if (sizeof(long int) == 8) { | 43 // Largest double number with 0.5 precision and one halfway rounding case be
low. |
| 44 // Largest double number with 0.5 precision and one halfway rounding cas
e below. | 44 EXPECT_EQ(pow(2.0, 52), lrint(pow(2.0, 52) - 0.5)); |
| 45 EXPECT_EQ(pow(2.0, 52), lrint(pow(2.0, 52) - 0.5)); | 45 EXPECT_EQ(pow(2.0, 52) - 2, lrint(pow(2.0, 52) - 1.5)); |
| 46 EXPECT_EQ(pow(2.0, 52) - 2, lrint(pow(2.0, 52) - 1.5)); | 46 // Smallest double number with 0.5 precision and one halfway rounding case a
bove. |
| 47 // Smallest double number with 0.5 precision and one halfway rounding ca
se above. | 47 EXPECT_EQ(-pow(2.0, 52), lrint(-pow(2.0, 52) + 0.5)); |
| 48 EXPECT_EQ(-pow(2.0, 52), lrint(-pow(2.0, 52) + 0.5)); | 48 EXPECT_EQ(-pow(2.0, 52) + 2, lrint(-pow(2.0, 52) + 1.5)); |
| 49 EXPECT_EQ(-pow(2.0, 52) + 2, lrint(-pow(2.0, 52) + 1.5)); | 49 } |
| 50 } | 50 } |
| 51 } | 51 |
| 52 | 52 TEST(MathExtrasTest, clampToIntLong) { |
| 53 TEST(MathExtrasTest, clampToIntLong) | 53 if (sizeof(long) == sizeof(int)) |
| 54 { | 54 return; |
| 55 if (sizeof(long) == sizeof(int)) | 55 |
| 56 return; | 56 long maxInt = std::numeric_limits<int>::max(); |
| 57 | 57 long minInt = std::numeric_limits<int>::min(); |
| 58 long maxInt = std::numeric_limits<int>::max(); | 58 long overflowInt = maxInt + 1; |
| 59 long minInt = std::numeric_limits<int>::min(); | 59 long underflowInt = minInt - 1; |
| 60 long overflowInt = maxInt + 1; | 60 |
| 61 long underflowInt = minInt - 1; | 61 EXPECT_GT(overflowInt, maxInt); |
| 62 | 62 EXPECT_LT(underflowInt, minInt); |
| 63 EXPECT_GT(overflowInt, maxInt); | 63 |
| 64 EXPECT_LT(underflowInt, minInt); | 64 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); |
| 65 | 65 EXPECT_EQ(minInt, clampTo<int>(minInt)); |
| 66 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); | 66 |
| 67 EXPECT_EQ(minInt, clampTo<int>(minInt)); | 67 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
| 68 | 68 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
| 69 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); | 69 } |
| 70 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); | 70 |
| 71 } | 71 TEST(MathExtrasTest, clampToIntLongLong) { |
| 72 | 72 long long maxInt = std::numeric_limits<int>::max(); |
| 73 TEST(MathExtrasTest, clampToIntLongLong) | 73 long long minInt = std::numeric_limits<int>::min(); |
| 74 { | 74 long long overflowInt = maxInt + 1; |
| 75 long long maxInt = std::numeric_limits<int>::max(); | 75 long long underflowInt = minInt - 1; |
| 76 long long minInt = std::numeric_limits<int>::min(); | 76 |
| 77 long long overflowInt = maxInt + 1; | 77 EXPECT_GT(overflowInt, maxInt); |
| 78 long long underflowInt = minInt - 1; | 78 EXPECT_LT(underflowInt, minInt); |
| 79 | 79 |
| 80 EXPECT_GT(overflowInt, maxInt); | 80 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); |
| 81 EXPECT_LT(underflowInt, minInt); | 81 EXPECT_EQ(minInt, clampTo<int>(minInt)); |
| 82 | 82 |
| 83 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); | 83 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
| 84 EXPECT_EQ(minInt, clampTo<int>(minInt)); | 84 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
| 85 | 85 } |
| 86 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); | 86 |
| 87 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); | 87 TEST(MathExtrasTest, clampToIntFloat) { |
| 88 } | 88 float maxInt = static_cast<float>(std::numeric_limits<int>::max()); |
| 89 | 89 float minInt = static_cast<float>(std::numeric_limits<int>::min()); |
| 90 TEST(MathExtrasTest, clampToIntFloat) | 90 float overflowInt = maxInt * 1.1f; |
| 91 { | 91 float underflowInt = minInt * 1.1f; |
| 92 float maxInt = static_cast<float>(std::numeric_limits<int>::max()); | 92 |
| 93 float minInt = static_cast<float>(std::numeric_limits<int>::min()); | 93 EXPECT_GT(overflowInt, maxInt); |
| 94 float overflowInt = maxInt * 1.1f; | 94 EXPECT_LT(underflowInt, minInt); |
| 95 float underflowInt = minInt * 1.1f; | 95 |
| 96 | 96 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); |
| 97 EXPECT_GT(overflowInt, maxInt); | 97 EXPECT_EQ(minInt, clampTo<int>(minInt)); |
| 98 EXPECT_LT(underflowInt, minInt); | 98 |
| 99 | 99 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
| 100 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); | 100 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
| 101 EXPECT_EQ(minInt, clampTo<int>(minInt)); | 101 |
| 102 | 102 // This value and the value one greater are typically represented the same |
| 103 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); | 103 // way when stored in a 32-bit float. Make sure clamping does not cause us |
| 104 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); | 104 // to erroneously jump to the larger value. |
| 105 | 105 int nearFloatPrecisionLimit = 2147483520; |
| 106 // This value and the value one greater are typically represented the same | 106 EXPECT_EQ(nearFloatPrecisionLimit, |
| 107 // way when stored in a 32-bit float. Make sure clamping does not cause us | 107 clampTo<int>(static_cast<float>(nearFloatPrecisionLimit), 0, |
| 108 // to erroneously jump to the larger value. | 108 nearFloatPrecisionLimit + 1)); |
| 109 int nearFloatPrecisionLimit = 2147483520; | 109 EXPECT_EQ(-nearFloatPrecisionLimit, |
| 110 EXPECT_EQ(nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(nearFloat
PrecisionLimit), 0, nearFloatPrecisionLimit + 1)); | 110 clampTo<int>(static_cast<float>(-nearFloatPrecisionLimit), |
| 111 EXPECT_EQ(-nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(-nearFlo
atPrecisionLimit), -nearFloatPrecisionLimit - 1, 0)); | 111 -nearFloatPrecisionLimit - 1, 0)); |
| 112 } | 112 } |
| 113 | 113 |
| 114 TEST(MathExtrasTest, clampToIntDouble) | 114 TEST(MathExtrasTest, clampToIntDouble) { |
| 115 { | 115 int maxInt = std::numeric_limits<int>::max(); |
| 116 int maxInt = std::numeric_limits<int>::max(); | 116 int minInt = std::numeric_limits<int>::min(); |
| 117 int minInt = std::numeric_limits<int>::min(); | 117 double almostOverflowInt = maxInt - 0.5; |
| 118 double almostOverflowInt = maxInt - 0.5; | 118 double overflowInt = maxInt + 0.5; |
| 119 double overflowInt = maxInt + 0.5; | 119 double almostUnderflowInt = minInt + 0.5; |
| 120 double almostUnderflowInt = minInt + 0.5; | 120 double underflowInt = minInt - 0.5; |
| 121 double underflowInt = minInt - 0.5; | 121 |
| 122 | 122 EXPECT_LT(almostOverflowInt, maxInt); |
| 123 EXPECT_LT(almostOverflowInt, maxInt); | 123 EXPECT_GT(overflowInt, maxInt); |
| 124 EXPECT_GT(overflowInt, maxInt); | 124 EXPECT_GT(almostUnderflowInt, minInt); |
| 125 EXPECT_GT(almostUnderflowInt, minInt); | 125 EXPECT_LT(underflowInt, minInt); |
| 126 EXPECT_LT(underflowInt, minInt); | 126 |
| 127 | 127 EXPECT_EQ(maxInt, clampTo<int>(static_cast<double>(maxInt))); |
| 128 EXPECT_EQ(maxInt, clampTo<int>(static_cast<double>(maxInt))); | 128 EXPECT_EQ(minInt, clampTo<int>(static_cast<double>(minInt))); |
| 129 EXPECT_EQ(minInt, clampTo<int>(static_cast<double>(minInt))); | 129 |
| 130 | 130 EXPECT_EQ(maxInt - 1, clampTo<int>(almostOverflowInt)); |
| 131 EXPECT_EQ(maxInt - 1, clampTo<int>(almostOverflowInt)); | 131 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
| 132 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); | 132 EXPECT_EQ(minInt + 1, clampTo<int>(almostUnderflowInt)); |
| 133 EXPECT_EQ(minInt + 1, clampTo<int>(almostUnderflowInt)); | 133 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
| 134 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); | 134 } |
| 135 } | 135 |
| 136 | 136 TEST(MathExtrasTest, clampToFloatDouble) { |
| 137 TEST(MathExtrasTest, clampToFloatDouble) | 137 double maxFloat = std::numeric_limits<float>::max(); |
| 138 { | 138 double minFloat = -maxFloat; |
| 139 double maxFloat = std::numeric_limits<float>::max(); | 139 double overflowFloat = maxFloat * 1.1; |
| 140 double minFloat = -maxFloat; | 140 double underflowFloat = minFloat * 1.1; |
| 141 double overflowFloat = maxFloat * 1.1; | 141 |
| 142 double underflowFloat = minFloat * 1.1; | 142 EXPECT_GT(overflowFloat, maxFloat); |
| 143 | 143 EXPECT_LT(underflowFloat, minFloat); |
| 144 EXPECT_GT(overflowFloat, maxFloat); | 144 |
| 145 EXPECT_LT(underflowFloat, minFloat); | 145 EXPECT_EQ(maxFloat, clampTo<float>(maxFloat)); |
| 146 | 146 EXPECT_EQ(minFloat, clampTo<float>(minFloat)); |
| 147 EXPECT_EQ(maxFloat, clampTo<float>(maxFloat)); | 147 |
| 148 EXPECT_EQ(minFloat, clampTo<float>(minFloat)); | 148 EXPECT_EQ(maxFloat, clampTo<float>(overflowFloat)); |
| 149 | 149 EXPECT_EQ(minFloat, clampTo<float>(underflowFloat)); |
| 150 EXPECT_EQ(maxFloat, clampTo<float>(overflowFloat)); | 150 |
| 151 EXPECT_EQ(minFloat, clampTo<float>(underflowFloat)); | 151 EXPECT_EQ(maxFloat, clampTo<float>(std::numeric_limits<float>::infinity())); |
| 152 | 152 EXPECT_EQ(minFloat, clampTo<float>(-std::numeric_limits<float>::infinity())); |
| 153 EXPECT_EQ(maxFloat, clampTo<float>(std::numeric_limits<float>::infinity())); | 153 } |
| 154 EXPECT_EQ(minFloat, clampTo<float>(-std::numeric_limits<float>::infinity()))
; | 154 |
| 155 } | 155 TEST(MathExtrasTest, clampToDouble) { |
| 156 | 156 EXPECT_EQ(0.0, clampTo<double>(0)); |
| 157 TEST(MathExtrasTest, clampToDouble) | 157 EXPECT_EQ(0.0, clampTo<double>(0.0f)); |
| 158 { | 158 EXPECT_EQ(0.0, clampTo<double>(0ULL)); |
| 159 EXPECT_EQ(0.0, clampTo<double>(0)); | 159 EXPECT_EQ(3.5, clampTo<double>(std::numeric_limits<unsigned long long>::max(), |
| 160 EXPECT_EQ(0.0, clampTo<double>(0.0f)); | 160 0.0, 3.5)); |
| 161 EXPECT_EQ(0.0, clampTo<double>(0ULL)); | 161 } |
| 162 EXPECT_EQ(3.5, clampTo<double>(std::numeric_limits<unsigned long long>::max(
), 0.0, 3.5)); | 162 |
| 163 } | 163 TEST(MathExtrasText, clampToLongLongDouble) { |
| 164 | 164 double overflowLL = |
| 165 TEST(MathExtrasText, clampToLongLongDouble) | 165 static_cast<double>(std::numeric_limits<long long>::max()) * 2; |
| 166 { | 166 EXPECT_EQ(std::numeric_limits<long long>::max(), |
| 167 double overflowLL = static_cast<double>(std::numeric_limits<long long>::max(
)) * 2; | 167 clampTo<long long>(overflowLL)); |
| 168 EXPECT_EQ(std::numeric_limits<long long>::max(), clampTo<long long>(overflow
LL)); | 168 EXPECT_EQ(std::numeric_limits<long long>::min(), |
| 169 EXPECT_EQ(std::numeric_limits<long long>::min(), clampTo<long long>(-overflo
wLL)); | 169 clampTo<long long>(-overflowLL)); |
| 170 } | 170 } |
| 171 | 171 |
| 172 TEST(MathExtrasText, clampToUnsignedLongLongDouble) | 172 TEST(MathExtrasText, clampToUnsignedLongLongDouble) { |
| 173 { | 173 double overflowULL = |
| 174 double overflowULL = static_cast<double>(std::numeric_limits<unsigned long l
ong>::max()) * 2; | 174 static_cast<double>(std::numeric_limits<unsigned long long>::max()) * 2; |
| 175 EXPECT_EQ(std::numeric_limits<unsigned long long>::max(), clampTo<unsigned l
ong long>(overflowULL)); | 175 EXPECT_EQ(std::numeric_limits<unsigned long long>::max(), |
| 176 EXPECT_EQ(std::numeric_limits<unsigned long long>::min(), clampTo<unsigned l
ong long>(-overflowULL)); | 176 clampTo<unsigned long long>(overflowULL)); |
| 177 } | 177 EXPECT_EQ(std::numeric_limits<unsigned long long>::min(), |
| 178 | 178 clampTo<unsigned long long>(-overflowULL)); |
| 179 TEST(MathExtrasTest, clampToUnsignedUnsignedLong) | 179 } |
| 180 { | 180 |
| 181 if (sizeof(unsigned long) == sizeof(unsigned)) | 181 TEST(MathExtrasTest, clampToUnsignedUnsignedLong) { |
| 182 return; | 182 if (sizeof(unsigned long) == sizeof(unsigned)) |
| 183 | 183 return; |
| 184 unsigned long maxUnsigned = std::numeric_limits<unsigned>::max(); | 184 |
| 185 unsigned long overflowUnsigned = maxUnsigned + 1; | 185 unsigned long maxUnsigned = std::numeric_limits<unsigned>::max(); |
| 186 | 186 unsigned long overflowUnsigned = maxUnsigned + 1; |
| 187 EXPECT_GT(overflowUnsigned, maxUnsigned); | 187 |
| 188 | 188 EXPECT_GT(overflowUnsigned, maxUnsigned); |
| 189 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); | 189 |
| 190 | 190 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); |
| 191 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); | 191 |
| 192 EXPECT_EQ(0u, clampTo<unsigned>(-1)); | 192 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); |
| 193 } | 193 EXPECT_EQ(0u, clampTo<unsigned>(-1)); |
| 194 | 194 } |
| 195 TEST(MathExtrasTest, clampToUnsignedUnsignedLongLong) | 195 |
| 196 { | 196 TEST(MathExtrasTest, clampToUnsignedUnsignedLongLong) { |
| 197 unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max(); | 197 unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max(); |
| 198 unsigned long long overflowUnsigned = maxUnsigned + 1; | 198 unsigned long long overflowUnsigned = maxUnsigned + 1; |
| 199 | 199 |
| 200 EXPECT_GT(overflowUnsigned, maxUnsigned); | 200 EXPECT_GT(overflowUnsigned, maxUnsigned); |
| 201 | 201 |
| 202 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); | 202 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); |
| 203 | 203 |
| 204 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); | 204 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); |
| 205 EXPECT_EQ(0u, clampTo<unsigned>(-1)); | 205 EXPECT_EQ(0u, clampTo<unsigned>(-1)); |
| 206 } | 206 } |
| 207 | 207 |
| 208 TEST(MathExtrasTest, clampToLongLongUnsignedLongLong) | 208 TEST(MathExtrasTest, clampToLongLongUnsignedLongLong) { |
| 209 { | 209 long long maxLongLongLL = std::numeric_limits<long long>::max(); |
| 210 long long maxLongLongLL = std::numeric_limits<long long>::max(); | 210 unsigned long long maxLongLongULL = maxLongLongLL; |
| 211 unsigned long long maxLongLongULL = maxLongLongLL; | 211 unsigned long long overflowLongLong = maxLongLongULL + 1; |
| 212 unsigned long long overflowLongLong = maxLongLongULL + 1; | 212 |
| 213 | 213 EXPECT_GT(overflowLongLong, maxLongLongULL); |
| 214 EXPECT_GT(overflowLongLong, maxLongLongULL); | 214 |
| 215 | 215 EXPECT_EQ(maxLongLongLL, clampTo<long long>(maxLongLongULL)); |
| 216 EXPECT_EQ(maxLongLongLL, clampTo<long long>(maxLongLongULL)); | 216 EXPECT_EQ(maxLongLongLL - 1, clampTo<long long>(maxLongLongULL - 1)); |
| 217 EXPECT_EQ(maxLongLongLL - 1, clampTo<long long>(maxLongLongULL - 1)); | 217 EXPECT_EQ(maxLongLongLL, clampTo<long long>(overflowLongLong)); |
| 218 EXPECT_EQ(maxLongLongLL, clampTo<long long>(overflowLongLong)); | 218 |
| 219 | 219 EXPECT_EQ(-3LL, clampTo<long long>(2ULL, -5LL, -3LL)); |
| 220 EXPECT_EQ(-3LL, clampTo<long long>(2ULL, -5LL, -3LL)); | 220 } |
| 221 } | 221 |
| 222 | 222 TEST(MathExtrasTest, clampToUnsignedLongLongInt) { |
| 223 TEST(MathExtrasTest, clampToUnsignedLongLongInt) | 223 EXPECT_EQ(0ULL, clampTo<unsigned long long>(-1)); |
| 224 { | 224 EXPECT_EQ(0ULL, clampTo<unsigned long long>(0)); |
| 225 EXPECT_EQ(0ULL, clampTo<unsigned long long>(-1)); | 225 EXPECT_EQ(1ULL, clampTo<unsigned long long>(1)); |
| 226 EXPECT_EQ(0ULL, clampTo<unsigned long long>(0)); | 226 } |
| 227 EXPECT_EQ(1ULL, clampTo<unsigned long long>(1)); | 227 |
| 228 } | 228 TEST(MathExtrasTest, clampToUnsignedLongLongUnsignedLongLong) { |
| 229 | 229 EXPECT_EQ(0ULL, clampTo<unsigned long long>(0ULL)); |
| 230 TEST(MathExtrasTest, clampToUnsignedLongLongUnsignedLongLong) | 230 EXPECT_EQ(1ULL, clampTo<unsigned long long>(0ULL, 1ULL, 2ULL)); |
| 231 { | 231 EXPECT_EQ(2ULL, clampTo<unsigned long long>(3ULL, 1ULL, 2ULL)); |
| 232 EXPECT_EQ(0ULL, clampTo<unsigned long long>(0ULL)); | 232 EXPECT_EQ(0xFFFFFFFFFFFFFFF5ULL, |
| 233 EXPECT_EQ(1ULL, clampTo<unsigned long long>(0ULL, 1ULL, 2ULL)); | 233 clampTo<unsigned long long>(0xFFFFFFFFFFFFFFF5ULL)); |
| 234 EXPECT_EQ(2ULL, clampTo<unsigned long long>(3ULL, 1ULL, 2ULL)); | |
| 235 EXPECT_EQ(0xFFFFFFFFFFFFFFF5ULL, clampTo<unsigned long long>(0xFFFFFFFFFFFFF
FF5ULL)); | |
| 236 } | 234 } |
| 237 | 235 |
| 238 // Make sure that various +-inf cases are handled properly (they aren't | 236 // Make sure that various +-inf cases are handled properly (they aren't |
| 239 // by default on VS). | 237 // by default on VS). |
| 240 TEST(MathExtrasTest, infinityMath) | 238 TEST(MathExtrasTest, infinityMath) { |
| 241 { | 239 double posInf = std::numeric_limits<double>::infinity(); |
| 242 double posInf = std::numeric_limits<double>::infinity(); | 240 double negInf = -std::numeric_limits<double>::infinity(); |
| 243 double negInf = -std::numeric_limits<double>::infinity(); | 241 double nan = std::numeric_limits<double>::quiet_NaN(); |
| 244 double nan = std::numeric_limits<double>::quiet_NaN(); | 242 |
| 245 | 243 EXPECT_EQ(M_PI_4, atan2(posInf, posInf)); |
| 246 EXPECT_EQ(M_PI_4, atan2(posInf, posInf)); | 244 EXPECT_EQ(3.0 * M_PI_4, atan2(posInf, negInf)); |
| 247 EXPECT_EQ(3.0 * M_PI_4, atan2(posInf, negInf)); | 245 EXPECT_EQ(-M_PI_4, atan2(negInf, posInf)); |
| 248 EXPECT_EQ(-M_PI_4, atan2(negInf, posInf)); | 246 EXPECT_EQ(-3.0 * M_PI_4, atan2(negInf, negInf)); |
| 249 EXPECT_EQ(-3.0 * M_PI_4, atan2(negInf, negInf)); | 247 |
| 250 | 248 EXPECT_EQ(0.0, fmod(0.0, posInf)); |
| 251 EXPECT_EQ(0.0, fmod(0.0, posInf)); | 249 EXPECT_EQ(7.0, fmod(7.0, posInf)); |
| 252 EXPECT_EQ(7.0, fmod(7.0, posInf)); | 250 EXPECT_EQ(-7.0, fmod(-7.0, posInf)); |
| 253 EXPECT_EQ(-7.0, fmod(-7.0, posInf)); | 251 EXPECT_EQ(0.0, fmod(0.0, negInf)); |
| 254 EXPECT_EQ(0.0, fmod(0.0, negInf)); | 252 EXPECT_EQ(7.0, fmod(7.0, negInf)); |
| 255 EXPECT_EQ(7.0, fmod(7.0, negInf)); | 253 EXPECT_EQ(-7.0, fmod(-7.0, negInf)); |
| 256 EXPECT_EQ(-7.0, fmod(-7.0, negInf)); | 254 |
| 257 | 255 EXPECT_EQ(1.0, pow(5.0, 0.0)); |
| 258 EXPECT_EQ(1.0, pow(5.0, 0.0)); | 256 EXPECT_EQ(1.0, pow(-5.0, 0.0)); |
| 259 EXPECT_EQ(1.0, pow(-5.0, 0.0)); | 257 EXPECT_EQ(1.0, pow(nan, 0.0)); |
| 260 EXPECT_EQ(1.0, pow(nan, 0.0)); | 258 } |
| 261 } | 259 |
| 262 | 260 } // namespace WTF |
| 263 } // namespace WTF | |
| OLD | NEW |