| // 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 'dart:async'; |
| |
| import 'package:args/args.dart'; |
| import 'package:args/command_runner.dart'; |
| 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/user_messages.dart'; |
| import 'package:flutter_tools/src/cache.dart'; |
| import 'package:flutter_tools/src/commands/create.dart'; |
| import 'package:flutter_tools/src/globals.dart' as globals; |
| import 'package:flutter_tools/src/runner/flutter_command.dart'; |
| import 'package:flutter_tools/src/runner/flutter_command_runner.dart'; |
| |
| export 'package:test_api/test_api.dart' hide isInstanceOf, test; // ignore: deprecated_member_use |
| |
| CommandRunner<void> createTestCommandRunner([ FlutterCommand? command ]) { |
| final FlutterCommandRunner runner = TestFlutterCommandRunner(); |
| if (command != null) { |
| runner.addCommand(command); |
| } |
| return runner; |
| } |
| |
| /// Creates a flutter project in the [temp] directory using the |
| /// [arguments] list if specified, or `--no-pub` if not. |
| /// Returns the path to the flutter project. |
| Future<String> createProject(Directory temp, { List<String>? arguments }) async { |
| arguments ??= <String>['--no-pub']; |
| final String projectPath = globals.fs.path.join(temp.path, 'flutter_project'); |
| final CreateCommand command = CreateCommand(); |
| final CommandRunner<void> runner = createTestCommandRunner(command); |
| await runner.run(<String>['create', ...arguments, projectPath]); |
| // Create `.packages` since it's not created when the flag `--no-pub` is passed. |
| globals.fs.file(globals.fs.path.join(projectPath, '.packages')).createSync(); |
| return projectPath; |
| } |
| |
| class TestFlutterCommandRunner extends FlutterCommandRunner { |
| @override |
| Future<void> runCommand(ArgResults topLevelResults) async { |
| final Logger topLevelLogger = globals.logger; |
| final Map<Type, dynamic> contextOverrides = <Type, dynamic>{ |
| if (topLevelResults['verbose'] as bool) |
| Logger: VerboseLogger(topLevelLogger), |
| }; |
| return context.run<void>( |
| overrides: contextOverrides.map<Type, Generator>((Type type, dynamic value) { |
| return MapEntry<Type, Generator>(type, () => value); |
| }), |
| body: () { |
| Cache.flutterRoot ??= Cache.defaultFlutterRoot( |
| platform: globals.platform, |
| fileSystem: globals.fs, |
| userMessages: UserMessages(), |
| ); |
| // For compatibility with tests that set this to a relative path. |
| Cache.flutterRoot = globals.fs.path.normalize(globals.fs.path.absolute(Cache.flutterRoot!)); |
| return super.runCommand(topLevelResults); |
| } |
| ); |
| } |
| } |