// Copyright (c) 2013, 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.

import "dart:async";
import "package:expect/expect.dart";
import 'package:async_helper/async_helper.dart';

main() {
  asyncStart();

  testValues();
  testErrors();
  testMixed();
  testOrdering();
  testEmpty();
  testPrecompleted();

  asyncEnd();
}

void testValues() {
  asyncStart();
  var cs = new List.generate(3, (_) => new Completer());
  var stream = new Stream.fromFutures(cs.map((x) => x.future));
  var result = stream.toList();

  result.then((list) {
    Expect.listEquals([1, 2, 3], list);
    asyncEnd();
  });

  cs[1].complete(1);
  cs[2].complete(2);
  cs[0].complete(3);
}

void testErrors() {
  asyncStart();
  var cs = new List.generate(3, (_) => new Completer());
  var stream = new Stream.fromFutures(cs.map((x) => x.future));

  int counter = 0;
  stream.listen((_) {
    Expect.fail("unexpected value");
  }, onError: (e) {
    Expect.equals(++counter, e);
  }, onDone: () {
    Expect.equals(3, counter);
    asyncEnd();
  });

  cs[1].completeError(1);
  cs[2].completeError(2);
  cs[0].completeError(3);
}

void testMixed() {
  asyncStart();
  var cs = new List.generate(3, (_) => new Completer());
  var stream = new Stream.fromFutures(cs.map((x) => x.future));

  int counter = 0;
  stream.listen((v) {
    Expect.isTrue(counter == 0 || counter == 2);
    Expect.equals(++counter, v);
  }, onError: (e) {
    Expect.equals(++counter, 2);
    Expect.equals(2, e);
  }, onDone: () {
    Expect.equals(3, counter);
    asyncEnd();
  });

  cs[1].complete(1);
  cs[2].completeError(2);
  cs[0].complete(3);
}

void testOrdering() {
  // The output is in completion order, not affected by the input future order.
  test(n1, n2, n3) {
    asyncStart();
    var cs = new List.generate(3, (_) => new Completer());
    var stream = new Stream.fromFutures(cs.map((x) => x.future));
    var result = stream.toList();

    result.then((list) {
      Expect.listEquals([1, 2, 3], list);
      asyncEnd();
    });

    cs[n1].complete(1);
    cs[n2].complete(2);
    cs[n3].complete(3);
  }
  test(0, 1, 2);
  test(0, 2, 1);
  test(1, 0, 2);
  test(1, 2, 0);
  test(2, 0, 1);
  test(2, 1, 0);
}

void testEmpty() {
  asyncStart();
  var stream = new Stream.fromFutures([]);

  stream.listen((_) {
    Expect.fail("unexpected value");
  }, onError: (e) {
    Expect.fail("unexpected error");
  }, onDone: () {
    asyncEnd();
  });
}

void testPrecompleted() {
  asyncStart();
  var stream = new Stream.fromFutures(
      new Iterable.generate(3, (v) => new Future.value(v + 1)));
  var expected = new Set.from([1, 2, 3]);
  stream.listen((v) {
    Expect.isTrue(expected.contains(v));
    expected.remove(v);
  }, onDone: () {
    Expect.isTrue(expected.isEmpty);
    asyncEnd();
  });
}
