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

// @dart = 2.9

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));
}
