// 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.

import 'package:expect/expect.dart';

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.throwsStateError(() => list1.firstWhere((x) => x > 3));
  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.throwsStateError(() => list2.firstWhere((x) => x == 0));
  Expect.equals(null, list2.firstWhere((x) => false, orElse: () => null));
  Expect.equals(499, list2.firstWhere((x) => false, orElse: () => 499));

  Expect.throwsStateError(() => list3.firstWhere((x) => x == 0));
  Expect.throwsStateError(() => list3.firstWhere((x) => true));
  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.throwsStateError(() => set1.firstWhere((x) => false));
  Expect.equals(null, set1.firstWhere((x) => false, orElse: () => null));
  Expect.equals(499, set1.firstWhere((x) => false, orElse: () => 499));

  Expect.throwsStateError(() => set2.firstWhere((x) => false));
  Expect.throwsStateError(() => set2.firstWhere((x) => true));
  Expect.equals(null, set2.firstWhere((x) => true, orElse: () => null));
  Expect.equals(499, set2.firstWhere((x) => false, orElse: () => 499));
}
