// 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 all futures have 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[k].complete(k);
  }

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