// 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)
 *    Returns a future which completes when the stream has been consumed
 * and the consumer has been closed. The returned future completes with
 * the same result as the future returned by StreamConsumer.close.
 * @description Checks that returned future is completed when the stream
 * has been consumed and the consumer has been closed. The returned future
 * completes with the same result as the future returned by StreamConsumer.close.
 * StreamConsumer.close completes with some value.
 * @author a.semenov@unipro.ru
 */
library pipe_A03_t01;
import "dart:async";
import "../../../Utils/expect.dart";

class TestStreamConsumer<T> implements StreamConsumer<T> {

  bool _addStreamFutureCompleted = false;
  bool _closeFutureCompleted = false;
  StreamController _controller = new StreamController();

  Future addStream(Stream<T> source) {
    return _controller.addStream(source, cancelOnError:false).then(
        (x) {
          _addStreamFutureCompleted = true;
          return x;
        }
    );
  }

  Future close() {
    return _controller.close().then(
      (_) {
        _closeFutureCompleted = true;
        return 3.14;
      }
    );
  }

  Stream get stream => _controller.stream;
  bool get addStreamFutureCompleted => _addStreamFutureCompleted;
  bool get closeFutureCompleted => _closeFutureCompleted;
}

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

  c.stream.listen(
    (x) {
      values.add(x);
    }
  );

  Stream<int> s = create([1, 2, 3, 4, 5]);

  asyncStart();
  s.pipe(c).then((x) {
    Expect.equals(3.14, x);
    Expect.isTrue(c.addStreamFutureCompleted);
    Expect.isTrue(c.closeFutureCompleted);
    Expect.listEquals([1, 2, 3, 4, 5], values);

    asyncEnd();
  });
}
