// 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))
/// 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 the returned iterable contains all elements of
/// Int32x4List that satisfy test.
/// @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;

check(list, bool test(Int32x4 e)) {
  var l = new Int32x4List.fromList(list);
  var res = l.where(test);
  var count = 0;

  Expect.isTrue(res is Iterable);
  Expect.runtimeIsType<Iterable>(res);
  for (int i = 0; i < l.length; ++i) {
    if (test(l[i])) {
      Expect.isTrue(equal(l[i], res.elementAt(count++)));
    }
  }
  Expect.equals(count, res.length);
}

main() {
  var list = [i32x4(0), i32x4(1), i32x4(2), i32x4(6), i32x4(4), i32x4(5)];
  check([i32x4(6)], (e) => false);
  check(list, (e) => true);
  check(list, (e) => false);
  check(list, (e) => e.x == 0);
  check(list, (e) => e.x > 4);
  check(list, (e) => e.x < 4);
  check(list, (e) => e.x == 4);
}
