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

// @dart = 2.9

/// @assertion Iterable<E> skipWhile(bool test(E value))
/// The returned iterable provides elements by iterating this iterable, but
/// skipping over all initial elements where [test(element)] returns [true].
/// @description Checks that once an element does not satisfy the [test],
/// the iterator stops testing and uses every element unconditionally.
/// @author kaigorodov

import "dart:collection";
import "../../../Utils/expect.dart";
import "LinkedList.lib.dart";

void check(LinkedList<MyLinkedListEntry<int>> a0, bool test0(int element)) {
  bool testPassed = null;
  bool test(MyLinkedListEntry<int> entry) {
    Expect.isTrue(testPassed == null || testPassed,
        "testPassed=$testPassed for element=${entry.value}");
    return testPassed =! test0(entry.value);
  }
  for (MyLinkedListEntry<int> element in a0.skipWhile(test)) {
    Expect.isTrue(testPassed == null || !testPassed);
  }  
}

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);
}
