// 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<bool> every(bool test(T element))
/// Checks whether test accepts all elements provided by this stream.
/// Completes the Future when the answer is known.
/// @description Checks that correct answer is passed to the future.
/// @author kaigorodov

import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateStream.dart" as IsolateStream;

check(Iterable<int?> data, bool test(var element), bool expected) {
  Stream s = IsolateStream.fromIterable(data);
  asyncStart();
  s.every(test).then((bool actual) {
    Expect.equals(expected, actual);
    asyncEnd();
  });
}

main() {
  check([], (var element) => true, true);
  check([1, 2, 3], (var element) => element != null, true);
  check([1, 2, 3, null], (var element) => element == null, false);
  check(new Iterable.generate(0, (int index) => index), (var element) => false,
      true);
  check(new Iterable.generate(10, (int index) => index), (var element) => false,
      false);
  check(new Iterable.generate(0, (int index) => index), (var element) => true,
      true);
  check(new Iterable.generate(2, (int index) => index), (var element) => true,
      true);
  check(new Iterable.generate(10, (int index) => index * 5),
      (var element) => element == 30, false);
  check(new Iterable.generate(10, (int index) => index * 5),
      (var element) => element != 30, false);
  check(new Iterable.generate(10, (int index) => index * 5),
      (var element) => element >= 0, true);
}
