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

/// @assertion abstract Future addStream(Stream<S> stream)
/// Consumes the elements of stream.
/// Listens on stream and does something for each event.
/// The consumer may stop listening after an error, or it may consume all the
/// errors and only stop at a done event.
/// @description Checks that addStream() can be preceded by add() and addError().
/// @author ilya

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

listen(stream, expectedData, expectedErrors) {
  var actualData = [];
  var actualErrors = [];

  asyncStart();
  stream.listen((x) {
    actualData.add(x);
  }, onError: (x) {
    actualErrors.add(x);
  }, onDone: () {
    Expect.listEquals(expectedData, actualData);
    Expect.listEquals(expectedErrors, actualErrors);
    asyncEnd();
  });
}

main() {
  var from = new Stream.fromIterable([5, 6]);

  var c = new StreamController();
  var sink = c.sink;

  listen(c.stream, [1, 3, 5, 6], [2, 4]);

  sink.add(1);
  sink.addError(2);
  sink.add(3);
  sink.addError(4);

  asyncStart();
  sink.addStream(from).then((_) {
    c.close();
    asyncEnd();
  });
}
