From a01f37245b561ffab1114e3db3aa3817cbb8147d Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 12 Mar 2021 12:53:05 -0800 Subject: [PATCH] [flutter_tools] remove globals from terminal (#77953) --- .../flutter_tools/lib/src/android/gradle.dart | 18 ++++---- .../lib/src/android/gradle_errors.dart | 11 +++-- .../lib/src/android/gradle_utils.dart | 3 +- .../flutter_tools/lib/src/base/terminal.dart | 45 ++++++++++++------- .../flutter_tools/lib/src/context_runner.dart | 6 +++ packages/flutter_tools/lib/src/globals.dart | 8 +++- .../lib/src/runner/flutter_command.dart | 5 +-- .../hermetic/symbolize_test.dart | 39 +++++++++++++--- .../general.shard/android/gradle_test.dart | 3 +- .../runner/flutter_command_runner_test.dart | 21 +++++++-- 10 files changed, 110 insertions(+), 49 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 404d6ee9669..e5c16aafdb9 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -146,7 +146,7 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) { } if (!exactMatch) { status.cancel(); - logger.printStatus('$warningMark Flutter tried to create the file `$newSettingsRelativeFile`, but failed.'); + logger.printStatus('${logger.terminal.warningMark} Flutter tried to create the file `$newSettingsRelativeFile`, but failed.'); // Print how to manually update the file. logger.printStatus(fileSystem.file(fileSystem.path.join(flutterRoot, 'packages','flutter_tools', 'gradle', 'manual_migration_settings.gradle.md')).readAsStringSync()); @@ -155,7 +155,7 @@ void createSettingsAarGradle(Directory androidDirectory, Logger logger) { // Copy the new file. newSettingsFile.writeAsStringSync(settingsAarContent); status.stop(); - logger.printStatus('$successMark `$newSettingsRelativeFile` created successfully.'); + logger.printStatus('${logger.terminal.successMark} `$newSettingsRelativeFile` created successfully.'); } /// An implementation of the [AndroidBuilder] that delegates to gradle. @@ -286,7 +286,7 @@ class AndroidGradleBuilder implements AndroidBuilder { assert(localGradleErrors != null); if (!project.android.isSupportedVersion) { - _exitWithUnsupportedProjectMessage(_usage); + _exitWithUnsupportedProjectMessage(_usage, _logger.terminal); } final Directory buildDirectory = project.android.buildDirectory; @@ -295,7 +295,7 @@ class AndroidGradleBuilder implements AndroidBuilder { BuildEvent('app-using-android-x', flutterUsage: _usage).send(); } else if (!usesAndroidX) { BuildEvent('app-not-using-android-x', flutterUsage: _usage).send(); - _logger.printStatus("$warningMark Your app isn't using AndroidX.", emphasis: true); + _logger.printStatus("${_logger.terminal.warningMark} Your app isn't using AndroidX.", emphasis: true); _logger.printStatus( 'To avoid potential build failures, you can quickly migrate your app ' 'by following the steps on https://goo.gl/CP92wY .', @@ -523,7 +523,7 @@ class AndroidGradleBuilder implements AndroidBuilder { } _logger.printStatus( - '$successMark Built ${_fileSystem.path.relative(bundleFile.path)}$appSize.', + '${_logger.terminal.successMark} Built ${_fileSystem.path.relative(bundleFile.path)}$appSize.', color: TerminalColor.green, ); return; @@ -557,7 +557,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ? '' // Don't display the size when building a debug variant. : ' (${getSizeAsMB(apkFile.lengthSync())})'; _logger.printStatus( - '$successMark Built ${_fileSystem.path.relative(apkFile.path)}$appSize.', + '${_logger.terminal.successMark} Built ${_fileSystem.path.relative(apkFile.path)}$appSize.', color: TerminalColor.green, ); @@ -748,7 +748,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ); } _logger.printStatus( - '$successMark Built ${_fileSystem.path.relative(repoDirectory.path)}.', + '${_logger.terminal.successMark} Built ${_fileSystem.path.relative(repoDirectory.path)}.', color: TerminalColor.green, ); } @@ -878,10 +878,10 @@ String _calculateSha(File file) { return _hex(sha1.convert(bytes).bytes); } -void _exitWithUnsupportedProjectMessage(Usage usage) { +void _exitWithUnsupportedProjectMessage(Usage usage, Terminal terminal) { BuildEvent('unsupported-project', eventError: 'gradle-plugin', flutterUsage: usage).send(); throwToolExit( - '$warningMark Your app is using an unsupported Gradle project. ' + '${terminal.warningMark} Your app is using an unsupported Gradle project. ' 'To fix this problem, create a new project by running `flutter create -t app ` ' 'and then move the dart code, assets and pubspec.yaml to the new project.', ); diff --git a/packages/flutter_tools/lib/src/android/gradle_errors.dart b/packages/flutter_tools/lib/src/android/gradle_errors.dart index eed2d2b7fc2..789e96cc3b7 100644 --- a/packages/flutter_tools/lib/src/android/gradle_errors.dart +++ b/packages/flutter_tools/lib/src/android/gradle_errors.dart @@ -8,7 +8,6 @@ import 'package:meta/meta.dart'; import '../base/error_handling_io.dart'; import '../base/file_system.dart'; import '../base/process.dart'; -import '../base/terminal.dart'; import '../globals.dart' as globals; import '../project.dart'; import '../reporting/reporting.dart'; @@ -88,7 +87,7 @@ final GradleHandledError permissionDeniedErrorHandler = GradleHandledError( bool usesAndroidX, bool shouldBuildPluginAsAar, }) async { - globals.printStatus('$warningMark Gradle does not have execution permission.', emphasis: true); + globals.printStatus('${globals.logger.terminal.warningMark} Gradle does not have execution permission.', emphasis: true); globals.printStatus( 'You should change the ownership of the project directory to your user, ' 'or move the project to a directory with execute permissions.', @@ -126,7 +125,7 @@ final GradleHandledError networkErrorHandler = GradleHandledError( bool shouldBuildPluginAsAar, }) async { globals.printError( - '$warningMark Gradle threw an error while downloading artifacts from the network. ' + '${globals.logger.terminal.warningMark} Gradle threw an error while downloading artifacts from the network. ' 'Retrying to download...' ); try { @@ -155,7 +154,7 @@ final GradleHandledError r8FailureHandler = GradleHandledError( bool usesAndroidX, bool shouldBuildPluginAsAar, }) async { - globals.printStatus('$warningMark The shrinker may have failed to optimize the Java bytecode.', emphasis: true); + globals.printStatus('${globals.logger.terminal.warningMark} The shrinker may have failed to optimize the Java bytecode.', emphasis: true); globals.printStatus('To disable the shrinker, pass the `--no-shrink` flag to this command.', indent: 4); globals.printStatus('To learn more, see: https://developer.android.com/studio/build/shrink-code', indent: 4); return GradleBuildStatus.exit; @@ -265,7 +264,7 @@ final GradleHandledError licenseNotAcceptedHandler = GradleHandledError( assert(licenseFailure != null); final Match licenseMatch = licenseFailure.firstMatch(line); globals.printStatus( - '$warningMark Unable to download needed Android SDK components, as the ' + '${globals.logger.terminal.warningMark} Unable to download needed Android SDK components, as the ' 'following licenses have not been accepted:\n' '${licenseMatch.group(1)}\n\n' 'To resolve this, please run the following command in a Terminal:\n' @@ -329,7 +328,7 @@ final GradleHandledError flavorUndefinedHandler = GradleHandledError( } } globals.printStatus( - '\n$warningMark Gradle project does not define a task suitable ' + '\n${globals.logger.terminal.warningMark} Gradle project does not define a task suitable ' 'for the requested build.' ); if (productFlavors.isEmpty) { diff --git a/packages/flutter_tools/lib/src/android/gradle_utils.dart b/packages/flutter_tools/lib/src/android/gradle_utils.dart index e9aef1deaba..93217a7cc85 100644 --- a/packages/flutter_tools/lib/src/android/gradle_utils.dart +++ b/packages/flutter_tools/lib/src/android/gradle_utils.dart @@ -12,7 +12,6 @@ import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/os.dart'; import '../base/platform.dart'; -import '../base/terminal.dart'; import '../base/utils.dart'; import '../base/version.dart'; import '../build_info.dart'; @@ -260,7 +259,7 @@ void writeLocalProperties(File properties) { void exitWithNoSdkMessage() { BuildEvent('unsupported-project', eventError: 'android-sdk-not-found', flutterUsage: globals.flutterUsage).send(); throwToolExit( - '$warningMark No Android SDK found. ' + '${globals.logger.terminal.warningMark} No Android SDK found. ' 'Try setting the ANDROID_SDK_ROOT environment variable.' ); } diff --git a/packages/flutter_tools/lib/src/base/terminal.dart b/packages/flutter_tools/lib/src/base/terminal.dart index cad92fa9eb8..e440b2df484 100644 --- a/packages/flutter_tools/lib/src/base/terminal.dart +++ b/packages/flutter_tools/lib/src/base/terminal.dart @@ -7,7 +7,6 @@ import 'package:meta/meta.dart'; import '../convert.dart'; -import '../globals.dart' as globals; import 'io.dart' as io; import 'logger.dart'; import 'platform.dart'; @@ -22,16 +21,6 @@ enum TerminalColor { grey, } -/// Warning mark to use in stdout or stderr. -String get warningMark { - return globals.terminal.bolden(globals.terminal.color('[!]', TerminalColor.red)); -} - -/// Success mark to use in stdout. -String get successMark { - return globals.terminal.bolden(globals.terminal.color('✓', TerminalColor.green)); -} - /// A class that contains the context settings for command text output to the /// console. class OutputPreferences { @@ -39,13 +28,17 @@ class OutputPreferences { bool wrapText, int wrapColumn, bool showColor, - }) : wrapText = wrapText ?? globals.stdio.hasTerminal, + io.Stdio stdio, + }) : _stdio = stdio, + wrapText = wrapText ?? stdio.hasTerminal, _overrideWrapColumn = wrapColumn, - showColor = showColor ?? globals.platform.stdoutSupportsAnsi ?? false; + showColor = showColor ?? false; /// A version of this class for use in tests. OutputPreferences.test({this.wrapText = false, int wrapColumn = kDefaultTerminalColumns, this.showColor = false}) - : _overrideWrapColumn = wrapColumn; + : _overrideWrapColumn = wrapColumn, _stdio = null; + + final io.Stdio _stdio; /// If [wrapText] is true, then any text sent to the context's [Logger] /// instance (e.g. from the [printError] or [printStatus] functions) will be @@ -65,7 +58,7 @@ class OutputPreferences { /// terminal, or to [kDefaultTerminalColumns] if not writing to a terminal. final int _overrideWrapColumn; int get wrapColumn { - return _overrideWrapColumn ?? globals.stdio.terminalColumns ?? kDefaultTerminalColumns; + return _overrideWrapColumn ?? _stdio?.terminalColumns ?? kDefaultTerminalColumns; } /// Whether or not to output ANSI color codes when writing to the output @@ -106,6 +99,12 @@ abstract class Terminal { /// or whether an automatic selection should be made instead. bool get stdinHasTerminal; + /// Warning mark to use in stdout or stderr. + String get warningMark; + + /// Success mark to use in stdout. + String get successMark; + String bolden(String message); String color(String message, TerminalColor color); @@ -199,6 +198,16 @@ class AnsiTerminal implements Terminal { @override bool usesTerminalUi = false; + @override + String get warningMark { + return bolden(color('[!]', TerminalColor.red)); + } + + @override + String get successMark { + return bolden(color('✓', TerminalColor.green)); + } + @override String bolden(String message) { assert(message != null); @@ -355,4 +364,10 @@ class _TestTerminal implements Terminal { @override bool get stdinHasTerminal => false; + + @override + String get successMark => '✓'; + + @override + String get warningMark => '[!]'; } diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index 2dfec2b7e08..6130318f7ee 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -24,6 +24,7 @@ import 'base/io.dart'; import 'base/logger.dart'; import 'base/os.dart'; import 'base/process.dart'; +import 'base/terminal.dart'; import 'base/time.dart'; import 'base/user_messages.dart'; import 'build_info.dart'; @@ -275,6 +276,11 @@ Future runInContext( platform: globals.platform, processManager: globals.processManager, ), + OutputPreferences: () => OutputPreferences( + wrapText: globals.stdio.hasTerminal ?? false, + showColor: globals.platform.stdoutSupportsAnsi, + stdio: globals.stdio, + ), PersistentToolState: () => PersistentToolState( fileSystem: globals.fs, logger: globals.logger, diff --git a/packages/flutter_tools/lib/src/globals.dart b/packages/flutter_tools/lib/src/globals.dart index 074ab8ca45f..998e0504d8a 100644 --- a/packages/flutter_tools/lib/src/globals.dart +++ b/packages/flutter_tools/lib/src/globals.dart @@ -106,8 +106,12 @@ XcodeProjectInterpreter get xcodeProjectInterpreter => context.get context.get(); -final OutputPreferences _defaultOutputPreferences = OutputPreferences(); -OutputPreferences get outputPreferences => context.get() ?? _defaultOutputPreferences; +final OutputPreferences _default = OutputPreferences( + wrapText: stdio.hasTerminal ?? false, + showColor: platform.stdoutSupportsAnsi, + stdio: stdio, +); +OutputPreferences get outputPreferences => context.get() ?? _default; final BotDetector _defaultBotDetector = BotDetector( httpClientFactory: context.get() ?? () => HttpClient(), diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 1137abc0067..8742ba05c34 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -14,7 +14,6 @@ import '../application_package.dart'; import '../base/common.dart'; import '../base/context.dart'; import '../base/io.dart' as io; -import '../base/terminal.dart'; import '../base/user_messages.dart'; import '../base/utils.dart'; import '../build_info.dart'; @@ -1046,7 +1045,7 @@ abstract class FlutterCommand extends Command { void _printDeprecationWarning() { if (deprecated) { - globals.printStatus('$warningMark The "$name" command is deprecated and ' + globals.printStatus('${globals.logger.terminal.warningMark} The "$name" command is deprecated and ' 'will be removed in a future version of Flutter. ' 'See https://flutter.dev/docs/development/tools/sdk/releases ' 'for previous releases of Flutter.'); @@ -1326,7 +1325,7 @@ abstract class FlutterCommand extends Command { ); final String help = [ if (deprecated) - '$warningMark Deprecated. This command will be removed in a future version of Flutter.', + '${globals.logger.terminal.warningMark} Deprecated. This command will be removed in a future version of Flutter.', description, '', 'Global options:', diff --git a/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart index f389e95a862..6422c280cbb 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart @@ -11,6 +11,7 @@ import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/symbolize.dart'; import 'package:flutter_tools/src/convert.dart'; @@ -24,7 +25,6 @@ import '../../src/fakes.dart'; void main() { MemoryFileSystem fileSystem; FakeStdio stdio; - SymbolizeCommand command; setUpAll(() { Cache.disableLocking(); @@ -33,11 +33,6 @@ void main() { setUp(() { fileSystem = MemoryFileSystem.test(); stdio = FakeStdio(); - command = SymbolizeCommand( - stdio: stdio, - fileSystem: fileSystem, - dwarfSymbolizationService: DwarfSymbolizationService.test(), - ); }); testUsingContext('Regression test for type error in codec', () async { @@ -60,28 +55,54 @@ void main() { testUsingContext('symbolize exits when --debug-info argument is missing', () async { + final SymbolizeCommand command = SymbolizeCommand( + stdio: stdio, + fileSystem: fileSystem, + dwarfSymbolizationService: DwarfSymbolizationService.test(), + ); final Future result = createTestCommandRunner(command) .run(const ['symbolize']); expect(result, throwsToolExit(message: '"--debug-info" is required to symbolize stack traces.')); + }, overrides: { + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('symbolize exits when --debug-info file is missing', () async { + final SymbolizeCommand command = SymbolizeCommand( + stdio: stdio, + fileSystem: fileSystem, + dwarfSymbolizationService: DwarfSymbolizationService.test(), + ); final Future result = createTestCommandRunner(command) .run(const ['symbolize', '--debug-info=app.debug']); expect(result, throwsToolExit(message: 'app.debug does not exist.')); + }, overrides: { + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('symbolize exits when --input file is missing', () async { + final SymbolizeCommand command = SymbolizeCommand( + stdio: stdio, + fileSystem: fileSystem, + dwarfSymbolizationService: DwarfSymbolizationService.test(), + ); fileSystem.file('app.debug').createSync(); final Future result = createTestCommandRunner(command) .run(const ['symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result']); expect(result, throwsToolExit(message: '')); + }, overrides: { + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('symbolize succeeds when DwarfSymbolizationService does not throw', () async { + final SymbolizeCommand command = SymbolizeCommand( + stdio: stdio, + fileSystem: fileSystem, + dwarfSymbolizationService: DwarfSymbolizationService.test(), + ); fileSystem.file('app.debug').writeAsBytesSync([1, 2, 3]); fileSystem.file('foo.stack').writeAsStringSync('hello'); @@ -90,10 +111,12 @@ void main() { expect(fileSystem.file('results/foo.result'), exists); expect(fileSystem.file('results/foo.result').readAsBytesSync(), [104, 101, 108, 108, 111, 10]); // hello + }, overrides: { + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('symbolize throws when DwarfSymbolizationService throws', () async { - command = SymbolizeCommand( + final SymbolizeCommand command = SymbolizeCommand( stdio: stdio, fileSystem: fileSystem, dwarfSymbolizationService: ThrowingDwarfSymbolizationService(), @@ -107,6 +130,8 @@ void main() { 'symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result']), throwsToolExit(message: 'test'), ); + }, overrides: { + OutputPreferences: () => OutputPreferences.test(), }); } diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart index 88b81d2f437..3e9f5a3e36d 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart @@ -15,7 +15,6 @@ import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; -import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -196,7 +195,7 @@ void main() { expect(() { updateLocalProperties(project: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory)); }, throwsToolExit( - message: '$warningMark No Android SDK found. Try setting the ANDROID_SDK_ROOT environment variable.', + message: '${globals.logger.terminal.warningMark} No Android SDK found. Try setting the ANDROID_SDK_ROOT environment variable.', )); }, overrides: { AndroidSdk: () => null, diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart index 48773980b13..d961a8859f6 100644 --- a/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart @@ -27,7 +27,6 @@ void main() { group('FlutterCommandRunner', () { MemoryFileSystem fileSystem; Platform platform; - FlutterCommandRunner runner; setUpAll(() { Cache.disableLocking(); @@ -45,12 +44,11 @@ void main() { }, version: '1 2 3 4 5', ); - - runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; }); group('run', () { testUsingContext('checks that Flutter installation is up-to-date', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterVersion version = globals.flutterVersion as FakeFlutterVersion; await runner.run(['dummy']); @@ -61,9 +59,11 @@ void main() { ProcessManager: () => FakeProcessManager.any(), Platform: () => platform, FlutterVersion: () => FakeFlutterVersion(), + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('does not check that Flutter installation is up-to-date with --machine flag', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterVersion version = globals.flutterVersion as FakeFlutterVersion; await runner.run(['dummy', '--machine', '--version']); @@ -74,9 +74,11 @@ void main() { ProcessManager: () => FakeProcessManager.any(), Platform: () => platform, FlutterVersion: () => FakeFlutterVersion(), + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('Fetches tags when --version is used', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterVersion version = globals.flutterVersion as FakeFlutterVersion; await runner.run(['--version']); @@ -87,9 +89,11 @@ void main() { ProcessManager: () => FakeProcessManager.any(), Platform: () => platform, FlutterVersion: () => FakeFlutterVersion(), + OutputPreferences: () => OutputPreferences.test(), }); testUsingContext('Doesnt crash on invalid .packages file', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; fileSystem.file('pubspec.yaml').createSync(); fileSystem.file('.packages') ..createSync() @@ -101,6 +105,7 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), Platform: () => platform, + OutputPreferences: () => OutputPreferences.test(), }); group('getRepoPackages', () { @@ -127,6 +132,7 @@ void main() { }); testUsingContext('', () { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final List packagePaths = runner.getRepoPackages() .map((Directory d) => d.path).toList(); expect(packagePaths, [ @@ -138,11 +144,13 @@ void main() { ProcessManager: () => FakeProcessManager.any(), Platform: () => platform, FlutterVersion: () => FakeFlutterVersion(), + OutputPreferences: () => OutputPreferences.test(), }); }); group('wrapping', () { testUsingContext('checks that output wrapping is turned on when writing to a terminal', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['fake']); @@ -151,9 +159,11 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), Stdio: () => FakeStdio(hasFakeTerminal: true), + OutputPreferences: () => OutputPreferences.test(), }, initializeFlutterRoot: false); testUsingContext('checks that output wrapping is turned off when not writing to a terminal', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['fake']); @@ -162,9 +172,11 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), Stdio: () => FakeStdio(hasFakeTerminal: false), + OutputPreferences: () => OutputPreferences.test(), }, initializeFlutterRoot: false); testUsingContext('checks that output wrapping is turned off when set on the command line and writing to a terminal', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['--no-wrap', 'fake']); @@ -173,9 +185,11 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), Stdio: () => FakeStdio(hasFakeTerminal: true), + OutputPreferences: () => OutputPreferences.test(), }, initializeFlutterRoot: false); testUsingContext('checks that output wrapping is turned on when set on the command line, but not writing to a terminal', () async { + final FlutterCommandRunner runner = createTestCommandRunner(DummyFlutterCommand()) as FlutterCommandRunner; final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['--wrap', 'fake']); @@ -184,6 +198,7 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), Stdio: () => FakeStdio(hasFakeTerminal: false), + OutputPreferences: () => OutputPreferences.test(), }, initializeFlutterRoot: false); }); });