/*
 * 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 test(E element))
 * ...
 * Iterating will not cache results, and thus iterating multiple times over the
 * returned Iterable may invoke the supplied function test multiple times on the
 * same element.
 * @description Checks that iterating multiple times over the returned Iterable
 * may invoke the supplied function test multiple times on the same element.
 * @author ngl@unipro.ru
 */

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

Int32x4 i32x4(n) => new Int32x4(n, n, n, n);

equal(o1, o2) => o1.x == o2.x && o1.y == o2.y && o1.z == o2.z && o1.w == o2.w;

main() {
  var counter = 0;
  bool test(e) {
    counter++;
    return e.x < 5;
  }
  var list = [i32x4(0), i32x4(1), i32x4(2), i32x4(6), i32x4(4), i32x4(5)];
  var l = new Int32x4List.fromList(list);

  var res = l.where(test);
  Expect.equals(0, counter);
  res.elementAt(0);
  Expect.equals(1, counter);
  res.elementAt(1);
  Expect.equals(3, counter);
  res.elementAt(0);
  Expect.equals(4, counter);
  res.elementAt(3);
  Expect.equals(9, counter);

  var it1 = res.iterator;
  var it2 = res.iterator;
  counter = 0;

  it1.moveNext();
  Expect.equals(1, counter);
  it1.moveNext();
  Expect.equals(2, counter);
  it2.moveNext();
  Expect.equals(3, counter);
}
