// 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.

// @dart = 2.9

// 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
// VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects

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());
}
