// Copyright (c) 2017, 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> where(bool f(E element))
/// Returns a new lazy [Iterable] with all elements that satisfy the predicate
/// [test].
/// The matching elements have the same order in the returned iterable as they
/// have in [iterator].
/// This method returns a view of the mapped elements.
/// @description Checks that all elements that satisfy [test] are retained,
/// and elements that do not, are skipped.
/// @author iarkh@unipro.ru

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

class MyIterable<int> extends Object with IterableMixin {
  List _content;
  MyIterable(List list): _content = list;

  Iterator get iterator {
    return _content.iterator;
  }
}

void check(IterableMixin iterable, bool test(var element)) {
  Iterator it0 = iterable.iterator;
  Iterator it = iterable.where(test).iterator;

  while (it0.moveNext()) {
    if (test(it0.current)) {
      Expect.isTrue(it.moveNext());
      Expect.equals(it0.current, it.current);
    }
  }
  Expect.isFalse(it.moveNext());
}

main() {
  IterableMixin iterable = new MyIterable([1, 3, 7, 4, 5, 6]);
  check(iterable, (var element) => element == 1);
  check(iterable, (var element) => true);
  check(iterable, (var element) => false);
  check(iterable, (var element) => element > 4);
  check(iterable, (var element) => element < 4);
  check(iterable, (var element) => element == 4);
}
