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

class RangeErrorTest {
  static testRead() {
    testListRead([], 0);
    testListRead([], -1);
    testListRead([], 1);

    var list = [1];
    testListRead(list, -1);
    testListRead(list, 1);

    list = new List(1);
    testListRead(list, -1);
    testListRead(list, 1);

    list = new List();
    testListRead(list, -1);
    testListRead(list, 0);
    testListRead(list, 1);
  }

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

    var list = [1];
    testListWrite(list, -1);
    testListWrite(list, 1);

    list = new List(1);
    testListWrite(list, -1);
    testListWrite(list, 1);

    list = new List();
    testListWrite(list, -1);
    testListWrite(list, 0);
    testListWrite(list, 1);
  }

  static testMain() {
    testRead();
    testWrite();
  }

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

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

main() {
  RangeErrorTest.testMain();
}
