/*
 * Copyright (c) 2013, 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 E firstWhere(bool test(E element), {E orElse()})
 * ...
 * If no element satisfies test, the result of invoking the [orElse] function
 * is returned.
 * @description Checks that the [orElse] function is invoked and its result is
 * returned if no element matches [test].
 * @author msyabro
 */

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

Float32x4 pack(v) => new Float32x4.splat(v);

equal(obj1, obj2) {
  var res = obj1.equal(obj2);
  return res.flagX && res.flagY && res.flagZ && res.flagW;
}

main() {
  var count = 0;
  Float32x4 f() {
    count++;
    return pack(0.0);
  }
  var l = new Float32x4List.fromList([
    pack(1.0), pack(2.0), pack(3.0), pack(4.0), pack(5.0), pack(6.0), pack(9.0)
  ]);
  var res = l.firstWhere((element) => false, orElse: f);
  Expect.equals(1, count);
  Expect.isTrue(equal(pack(.0), res));

  res = l.firstWhere((element) => element.z > 100.0, orElse: f);
  Expect.equals(2, count);
  Expect.isTrue(equal(pack(.0), res));

  l = new Float32x4List.fromList([]);
  res = l.firstWhere((element) => true, orElse: f);
  Expect.equals(3, count);
  Expect.isTrue(equal(pack(.0), res));
}
