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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/wtf/MathExtras.h ('k') | Tools/run-perf-test.cfg » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« 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