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

// Dart test for testing out of range exceptions on arrays, and the content
// of range_error toString().

void main() {
  testRead();
  testWrite();
  testToString();
}

void testRead() {
  testListRead([], 0);
  testListRead([], -1);
  testListRead([], 1);

  var list = <int?>[1];
  testListRead(list, -1);
  testListRead(list, 1);

  list = new List.filled(1, null);
  testListRead(list, -1);
  testListRead(list, 1);
}

void testWrite() {
  testListWrite([], 0);
  testListWrite([], -1);
  testListWrite([], 1);

  var list = <int?>[1];
  testListWrite(list, -1);
  testListWrite(list, 1);

  list = new List.filled(1, null);
  testListWrite(list, -1);
  testListWrite(list, 1);
}

void testToString() {
  for (var name in [null, "THENAME"]) {
    for (var message in [null, "THEMESSAGE"]) {
      var value = 37;
      for (var re in [
        new ArgumentError.value(value, name, message),
        new RangeError.value(value, name, message),
        new RangeError.index(value, [], name, message),
        new RangeError.range(value, 0, 24, name, message)
      ]) {
        var str = re.toString();
        if (name != null) Expect.isTrue(str.contains(name), "$name in $str");
        if (message != null)
          Expect.isTrue(str.contains(message), "$message in $str");
        Expect.isTrue(str.contains("$value"), "$value in $str");
        // No empty ':' separated parts - in that case the colon is omitted too.
        Expect.isFalse(str.contains(new RegExp(":\s*:")));
      }
    }
  }
}

void testListRead(list, index) {
  var exception = null;
  try {
    var e = list[index];
  } on RangeError catch (e) {
    exception = e;
  }
  Expect.equals(true, exception != null);
}

void testListWrite(list, index) {
  var exception = null;
  try {
    list[index] = 0;
  } on RangeError catch (e) {
    exception = e;
  }
  Expect.equals(true, exception != null);
}
