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