// Copyright (c) 2012, 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.

import "package:expect/expect.dart";
import "dart:math" show pow, log;

void main() {
  const String oneByteWhiteSpace = "\x09\x0a\x0b\x0c\x0d\x20\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(0, int.parse("${ws}0${ws}", radix: 2));
  }

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

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

  for (int r = 2; r <= 36; r++) {
    for (int i = 0; i <= r * r; i++) {
      String radixString = i.toRadixString(r);
      testParse(i, radixString, r);
    }
    for (var v in [
      0,
      0x10000,
      0x7FFFFFFF,
      0x80000000,
      0xFFFFFFFF,
      0x100000000,
      0x7FFFFFFFFFFFF8,
    ]) {
      var string = v.toRadixString(r);
      Expect.equals(v, int.tryParse(string, radix: r));
      if (v > 0) {
        Expect.equals(-v, int.tryParse("-$string", radix: r));
        if (r == 16) {
          Expect.equals(v, int.tryParse("0x$string"));
          Expect.equals(v, int.tryParse("0X$string"));
        }
      }
    }
  }

  // Allow both upper- and lower-case letters.
  Expect.equals(0xABCD, int.tryParse("ABCD", radix: 16));
  Expect.equals(0xABCD, int.tryParse("abcd", radix: 16));
  Expect.equals(15628859, int.tryParse("09azAZ", radix: 36));
  // Bigish numbers (representable precisely as both Int64 and double (2^53)).
  Expect.equals(9007199254740991, int.tryParse("9007199254740991"));
  Expect.equals(-9007199254740991, int.tryParse("-9007199254740991"));
  // Allow whitespace before and after the number.
  Expect.equals(1, int.tryParse(" 1", radix: 2));
  Expect.equals(1, int.tryParse("1 ", radix: 2));
  Expect.equals(1, int.tryParse(" 1 ", radix: 2));
  Expect.equals(1, int.tryParse("\n1", radix: 2));
  Expect.equals(1, int.tryParse("1\n", radix: 2));
  Expect.equals(1, int.tryParse("\n1\n", radix: 2));
  Expect.equals(1, int.tryParse("+1", radix: 2));

  void testFails(String source, int radix) {
    Expect.isNull(int.tryParse(source, radix: 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);
  }
  int digitX = 33;
  Expect.equals(((digitX * 34) + 1) * 34, int.tryParse("0x10", radix: 34));
  Expect.equals(((digitX * 35) + 1) * 35, int.tryParse("0x10", radix: 35));

  // Radix must be in the range 2 .. 36.
  Expect.throwsArgumentError(() => int.tryParse("0", radix: -1));
  Expect.throwsArgumentError(() => int.tryParse("0", radix: 0));
  Expect.throwsArgumentError(() => int.tryParse("0", radix: -1));
  Expect.throwsArgumentError(() => int.tryParse("0", radix: 37));
}
