@@ -9,6 +9,7 @@ import 'package:flutter_tools/src/base/terminal.dart';
99import 'package:test/fake.dart' ;
1010
1111import '../../src/common.dart' ;
12+ import '../../src/fakes.dart' ;
1213
1314void main () {
1415 group ('output preferences' , () {
@@ -253,6 +254,16 @@ void main() {
253254 expect (AnsiTerminal (stdio: stdio, platform: const LocalPlatform (), now: DateTime (2018 , 1 , 10 , 23 )).preferredStyle, 2 );
254255 expect (AnsiTerminal (stdio: stdio, platform: const LocalPlatform (), now: DateTime (2018 , 1 , 11 , 23 )).preferredStyle, 3 );
255256 });
257+
258+ testWithoutContext ('set singleCharMode resilient to StdinException' , () async {
259+ final FakeStdio stdio = FakeStdio ();
260+ final AnsiTerminal terminal = AnsiTerminal (stdio: stdio, platform: const LocalPlatform ());
261+ stdio.stdinHasTerminal = true ;
262+ stdio._stdin = FakeStdin ()..echoModeCallback = (bool _) => throw const StdinException (
263+ 'Error setting terminal echo mode, OS Error: The handle is invalid.' ,
264+ );
265+ terminal.singleCharMode = true ;
266+ });
256267}
257268
258269late Stream <String > mockStdInStream;
@@ -269,14 +280,36 @@ class TestTerminal extends AnsiTerminal {
269280 return mockStdInStream;
270281 }
271282
283+ bool _singleCharMode = false ;
284+
272285 @override
273- bool singleCharMode = false ;
286+ bool get singleCharMode => _singleCharMode;
287+
288+ void Function (bool newMode)? _singleCharModeCallback;
289+
290+ @override
291+ set singleCharMode (bool newMode) {
292+ _singleCharMode = newMode;
293+ if (_singleCharModeCallback != null ) {
294+ _singleCharModeCallback !(newMode);
295+ }
296+ }
274297
275298 @override
276299 int get preferredStyle => 0 ;
277300}
278301
279302class FakeStdio extends Fake implements Stdio {
303+ Stream <List <int >>? _stdin;
304+
305+ @override
306+ Stream <List <int >> get stdin {
307+ if (_stdin != null ) {
308+ return _stdin! ;
309+ }
310+ throw UnimplementedError ('stdin' );
311+ }
312+
280313 @override
281314 bool stdinHasTerminal = false ;
282315}
0 commit comments