// Copyright (c) 2017, 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=
// VMOptions=--no_intrinsify
// VMOptions=--optimization_counter_threshold=10 --no-background_compilation

import "package:expect/expect.dart";

import 'dart:math' show pow;

void testParseRadix() {
  bool checkedMode = false;
  assert((checkedMode = true));
  const String oneByteWhiteSpace = "\x09\x0a\x0b\x0c\x0d\x20"
      // "\x85" // Might make troubles on some systems. Was marked as OK test.
      "\xa0";
  const String whiteSpace = "$oneByteWhiteSpace\u1680"
      "\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a"
      "\u2028\u2029\u202f\u205f\u3000\ufeff";

  var digits = "0123456789abcdefghijklmnopqrstuvwxyz";
  var zeros = "0" * 64;

  for (int i = 0; i < whiteSpace.length; i++) {
    var ws = whiteSpace[i];
    Expect.equals(BigInt.zero, BigInt.parse("${ws}0${ws}", radix: 2));
  }

  void testParse(BigInt result, String radixString, int radix) {
    var m = "$radixString/$radix->$result";
    Expect.equals(
        result, BigInt.parse(radixString.toLowerCase(), radix: radix), m);
    Expect.equals(
        result, BigInt.parse(radixString.toUpperCase(), radix: radix), m);
    Expect.equals(result, BigInt.parse(" $radixString", radix: radix), m);
    Expect.equals(result, BigInt.parse("$radixString ", radix: radix), m);
    Expect.equals(result, BigInt.parse(" $radixString ", radix: radix), m);
    Expect.equals(result, BigInt.parse("+$radixString", radix: radix), m);
    Expect.equals(result, BigInt.parse(" +$radixString", radix: radix), m);
    Expect.equals(result, BigInt.parse("+$radixString ", radix: radix), m);
    Expect.equals(result, BigInt.parse(" +$radixString ", radix: radix), m);
    Expect.equals(-result, BigInt.parse("-$radixString", radix: radix), m);
    Expect.equals(-result, BigInt.parse(" -$radixString", radix: radix), m);
    Expect.equals(-result, BigInt.parse("-$radixString ", radix: radix), m);
    Expect.equals(-result, BigInt.parse(" -$radixString ", radix: radix), m);
    Expect.equals(
        result,
        BigInt.parse("$oneByteWhiteSpace$radixString$oneByteWhiteSpace",
            radix: radix),
        m);
    Expect.equals(
        -result,
        BigInt.parse("$oneByteWhiteSpace-$radixString$oneByteWhiteSpace",
            radix: radix),
        m);
    Expect.equals(result,
        BigInt.parse("$whiteSpace$radixString$whiteSpace", radix: radix), m);
    Expect.equals(-result,
        BigInt.parse("$whiteSpace-$radixString$whiteSpace", radix: radix), m);

    Expect.equals(result, BigInt.parse("$zeros$radixString", radix: radix), m);
    Expect.equals(result, BigInt.parse("+$zeros$radixString", radix: radix), m);
    Expect.equals(
        -result, BigInt.parse("-$zeros$radixString", radix: radix), m);
  }

  for (int r = 2; r <= 36; r++) {
    for (var i = BigInt.zero; i <= new BigInt.from(r * r); i += BigInt.one) {
      String radixString = i.toRadixString(r);
      testParse(i, radixString, r);
    }
  }

  for (int i = 2; i <= 36; i++) {
    var digit = digits[i - 1];
    testParse(new BigInt.from(i).pow(64) - BigInt.one, digit * 64, i);
    testParse(BigInt.zero, zeros, i);
  }

  // Allow both upper- and lower-case letters.
  Expect.equals(new BigInt.from(0xABCD), BigInt.parse("ABCD", radix: 16));
  Expect.equals(new BigInt.from(0xABCD), BigInt.parse("abcd", radix: 16));
  Expect.equals(new BigInt.from(15628859), BigInt.parse("09azAZ", radix: 36));

  Expect.equals(
      (new BigInt.from(0x12345678) << 96) +
          (new BigInt.from(0x12345678) << 64) +
          (new BigInt.from(0x12345678) << 32) +
          new BigInt.from(0x12345678),
      BigInt.parse("0x12345678123456781234567812345678"));

  // Allow whitespace before and after the number.
  Expect.equals(BigInt.one, BigInt.parse(" 1", radix: 2));
  Expect.equals(BigInt.one, BigInt.parse("1 ", radix: 2));
  Expect.equals(BigInt.one, BigInt.parse(" 1 ", radix: 2));
  Expect.equals(BigInt.one, BigInt.parse("\n1", radix: 2));
  Expect.equals(BigInt.one, BigInt.parse("1\n", radix: 2));
  Expect.equals(BigInt.one, BigInt.parse("\n1\n", radix: 2));
  Expect.equals(BigInt.one, BigInt.parse("+1", radix: 2));

  void testFails(String source, int radix) {
    Expect.throws(() {
      BigInt.parse(source, radix: radix);
    }, (e) => e is FormatException, "$source/$radix");
  }

  for (int i = 2; i < 36; i++) {
    var char = i.toRadixString(36);
    testFails(char.toLowerCase(), i);
    testFails(char.toUpperCase(), i);
  }
  testFails("", 2);
  testFails("+ 1", 2); // No space between sign and digits.
  testFails("- 1", 2); // No space between sign and digits.
  testFails("0x", null);
  for (int i = 2; i <= 33; i++) {
    // No 0x specially allowed.
    // At radix 34 and above, "x" is a valid digit.
    testFails("0x10", i);
  }

  testBadArguments(String source, int radix) {
    // If the types match, it should be an ArgumentError of some sort.
    Expect.throws(
        () => BigInt.parse(source, radix: radix), (e) => e is ArgumentError);
  }

  testBadArguments("0", -1);
  testBadArguments("0", 0);
  testBadArguments("0", 1);
  testBadArguments("0", 37);
}

main() {
  testParseRadix();
}
