// 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 IndexError.withLength(value, 0,
            indexable: [], name: name, message: 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);
}
