// 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();
    } catch (NoMoreElementsException 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();
}
