// Copyright (c) 2016, 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  Stream.fromFutures(Iterable<Future<T>> futures)
/// Create a stream from a group of futures.
/// . . .
/// If some futures have completed before calling Stream.fromFutures, their
/// result will be output on the created stream in some unspecified order.
///
/// When all futures have completed, the stream is closed.
///
/// @description Checks that if one future has completed before calling
/// Stream.fromFutures, their result will be output on the created stream in
/// some unspecified order. The stream is closed when all futures completed.
/// @author ngl@unipro.ru

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

const N = 4;

List<Completer> completers = new List<Completer>.filled(N, new Completer());
List<Future> futures = new List<Future>.filled(N, new Future.value());
int num = 0;

main() {
  for (int k = 0; k < N; k++) {
    completers[k] = new Completer();
    futures[k] = completers[k].future;
  }
  completers[1].complete(1);

  Stream s = new Stream.fromFutures(futures);
  List<int> events = [];
  asyncStart();

  s.listen(
    (var event) {
      events.add(event);
    },
    onError: (_) {
      Expect.fail("onError called unexpectedly");
    },
    onDone: () {
      events.sort();
      Expect.listEquals([0,1,2,3], events);
      asyncEnd();
    }
  );

  for (int k = 0; k < N; k++) {
    if (k != 1) {
      completers[k].complete(k);
    }
  }
}
