blob: d973ecc0d3f680ac3ceb091f695e5aae4f1437e3 [file] [log] [blame]
// Copyright 2017, 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 'dart:convert';
import 'package:io/io.dart' hide sharedStdIn;
import 'package:test/test.dart';
void main() {
// ignore: close_sinks
late StreamController<String> fakeStdIn;
late SharedStdIn sharedStdIn;
setUp(() {
fakeStdIn = StreamController<String>(sync: true);
sharedStdIn = SharedStdIn(fakeStdIn.stream.map((s) => s.codeUnits));
});
test('should allow a single subscriber', () async {
final logs = <String>[];
final sub = sharedStdIn.transform(utf8.decoder).listen(logs.add);
fakeStdIn.add('Hello World');
await sub.cancel();
expect(logs, ['Hello World']);
});
test('should allow multiple subscribers', () async {
final logs = <String>[];
final asUtf8 = sharedStdIn.transform(utf8.decoder);
var sub = asUtf8.listen(logs.add);
fakeStdIn.add('Hello World');
await sub.cancel();
sub = asUtf8.listen(logs.add);
fakeStdIn.add('Goodbye World');
await sub.cancel();
expect(logs, ['Hello World', 'Goodbye World']);
});
test('should throw if a subscriber is still active', () async {
final active = sharedStdIn.listen((_) {});
expect(() => sharedStdIn.listen((_) {}), throwsStateError);
await active.cancel();
expect(() => sharedStdIn.listen((_) {}), returnsNormally);
});
test('should return a stream of lines', () async {
expect(
sharedStdIn.lines(),
emitsInOrder(<dynamic>[
'I',
'Think',
'Therefore',
'I',
'Am',
]),
);
[
'I\nThink\n',
'Therefore\n',
'I\n',
'Am\n',
].forEach(fakeStdIn.add);
});
test('should return the next line', () {
expect(sharedStdIn.nextLine(), completion('Hello World'));
fakeStdIn.add('Hello World\n');
});
test('should allow listening for new lines multiple times', () async {
expect(sharedStdIn.nextLine(), completion('Hello World'));
fakeStdIn.add('Hello World\n');
await Future<void>.value();
expect(sharedStdIn.nextLine(), completion('Hello World'));
fakeStdIn.add('Hello World\n');
});
}