| // Copyright (c) 2018, 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 for JavaScript specific BigInt behaviour. Any JavaScript number (double) |
| // that is an integral value is a Dart 'int' value, so any BigInt that has a |
| // value that is exactly a double integral value should return `true` for |
| // [BigInt.isValidInt]. |
| |
| import "package:expect/expect.dart"; |
| |
| int intPow(int a, int p) { |
| int result = 1; |
| for (int i = 0; i < p; i++) result *= a; |
| return result; |
| } |
| |
| int pow2_53 = intPow(2, 53); |
| |
| test(int n1, int n2, int shift, [bool expectedIsValidInt = true]) { |
| var n = (new BigInt.from(n1) * new BigInt.from(n2)) << shift; |
| Expect.equals(expectedIsValidInt, n.isValidInt, '${n}.isValidInt'); |
| if (n >= new BigInt.from(pow2_53)) { |
| var nplus1 = n + BigInt.one; |
| Expect.isFalse(nplus1.isValidInt, '${nplus1}.isValidInt'); |
| } |
| } |
| |
| main() { |
| test(13, 19, 1); |
| test(19997, 19993, 100); |
| test(19997, pow2_53 ~/ 19997, 0); |
| test(19997, pow2_53 ~/ 19997, 1); |
| test(19997, pow2_53 ~/ 19997, 100); |
| test(1, 1, 100); |
| test(1, 1, 10000, false); |
| |
| // More than 53 bits in product, |
| test(pow2_53 ~/ 3, pow2_53 ~/ 5, 0, false); |
| } |