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

class ListIteratorsTest {
  static void checkListIterator(List a) {
    Iterator it = a.iterator();
    Expect.equals(false, it.hasNext == a.isEmpty);
    for (int i = 0; i < a.length; i++) {
      Expect.equals(true, it.hasNext);
      var elem = it.next();
    }
    Expect.equals(false, it.hasNext);
    bool exceptionCaught = false;
    try {
     var eleme = it.next();
    } on StateError catch (e) {
     exceptionCaught = true;
    }
    Expect.equals(true, exceptionCaught);
  }

  static testMain() {
    checkListIterator([]);
    checkListIterator([1, 2]);
    checkListIterator(new List(0));
    checkListIterator(new List(10));
    checkListIterator(new List());
    List g = new List();
    g.addAll([1, 2]);
    checkListIterator(g);

    Iterator it = g.iterator();
    Expect.equals(true, it.hasNext);
    g.removeLast();
    Expect.equals(true, it.hasNext);
    g.removeLast();
    Expect.equals(false, it.hasNext);

    g.addAll([10, 20]);
    int sum = 0;
    for (var elem in g) {
      sum += elem;
      // Iterator must realize that g has no more elements.
      g.removeLast();
    }
    Expect.equals(10, sum);
  }
}

main() {
  ListIteratorsTest.testMain();
}
