blob: 8d830058a31ef0111a9e2a4f70ea55d00209caa2 [file] [log] [blame]
// Copyright (c) 2016, 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.
import 'dart:async';
import 'package:stream_channel/stream_channel.dart';
import 'package:test/test.dart';
void main() {
var completer;
var streamController;
var sinkController;
var innerChannel;
setUp(() {
completer = new StreamChannelCompleter();
streamController = new StreamController();
sinkController = new StreamController();
innerChannel =
new StreamChannel(streamController.stream, sinkController.sink);
});
group("when a channel is set before accessing", () {
test("forwards events through the stream", () {
completer.setChannel(innerChannel);
expect(completer.channel.stream.toList(), completion(equals([1, 2, 3])));
streamController.add(1);
streamController.add(2);
streamController.add(3);
streamController.close();
});
test("forwards events through the sink", () {
completer.setChannel(innerChannel);
expect(sinkController.stream.toList(), completion(equals([1, 2, 3])));
completer.channel.sink.add(1);
completer.channel.sink.add(2);
completer.channel.sink.add(3);
completer.channel.sink.close();
});
test("forwards an error through the stream", () {
completer.setError("oh no");
expect(completer.channel.stream.first, throwsA("oh no"));
});
test("drops sink events", () {
completer.setError("oh no");
expect(completer.channel.sink.done, completes);
completer.channel.sink.add(1);
completer.channel.sink.addError("oh no");
});
});
group("when a channel is set after accessing", () {
test("forwards events through the stream", () async {
expect(completer.channel.stream.toList(), completion(equals([1, 2, 3])));
await pumpEventQueue();
completer.setChannel(innerChannel);
streamController.add(1);
streamController.add(2);
streamController.add(3);
streamController.close();
});
test("forwards events through the sink", () async {
completer.channel.sink.add(1);
completer.channel.sink.add(2);
completer.channel.sink.add(3);
completer.channel.sink.close();
await pumpEventQueue();
completer.setChannel(innerChannel);
expect(sinkController.stream.toList(), completion(equals([1, 2, 3])));
});
test("forwards an error through the stream", () async {
expect(completer.channel.stream.first, throwsA("oh no"));
await pumpEventQueue();
completer.setError("oh no");
});
test("drops sink events", () async {
expect(completer.channel.sink.done, completes);
completer.channel.sink.add(1);
completer.channel.sink.addError("oh no");
await pumpEventQueue();
completer.setError("oh no");
});
});
group("forFuture", () {
test("forwards a StreamChannel", () {
var channel =
StreamChannelCompleter.fromFuture(new Future.value(innerChannel));
channel.sink.add(1);
channel.sink.close();
streamController.sink.add(2);
streamController.sink.close();
expect(sinkController.stream.toList(), completion(equals([1])));
expect(channel.stream.toList(), completion(equals([2])));
});
test("forwards an error", () {
var channel =
StreamChannelCompleter.fromFuture(new Future.error("oh no"));
expect(channel.stream.toList(), throwsA("oh no"));
});
});
test("doesn't allow the channel to be set multiple times", () {
completer.setChannel(innerChannel);
expect(() => completer.setChannel(innerChannel), throwsStateError);
expect(() => completer.setChannel(innerChannel), throwsStateError);
});
}