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

/// @assertion void checkValidIndex(int index, indexable, [String name,
/// int length, String message])
/// ...
/// If length is provided, it is used as the length of the indexable object,
/// otherwise the length is found as indexable.length.
/// @description Checks that if length is not provided, then  the length is found
/// as indexable.length
/// @author sgrekhov@unipro.ru

import "../../../Utils/expect.dart";

check(int index, indexable, String? name) {
  try {
    RangeError.checkValidIndex(index, indexable, name);
    Expect.fail("RangeError expected");
  } on RangeError catch (e) {
    Expect.equals(index, e.invalidValue);
    if (name == null) {
      Expect.equals("index", e.name);
    } else {
      Expect.equals(name, e.name);
    }
    Expect.equals("Index out of range", e.message);
    Expect.equals(0, e.start);
    Expect.equals(indexable.length - 1, e.end);
  } catch (e) {
    Expect.fail("Wrong exception type $e");
  }
}

main() {
  RangeError.checkValidIndex(0, [1, 2, 3], "name1");
  RangeError.checkValidIndex(1, [1, 2, 3], "name2");
  RangeError.checkValidIndex(2, [1, 2, 3], "name3");
  RangeError.checkValidIndex(2, [1, 2, 3], null);

  check(-1, [1, 2, 3], "name4");
  check(3, [1, 2, 3], "name5");
  check(11, [1, 2, 3], null);
}
