// Copyright (c) 2015, 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";

// Test that error constructors do what they are documented as doing.

main() {
  Expect.equals("Invalid argument(s)", new ArgumentError().toString());
  Expect.equals(
      "Invalid argument(s): message", new ArgumentError("message").toString());
  Expect.equals(
      "Invalid argument: null", new ArgumentError.value(null).toString());
  Expect.equals("Invalid argument: 42", new ArgumentError.value(42).toString());
  Expect.equals(
      "Invalid argument: \"bad\"", new ArgumentError.value("bad").toString());
  Expect.equals("Invalid argument (foo): null",
      new ArgumentError.value(null, "foo").toString());
  Expect.equals("Invalid argument (foo): 42",
      new ArgumentError.value(42, "foo").toString());
  Expect.equals("Invalid argument (foo): message: 42",
      new ArgumentError.value(42, "foo", "message").toString());
  Expect.equals("Invalid argument: message: 42",
      new ArgumentError.value(42, null, "message").toString());
  Expect.equals("Invalid argument(s): Must not be null",
      new ArgumentError.notNull().toString());
  Expect.equals("Invalid argument(s) (foo): Must not be null",
      new ArgumentError.notNull("foo").toString());

  Expect.equals("RangeError", new RangeError(null).toString());
  Expect.equals("RangeError: message", new RangeError("message").toString());
  Expect.equals("RangeError: Value not in range: 42",
      new RangeError.value(42).toString());
  Expect.equals("RangeError (foo): Value not in range: 42",
      new RangeError.value(42, "foo").toString());
  Expect.equals("RangeError (foo): message: 42",
      new RangeError.value(42, "foo", "message").toString());
  Expect.equals("RangeError: message: 42",
      new RangeError.value(42, null, "message").toString());

  Expect.equals("RangeError: Invalid value: Not in range 2..9, inclusive: 42",
      new RangeError.range(42, 2, 9).toString());
  Expect.equals(
      "RangeError (foo): Invalid value: Not in range 2..9, "
      "inclusive: 42",
      new RangeError.range(42, 2, 9, "foo").toString());
  Expect.equals("RangeError (foo): message: Not in range 2..9, inclusive: 42",
      new RangeError.range(42, 2, 9, "foo", "message").toString());
  Expect.equals("RangeError: message: Not in range 2..9, inclusive: 42",
      new RangeError.range(42, 2, 9, null, "message").toString());

  Expect.equals(
      "RangeError: Index out of range: "
      "index should be less than 3: 42",
      new RangeError.index(42, [1, 2, 3]).toString());
  Expect.equals(
      "RangeError (foo): Index out of range: "
      "index should be less than 3: 42",
      new RangeError.index(42, [1, 2, 3], "foo").toString());
  Expect.equals(
      "RangeError (foo): message: "
      "index should be less than 3: 42",
      new RangeError.index(42, [1, 2, 3], "foo", "message").toString());
  Expect.equals(
      "RangeError: message: "
      "index should be less than 3: 42",
      new RangeError.index(42, [1, 2, 3], null, "message").toString());
  Expect.equals(
      "RangeError (foo): message: "
      "index should be less than 2: 42",
      new RangeError.index(42, [1, 2, 3], "foo", "message", 2).toString());
  Expect.equals(
      "RangeError: Index out of range: "
      "index must not be negative: -5",
      new RangeError.index(-5, [1, 2, 3]).toString());

  Expect.equals(42, ArgumentError.checkNotNull(42));
  Expect.equals(42, ArgumentError.checkNotNull(42, "name"));
  Expect.throwsArgumentError(() => ArgumentError.checkNotNull(null));

  Expect.equals(1, RangeError.checkNotNegative(1));
  Expect.equals(0, RangeError.checkNotNegative(0));
  Expect.throwsRangeError(() => RangeError.checkNotNegative(-1));

  Expect.equals(1, RangeError.checkValueInInterval(1, 0, 2));
  Expect.equals(1, RangeError.checkValueInInterval(1, 1, 2));
  Expect.equals(1, RangeError.checkValueInInterval(1, 0, 1));
  Expect.equals(1, RangeError.checkValueInInterval(1, 1, 1));
  Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 2, 3));
  Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 1, 0));
  Expect.throwsRangeError(() => RangeError.checkValueInInterval(0, 1, 0));

  Expect.equals(1, RangeError.checkValidIndex(1, [1, 2]));
  Expect.equals(1, RangeError.checkValidIndex(1, null, null, 2));
  Expect.throwsRangeError(() => RangeError.checkValidIndex(1, []));
  Expect.throwsRangeError(() => RangeError.checkValidIndex(1, null, null, 1));
  Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, [1, 2, 3]));
  Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, null, null, 3));
}
