// 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 futures_test;
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);
}

Future testForEachEmpty() {
  return Futures.forEach([], (_) {
    throw 'should not be called';
  });
}

Future testForEach() {
  var seen = <int>[];
  return Futures.forEach([1, 2, 3, 4, 5], (n) {
    seen.add(n);
    return new Future.immediate(null);
  }).transform((_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
}

Future testForEachWithException() {
  var seen = <int>[];
  return Futures.forEach([1, 2, 3, 4, 5], (n) {
    if (n == 4) throw 'correct exception';
    seen.add(n);
    return new Future.immediate(null);
  }).transform((_) {
    throw 'incorrect exception';
  }).transformException((e) {
    Expect.equals('correct exception', e);
  });
}

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

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

  // 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(5, list.length);
    port.close();
  });
}
