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