// 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.

#library("FuturesTest");
#import("dart:isolate");

Future testWaitEmpty() {
  List<Future> futures = new List<Future>();
  return Futures.wait(futures);
}

Future testCompleteAfterWait() {
  List<Future> futures = new List<Future>();
  Completer<Object> c = new Completer<Object>();
  futures.add(c.future);
  Future future = Futures.wait(futures);
  c.complete(null);
  return future;
}

Future testCompleteBeforeWait() {
  List<Future> futures = new List<Future>();
  Completer c = new Completer();
  futures.add(c.future);
  c.complete(null);
  return Futures.wait(futures);
}

main() {
  List<Future> futures = new List<Future>();

  futures.add(testWaitEmpty());
  futures.add(testCompleteAfterWait());
  futures.add(testCompleteBeforeWait());

  // Use a receive port for blocking the test. 
  // Note that if the test fails, the program will not end.
  ReceivePort port = new ReceivePort();
  Futures.wait(futures).then((List list) {
    Expect.equals(3, list.length);
    port.close();
  });
}
