diff --git a/Docs/ProjectSpec.md b/Docs/ProjectSpec.md index 6780e13d..33fa386c 100644 --- a/Docs/ProjectSpec.md +++ b/Docs/ProjectSpec.md @@ -1064,6 +1064,7 @@ A multiline script can be written using the various YAML multiline methods, for - [ ] **captureScreenshotsAutomatically**: **Bool** - indicates whether screenshots should be captured automatically while UI Testing. This defaults to true. - [ ] **deleteScreenshotsWhenEachTestSucceeds**: **Bool** - whether successful UI tests should cause automatically-captured screenshots to be deleted. If `captureScreenshotsAutomatically` is false, this value is ignored. This defaults to true. - [ ] **testPlans**: **[[Test Plan](#test-plan)]** - List of test plan locations that will be referenced in the scheme. +- [ ] **preferredScreenCaptureFormat**: **String** - automatic screen capture format to use while UI Testing. Possible values are `screenshots`, `screenRecording`. Default is `screenRecording`. #### Test Target A target can be one of a 2 types: diff --git a/Sources/ProjectSpec/Scheme.swift b/Sources/ProjectSpec/Scheme.swift index 204d05c3..9e4e6171 100644 --- a/Sources/ProjectSpec/Scheme.swift +++ b/Sources/ProjectSpec/Scheme.swift @@ -203,6 +203,7 @@ public struct Scheme: Equatable { public static let debugEnabledDefault = true public static let captureScreenshotsAutomaticallyDefault = true public static let deleteScreenshotsWhenEachTestSucceedsDefault = true + public static let preferredScreenCaptureFormatDefault = XCScheme.TestAction.ScreenCaptureFormat.screenRecording public var config: String? public var gatherCoverageData: Bool @@ -221,6 +222,7 @@ public struct Scheme: Equatable { public var deleteScreenshotsWhenEachTestSucceeds: Bool public var testPlans: [TestPlan] public var macroExpansion: String? + public var preferredScreenCaptureFormat: XCScheme.TestAction.ScreenCaptureFormat public struct TestTarget: Equatable, ExpressibleByStringLiteral { @@ -288,7 +290,8 @@ public struct Scheme: Equatable { customLLDBInit: String? = nil, captureScreenshotsAutomatically: Bool = captureScreenshotsAutomaticallyDefault, deleteScreenshotsWhenEachTestSucceeds: Bool = deleteScreenshotsWhenEachTestSucceedsDefault, - macroExpansion: String? = nil + macroExpansion: String? = nil, + preferredScreenCaptureFormat: XCScheme.TestAction.ScreenCaptureFormat = preferredScreenCaptureFormatDefault ) { self.config = config self.gatherCoverageData = gatherCoverageData @@ -307,6 +310,7 @@ public struct Scheme: Equatable { self.captureScreenshotsAutomatically = captureScreenshotsAutomatically self.deleteScreenshotsWhenEachTestSucceeds = deleteScreenshotsWhenEachTestSucceeds self.macroExpansion = macroExpansion + self.preferredScreenCaptureFormat = preferredScreenCaptureFormat } public var shouldUseLaunchSchemeArgsEnv: Bool { @@ -624,6 +628,7 @@ extension Scheme.Test: JSONObjectConvertible { captureScreenshotsAutomatically = jsonDictionary.json(atKeyPath: "captureScreenshotsAutomatically") ?? Scheme.Test.captureScreenshotsAutomaticallyDefault deleteScreenshotsWhenEachTestSucceeds = jsonDictionary.json(atKeyPath: "deleteScreenshotsWhenEachTestSucceeds") ?? Scheme.Test.deleteScreenshotsWhenEachTestSucceedsDefault macroExpansion = jsonDictionary.json(atKeyPath: "macroExpansion") + preferredScreenCaptureFormat = jsonDictionary.json(atKeyPath: "preferredScreenCaptureFormat") ?? Scheme.Test.preferredScreenCaptureFormatDefault } } @@ -667,6 +672,10 @@ extension Scheme.Test: JSONEncodable { dict["deleteScreenshotsWhenEachTestSucceeds"] = deleteScreenshotsWhenEachTestSucceeds } + if preferredScreenCaptureFormat != Scheme.Test.preferredScreenCaptureFormatDefault { + dict["preferredScreenCaptureFormat"] = preferredScreenCaptureFormat.toJSONValue() + } + return dict } } @@ -1018,3 +1027,9 @@ extension XCScheme.LaunchAction.GPUValidationMode: JSONEncodable { } } } + +extension XCScheme.TestAction.ScreenCaptureFormat: JSONEncodable { + public func toJSONValue() -> Any { + rawValue + } +} diff --git a/Sources/XcodeGenKit/SchemeGenerator.swift b/Sources/XcodeGenKit/SchemeGenerator.swift index 90ef213a..c6366cf4 100644 --- a/Sources/XcodeGenKit/SchemeGenerator.swift +++ b/Sources/XcodeGenKit/SchemeGenerator.swift @@ -317,6 +317,7 @@ public class SchemeGenerator { language: scheme.test?.language, region: scheme.test?.region, systemAttachmentLifetime: scheme.test?.systemAttachmentLifetime, + preferredScreenCaptureFormat: scheme.test?.preferredScreenCaptureFormat, customLLDBInitFile: scheme.test?.customLLDBInit ) diff --git a/Tests/ProjectSpecTests/SpecLoadingTests.swift b/Tests/ProjectSpecTests/SpecLoadingTests.swift index bc332e72..2fd6e7db 100644 --- a/Tests/ProjectSpecTests/SpecLoadingTests.swift +++ b/Tests/ProjectSpecTests/SpecLoadingTests.swift @@ -1028,7 +1028,8 @@ class SpecLoadingTests: XCTestCase { [ "path": "Path/Plan2.xctestplan" ] - ] + ], + "preferredScreenCaptureFormat": "screenshots", ], "management": [ "isShown": false, @@ -1082,7 +1083,8 @@ class SpecLoadingTests: XCTestCase { testPlans: [ .init(path: "Path/Plan.xctestplan"), .init(path: "Path/Plan2.xctestplan") - ] + ], + preferredScreenCaptureFormat: .screenshots ) try expect(scheme.test) == expectedTest diff --git a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift index d7527200..edad2183 100644 --- a/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SchemeGeneratorTests.swift @@ -644,6 +644,42 @@ class SchemeGeneratorTests: XCTestCase { .init(reference: "container:\(testPlanPath2)", default: true), ] } + + $0.it("generates scheme with screenshots as preferred screen capture format") { + let scheme = Scheme( + name: "MyScheme", + build: Scheme.Build(targets: [buildTarget]), + run: Scheme.Run(config: "Debug"), + test: Scheme.Test(config: "Debug", preferredScreenCaptureFormat: .screenshots) + ) + let project = Project( + name: "test", + targets: [app, framework], + schemes: [scheme] + ) + let xcodeProject = try project.generateXcodeProject() + + let xcscheme = try unwrap(xcodeProject.sharedData?.schemes.first) + try expect(xcscheme.testAction?.preferredScreenCaptureFormat) == .screenshots + } + + $0.it("generates scheme with screen recording as preferred screen capture format") { + let scheme = Scheme( + name: "MyScheme", + build: Scheme.Build(targets: [buildTarget]), + run: Scheme.Run(config: "Debug"), + test: Scheme.Test(config: "Debug", preferredScreenCaptureFormat: .screenRecording) + ) + let project = Project( + name: "test", + targets: [app, framework], + schemes: [scheme] + ) + let xcodeProject = try project.generateXcodeProject() + + let xcscheme = try unwrap(xcodeProject.sharedData?.schemes.first) + try expect(xcscheme.testAction?.preferredScreenCaptureFormat) == .screenRecording + } } }