// 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, 6];
  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.lastWhere((x) => x.isEven));
  Expect.equals(3, list1.lastWhere((x) => x.isOdd));
  Expect.throwsStateError(() => list1.lastWhere((x) => x > 3));
  Expect.equals(null, list1.lastWhere((x) => x > 3, orElse: () => null));
  Expect.equals(499, list1.lastWhere((x) => x > 3, orElse: () => 499));

  Expect.equals(6, list2.lastWhere((x) => x.isEven));
  Expect.equals(5, list2.lastWhere((x) => x.isOdd));
  Expect.throwsStateError(() => list2.lastWhere((x) => x == 0));
  Expect.equals(null, list2.lastWhere((x) => false, orElse: () => null));
  Expect.equals(499, list2.lastWhere((x) => false, orElse: () => 499));

  Expect.throwsStateError(() => list3.lastWhere((x) => x == 0));
  Expect.throwsStateError(() => list3.lastWhere((x) => true));
  Expect.equals(null, list3.lastWhere((x) => true, orElse: () => null));
  Expect.equals("str", list3.lastWhere((x) => false, orElse: () => "str"));

  Expect.equals(12, set1.lastWhere((x) => x.isEven));
  var odd = set1.lastWhere((x) => x.isOdd);
  Expect.isTrue(odd == 11 || odd == 13);
  Expect.throwsStateError(() => set1.lastWhere((x) => false));
  Expect.equals(null, set1.lastWhere((x) => false, orElse: () => null));
  Expect.equals(499, set1.lastWhere((x) => false, orElse: () => 499));

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