22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5+ import 'package:args/command_runner.dart' ;
56import 'package:file/memory.dart' ;
67import 'package:file_testing/file_testing.dart' ;
78import 'package:flutter_tools/src/base/file_system.dart' ;
89import 'package:flutter_tools/src/base/logger.dart' ;
910import 'package:flutter_tools/src/base/platform.dart' ;
1011import 'package:flutter_tools/src/base/version.dart' ;
12+ import 'package:flutter_tools/src/cache.dart' ;
1113import 'package:flutter_tools/src/commands/clean.dart' ;
1214import 'package:flutter_tools/src/ios/xcodeproj.dart' ;
1315import 'package:flutter_tools/src/macos/xcode.dart' ;
@@ -17,13 +19,15 @@ import 'package:test/fake.dart';
1719
1820import '../../src/common.dart' ;
1921import '../../src/context.dart' ;
22+ import '../../src/test_flutter_command_runner.dart' ;
2023
2124void main () {
2225 group ('clean command' , () {
2326 late Xcode xcode;
2427 late FakeXcodeProjectInterpreter xcodeProjectInterpreter;
2528
2629 setUp (() {
30+ Cache .disableLocking ();
2731 xcodeProjectInterpreter = FakeXcodeProjectInterpreter ();
2832 xcode = Xcode .test (
2933 processManager: FakeProcessManager .any (),
@@ -37,6 +41,7 @@ void main() {
3741
3842 setUp (() {
3943 fs = MemoryFileSystem .test ();
44+ fs.file ('pubspec.yaml' ).createSync (recursive: true );
4045
4146 final Directory currentDirectory = fs.currentDirectory;
4247 buildDirectory = currentDirectory.childDirectory ('build' );
@@ -72,7 +77,30 @@ void main() {
7277
7378 expect (xcodeProjectInterpreter.workspaces, const < CleanWorkspaceCall > [
7479 CleanWorkspaceCall ('/ios/Runner.xcworkspace' , 'Runner' , false ),
80+ CleanWorkspaceCall ('/ios/Runner.xcworkspace' , 'custom-scheme' , false ),
7581 CleanWorkspaceCall ('/macos/Runner.xcworkspace' , 'Runner' , false ),
82+ CleanWorkspaceCall ('/macos/Runner.xcworkspace' , 'custom-scheme' , false ),
83+ ]);
84+ }, overrides: < Type , Generator > {
85+ FileSystem : () => fs,
86+ ProcessManager : () => FakeProcessManager .any (),
87+ Xcode : () => xcode,
88+ XcodeProjectInterpreter : () => xcodeProjectInterpreter,
89+ });
90+
91+ testUsingContext ('$CleanCommand removes a specific xcode scheme --scheme' , () async {
92+ setupProjectUnderTest (fs.currentDirectory, true );
93+ // Xcode is installed and version satisfactory.
94+ xcodeProjectInterpreter.isInstalled = true ;
95+ xcodeProjectInterpreter.version = Version (1000 , 0 , 0 );
96+
97+ final CleanCommand command = CleanCommand ();
98+ final CommandRunner <void > runner = createTestCommandRunner (command);
99+ await runner.run (< String > ['clean' , '--scheme=custom-scheme' ]);
100+
101+ expect (xcodeProjectInterpreter.workspaces, < CleanWorkspaceCall > [
102+ const CleanWorkspaceCall ('/ios/Runner.xcworkspace' , 'custom-scheme' , false ),
103+ const CleanWorkspaceCall ('/macos/Runner.xcworkspace' , 'custom-scheme' , false ),
76104 ]);
77105 }, overrides: < Type , Generator > {
78106 FileSystem : () => fs,
@@ -96,6 +124,28 @@ void main() {
96124 XcodeProjectInterpreter : () => xcodeProjectInterpreter,
97125 });
98126
127+ testUsingContext ('$CleanCommand throws when given an invalid value for --scheme' , () async {
128+ setupProjectUnderTest (fs.currentDirectory, true );
129+ // Xcode is installed and version satisfactory.
130+ xcodeProjectInterpreter.isInstalled = true ;
131+ xcodeProjectInterpreter.version = Version (1000 , 0 , 0 );
132+
133+ final CleanCommand command = CleanCommand ();
134+ expect (
135+ () => createTestCommandRunner (command).run (< String > ['clean' , '--scheme' ]),
136+ throwsUsageException (),
137+ );
138+ expect (
139+ () => createTestCommandRunner (command).run (< String > ['clean' , '--scheme=unknown' ]),
140+ throwsToolExit (),
141+ );
142+ }, overrides: < Type , Generator > {
143+ FileSystem : () => fs,
144+ ProcessManager : () => FakeProcessManager .any (),
145+ Xcode : () => xcode,
146+ XcodeProjectInterpreter : () => xcodeProjectInterpreter,
147+ });
148+
99149 testUsingContext ('$CleanCommand cleans Xcode verbosely for iOS and macOS' , () async {
100150 setupProjectUnderTest (fs.currentDirectory, true );
101151 // Xcode is installed and version satisfactory.
@@ -106,7 +156,9 @@ void main() {
106156
107157 expect (xcodeProjectInterpreter.workspaces, const < CleanWorkspaceCall > [
108158 CleanWorkspaceCall ('/ios/Runner.xcworkspace' , 'Runner' , true ),
159+ CleanWorkspaceCall ('/ios/Runner.xcworkspace' , 'custom-scheme' , true ),
109160 CleanWorkspaceCall ('/macos/Runner.xcworkspace' , 'Runner' , true ),
161+ CleanWorkspaceCall ('/macos/Runner.xcworkspace' , 'custom-scheme' , true ),
110162 ]);
111163 }, overrides: < Type , Generator > {
112164 FileSystem : () => fs,
@@ -209,7 +261,7 @@ class FakeXcodeProjectInterpreter extends Fake implements XcodeProjectInterprete
209261 return XcodeProjectInfo (
210262 const < String > [],
211263 const < String > [],
212- < String > ['Runner' ],
264+ < String > ['Runner' , 'custom-scheme' ],
213265 BufferLogger .test (),
214266 );
215267 }
0 commit comments