/*
 * Copyright (c) 2011, 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 Future<T> singleWhere(bool test(T element))
 * Like lastMatch, except that it is an error if more than one matching element
 * occurs in the stream.
 * @description Checks that it is an error if more than one matching element
 * occurs in the stream.
 * @author kaigorodov
 */
library singleWhere_A02_t01;

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

void test(CreateStreamFunction create) {
  AsyncExpect.error(
      (e) => e is Error, create([1, 2, 3]).singleWhere((int e) => true));
  AsyncExpect.error(
      (e) => e is Error, create([1, 2, 3]).singleWhere((int? e) => e != null));
  AsyncExpect.error(
      (e) => e is Error, create([-1, 2, 3]).singleWhere((int e) => e > 0));
  AsyncExpect.error(
      (e) => e is Error,
      create(new Iterable.generate(10, (int i) => i * 5))
          .singleWhere((int e) => e != 30));
}
