// 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 Iterable<E> skipWhile(bool test(E value))
 * Every new [Iterator] of the returned [Iterable] iterates over all elements of
 * this.
 * @description Checks that for every new iterator, all elements are either
 * tested and satisfy the [test], or returned by the iterator.
 * @author kaigorodov
 */
import "dart:collection";
import "LinkedList.lib.dart";

void check(LinkedList<MyLinkedListEntry<int>> a0, bool test0(int element)) {
  List<MyLinkedListEntry<int>> all = [];
  bool test(MyLinkedListEntry<int> entry) {
    bool res = test0(entry.value);
    if (res) {
      all.add(entry);
    };
    return res;
  }

  Iterable<MyLinkedListEntry<int>> itbl = a0.skipWhile(test);
  
  for (int k = 0; k < 5; k++) {
    all = [];
    Iterator<MyLinkedListEntry<int>> it = itbl.iterator;
    while (it.moveNext()) {
      all.add(it.current);
    }
    entriesEquals(all, a0);
  }
}

main() {
  LinkedList<MyLinkedListEntry<int>> a0 = toLinkedList([1, 3, 7, 4, 5, 6, 1]);
  check(a0, (int element) => element == 1);
  check(a0, (int element) => true);
  check(a0, (int element) => false);
  check(a0, (int element) => element > 4);
  check(a0, (int element) => element < 4);
  check(a0, (int element) => element == 4);
}
