// 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.

// @dart = 2.9

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 inclusive range 2..9: 42",
      new RangeError.range(42, 2, 9).toString());
  Expect.equals(
      "RangeError (foo): Invalid value: Not in inclusive range 2..9: 42",
      new RangeError.range(42, 2, 9, "foo").toString());
  Expect.equals("RangeError (foo): message: Not in inclusive range 2..9: 42",
      new RangeError.range(42, 2, 9, "foo", "message").toString());
  Expect.equals("RangeError: message: Not in inclusive range 2..9: 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));
}
