// 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";

void main() {
  bool checkedMode = false;
  assert(checkedMode = true);

  for (int i = 0; i < 36 * 36 + 1; i++) {
    for (int r = 2; r <= 36; r++) {
      String radixString = i.toRadixString(r);
      Expect.equals(i, int.parse(radixString, radix: r), "");
      Expect.equals(i, int.parse(" $radixString", radix: r), "");
      Expect.equals(i, int.parse("$radixString ", radix: r), "");
      Expect.equals(i, int.parse(" $radixString ", radix: r), "");
      Expect.equals(i, int.parse("+$radixString", radix: r), "");
      Expect.equals(i, int.parse(" +$radixString", radix: r), "");
      Expect.equals(i, int.parse("+$radixString ", radix: r), "");
      Expect.equals(i, int.parse(" +$radixString ", radix: r), "");
      Expect.equals(-i, int.parse("-$radixString", radix: r), "");
      Expect.equals(-i, int.parse(" -$radixString", radix: r), "");
      Expect.equals(-i, int.parse("-$radixString ", radix: r), "");
      Expect.equals(-i, int.parse(" -$radixString ", radix: r), "");
    }
  }
  // Allow both upper- and lower-case letters.
  Expect.equals(0xABCD, int.parse("ABCD", radix: 16));
  Expect.equals(0xABCD, int.parse("abcd", radix: 16)); 
  Expect.equals(15628859, int.parse("09azAZ", radix: 36));

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

  void testFails(String source, int radix) {
    Expect.throws(() { throw int.parse(source, radix: radix,
                                       onError: (s) { throw "FAIL"; }); },
                  (e) => e == "FAIL",
                  "$source/$radix");
    Expect.equals(-999, int.parse(source, radix: radix, onError: (s) => -999));
  }
  for (int i = 2; i < 36; i++) {
    testFails(i.toRadixString(36), i);
  }
  testFails("", 2);
  testFails("0x10", 16);  // No 0x specially allowed.
  testFails("+ 1", 2);  // No space between sign and digits.
  testFails("- 1", 2);  // No space between sign and digits.

  testBadTypes(var source, var radix) {
    if (!checkedMode) {
      // No promises on what error is thrown if the type doesn't match.
      // Likely either ArgumentError or NoSuchMethodError.
      Expect.throws(() => int.parse(source, radix: radix, onError: (s) => 0));
      return;
    }
    // In checked mode, it's always a TypeError.
    Expect.throws(() => int.parse(source, radix: radix, onError: (s) => 0),
                  (e) => e is TypeError);
  }

  testBadTypes(9, 10);
  testBadTypes(true, 10);
  testBadTypes("0", true);
  testBadTypes("0", "10");

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

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

  // If handleError isn't an unary function, and it's called, it also throws
  // (either TypeError in checked mode, or some failure in unchecked mode).
  Expect.throws(() => int.parse("9", radix: 8, onError: "not a function"));
  Expect.throws(() => int.parse("9", radix: 8, onError: () => 42));
  Expect.throws(() => int.parse("9", radix: 8, onError: (v1, v2) => 42));
}
