Skip to content

Commit 68b0d12

Browse files
Support preferred screen capture format in scheme test action (#1450)
* Support preferred screen capture format in scheme test action (resolves #1443) * preferredScreenCaptureFormat decoding test --------- Co-authored-by: Yonas Kolb <yonaskolb@users.noreply.github.com>
1 parent d1d04e8 commit 68b0d12

5 files changed

Lines changed: 58 additions & 3 deletions

File tree

Docs/ProjectSpec.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,7 @@ A multiline script can be written using the various YAML multiline methods, for
10641064
- [ ] **captureScreenshotsAutomatically**: **Bool** - indicates whether screenshots should be captured automatically while UI Testing. This defaults to true.
10651065
- [ ] **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.
10661066
- [ ] **testPlans**: **[[Test Plan](#test-plan)]** - List of test plan locations that will be referenced in the scheme.
1067+
- [ ] **preferredScreenCaptureFormat**: **String** - automatic screen capture format to use while UI Testing. Possible values are `screenshots`, `screenRecording`. Default is `screenRecording`.
10671068

10681069
#### Test Target
10691070
A target can be one of a 2 types:

Sources/ProjectSpec/Scheme.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ public struct Scheme: Equatable {
203203
public static let debugEnabledDefault = true
204204
public static let captureScreenshotsAutomaticallyDefault = true
205205
public static let deleteScreenshotsWhenEachTestSucceedsDefault = true
206+
public static let preferredScreenCaptureFormatDefault = XCScheme.TestAction.ScreenCaptureFormat.screenRecording
206207

207208
public var config: String?
208209
public var gatherCoverageData: Bool
@@ -221,6 +222,7 @@ public struct Scheme: Equatable {
221222
public var deleteScreenshotsWhenEachTestSucceeds: Bool
222223
public var testPlans: [TestPlan]
223224
public var macroExpansion: String?
225+
public var preferredScreenCaptureFormat: XCScheme.TestAction.ScreenCaptureFormat
224226

225227
public struct TestTarget: Equatable, ExpressibleByStringLiteral {
226228

@@ -288,7 +290,8 @@ public struct Scheme: Equatable {
288290
customLLDBInit: String? = nil,
289291
captureScreenshotsAutomatically: Bool = captureScreenshotsAutomaticallyDefault,
290292
deleteScreenshotsWhenEachTestSucceeds: Bool = deleteScreenshotsWhenEachTestSucceedsDefault,
291-
macroExpansion: String? = nil
293+
macroExpansion: String? = nil,
294+
preferredScreenCaptureFormat: XCScheme.TestAction.ScreenCaptureFormat = preferredScreenCaptureFormatDefault
292295
) {
293296
self.config = config
294297
self.gatherCoverageData = gatherCoverageData
@@ -307,6 +310,7 @@ public struct Scheme: Equatable {
307310
self.captureScreenshotsAutomatically = captureScreenshotsAutomatically
308311
self.deleteScreenshotsWhenEachTestSucceeds = deleteScreenshotsWhenEachTestSucceeds
309312
self.macroExpansion = macroExpansion
313+
self.preferredScreenCaptureFormat = preferredScreenCaptureFormat
310314
}
311315

312316
public var shouldUseLaunchSchemeArgsEnv: Bool {
@@ -624,6 +628,7 @@ extension Scheme.Test: JSONObjectConvertible {
624628
captureScreenshotsAutomatically = jsonDictionary.json(atKeyPath: "captureScreenshotsAutomatically") ?? Scheme.Test.captureScreenshotsAutomaticallyDefault
625629
deleteScreenshotsWhenEachTestSucceeds = jsonDictionary.json(atKeyPath: "deleteScreenshotsWhenEachTestSucceeds") ?? Scheme.Test.deleteScreenshotsWhenEachTestSucceedsDefault
626630
macroExpansion = jsonDictionary.json(atKeyPath: "macroExpansion")
631+
preferredScreenCaptureFormat = jsonDictionary.json(atKeyPath: "preferredScreenCaptureFormat") ?? Scheme.Test.preferredScreenCaptureFormatDefault
627632
}
628633
}
629634

@@ -667,6 +672,10 @@ extension Scheme.Test: JSONEncodable {
667672
dict["deleteScreenshotsWhenEachTestSucceeds"] = deleteScreenshotsWhenEachTestSucceeds
668673
}
669674

675+
if preferredScreenCaptureFormat != Scheme.Test.preferredScreenCaptureFormatDefault {
676+
dict["preferredScreenCaptureFormat"] = preferredScreenCaptureFormat.toJSONValue()
677+
}
678+
670679
return dict
671680
}
672681
}
@@ -1018,3 +1027,9 @@ extension XCScheme.LaunchAction.GPUValidationMode: JSONEncodable {
10181027
}
10191028
}
10201029
}
1030+
1031+
extension XCScheme.TestAction.ScreenCaptureFormat: JSONEncodable {
1032+
public func toJSONValue() -> Any {
1033+
rawValue
1034+
}
1035+
}

Sources/XcodeGenKit/SchemeGenerator.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ public class SchemeGenerator {
317317
language: scheme.test?.language,
318318
region: scheme.test?.region,
319319
systemAttachmentLifetime: scheme.test?.systemAttachmentLifetime,
320+
preferredScreenCaptureFormat: scheme.test?.preferredScreenCaptureFormat,
320321
customLLDBInitFile: scheme.test?.customLLDBInit
321322
)
322323

Tests/ProjectSpecTests/SpecLoadingTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,8 @@ class SpecLoadingTests: XCTestCase {
10281028
[
10291029
"path": "Path/Plan2.xctestplan"
10301030
]
1031-
]
1031+
],
1032+
"preferredScreenCaptureFormat": "screenshots",
10321033
],
10331034
"management": [
10341035
"isShown": false,
@@ -1082,7 +1083,8 @@ class SpecLoadingTests: XCTestCase {
10821083
testPlans: [
10831084
.init(path: "Path/Plan.xctestplan"),
10841085
.init(path: "Path/Plan2.xctestplan")
1085-
]
1086+
],
1087+
preferredScreenCaptureFormat: .screenshots
10861088
)
10871089
try expect(scheme.test) == expectedTest
10881090

Tests/XcodeGenKitTests/SchemeGeneratorTests.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,42 @@ class SchemeGeneratorTests: XCTestCase {
644644
.init(reference: "container:\(testPlanPath2)", default: true),
645645
]
646646
}
647+
648+
$0.it("generates scheme with screenshots as preferred screen capture format") {
649+
let scheme = Scheme(
650+
name: "MyScheme",
651+
build: Scheme.Build(targets: [buildTarget]),
652+
run: Scheme.Run(config: "Debug"),
653+
test: Scheme.Test(config: "Debug", preferredScreenCaptureFormat: .screenshots)
654+
)
655+
let project = Project(
656+
name: "test",
657+
targets: [app, framework],
658+
schemes: [scheme]
659+
)
660+
let xcodeProject = try project.generateXcodeProject()
661+
662+
let xcscheme = try unwrap(xcodeProject.sharedData?.schemes.first)
663+
try expect(xcscheme.testAction?.preferredScreenCaptureFormat) == .screenshots
664+
}
665+
666+
$0.it("generates scheme with screen recording as preferred screen capture format") {
667+
let scheme = Scheme(
668+
name: "MyScheme",
669+
build: Scheme.Build(targets: [buildTarget]),
670+
run: Scheme.Run(config: "Debug"),
671+
test: Scheme.Test(config: "Debug", preferredScreenCaptureFormat: .screenRecording)
672+
)
673+
let project = Project(
674+
name: "test",
675+
targets: [app, framework],
676+
schemes: [scheme]
677+
)
678+
let xcodeProject = try project.generateXcodeProject()
679+
680+
let xcscheme = try unwrap(xcodeProject.sharedData?.schemes.first)
681+
try expect(xcscheme.testAction?.preferredScreenCaptureFormat) == .screenRecording
682+
}
647683
}
648684
}
649685

0 commit comments

Comments
 (0)