OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
6 #include "vm/unit_test.h" | 6 #include "vm/unit_test.h" |
7 | 7 |
8 namespace dart { | 8 namespace dart { |
9 | 9 |
10 TEST_CASE(InstructionTests) { | 10 TEST_CASE(InstructionTests) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
46 RangeBoundary::FromConstant(0)); | 46 RangeBoundary::FromConstant(0)); |
47 Range* positive = new Range( | 47 Range* positive = new Range( |
48 RangeBoundary::FromConstant(0), | 48 RangeBoundary::FromConstant(0), |
49 RangeBoundary::FromConstant(100)); | 49 RangeBoundary::FromConstant(100)); |
50 Range* negative = new Range( | 50 Range* negative = new Range( |
51 RangeBoundary::FromConstant(-1), | 51 RangeBoundary::FromConstant(-1), |
52 RangeBoundary::FromConstant(-100)); | 52 RangeBoundary::FromConstant(-100)); |
53 Range* range_x = new Range( | 53 Range* range_x = new Range( |
54 RangeBoundary::FromConstant(-15), | 54 RangeBoundary::FromConstant(-15), |
55 RangeBoundary::FromConstant(100)); | 55 RangeBoundary::FromConstant(100)); |
56 EXPECT(negative->IsNegative()); | |
57 EXPECT(positive->IsPositive()); | 56 EXPECT(positive->IsPositive()); |
58 EXPECT(zero->Overlaps(0, 0)); | 57 EXPECT(zero->Overlaps(0, 0)); |
59 EXPECT(positive->Overlaps(0, 0)); | 58 EXPECT(positive->Overlaps(0, 0)); |
60 EXPECT(!negative->Overlaps(0, 0)); | 59 EXPECT(!negative->Overlaps(0, 0)); |
61 EXPECT(range_x->Overlaps(0, 0)); | 60 EXPECT(range_x->Overlaps(0, 0)); |
62 EXPECT(range_x->IsWithin(-15, 100)); | 61 EXPECT(range_x->IsWithin(-15, 100)); |
63 EXPECT(!range_x->IsWithin(-15, 99)); | 62 EXPECT(!range_x->IsWithin(-15, 99)); |
64 EXPECT(!range_x->IsWithin(-14, 100)); | 63 EXPECT(!range_x->IsWithin(-14, 100)); |
65 | 64 |
66 #define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max) \ | 65 #define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max) \ |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 RangeBoundary(0), RangeBoundary::PositiveInfinity()); | 111 RangeBoundary(0), RangeBoundary::PositiveInfinity()); |
113 TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64, | 112 TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64, |
114 RangeBoundary::NegativeInfinity(), RangeBoundary(0)); | 113 RangeBoundary::NegativeInfinity(), RangeBoundary(0)); |
115 | 114 |
116 #undef TEST_RANGE_OP | 115 #undef TEST_RANGE_OP |
117 } | 116 } |
118 | 117 |
119 | 118 |
120 TEST_CASE(RangeTestsInfinity) { | 119 TEST_CASE(RangeTestsInfinity) { |
121 // +/- inf overflowed. | 120 // +/- inf overflowed. |
122 EXPECT(RangeBoundary::NegativeInfinity().Overflowed()); | 121 EXPECT(RangeBoundary::NegativeInfinity().OverflowedSmi()); |
123 EXPECT(RangeBoundary::PositiveInfinity().Overflowed()); | 122 EXPECT(RangeBoundary::PositiveInfinity().OverflowedSmi()); |
123 | |
124 EXPECT(RangeBoundary::NegativeInfinity().OverflowedMint()); | |
125 EXPECT(RangeBoundary::PositiveInfinity().OverflowedMint()); | |
124 | 126 |
125 Range* all = new Range(RangeBoundary::NegativeInfinity(), | 127 Range* all = new Range(RangeBoundary::NegativeInfinity(), |
126 RangeBoundary::PositiveInfinity()); | 128 RangeBoundary::PositiveInfinity()); |
127 EXPECT(all->Overlaps(0, 0)); | 129 EXPECT(all->Overlaps(0, 0)); |
128 EXPECT(all->Overlaps(-1, 1)); | 130 EXPECT(all->Overlaps(-1, 1)); |
129 EXPECT(!all->IsWithin(0, 100)); | 131 EXPECT(!all->IsWithin(0, 100)); |
130 Range* positive = new Range(RangeBoundary::FromConstant(0), | 132 Range* positive = new Range(RangeBoundary::FromConstant(0), |
131 RangeBoundary::PositiveInfinity()); | 133 RangeBoundary::PositiveInfinity()); |
132 EXPECT(positive->IsPositive()); | 134 EXPECT(positive->IsPositive()); |
133 EXPECT(!positive->IsNegative()); | |
134 EXPECT(positive->Overlaps(0, 1)); | 135 EXPECT(positive->Overlaps(0, 1)); |
135 EXPECT(positive->Overlaps(1, 100)); | 136 EXPECT(positive->Overlaps(1, 100)); |
136 EXPECT(positive->Overlaps(-1, 0)); | 137 EXPECT(positive->Overlaps(-1, 0)); |
137 EXPECT(!positive->Overlaps(-2, -1)); | 138 EXPECT(!positive->Overlaps(-2, -1)); |
138 Range* negative = new Range(RangeBoundary::NegativeInfinity(), | 139 Range* negative = new Range(RangeBoundary::NegativeInfinity(), |
139 RangeBoundary::FromConstant(-1)); | 140 RangeBoundary::FromConstant(-1)); |
140 EXPECT(negative->IsNegative()); | |
141 EXPECT(!negative->IsPositive()); | 141 EXPECT(!negative->IsPositive()); |
142 EXPECT(!negative->Overlaps(0, 1)); | 142 EXPECT(!negative->Overlaps(0, 1)); |
143 EXPECT(!negative->Overlaps(1, 100)); | 143 EXPECT(!negative->Overlaps(1, 100)); |
144 EXPECT(negative->Overlaps(-1, 0)); | 144 EXPECT(negative->Overlaps(-1, 0)); |
145 EXPECT(negative->Overlaps(-2, -1)); | 145 EXPECT(negative->Overlaps(-2, -1)); |
146 Range* negpos = new Range(RangeBoundary::NegativeInfinity(), | 146 Range* negpos = new Range(RangeBoundary::NegativeInfinity(), |
147 RangeBoundary::FromConstant(0)); | 147 RangeBoundary::FromConstant(0)); |
148 EXPECT(!negpos->IsNegative()); | |
149 EXPECT(!negpos->IsPositive()); | 148 EXPECT(!negpos->IsPositive()); |
150 | 149 |
151 Range* a = new Range(RangeBoundary::NegativeInfinity(), | 150 Range* a = new Range(RangeBoundary::NegativeInfinity(), |
152 RangeBoundary::FromConstant(1)); | 151 RangeBoundary::FromConstant(1)); |
153 | 152 |
154 Range* b = new Range(RangeBoundary::NegativeInfinity(), | 153 Range* b = new Range(RangeBoundary::NegativeInfinity(), |
155 RangeBoundary::FromConstant(31)); | 154 RangeBoundary::FromConstant(31)); |
156 | 155 |
157 Range* c = new Range(RangeBoundary::NegativeInfinity(), | 156 Range* c = new Range(RangeBoundary::NegativeInfinity(), |
158 RangeBoundary::FromConstant(32)); | 157 RangeBoundary::FromConstant(32)); |
159 | 158 |
160 EXPECT(a->OnlyLessThanOrEqualTo(31)); | 159 EXPECT(a->OnlyLessThanOrEqualTo(31)); |
161 EXPECT(b->OnlyLessThanOrEqualTo(31)); | 160 EXPECT(b->OnlyLessThanOrEqualTo(31)); |
162 EXPECT(!c->OnlyLessThanOrEqualTo(31)); | 161 EXPECT(!c->OnlyLessThanOrEqualTo(31)); |
163 | 162 |
164 Range* unsatisfiable = new Range(RangeBoundary::PositiveInfinity(), | 163 Range* unsatisfiable = new Range(RangeBoundary::PositiveInfinity(), |
165 RangeBoundary::NegativeInfinity()); | 164 RangeBoundary::NegativeInfinity()); |
166 EXPECT(unsatisfiable->IsUnsatisfiable()); | 165 EXPECT(unsatisfiable->IsUnsatisfiable()); |
167 | 166 |
168 Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(), | 167 Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(), |
169 RangeBoundary::FromConstant(0)); | 168 RangeBoundary::FromConstant(0)); |
170 EXPECT(unsatisfiable_right->IsUnsatisfiable()); | 169 EXPECT(unsatisfiable_right->IsUnsatisfiable()); |
171 | 170 |
172 Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0), | 171 Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0), |
173 RangeBoundary::NegativeInfinity()); | 172 RangeBoundary::NegativeInfinity()); |
174 EXPECT(unsatisfiable_left->IsUnsatisfiable()); | 173 EXPECT(unsatisfiable_left->IsUnsatisfiable()); |
175 } | 174 } |
176 | 175 |
176 | |
177 TEST_CASE(RangeUtils) { | |
178 // [-inf, +inf]. | |
179 const Range& range_0 = *(new Range(RangeBoundary::NegativeInfinity(), | |
180 RangeBoundary::PositiveInfinity())); | |
181 // [-inf, -1]. | |
182 const Range& range_a = *(new Range(RangeBoundary::NegativeInfinity(), | |
183 RangeBoundary::FromConstant(-1))); | |
184 // [-inf, 0]. | |
185 const Range& range_b = *(new Range(RangeBoundary::NegativeInfinity(), | |
186 RangeBoundary::FromConstant(0))); | |
187 // [-inf, 1]. | |
188 const Range& range_c = *(new Range(RangeBoundary::NegativeInfinity(), | |
189 RangeBoundary::FromConstant(1))); | |
190 // [-1, +inf] | |
191 const Range& range_d = *(new Range(RangeBoundary::FromConstant(-1), | |
192 RangeBoundary::PositiveInfinity())); | |
193 // [0, +inf] | |
194 const Range& range_e = *(new Range(RangeBoundary::FromConstant(0), | |
195 RangeBoundary::PositiveInfinity())); | |
196 // [1, +inf]. | |
197 const Range& range_f = *(new Range(RangeBoundary::FromConstant(1), | |
198 RangeBoundary::PositiveInfinity())); | |
199 // [1, 2]. | |
200 const Range& range_g = *(new Range(RangeBoundary::FromConstant(1), | |
201 RangeBoundary::FromConstant(2))); | |
202 // [-1, -2]. | |
203 const Range& range_h = *(new Range(RangeBoundary::FromConstant(-1), | |
204 RangeBoundary::FromConstant(-2))); | |
205 // [-1, 1]. | |
206 const Range& range_i = *(new Range(RangeBoundary::FromConstant(-1), | |
207 RangeBoundary::FromConstant(1))); | |
208 | |
209 // OnlyPositiveOrZero. | |
210 EXPECT(!Range::OnlyPositiveOrZero(range_a, range_b)); | |
211 EXPECT(!Range::OnlyPositiveOrZero(range_b, range_c)); | |
212 EXPECT(!Range::OnlyPositiveOrZero(range_c, range_d)); | |
213 EXPECT(!Range::OnlyPositiveOrZero(range_d, range_e)); | |
214 EXPECT(Range::OnlyPositiveOrZero(range_e, range_f)); | |
215 EXPECT(!Range::OnlyPositiveOrZero(range_d, range_d)); | |
216 EXPECT(Range::OnlyPositiveOrZero(range_e, range_e)); | |
217 EXPECT(Range::OnlyPositiveOrZero(range_f, range_g)); | |
218 EXPECT(!Range::OnlyPositiveOrZero(range_g, range_h)); | |
219 EXPECT(!Range::OnlyPositiveOrZero(range_i, range_i)); | |
220 | |
221 // OnlyNegativeOrZero. | |
222 EXPECT(Range::OnlyNegativeOrZero(range_a, range_b)); | |
223 EXPECT(!Range::OnlyNegativeOrZero(range_b, range_c)); | |
224 EXPECT(Range::OnlyNegativeOrZero(range_b, range_b)); | |
225 EXPECT(!Range::OnlyNegativeOrZero(range_c, range_c)); | |
226 EXPECT(!Range::OnlyNegativeOrZero(range_c, range_d)); | |
227 EXPECT(!Range::OnlyNegativeOrZero(range_d, range_e)); | |
228 EXPECT(!Range::OnlyNegativeOrZero(range_e, range_f)); | |
229 EXPECT(!Range::OnlyNegativeOrZero(range_f, range_g)); | |
230 EXPECT(!Range::OnlyNegativeOrZero(range_g, range_h)); | |
231 EXPECT(Range::OnlyNegativeOrZero(range_h, range_h)); | |
232 EXPECT(!Range::OnlyNegativeOrZero(range_i, range_i)); | |
233 | |
234 // [-inf, +inf]. | |
235 EXPECT(!Range::OnlyNegativeOrZero(range_0, range_0)); | |
236 EXPECT(!Range::OnlyPositiveOrZero(range_0, range_0)); | |
237 | |
238 EXPECT(Range::ConstantAbsMax(&range_0) == RangeBoundary::kMax); | |
239 EXPECT(Range::ConstantAbsMax(&range_h) == 2); | |
240 EXPECT(Range::ConstantAbsMax(&range_i) == 1); | |
241 | |
242 // RangeBOundary.Equals. | |
243 EXPECT(RangeBoundary::FromConstant(1).Equals( | |
244 RangeBoundary::FromConstant(1))); | |
245 EXPECT(!RangeBoundary::FromConstant(2).Equals( | |
246 RangeBoundary::FromConstant(1))); | |
247 EXPECT(RangeBoundary::PositiveInfinity().Equals( | |
248 RangeBoundary::PositiveInfinity())); | |
249 EXPECT(!RangeBoundary::PositiveInfinity().Equals( | |
250 RangeBoundary::NegativeInfinity())); | |
251 EXPECT(RangeBoundary::NegativeInfinity().Equals( | |
252 RangeBoundary::NegativeInfinity())); | |
253 EXPECT(!RangeBoundary::NegativeInfinity().Equals( | |
254 RangeBoundary::PositiveInfinity())); | |
255 EXPECT(!RangeBoundary::FromConstant(1).Equals( | |
256 RangeBoundary::NegativeInfinity())); | |
257 EXPECT(!RangeBoundary::FromConstant(1).Equals( | |
258 RangeBoundary::NegativeInfinity())); | |
259 EXPECT(!RangeBoundary::FromConstant(2).Equals( | |
260 RangeBoundary::PositiveInfinity())); | |
261 } | |
262 | |
263 | |
264 TEST_CASE(RangeBinaryOp) { | |
265 // Test that [0, +inf] + [-inf, 0] = [-inf, +inf]. | |
266 Range* range_a = new Range(RangeBoundary::FromConstant(0), | |
267 RangeBoundary::PositiveInfinity()); | |
268 EXPECT(range_a->min().ConstantValue() == 0); | |
269 EXPECT(range_a->max().IsPositiveInfinity()); | |
270 Range* range_b = new Range(RangeBoundary::NegativeInfinity(), | |
271 RangeBoundary::FromConstant(0)); | |
272 EXPECT(range_b->min().IsNegativeInfinity()); | |
Florian Schneider
2014/06/17 10:50:11
Where does it make sense to have +/- infinity as a
Cutch
2014/06/17 21:49:04
Agreed. I've modified Range::BinaryOp to assert th
| |
273 EXPECT(range_b->max().ConstantValue() == 0); | |
274 Range* result = Range::BinaryOp(Token::kADD, | |
275 range_a, | |
276 range_b, | |
277 NULL); | |
278 ASSERT(result != NULL); | |
279 EXPECT(result->min().IsNegativeInfinity()); | |
280 EXPECT(result->max().IsPositiveInfinity()); | |
281 | |
282 // Test that [5, 10] + [0, 5] = [5, 15]. | |
283 Range* range_c = new Range(RangeBoundary::FromConstant(5), | |
284 RangeBoundary::FromConstant(10)); | |
285 Range* range_d = new Range(RangeBoundary::FromConstant(0), | |
286 RangeBoundary::FromConstant(5)); | |
287 result = Range::BinaryOp(Token::kADD, | |
288 range_c, | |
289 range_d, | |
290 NULL); | |
291 ASSERT(result != NULL); | |
292 EXPECT(result->min().ConstantValue() == 5); | |
293 EXPECT(result->max().ConstantValue() == 15); | |
294 | |
295 | |
296 // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf]. | |
297 Range* range_e = new Range(RangeBoundary::FromConstant(0xff), | |
298 RangeBoundary::FromConstant(0xfff)); | |
299 Range* range_f = new Range(RangeBoundary::FromConstant(0xf), | |
300 RangeBoundary::FromConstant(0xf)); | |
301 result = Range::BinaryOp(Token::kBIT_AND, | |
302 range_e, | |
303 range_f, | |
304 NULL); | |
305 ASSERT(result != NULL); | |
306 EXPECT(result->min().ConstantValue() == 0x0); | |
307 EXPECT(result->max().ConstantValue() == 0xf); | |
308 } | |
309 | |
310 | |
311 TEST_CASE(RangeAdd) { | |
312 #define TEST_RANGE_ADD(l_min, l_max, r_min, r_max, result_min, result_max) \ | |
Florian Schneider
2014/06/17 10:50:11
Can you re-use the TEST_RANGE_OP macro from above
Cutch
2014/06/17 21:49:03
I can't reuse for add and subtract because they ta
| |
313 { \ | |
314 RangeBoundary min, max; \ | |
315 Range* left_range = new Range( \ | |
316 RangeBoundary::FromConstant(l_min), \ | |
317 RangeBoundary::FromConstant(l_max)); \ | |
318 Range* right_range = new Range( \ | |
319 RangeBoundary::FromConstant(r_min), \ | |
320 RangeBoundary::FromConstant(r_max)); \ | |
321 EXPECT(left_range->min().ConstantValue() == l_min); \ | |
322 EXPECT(left_range->max().ConstantValue() == l_max); \ | |
323 EXPECT(right_range->min().ConstantValue() == r_min); \ | |
324 EXPECT(right_range->max().ConstantValue() == r_max); \ | |
325 Range::Add(left_range, right_range, &min, &max, NULL); \ | |
326 EXPECT(min.Equals(result_min)); \ | |
327 if (!min.Equals(result_min)) { \ | |
328 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ | |
329 } \ | |
330 EXPECT(max.Equals(result_max)); \ | |
331 if (!max.Equals(result_max)) { \ | |
332 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ | |
333 } \ | |
334 } | |
335 | |
336 // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35]. | |
337 TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32), | |
338 static_cast<int64_t>(kMaxInt32) + 15, | |
339 static_cast<int64_t>(10), | |
340 static_cast<int64_t>(20), | |
341 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10), | |
342 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35)); | |
343 | |
344 // [kMaxInt32 - 15, kMaxInt32 + 15] + [15, -15] = [kMaxInt32, kMaxInt32]. | |
345 TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32) - 15, | |
346 static_cast<int64_t>(kMaxInt32) + 15, | |
347 static_cast<int64_t>(15), | |
348 static_cast<int64_t>(-15), | |
349 RangeBoundary(static_cast<int64_t>(kMaxInt32)), | |
350 RangeBoundary(static_cast<int64_t>(kMaxInt32))); | |
351 | |
352 // [kMaxInt32, kMaxInt32 + 15] + [10, kMaxInt64] = [kMaxInt32 + 10, +inf]. | |
353 TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32), | |
354 static_cast<int64_t>(kMaxInt32) + 15, | |
355 static_cast<int64_t>(10), | |
356 static_cast<int64_t>(kMaxInt64), | |
357 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10), | |
358 RangeBoundary::PositiveInfinity()); | |
359 | |
360 // [kMaxInt64, kMaxInt32 + 15] + [10, kMaxInt64] = [-inf, kMaxInt32 + 35]. | |
Florian Schneider
2014/06/17 10:50:10
Lower bound should be smaller than upper bound.
M
Cutch
2014/06/17 21:49:03
Done.
| |
361 TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64), | |
362 static_cast<int64_t>(kMaxInt32) + 15, | |
363 static_cast<int64_t>(10), | |
364 static_cast<int64_t>(20), | |
365 RangeBoundary::NegativeInfinity(), | |
366 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35)); | |
367 | |
368 // [0, 0] + [kMinInt64, kMaxInt64] = [kMinInt64, kMaxInt64]. | |
369 TEST_RANGE_ADD(static_cast<int64_t>(0), | |
370 static_cast<int64_t>(0), | |
371 static_cast<int64_t>(kMinInt64), | |
372 static_cast<int64_t>(kMaxInt64), | |
373 RangeBoundary(kMinInt64), | |
374 RangeBoundary(kMaxInt64)); | |
375 | |
376 | |
377 // [-1, 1] + [kMinInt64, kMaxInt64] = [-inf, +inf]. | |
378 TEST_RANGE_ADD(static_cast<int64_t>(-1), | |
379 static_cast<int64_t>(1), | |
380 static_cast<int64_t>(kMinInt64), | |
381 static_cast<int64_t>(kMaxInt64), | |
382 RangeBoundary::NegativeInfinity(), | |
383 RangeBoundary::PositiveInfinity()); | |
384 | |
385 #undef TEST_RANGE_ADD | |
386 } | |
387 | |
388 | |
389 TEST_CASE(RangeSub) { | |
390 #define TEST_RANGE_SUB(l_min, l_max, r_min, r_max, result_min, result_max) \ | |
391 { \ | |
392 RangeBoundary min, max; \ | |
393 Range* left_range = new Range( \ | |
394 RangeBoundary::FromConstant(l_min), \ | |
395 RangeBoundary::FromConstant(l_max)); \ | |
396 Range* right_range = new Range( \ | |
397 RangeBoundary::FromConstant(r_min), \ | |
398 RangeBoundary::FromConstant(r_max)); \ | |
399 EXPECT(left_range->min().ConstantValue() == l_min); \ | |
400 EXPECT(left_range->max().ConstantValue() == l_max); \ | |
401 EXPECT(right_range->min().ConstantValue() == r_min); \ | |
402 EXPECT(right_range->max().ConstantValue() == r_max); \ | |
403 Range::Sub(left_range, right_range, &min, &max, NULL); \ | |
404 EXPECT(min.Equals(result_min)); \ | |
405 if (!min.Equals(result_min)) { \ | |
406 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ | |
407 } \ | |
408 EXPECT(max.Equals(result_max)); \ | |
409 if (!max.Equals(result_max)) { \ | |
410 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ | |
411 } \ | |
412 } | |
413 | |
414 // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5]. | |
415 TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32), | |
Florian Schneider
2014/06/17 10:50:10
Maybe move the static_cast<int64_t> into the macro
Cutch
2014/06/17 21:49:03
I can't because kMaxInt32 is an int32_t and it mus
| |
416 static_cast<int64_t>(kMaxInt32) + 15, | |
417 static_cast<int64_t>(10), | |
418 static_cast<int64_t>(20), | |
419 RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20), | |
420 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 5)); | |
421 | |
422 // [kMintInt64, kMintInt64] - [1, 1] = [-inf, +inf]. | |
423 TEST_RANGE_SUB(static_cast<int64_t>(kMinInt64), | |
424 static_cast<int64_t>(kMinInt64), | |
425 static_cast<int64_t>(1), | |
426 static_cast<int64_t>(1), | |
427 RangeBoundary::NegativeInfinity(), | |
428 RangeBoundary::PositiveInfinity()); | |
429 | |
430 // [1, 1] - [kMintInt64, kMintInt64] = [-inf, +inf]. | |
431 TEST_RANGE_SUB(static_cast<int64_t>(1), | |
432 static_cast<int64_t>(1), | |
433 static_cast<int64_t>(kMinInt64), | |
434 static_cast<int64_t>(kMinInt64), | |
435 RangeBoundary::NegativeInfinity(), | |
436 RangeBoundary::PositiveInfinity()); | |
Florian Schneider
2014/06/17 10:50:10
I'd add also the test cases that you have for ADD
Cutch
2014/06/17 21:49:03
Done.
| |
437 | |
438 | |
439 #undef TEST_RANGE_SUB | |
440 } | |
441 | |
442 | |
443 TEST_CASE(RangeAnd) { | |
444 #define TEST_RANGE_AND(l_min, l_max, r_min, r_max, result_min, result_max) \ | |
445 { \ | |
446 RangeBoundary min, max; \ | |
447 Range* left_range = new Range( \ | |
448 RangeBoundary::FromConstant(l_min), \ | |
449 RangeBoundary::FromConstant(l_max)); \ | |
450 Range* right_range = new Range( \ | |
451 RangeBoundary::FromConstant(r_min), \ | |
452 RangeBoundary::FromConstant(r_max)); \ | |
453 EXPECT(left_range->min().ConstantValue() == l_min); \ | |
454 EXPECT(left_range->max().ConstantValue() == l_max); \ | |
455 EXPECT(right_range->min().ConstantValue() == r_min); \ | |
456 EXPECT(right_range->max().ConstantValue() == r_max); \ | |
457 Range::And(left_range, right_range, &min, &max); \ | |
458 EXPECT(min.Equals(result_min)); \ | |
459 if (!min.Equals(result_min)) { \ | |
460 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ | |
461 } \ | |
462 EXPECT(max.Equals(result_max)); \ | |
463 if (!max.Equals(result_max)) { \ | |
464 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ | |
465 } \ | |
466 } | |
467 | |
468 // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf]. | |
469 TEST_RANGE_AND(static_cast<int64_t>(0xff), | |
470 static_cast<int64_t>(0xfff), | |
471 static_cast<int64_t>(0xf), | |
472 static_cast<int64_t>(0xf), | |
473 RangeBoundary(0), | |
474 RangeBoundary(0xf)); | |
475 | |
476 // [0xffffffff, 0xffffffff] & [0xfffffffff, 0xfffffffff] = [0x0, 0xfffffffff]. | |
477 TEST_RANGE_AND(static_cast<int64_t>(0xffffffff), | |
478 static_cast<int64_t>(0xffffffff), | |
479 static_cast<int64_t>(0xfffffffff), | |
480 static_cast<int64_t>(0xfffffffff), | |
481 RangeBoundary(0), | |
482 RangeBoundary(static_cast<int64_t>(0xfffffffff))); | |
483 | |
484 // [0xffffffff, 0xffffffff] & [-20, 20] = [0x0, 0xffffffff]. | |
485 TEST_RANGE_AND(static_cast<int64_t>(0xffffffff), | |
486 static_cast<int64_t>(0xffffffff), | |
487 static_cast<int64_t>(-20), | |
488 static_cast<int64_t>(20), | |
489 RangeBoundary(0), | |
490 RangeBoundary(static_cast<int64_t>(0xffffffff))); | |
491 | |
492 // [-20, 20] & [0xffffffff, 0xffffffff] = [0x0, 0xffffffff]. | |
493 TEST_RANGE_AND(static_cast<int64_t>(-20), | |
494 static_cast<int64_t>(20), | |
495 static_cast<int64_t>(0xffffffff), | |
496 static_cast<int64_t>(0xffffffff), | |
497 RangeBoundary(0), | |
498 RangeBoundary(static_cast<int64_t>(0xffffffff))); | |
Florian Schneider
2014/06/17 10:50:10
Please add a test case where both, left and right
Cutch
2014/06/17 21:49:03
Done.
| |
499 | |
500 #undef TEST_RANGE_AND | |
501 } | |
502 | |
503 | |
504 TEST_CASE(RangeMinMax) { | |
505 // Constants. | |
506 // MIN(0, 1) == 0 | |
507 EXPECT(RangeBoundary::Min( | |
508 RangeBoundary::FromConstant(0), | |
509 RangeBoundary::FromConstant(1), | |
510 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0); | |
511 // MIN(0, -1) == -1 | |
512 EXPECT(RangeBoundary::Min( | |
513 RangeBoundary::FromConstant(0), | |
514 RangeBoundary::FromConstant(-1), | |
515 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1); | |
516 | |
517 // MIN(1, 0) == 0 | |
518 EXPECT(RangeBoundary::Min( | |
519 RangeBoundary::FromConstant(1), | |
520 RangeBoundary::FromConstant(0), | |
521 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0); | |
522 // MIN(-1, 0) == -1 | |
523 EXPECT(RangeBoundary::Min( | |
524 RangeBoundary::FromConstant(-1), | |
525 RangeBoundary::FromConstant(0), | |
526 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1); | |
527 | |
528 // MAX(0, 1) == 1 | |
529 EXPECT(RangeBoundary::Max( | |
530 RangeBoundary::FromConstant(0), | |
531 RangeBoundary::FromConstant(1), | |
532 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1); | |
533 | |
534 // MAX(0, -1) == 0 | |
535 EXPECT(RangeBoundary::Max( | |
536 RangeBoundary::FromConstant(0), | |
537 RangeBoundary::FromConstant(-1), | |
538 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0); | |
539 | |
540 // MAX(1, 0) == 1 | |
541 EXPECT(RangeBoundary::Max( | |
542 RangeBoundary::FromConstant(1), | |
543 RangeBoundary::FromConstant(0), | |
544 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1); | |
545 // MAX(-1, 0) == 0 | |
546 EXPECT(RangeBoundary::Max( | |
547 RangeBoundary::FromConstant(-1), | |
548 RangeBoundary::FromConstant(0), | |
549 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0); | |
550 | |
551 RangeBoundary n_infinity = RangeBoundary::NegativeInfinity(); | |
552 RangeBoundary p_infinity = RangeBoundary::PositiveInfinity(); | |
553 | |
554 // Constants vs. infinity. | |
555 EXPECT(RangeBoundary::Max( | |
556 n_infinity, | |
557 RangeBoundary::FromConstant(-1), | |
558 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1); | |
559 | |
560 EXPECT(RangeBoundary::Max( | |
561 RangeBoundary::FromConstant(-1), | |
562 n_infinity, | |
563 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1); | |
564 | |
565 EXPECT(RangeBoundary::Max( | |
566 RangeBoundary::FromConstant(1), | |
567 n_infinity, | |
568 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1); | |
569 | |
570 EXPECT(RangeBoundary::Max( | |
571 n_infinity, | |
572 RangeBoundary::FromConstant(1), | |
573 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1); | |
574 | |
575 EXPECT(RangeBoundary::Min( | |
576 p_infinity, | |
577 RangeBoundary::FromConstant(-1), | |
578 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1); | |
579 | |
580 EXPECT(RangeBoundary::Min( | |
581 RangeBoundary::FromConstant(-1), | |
582 p_infinity, | |
583 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1); | |
584 | |
585 EXPECT(RangeBoundary::Min( | |
586 RangeBoundary::FromConstant(1), | |
587 p_infinity, | |
588 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1); | |
589 | |
590 EXPECT(RangeBoundary::Min( | |
591 p_infinity, | |
592 RangeBoundary::FromConstant(1), | |
593 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1); | |
594 | |
595 // 64-bit values. | |
596 EXPECT(RangeBoundary::Min( | |
597 RangeBoundary(static_cast<int64_t>(kMinInt64)), | |
598 RangeBoundary(static_cast<int64_t>(kMinInt32)), | |
599 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt64); | |
600 | |
601 EXPECT(RangeBoundary::Max( | |
602 RangeBoundary(static_cast<int64_t>(kMinInt64)), | |
603 RangeBoundary(static_cast<int64_t>(kMinInt32)), | |
604 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt32); | |
605 | |
606 EXPECT(RangeBoundary::Min( | |
607 RangeBoundary(static_cast<int64_t>(kMaxInt64)), | |
608 RangeBoundary(static_cast<int64_t>(kMaxInt32)), | |
609 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt32); | |
610 | |
611 EXPECT(RangeBoundary::Max( | |
612 RangeBoundary(static_cast<int64_t>(kMaxInt64)), | |
613 RangeBoundary(static_cast<int64_t>(kMaxInt32)), | |
614 RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt64); | |
615 } | |
616 | |
177 } // namespace dart | 617 } // namespace dart |
OLD | NEW |