// Copyright (c) 2012, 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.

main() {
  List<int> list1 = <int>[1, 2, 3];
  List<int> list2 = const <int>[4, 5];
  List<String> list3 = <String>[];
  Set<int> set1 = new Set<int>();
  set1..add(11)
      ..add(12)
      ..add(13);
  Set set2 = new Set();

  Expect.equals(2, list1.firstWhere((x) => x.isEven));
  Expect.equals(1, list1.firstWhere((x) => x.isOdd));
  Expect.throws(() => list1.firstWhere((x) => x > 3),
                (e) => e is StateError);
  Expect.equals(null, list1.firstWhere((x) => x > 3, orElse: () => null));
  Expect.equals(499, list1.firstWhere((x) => x > 3, orElse: () => 499));

  Expect.equals(4, list2.firstWhere((x) => x.isEven));
  Expect.equals(5, list2.firstWhere((x) => x.isOdd));
  Expect.throws(() => list2.firstWhere((x) => x == 0),
                (e) => e is StateError);
  Expect.equals(null, list2.firstWhere((x) => false, orElse: () => null));
  Expect.equals(499, list2.firstWhere((x) => false, orElse: () => 499));

  Expect.throws(() => list3.firstWhere((x) => x == 0),
                (e) => e is StateError);
  Expect.throws(() => list3.firstWhere((x) => true), (e) => e is StateError);
  Expect.equals(null, list3.firstWhere((x) => true, orElse: () => null));
  Expect.equals("str", list3.firstWhere((x) => false, orElse: () => "str"));

  Expect.equals(12, set1.firstWhere((x) => x.isEven));
  var odd = set1.firstWhere((x) => x.isOdd);
  Expect.isTrue(odd == 11 || odd == 13);
  Expect.throws(() => set1.firstWhere((x) => false), (e) => e is StateError);
  Expect.equals(null, set1.firstWhere((x) => false, orElse: () => null));
  Expect.equals(499, set1.firstWhere((x) => false, orElse: () => 499));

  Expect.throws(() => set2.firstWhere((x) => false), (e) => e is StateError);
  Expect.throws(() => set2.firstWhere((x) => true), (e) => e is StateError);
  Expect.equals(null, set2.firstWhere((x) => true, orElse: () => null));
  Expect.equals(499, set2.firstWhere((x) => false, orElse: () => 499));
}
