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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 EXPECT_GT(overflowInt, maxInt); | 81 EXPECT_GT(overflowInt, maxInt); |
82 EXPECT_LT(underflowInt, minInt); | 82 EXPECT_LT(underflowInt, minInt); |
83 | 83 |
84 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); | 84 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); |
85 EXPECT_EQ(minInt, clampTo<int>(minInt)); | 85 EXPECT_EQ(minInt, clampTo<int>(minInt)); |
86 | 86 |
87 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); | 87 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
88 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); | 88 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
89 } | 89 } |
90 | 90 |
91 TEST(MathExtrasTest, clampToIntegerFloat) | 91 TEST(MathExtrasTest, clampToIntFloat) |
92 { | 92 { |
93 // This test is inaccurate as floats will round the min / max integer | 93 float maxInt = static_cast<float>(std::numeric_limits<int>::max()); |
94 // due to the narrow mantissa. However it will properly checks within | 94 float minInt = static_cast<float>(std::numeric_limits<int>::min()); |
95 // (close to the extreme) and outside the integer range. | 95 float overflowInt = maxInt * 1.1f; |
96 float maxInt = std::numeric_limits<int>::max(); | 96 float underflowInt = minInt * 1.1f; |
97 float minInt = std::numeric_limits<int>::min(); | |
98 float overflowInt = maxInt * 1.1; | |
99 float underflowInt = minInt * 1.1; | |
100 | 97 |
101 EXPECT_GT(overflowInt, maxInt); | 98 EXPECT_GT(overflowInt, maxInt); |
102 EXPECT_LT(underflowInt, minInt); | 99 EXPECT_LT(underflowInt, minInt); |
103 | 100 |
104 // If maxInt == 2^31 - 1 (ie on I32 architecture), the closest float used to
represent it is 2^31. | 101 EXPECT_EQ(maxInt, clampTo<int>(maxInt)); |
105 EXPECT_NEAR(clampToInteger(maxInt), maxInt, 1); | 102 EXPECT_EQ(minInt, clampTo<int>(minInt)); |
106 EXPECT_EQ(minInt, clampToInteger(minInt)); | |
107 | 103 |
108 EXPECT_NEAR(clampToInteger(overflowInt), maxInt, 1); | 104 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
109 EXPECT_EQ(minInt, clampToInteger(underflowInt)); | 105 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
| 106 |
| 107 // This value and the value one greater are typically represented the same |
| 108 // way when stored in a 32-bit float. Make sure clamping does not cause us |
| 109 // to erroneously jump to the larger value. |
| 110 int nearFloatPrecisionLimit = 2147483520; |
| 111 EXPECT_EQ(nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(nearFloat
PrecisionLimit), 0, nearFloatPrecisionLimit + 1)); |
| 112 EXPECT_EQ(-nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(-nearFlo
atPrecisionLimit), -nearFloatPrecisionLimit - 1, 0)); |
110 } | 113 } |
111 | 114 |
112 TEST(MathExtrasTest, clampToIntegerDouble) | 115 TEST(MathExtrasTest, clampToIntDouble) |
113 { | 116 { |
114 double maxInt = std::numeric_limits<int>::max(); | 117 int maxInt = std::numeric_limits<int>::max(); |
115 double minInt = std::numeric_limits<int>::min(); | 118 int minInt = std::numeric_limits<int>::min(); |
116 double overflowInt = maxInt + 1; | 119 double almostOverflowInt = maxInt - 0.5; |
117 double underflowInt = minInt - 1; | 120 double overflowInt = maxInt + 0.5; |
| 121 double almostUnderflowInt = minInt + 0.5; |
| 122 double underflowInt = minInt - 0.5; |
118 | 123 |
| 124 EXPECT_LT(almostOverflowInt, maxInt); |
119 EXPECT_GT(overflowInt, maxInt); | 125 EXPECT_GT(overflowInt, maxInt); |
| 126 EXPECT_GT(almostUnderflowInt, minInt); |
120 EXPECT_LT(underflowInt, minInt); | 127 EXPECT_LT(underflowInt, minInt); |
121 | 128 |
122 EXPECT_EQ(maxInt, clampToInteger(maxInt)); | 129 EXPECT_EQ(maxInt, clampTo<int>(static_cast<double>(maxInt))); |
123 EXPECT_EQ(minInt, clampToInteger(minInt)); | 130 EXPECT_EQ(minInt, clampTo<int>(static_cast<double>(minInt))); |
124 | 131 |
125 EXPECT_EQ(clampToInteger(overflowInt), maxInt); | 132 EXPECT_EQ(maxInt - 1, clampTo<int>(almostOverflowInt)); |
126 EXPECT_EQ(clampToInteger(underflowInt), minInt); | 133 EXPECT_EQ(maxInt, clampTo<int>(overflowInt)); |
| 134 EXPECT_EQ(minInt + 1, clampTo<int>(almostUnderflowInt)); |
| 135 EXPECT_EQ(minInt, clampTo<int>(underflowInt)); |
127 } | 136 } |
128 | 137 |
129 TEST(MathExtrasTest, clampToFloat) | 138 TEST(MathExtrasTest, clampToFloatDouble) |
130 { | 139 { |
131 double maxFloat = std::numeric_limits<float>::max(); | 140 double maxFloat = std::numeric_limits<float>::max(); |
132 double minFloat = -maxFloat; | 141 double minFloat = -maxFloat; |
133 double overflowFloat = maxFloat * 1.1; | 142 double overflowFloat = maxFloat * 1.1; |
134 double underflowFloat = minFloat * 1.1; | 143 double underflowFloat = minFloat * 1.1; |
135 | 144 |
136 EXPECT_GT(overflowFloat, maxFloat); | 145 EXPECT_GT(overflowFloat, maxFloat); |
137 EXPECT_LT(underflowFloat, minFloat); | 146 EXPECT_LT(underflowFloat, minFloat); |
138 | 147 |
139 EXPECT_EQ(maxFloat, clampToFloat(maxFloat)); | 148 EXPECT_EQ(maxFloat, clampTo<float>(maxFloat)); |
140 EXPECT_EQ(minFloat, clampToFloat(minFloat)); | 149 EXPECT_EQ(minFloat, clampTo<float>(minFloat)); |
141 | 150 |
142 EXPECT_EQ(maxFloat, clampToFloat(overflowFloat)); | 151 EXPECT_EQ(maxFloat, clampTo<float>(overflowFloat)); |
143 EXPECT_EQ(minFloat, clampToFloat(underflowFloat)); | 152 EXPECT_EQ(minFloat, clampTo<float>(underflowFloat)); |
144 | 153 |
145 EXPECT_EQ(maxFloat, clampToFloat(std::numeric_limits<float>::infinity())); | 154 EXPECT_EQ(maxFloat, clampTo<float>(std::numeric_limits<float>::infinity())); |
146 EXPECT_EQ(minFloat, clampToFloat(-std::numeric_limits<float>::infinity())); | 155 EXPECT_EQ(minFloat, clampTo<float>(-std::numeric_limits<float>::infinity()))
; |
147 } | 156 } |
148 | 157 |
149 TEST(MathExtrasTest, clampToUnsignedLong) | 158 TEST(MathExtrasTest, clampToDouble) |
| 159 { |
| 160 EXPECT_EQ(0.0, clampTo<double>(0)); |
| 161 EXPECT_EQ(0.0, clampTo<double>(0.0f)); |
| 162 EXPECT_EQ(0.0, clampTo<double>(0ULL)); |
| 163 EXPECT_EQ(3.5, clampTo<double>(std::numeric_limits<unsigned long long>::max(
), 0.0, 3.5)); |
| 164 } |
| 165 |
| 166 TEST(MathExtrasText, clampToLongLongDouble) |
| 167 { |
| 168 double overflowLL = static_cast<double>(std::numeric_limits<long long>::max(
)) * 2; |
| 169 EXPECT_EQ(std::numeric_limits<long long>::max(), clampTo<long long>(overflow
LL)); |
| 170 EXPECT_EQ(std::numeric_limits<long long>::min(), clampTo<long long>(-overflo
wLL)); |
| 171 } |
| 172 |
| 173 TEST(MathExtrasText, clampToUnsignedLongLongDouble) |
| 174 { |
| 175 double overflowULL = static_cast<double>(std::numeric_limits<unsigned long l
ong>::max()) * 2; |
| 176 EXPECT_EQ(std::numeric_limits<unsigned long long>::max(), clampTo<unsigned l
ong long>(overflowULL)); |
| 177 EXPECT_EQ(std::numeric_limits<unsigned long long>::min(), clampTo<unsigned l
ong long>(-overflowULL)); |
| 178 } |
| 179 |
| 180 TEST(MathExtrasTest, clampToUnsignedUnsignedLong) |
150 { | 181 { |
151 if (sizeof(unsigned long) == sizeof(unsigned)) | 182 if (sizeof(unsigned long) == sizeof(unsigned)) |
152 return; | 183 return; |
153 | 184 |
154 unsigned long maxUnsigned = std::numeric_limits<unsigned>::max(); | 185 unsigned long maxUnsigned = std::numeric_limits<unsigned>::max(); |
155 unsigned long overflowUnsigned = maxUnsigned + 1; | 186 unsigned long overflowUnsigned = maxUnsigned + 1; |
156 | 187 |
157 EXPECT_GT(overflowUnsigned, maxUnsigned); | 188 EXPECT_GT(overflowUnsigned, maxUnsigned); |
158 | 189 |
159 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); | 190 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); |
160 | 191 |
161 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); | 192 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); |
162 EXPECT_EQ(0u, clampTo<unsigned>(-1)); | 193 EXPECT_EQ(0u, clampTo<unsigned>(-1)); |
163 } | 194 } |
164 | 195 |
165 TEST(MathExtrasTest, clampToUnsignedLongLong) | 196 TEST(MathExtrasTest, clampToUnsignedUnsignedLongLong) |
166 { | 197 { |
167 unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max(); | 198 unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max(); |
168 unsigned long long overflowUnsigned = maxUnsigned + 1; | 199 unsigned long long overflowUnsigned = maxUnsigned + 1; |
169 | 200 |
170 EXPECT_GT(overflowUnsigned, maxUnsigned); | 201 EXPECT_GT(overflowUnsigned, maxUnsigned); |
171 | 202 |
172 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); | 203 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned)); |
173 | 204 |
174 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); | 205 EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned)); |
175 EXPECT_EQ(0u, clampTo<unsigned>(-1)); | 206 EXPECT_EQ(0u, clampTo<unsigned>(-1)); |
176 } | 207 } |
177 | 208 |
| 209 TEST(MathExtrasTest, clampToLongLongUnsignedLongLong) |
| 210 { |
| 211 long long maxLongLongLL = std::numeric_limits<long long>::max(); |
| 212 unsigned long long maxLongLongULL = maxLongLongLL; |
| 213 unsigned long long overflowLongLong = maxLongLongULL + 1; |
| 214 |
| 215 EXPECT_GT(overflowLongLong, maxLongLongULL); |
| 216 |
| 217 EXPECT_EQ(maxLongLongLL, clampTo<long long>(maxLongLongULL)); |
| 218 EXPECT_EQ(maxLongLongLL - 1, clampTo<long long>(maxLongLongULL - 1)); |
| 219 EXPECT_EQ(maxLongLongLL, clampTo<long long>(overflowLongLong)); |
| 220 |
| 221 EXPECT_EQ(-3LL, clampTo<long long>(2ULL, -5LL, -3LL)); |
| 222 } |
| 223 |
| 224 TEST(MathExtrasTest, clampToUnsignedLongLongInt) |
| 225 { |
| 226 EXPECT_EQ(0ULL, clampTo<unsigned long long>(-1)); |
| 227 EXPECT_EQ(0ULL, clampTo<unsigned long long>(0)); |
| 228 EXPECT_EQ(1ULL, clampTo<unsigned long long>(1)); |
| 229 } |
| 230 |
| 231 TEST(MathExtrasTest, clampToUnsignedLongLongUnsignedLongLong) |
| 232 { |
| 233 EXPECT_EQ(0ULL, clampTo<unsigned long long>(0ULL)); |
| 234 EXPECT_EQ(1ULL, clampTo<unsigned long long>(0ULL, 1ULL, 2ULL)); |
| 235 EXPECT_EQ(2ULL, clampTo<unsigned long long>(3ULL, 1ULL, 2ULL)); |
| 236 EXPECT_EQ(0xFFFFFFFFFFFFFFF5ULL, clampTo<unsigned long long>(0xFFFFFFFFFFFFF
FF5ULL)); |
| 237 } |
| 238 |
178 // Make sure that various +-inf cases are handled properly (they aren't | 239 // Make sure that various +-inf cases are handled properly (they aren't |
179 // by default on VS). | 240 // by default on VS). |
180 TEST(MathExtrasTest, infinityMath) | 241 TEST(MathExtrasTest, infinityMath) |
181 { | 242 { |
182 double posInf = std::numeric_limits<double>::infinity(); | 243 double posInf = std::numeric_limits<double>::infinity(); |
183 double negInf = -std::numeric_limits<double>::infinity(); | 244 double negInf = -std::numeric_limits<double>::infinity(); |
184 double nan = std::numeric_limits<double>::quiet_NaN(); | 245 double nan = std::numeric_limits<double>::quiet_NaN(); |
185 | 246 |
186 EXPECT_EQ(M_PI_4, atan2(posInf, posInf)); | 247 EXPECT_EQ(M_PI_4, atan2(posInf, posInf)); |
187 EXPECT_EQ(3.0 * M_PI_4, atan2(posInf, negInf)); | 248 EXPECT_EQ(3.0 * M_PI_4, atan2(posInf, negInf)); |
188 EXPECT_EQ(-M_PI_4, atan2(negInf, posInf)); | 249 EXPECT_EQ(-M_PI_4, atan2(negInf, posInf)); |
189 EXPECT_EQ(-3.0 * M_PI_4, atan2(negInf, negInf)); | 250 EXPECT_EQ(-3.0 * M_PI_4, atan2(negInf, negInf)); |
190 | 251 |
191 EXPECT_EQ(0.0, fmod(0.0, posInf)); | 252 EXPECT_EQ(0.0, fmod(0.0, posInf)); |
192 EXPECT_EQ(7.0, fmod(7.0, posInf)); | 253 EXPECT_EQ(7.0, fmod(7.0, posInf)); |
193 EXPECT_EQ(-7.0, fmod(-7.0, posInf)); | 254 EXPECT_EQ(-7.0, fmod(-7.0, posInf)); |
194 EXPECT_EQ(0.0, fmod(0.0, negInf)); | 255 EXPECT_EQ(0.0, fmod(0.0, negInf)); |
195 EXPECT_EQ(7.0, fmod(7.0, negInf)); | 256 EXPECT_EQ(7.0, fmod(7.0, negInf)); |
196 EXPECT_EQ(-7.0, fmod(-7.0, negInf)); | 257 EXPECT_EQ(-7.0, fmod(-7.0, negInf)); |
197 | 258 |
198 EXPECT_EQ(1.0, pow(5.0, 0.0)); | 259 EXPECT_EQ(1.0, pow(5.0, 0.0)); |
199 EXPECT_EQ(1.0, pow(-5.0, 0.0)); | 260 EXPECT_EQ(1.0, pow(-5.0, 0.0)); |
200 EXPECT_EQ(1.0, pow(nan, 0.0)); | 261 EXPECT_EQ(1.0, pow(nan, 0.0)); |
201 } | 262 } |
202 | 263 |
203 } // namespace | 264 } // namespace |
OLD | NEW |