From ce5d0153514bfcdbfec40ca6c86fcf71f85b9e8f Mon Sep 17 00:00:00 2001 From: Ernesto Cambuston Date: Tue, 16 Apr 2024 16:37:20 -0700 Subject: [PATCH 1/5] Allow to override test macroExpansions --- Sources/ProjectSpec/Scheme.swift | 6 +++- Sources/XcodeGenKit/SchemeGenerator.swift | 6 +++- .../SchemeGeneratorTests.swift | 35 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index db6aca73..fc9074e4 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -218,6 +218,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 { @@ -284,7 +285,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 @@ -302,6 +304,7 @@ public struct Scheme: Equatable { self.customLLDBInit = customLLDBInit self.captureScreenshotsAutomatically = captureScreenshotsAutomatically self.deleteScreenshotsWhenEachTestSucceeds = deleteScreenshotsWhenEachTestSucceeds + self.macroExpansion = macroExpansion } public var shouldUseLaunchSchemeArgsEnv: Bool { @@ -616,6 +619,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 1f2a0810..2dc862a5 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -227,6 +227,10 @@ public class SchemeGenerator { let buildableReference = buildActionEntries.first(where: { $0.buildableReference.blueprintName == schemeTarget?.name })?.buildableReference ?? buildActionEntries.first!.buildableReference let runnables = makeProductRunnables(for: schemeTarget, buildableReference: buildableReference) + + let testMacroExpansion: XCScheme.BuildableReference = buildActionEntries.first( + where: { $0.buildableReference.blueprintName == scheme.test?.macroExpansion } + )?.buildableReference ?? buildableReference let buildAction = XCScheme.BuildAction( buildActionEntries: buildActionEntries, @@ -284,7 +288,7 @@ public class SchemeGenerator { let testAction = XCScheme.TestAction( buildConfiguration: scheme.test?.config ?? defaultDebugConfig.name, - macroExpansion: buildableReference, + 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 b5f392d3..aa85d3d4 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" } From b616864b03e29c589ec309a0838353c6faacc218 Mon Sep 17 00:00:00 2001 From: Ernesto Cambuston Date: Tue, 16 Apr 2024 16:47:04 -0700 Subject: [PATCH 2/5] update doc --- Docs/ProjectSpec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/ProjectSpec.md b/Docs/ProjectSpec.md index 326e17f3..7d97b3f0 100644 --- a/Docs/ProjectSpec.md +++ b/Docs/ProjectSpec.md @@ -1038,7 +1038,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 From f0be240238878c4b1b56d46d96a50b877db46312 Mon Sep 17 00:00:00 2001 From: Ernesto Cambuston Date: Tue, 16 Apr 2024 16:48:04 -0700 Subject: [PATCH 3/5] style --- Sources/XcodeGenKit/SchemeGenerator.swift | 2 +- Tests/XcodeGenKitTests/SchemeGeneratorTests.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index 2dc862a5..ed29fe20 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -227,7 +227,7 @@ public class SchemeGenerator { let buildableReference = buildActionEntries.first(where: { $0.buildableReference.blueprintName == schemeTarget?.name })?.buildableReference ?? buildActionEntries.first!.buildableReference let runnables = makeProductRunnables(for: schemeTarget, buildableReference: buildableReference) - + let testMacroExpansion: XCScheme.BuildableReference = buildActionEntries.first( where: { $0.buildableReference.blueprintName == scheme.test?.macroExpansion } )?.buildableReference ?? buildableReference diff --git a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift index aa85d3d4..06f91da2 100644 --- a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift @@ -479,7 +479,7 @@ class SchemeGeneratorTests: XCTestCase { 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", From 32d356632e7368005f72e1baa24c1f1e4021c584 Mon Sep 17 00:00:00 2001 From: Ernesto Cambuston Date: Thu, 20 Jun 2024 12:57:01 -0700 Subject: [PATCH 4/5] Address feedback from PR --- Sources/XcodeGenKit/SchemeGenerator.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index ed29fe20..fd45cc59 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -229,7 +229,12 @@ public class SchemeGenerator { let runnables = makeProductRunnables(for: schemeTarget, buildableReference: buildableReference) let testMacroExpansion: XCScheme.BuildableReference = buildActionEntries.first( - where: { $0.buildableReference.blueprintName == scheme.test?.macroExpansion } + where: { value in + if let macroExpansion = scheme.test?.macroExpansion { + return value.buildableReference.blueprintName == macroExpansion + } + return false + } )?.buildableReference ?? buildableReference let buildAction = XCScheme.BuildAction( From 0dd28421ba9a734e5f17b5b7d796d6bba8dfb0b8 Mon Sep 17 00:00:00 2001 From: Ernesto Cambuston Date: Wed, 3 Jul 2024 09:49:20 -0700 Subject: [PATCH 5/5] fix build --- Sources/XcodeGenKit/SchemeGenerator.swift | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index 0c58d714..ac100e89 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -233,15 +233,6 @@ public class SchemeGenerator { let buildableReference = buildActionEntries.first(where: { $0.buildableReference.blueprintName == schemeTarget?.name })?.buildableReference ?? buildActionEntries.first!.buildableReference let runnables = makeProductRunnables(for: schemeTarget, buildableReference: buildableReference) - let testMacroExpansion: XCScheme.BuildableReference = buildActionEntries.first( - where: { value in - if let macroExpansion = scheme.test?.macroExpansion { - return value.buildableReference.blueprintName == macroExpansion - } - return false - } - )?.buildableReference ?? buildableReference - let buildAction = XCScheme.BuildAction( buildActionEntries: buildActionEntries, preActions: scheme.build.preActions.map(getExecutionAction), @@ -297,6 +288,7 @@ 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 { @@ -304,7 +296,7 @@ public class SchemeGenerator { } return false } - )?.buildableReference ?? testMacroExpansionBuildableRef + )?.buildableReference ?? testMacroExpansionBuildableRef ?? buildableReference let testAction = XCScheme.TestAction( buildConfiguration: scheme.test?.config ?? defaultDebugConfig.name,