blob: 649cbad15a8506a9ae6d512d1fa2bba9a7940098 [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:async/async.dart';
import 'package:test/test.dart';
import 'utils.dart';
void main() {
group('constructors', () {
test('done defaults to a completed future', () {
var sink = NullStreamSink();
expect(sink.done, completes);
});
test('a custom future may be passed to done', () async {
var completer = Completer();
var sink = NullStreamSink(done: completer.future);
var doneFired = false;
sink.done.then((_) {
doneFired = true;
});
await flushMicrotasks();
expect(doneFired, isFalse);
completer.complete();
await flushMicrotasks();
expect(doneFired, isTrue);
});
test('NullStreamSink.error passes an error to done', () {
var sink = NullStreamSink.error('oh no');
expect(sink.done, throwsA('oh no'));
});
});
group('events', () {
test('are silently dropped before close', () {
var sink = NullStreamSink();
sink.add(1);
sink.addError('oh no');
});
test('throw StateErrors after close', () {
var sink = NullStreamSink();
expect(sink.close(), completes);
expect(() => sink.add(1), throwsStateError);
expect(() => sink.addError('oh no'), throwsStateError);
expect(() => sink.addStream(Stream.empty()), throwsStateError);
});
group('addStream', () {
test('listens to the stream then cancels immediately', () async {
var sink = NullStreamSink();
var canceled = false;
var controller = StreamController(onCancel: () {
canceled = true;
});
expect(sink.addStream(controller.stream), completes);
await flushMicrotasks();
expect(canceled, isTrue);
});
test('returns the cancel future', () async {
var completer = Completer();
var sink = NullStreamSink();
var controller = StreamController(onCancel: () => completer.future);
var addStreamFired = false;
sink.addStream(controller.stream).then((_) {
addStreamFired = true;
});
await flushMicrotasks();
expect(addStreamFired, isFalse);
completer.complete();
await flushMicrotasks();
expect(addStreamFired, isTrue);
});
test('pipes errors from the cancel future through addStream', () async {
var sink = NullStreamSink();
var controller = StreamController(onCancel: () => throw 'oh no');
expect(sink.addStream(controller.stream), throwsA('oh no'));
});
test('causes events to throw StateErrors until the future completes',
() async {
var sink = NullStreamSink();
var future = sink.addStream(Stream.empty());
expect(() => sink.add(1), throwsStateError);
expect(() => sink.addError('oh no'), throwsStateError);
expect(() => sink.addStream(Stream.empty()), throwsStateError);
await future;
sink.add(1);
sink.addError('oh no');
expect(sink.addStream(Stream.empty()), completes);
});
});
});
test('close returns the done future', () {
var sink = NullStreamSink.error('oh no');
expect(sink.close(), throwsA('oh no'));
});
}