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

/**
 * @assertion   abstract Map<int, E> asMap()
 * The Map.keys Iterable iterates the indices of this list in numerical order.
 * @description Checks that Map.keys iterates the indices of this list in
 * numerical order.
 * @author kaigorodov
 */
library asMap_A02_t01;

import "../../../Utils/expect.dart";

test(List<E> create<E>([int length, E fill])) {

  void check(List a0) {
    List a = create(a0.length, new Object());
    Expect.equals(a0.length, a.length);
    a.setRange(0, a0.length, a0);
    var map = a.asMap();
  
    int key1 = 0;
    Iterator keys2 = map.keys.iterator;
    for (; ;) {
      if (key1 == a.length) {
        Expect.isFalse(keys2.moveNext());
        break;
      }
      Expect.isTrue(keys2.moveNext());
      Expect.equals(key1, keys2.current);
      key1++;
    }
  }

  List a = new List.empty(growable: true);
  check(a);
  a.add(2);
  check(a);
  a.add(1);
  check(a);
  a.add(1);
  check(a);
  a.add("1");
  check(a);
  a.clear();
  check(a);
}
