// 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 error.
 * @author a.semenov@unipro.ru
 */
library pipe_A03_t02;
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 new Future.error(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.fail("Returned future should complete with error");
    },
    onError: (e) {
      Expect.equals(3.14, e);
      Expect.isTrue(c.addStreamFutureCompleted);
      Expect.isTrue(c.closeFutureCompleted);
      Expect.listEquals([1, 2, 3, 4, 5], values);
      asyncEnd();
    }
  );
}
