// 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 int checkValidRange(int start, int end, int length,
/// [String startName, String endName, String message])
/// Check that a range represents a slice of an indexable object.
/// @description Checks that if startName, endName and message are set then name
/// and message have appropriate values
/// @issue 28116
/// @author sgrekhov@unipro.ru

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

check(int start, int end, int length, String? startName, String? endName,
    String? message) {
  try {
    RangeError.checkValidRange(start, end, length, startName, endName, message);
    Expect.fail("RangeError expected");
  } on RangeError catch (e) {
    if (start < 0 || start > length) {
      if (startName != null) {
        Expect.equals(startName, e.name);
      } else {
        Expect.equals("start", e.name);
      }
    } else {
      if (endName != null) {
        Expect.equals(endName, e.name);
      } else {
        Expect.equals("end", e.name);
      }
    }
    if (message != null) {
      Expect.equals(message, e.message);
    } else {
      Expect.equals("Invalid value", e.message);
    }
  } catch (e) {
    Expect.fail("Wrong exception type $e");
  }
}

main() {
  // start value breaks the range
  check(-1, 2, 5, "Start name", "End name", "Just message");
  check(6, 2, 5, "Start name", "End name", null);
  check(6, 2, 5, null, "End name", null);
  check(6, 2, 5, null, null, null);
  check(-1, 2, 5, "Start name", null, "Just message");

  // end value breaks the range
  check(0, 20, 5, "Start name", "End name", "Just message");
  check(3, 20, 5, "Start name", "End name", null);
  check(3, 20, 5, null, "End name", null);
  check(3, 20, 5, null, null, null);
  check(3, 20, 5, "Start name", null, "Just message");
}
