blob: 1ef06b38d2292dc143ac87fc09aa87cda6d4c049 [file] [log] [blame] [edit]
// 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.
// Testing Bigints with and without intrinsics.
// VMOptions=--intrinsify --no-enable-asserts
// VMOptions=--intrinsify --enable-asserts
// VMOptions=--no-intrinsify --enable-asserts
// VMOptions=--optimization-counter-threshold=5 --no-background-compilation
import "package:expect/expect.dart";
import 'dart:math' show pow;
main() {
// Test integers.
testInt(0);
for (int i = 0; i < 63; i++) {
var n = pow(2, i);
testInt(-n - 1);
testInt(-n);
testInt(-n + 1);
testInt(n - 1);
testInt(n);
testInt(n + 1);
}
testInt(-0x8000000000000000);
// Test doubles.
testDouble(0.0);
testDouble(-0.0, 0.0);
for (double d in [
1.0,
2.0,
pow(2.0, 30) - 1,
pow(2.0, 30),
pow(2.0, 31) - 1,
pow(2.0, 31),
pow(2.0, 31) + 1,
pow(2.0, 32) - 1,
pow(2.0, 32),
pow(2.0, 32) + 1,
pow(2.0, 52) - 1,
pow(2.0, 52),
pow(2.0, 52) + 1,
pow(2.0, 53) - 1,
pow(2.0, 53),
]) {
for (int p = 0; p < 1024; p++) {
var value = d * pow(2.0, p); // Valid integer value.
if (!value.isFinite) break;
testDouble(-value);
testDouble(value);
}
}
Expect.equals(BigInt.zero, new BigInt.from(0.5));
Expect.equals(BigInt.one, new BigInt.from(1.5));
Expect.throws(() => new BigInt.from(double.infinity));
Expect.throws(() => new BigInt.from(-double.infinity));
Expect.throws(() => new BigInt.from(double.nan));
}
testInt(int n) {
var bigint = new BigInt.from(n);
Expect.equals(n, bigint.toInt());
// If the integers are inexact (e.g. > 2^53 when represented by doubles as
// when compiled to JavaScript numbers) then the 'toString' might be rounded
// to the nearest equivalent 'nicer looking' number.
if (n == n + 1 || n == n - 1) return;
Expect.equals("$n", "$bigint");
}
testDouble(double input, [double expectation]) {
var bigint = new BigInt.from(input);
Expect.equals(expectation ?? input, bigint.toDouble());
}