// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/shell_completion.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import '../../src/context.dart'; import '../../src/fakes.dart'; import '../../src/test_flutter_command_runner.dart'; void main() { group('shell_completion', () { late FakeStdio fakeStdio; setUp(() { Cache.disableLocking(); fakeStdio = FakeStdio()..stdout.terminalColumns = 80; }); testUsingContext('generates bash initialization script to stdout', () async { final ShellCompletionCommand command = ShellCompletionCommand(); await createTestCommandRunner(command).run(<String>['bash-completion']); expect(fakeStdio.writtenToStdout.length, equals(1)); expect(fakeStdio.writtenToStdout.first, contains('__flutter_completion')); }, overrides: <Type, Generator>{ FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), Stdio: () => fakeStdio, }); testUsingContext('generates bash initialization script to stdout with arg', () async { final ShellCompletionCommand command = ShellCompletionCommand(); await createTestCommandRunner(command).run(<String>['bash-completion', '-']); expect(fakeStdio.writtenToStdout.length, equals(1)); expect(fakeStdio.writtenToStdout.first, contains('__flutter_completion')); }, overrides: <Type, Generator>{ FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), Stdio: () => fakeStdio, }); testUsingContext('generates bash initialization script to output file', () async { final ShellCompletionCommand command = ShellCompletionCommand(); const String outputFile = 'bash-setup.sh'; await createTestCommandRunner(command).run( <String>['bash-completion', outputFile], ); expect(globals.fs.isFileSync(outputFile), isTrue); expect(globals.fs.file(outputFile).readAsStringSync(), contains('__flutter_completion')); }, overrides: <Type, Generator>{ FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), Stdio: () => fakeStdio, }); testUsingContext("won't overwrite existing output file ", () async { final ShellCompletionCommand command = ShellCompletionCommand(); const String outputFile = 'bash-setup.sh'; globals.fs.file(outputFile).createSync(); await expectLater( () => createTestCommandRunner(command).run( <String>['bash-completion', outputFile], ), throwsA( isA<ToolExit>() .having((ToolExit error) => error.exitCode, 'exitCode', anyOf(isNull, 1)) .having((ToolExit error) => error.message, 'message', contains('Use --overwrite')), ), ); expect(globals.fs.isFileSync(outputFile), isTrue); expect(globals.fs.file(outputFile).readAsStringSync(), isEmpty); }, overrides: <Type, Generator>{ FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), Stdio: () => fakeStdio, }); testUsingContext('will overwrite existing output file if given --overwrite', () async { final ShellCompletionCommand command = ShellCompletionCommand(); const String outputFile = 'bash-setup.sh'; globals.fs.file(outputFile).createSync(); await createTestCommandRunner(command).run( <String>['bash-completion', '--overwrite', outputFile], ); expect(globals.fs.isFileSync(outputFile), isTrue); expect(globals.fs.file(outputFile).readAsStringSync(), contains('__flutter_completion')); }, overrides: <Type, Generator>{ FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), Stdio: () => fakeStdio, }); }); }