diff --git a/Docs/ProjectSpec.md b/Docs/ProjectSpec.md index 430e54e4..fa5f7fe0 100644 --- a/Docs/ProjectSpec.md +++ b/Docs/ProjectSpec.md @@ -1039,7 +1039,7 @@ The different actions share some properties: - [ ] **askForAppToLaunch**: **Bool** - `run` and `profile` actions can define the executable set to ask to launch. This defaults to false. - [ ] **launchAutomaticallySubstyle**: **String** - `run` action can define the launch automatically substyle ('2' for extensions). - [ ] **storeKitConfiguration**: **String** - `run` action can specify a storekit configuration. See [Options](#options). -- [ ] **macroExpansion**: **String** - `run` action can define the macro expansion from other target. This defaults to nil. +- [ ] **macroExpansion**: **String** - `run` and `test` action can define the macro expansion from other target. This defaults to nil. ### Execution Action diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index bb0a4bb9..6e2faea2 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -220,6 +220,7 @@ public struct Scheme: Equatable { public var captureScreenshotsAutomatically: Bool public var deleteScreenshotsWhenEachTestSucceeds: Bool public var testPlans: [TestPlan] + public var macroExpansion: String? public struct TestTarget: Equatable, ExpressibleByStringLiteral { @@ -286,7 +287,8 @@ public struct Scheme: Equatable { debugEnabled: Bool = debugEnabledDefault, customLLDBInit: String? = nil, captureScreenshotsAutomatically: Bool = captureScreenshotsAutomaticallyDefault, - deleteScreenshotsWhenEachTestSucceeds: Bool = deleteScreenshotsWhenEachTestSucceedsDefault + deleteScreenshotsWhenEachTestSucceeds: Bool = deleteScreenshotsWhenEachTestSucceedsDefault, + macroExpansion: String? = nil ) { self.config = config self.gatherCoverageData = gatherCoverageData @@ -304,6 +306,7 @@ public struct Scheme: Equatable { self.customLLDBInit = customLLDBInit self.captureScreenshotsAutomatically = captureScreenshotsAutomatically self.deleteScreenshotsWhenEachTestSucceeds = deleteScreenshotsWhenEachTestSucceeds + self.macroExpansion = macroExpansion } public var shouldUseLaunchSchemeArgsEnv: Bool { @@ -620,6 +623,7 @@ extension Scheme.Test: JSONObjectConvertible { customLLDBInit = jsonDictionary.json(atKeyPath: "customLLDBInit") captureScreenshotsAutomatically = jsonDictionary.json(atKeyPath: "captureScreenshotsAutomatically") ?? Scheme.Test.captureScreenshotsAutomaticallyDefault deleteScreenshotsWhenEachTestSucceeds = jsonDictionary.json(atKeyPath: "deleteScreenshotsWhenEachTestSucceeds") ?? Scheme.Test.deleteScreenshotsWhenEachTestSucceedsDefault + macroExpansion = jsonDictionary.json(atKeyPath: "macroExpansion") } } diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index db3114d8..ac100e89 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -289,9 +289,18 @@ public class SchemeGenerator { let testBuildableEntries = buildActionEntries.filter({ $0.buildFor.contains(.testing) }) + testBuildTargetEntries let testMacroExpansionBuildableRef = testBuildableEntries.map(\.buildableReference).contains(buildableReference) ? buildableReference : testBuildableEntries.first?.buildableReference + let testMacroExpansion: XCScheme.BuildableReference = buildActionEntries.first( + where: { value in + if let macroExpansion = scheme.test?.macroExpansion { + return value.buildableReference.blueprintName == macroExpansion + } + return false + } + )?.buildableReference ?? testMacroExpansionBuildableRef ?? buildableReference + let testAction = XCScheme.TestAction( buildConfiguration: scheme.test?.config ?? defaultDebugConfig.name, - macroExpansion: testMacroExpansionBuildableRef, + macroExpansion: testMacroExpansion, testables: testables, testPlans: testPlans.isEmpty ? nil : testPlans, preActions: scheme.test?.preActions.map(getExecutionAction) ?? [], diff --git a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift index 31af6747..07f63a92 100644 --- a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift @@ -476,6 +476,41 @@ class SchemeGeneratorTests: XCTestCase { let xcodeProject = try project.generateXcodeProject() let xcscheme = try unwrap(xcodeProject.sharedData?.schemes.first) + try expect(xcscheme.testAction?.macroExpansion?.buildableName) == "MyApp.app" + try expect(xcscheme.launchAction?.macroExpansion?.buildableName) == "MyApp.app" + } + + $0.it("allows to override test macroExpansion") { + let app = Target( + name: "MyApp", + type: .application, + platform: .iOS, + dependencies: [Dependency(type: .target, reference: "MyAppExtension", embed: false)] + ) + + let `extension` = Target( + name: "MyAppExtension", + type: .appExtension, + platform: .iOS + ) + let appTarget = Scheme.BuildTarget(target: .local(app.name), buildTypes: [.running]) + let extensionTarget = Scheme.BuildTarget(target: .local(`extension`.name), buildTypes: [.running]) + + let scheme = Scheme( + name: "TestScheme", + build: Scheme.Build(targets: [appTarget, extensionTarget]), + run: Scheme.Run(config: "Debug", macroExpansion: "MyApp"), + test: .init(macroExpansion: "MyAppExtension") + ) + let project = Project( + name: "test", + targets: [app, `extension`], + schemes: [scheme] + ) + let xcodeProject = try project.generateXcodeProject() + + let xcscheme = try unwrap(xcodeProject.sharedData?.schemes.first) + try expect(xcscheme.testAction?.macroExpansion?.buildableName) == "MyAppExtension.appex" try expect(xcscheme.launchAction?.macroExpansion?.buildableName) == "MyApp.app" }