|  | // Copyright 2017 The Chromium 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:flutter_tools/src/base/flags.dart'; | 
|  | import 'package:flutter_tools/src/cache.dart'; | 
|  | import 'package:flutter_tools/src/runner/flutter_command.dart'; | 
|  | import 'package:test/test.dart'; | 
|  |  | 
|  | import '../src/common.dart'; | 
|  | import '../src/context.dart'; | 
|  |  | 
|  | typedef FutureOr<Null> _TestMethod(); | 
|  |  | 
|  | void main() { | 
|  | Cache.disableLocking(); | 
|  |  | 
|  | Future<Null> runCommand(Iterable<String> flags, _TestMethod testMethod) async { | 
|  | final List<String> args = <String>['test']..addAll(flags); | 
|  | final _TestCommand command = new _TestCommand(testMethod); | 
|  | await createTestCommandRunner(command).run(args); | 
|  | } | 
|  |  | 
|  | testUsingContext('runCommand works as expected', () async { | 
|  | bool testRan = false; | 
|  | await runCommand(<String>[], () { | 
|  | testRan = true; | 
|  | }); | 
|  | expect(testRan, isTrue); | 
|  | }); | 
|  |  | 
|  | group('flags', () { | 
|  | test('returns no-op flags when not inside Flutter runner', () { | 
|  | expect(flags, isNotNull); | 
|  | expect(flags['foo'], isNull); | 
|  | }); | 
|  |  | 
|  | testUsingContext('returns null for undefined flags', () async { | 
|  | await runCommand(<String>[], () { | 
|  | expect(flags['undefined-flag'], isNull); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | testUsingContext('picks up default values', () async { | 
|  | await runCommand(<String>[], () { | 
|  | expect(flags['verbose'], isFalse); | 
|  | expect(flags['flag-defaults-to-false'], isFalse); | 
|  | expect(flags['flag-defaults-to-true'], isTrue); | 
|  | expect(flags['option-defaults-to-foo'], 'foo'); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | testUsingContext('returns null for flags with no default values', () async { | 
|  | await runCommand(<String>[], () { | 
|  | expect(flags['device-id'], isNull); | 
|  | expect(flags['option-no-default'], isNull); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | testUsingContext('picks up explicit values', () async { | 
|  | await runCommand(<String>[ | 
|  | '--verbose', | 
|  | '--flag-defaults-to-false', | 
|  | '--option-no-default=explicit', | 
|  | '--option-defaults-to-foo=qux', | 
|  | ], () { | 
|  | expect(flags['verbose'], isTrue); | 
|  | expect(flags['flag-defaults-to-false'], isTrue); | 
|  | expect(flags['option-no-default'], 'explicit'); | 
|  | expect(flags['option-defaults-to-foo'], 'qux'); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | } | 
|  |  | 
|  | class _TestCommand extends FlutterCommand { | 
|  | _TestCommand(this.testMethod) { | 
|  | argParser.addFlag('flag-defaults-to-false', defaultsTo: false); | 
|  | argParser.addFlag('flag-defaults-to-true', defaultsTo: true); | 
|  | argParser.addOption('option-no-default'); | 
|  | argParser.addOption('option-defaults-to-foo', defaultsTo: 'foo'); | 
|  | } | 
|  |  | 
|  | final _TestMethod testMethod; | 
|  |  | 
|  | @override | 
|  | String get name => 'test'; | 
|  |  | 
|  | @override | 
|  | String get description => 'runs a test method'; | 
|  |  | 
|  | @override | 
|  | Future<FlutterCommandResult> runCommand() async { | 
|  | await testMethod(); | 
|  | return null; | 
|  | } | 
|  | } |