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

// @dart = 2.9

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