// Copyright (c) 2016, 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()})
/// Returns the first element that satisfies the given predicate test.
/// Iterates through elements and returns the first to satsify test.
/// If no element satisfies test, the result of invoking the orElse function
/// is returned. If orElse is omitted, it defaults to throwing a StateError.
/// @description Checks that the first element that satisfies the given predicate
/// test is returned
/// @author sgrekhov@unipro.ru

library firstWhere_A04_t01;

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

class C {
  int val;
  C(this.val);
}

test(Iterable create([Iterable content]), {bool isSet: false}) {
  C c1 = new C(42);
  C c2 = new C(42);

  Iterable a = create([c1, c2]);
  C found = a.firstWhere((var value) {
    if (value is C) {
      return value.val == 42;
    }
    return false;
  }, orElse: () => null);
  if (isSet) {
    // Set may be unordered so the first element that satisfies the test is
    // unpredictable. Just test that something is returned
    Expect.isNotNull(found);
  } else {
    if (found != null) {
      Expect.identical(c1, found);
      Expect.notEquals(c2, found);
    }
  }
}
