| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| // Test integer division by zero. | |
| // Test that results before and after optimization are the same. | |
| // VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation | |
| import "package:expect/expect.dart"; | |
| num divBy(num a, num b) => a ~/ b; | |
| main() { | |
| // Dividing integers by zero is an error. | |
| Expect.throws<Error>(() => divBy(1, 0)); | |
| Expect.throws<Error>(() => divBy(0, 0)); | |
| // Dividing doubles by zero is an error (result is never finite). | |
| Expect.throws<Error>(() => divBy(1.0, 0)); | |
| Expect.throws<Error>(() => divBy(1, 0.0)); | |
| Expect.throws<Error>(() => divBy(1, -0.0)); | |
| Expect.throws<Error>(() => divBy(1.0, 0.0)); | |
| // Double division yielding infinity is an error, even when not dividing | |
| // by zero. | |
| Expect.throws<Error>(() => divBy(double.maxFinite, 0.5)); | |
| Expect.throws<Error>(() => divBy(1, double.minPositive)); | |
| Expect.throws<Error>(() => divBy(double.infinity, 2.0)); | |
| Expect.throws<Error>(() => divBy(-double.maxFinite, 0.5)); | |
| Expect.throws<Error>(() => divBy(-1, double.minPositive)); | |
| Expect.throws<Error>(() => divBy(-double.infinity, 2.0)); | |
| // Double division yielding NaN is an error. | |
| Expect.throws<Error>(() => divBy(0.0, 0.0)); | |
| Expect.throws<Error>(() => divBy(double.infinity, double.infinity)); | |
| Expect.throws<Error>(() => divBy(-0.0, 0.0)); | |
| Expect.throws<Error>(() => divBy(-double.infinity, double.infinity)); | |
| // Truncating division containing a double truncates to max integer | |
| // on non-web. | |
| num one = 1; | |
| if (one is! double) { | |
| var minInt = -0x8000000000000000; | |
| var maxInt = minInt - 1; | |
| Expect.isTrue(maxInt > 0); | |
| // Not on web. | |
| Expect.equals(divBy(double.maxFinite, 2), maxInt); | |
| Expect.equals(divBy(-double.maxFinite, 2), minInt); | |
| Expect.equals(divBy(maxInt, 0.25), maxInt); | |
| Expect.equals(divBy(minInt, 0.25), minInt); | |
| } | |
| } |