// 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 Future pipe(StreamConsumer<T> streamConsumer)
/// Pipe the events of this stream into streamConsumer.
/// @description Checks that all events (including errors) of this stream are
/// piped through streamConsumer
/// @author a.semenov@unipro.ru

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

class TestStreamConsumer<T> implements StreamConsumer<T> {

  StreamController _controller = new StreamController();

  Future addStream(Stream<T> source) {
    return _controller.addStream(source, cancelOnError:false);
  }

  Future close() {
    return _controller.close();
  }

  Stream get stream => _controller.stream;
}

void test(CreateStreamWithErrorsFunction create) {
  List values = [];
  List errors = [];
  TestStreamConsumer<int> c = new TestStreamConsumer<int>();

  c.stream.listen(
    (x) {
      values.add(x);
    },
    onError:(error) {
      errors.add(error);
    }
  );

  Stream<int> s = create([1, 2, 3, 4, 5], isError:(x) => x.isEven, defVal: 42);

  asyncStart();
  s.pipe(c).then((x) {
    Expect.listEquals([1, 3, 5], values);
    Expect.listEquals([2, 4], errors);
    asyncEnd();
  });
}
