| // 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'); |
| }); |
| } |