// 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)
///    Pipe the events of this stream into streamConsumer.
///    The events of this stream are added to streamConsumer using
/// [StreamConsumer.addStream]. The streamConsumer is closed when this stream
/// has been successfully added to it - when the future returned by addStream
/// completes without an error.
/// @description Checks that streamConsumer is closed when the future returned
/// by addStream completes without an error.
/// @author a.semenov@unipro.ru

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

class TestStreamConsumer<T> implements StreamConsumer<T> {

  int _addStreamFutureCompleted = 0;
  int _addStreamFutureCompletedInClose = 0;
  int _closeCallCount = 0;
  StreamController _controller = new StreamController();

  Future addStream(Stream<T> source) {
    return _controller.addStream(source).then(
      (x) {
        _addStreamFutureCompleted++;
        return x;
      }
    );
  }

  Future close() {
    _closeCallCount++;
    _addStreamFutureCompletedInClose = _addStreamFutureCompleted;
    return _controller.close();
  }

  Stream get stream => _controller.stream;
  int get addStreamFutureCompletedInClose => _addStreamFutureCompletedInClose;
  int get closeCallCount => _closeCallCount;
}

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.listEquals([1, 2, 3, 4, 5], values);
      Expect.equals(1, c.closeCallCount);
      Expect.equals(1, c.addStreamFutureCompletedInClose);
      asyncEnd();
    }
  );
}
