Skip to content

Commit 930ee85

Browse files
committed
[Traits] Enable trait configuration for swift-test
# Motivation It is useful to be able to configure the traits of the root package when running tests. # Modification This PR adds the trait CLI options to the `swift test` command to enable specific traits or all traits, or to disable the default traits. # Result `swift test` now supports configuring the root traits.
1 parent 2e270a1 commit 930ee85

File tree

4 files changed

+174
-5
lines changed

4 files changed

+174
-5
lines changed

Fixtures/Traits/Example/Package.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,55 @@ let package = Package(
9999
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
100100
]
101101
),
102+
.testTarget(
103+
name: "ExampleTests",
104+
dependencies: [
105+
.product(
106+
name: "Package1Library1",
107+
package: "Package1",
108+
condition: .when(traits: ["Package1"])
109+
),
110+
.product(
111+
name: "Package2Library1",
112+
package: "Package2",
113+
condition: .when(traits: ["Package2"])
114+
),
115+
.product(
116+
name: "Package3Library1",
117+
package: "Package3",
118+
condition: .when(traits: ["Package3"])
119+
),
120+
.product(
121+
name: "Package4Library1",
122+
package: "Package4",
123+
condition: .when(traits: ["Package4"])
124+
),
125+
.product(
126+
name: "Package5Library1",
127+
package: "Package5",
128+
condition: .when(traits: ["Package5"])
129+
),
130+
.product(
131+
name: "Package7Library1",
132+
package: "Package7",
133+
condition: .when(traits: ["Package7"])
134+
),
135+
.product(
136+
name: "Package9Library1",
137+
package: "Package9",
138+
condition: .when(traits: ["Package9"])
139+
),
140+
.product(
141+
name: "Package10Library1",
142+
package: "Package10",
143+
condition: .when(traits: ["Package10"])
144+
),
145+
],
146+
swiftSettings: [
147+
.define("DEFINE1", .when(traits: ["BuildCondition1"])),
148+
.define("DEFINE2", .when(traits: ["BuildCondition2"])),
149+
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
150+
]
151+
)
102152
]
103153
)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#if Package1
2+
import Package1Library1
3+
#endif
4+
#if Package2
5+
import Package2Library1
6+
#endif
7+
#if Package3
8+
import Package3Library1
9+
#endif
10+
#if Package4
11+
import Package4Library1
12+
#endif
13+
#if Package5
14+
import Package5Library1
15+
#endif
16+
#if Package7
17+
import Package7Library1
18+
#endif
19+
#if Package9
20+
import Package9Library1
21+
#endif
22+
#if Package10
23+
import Package10Library1
24+
#endif
25+
26+
import XCTest
27+
28+
final class Tests: XCTestCase {
29+
func testTraits() {
30+
#if Package1
31+
Package1Library1.hello()
32+
#endif
33+
#if Package2
34+
Package2Library1.hello()
35+
#endif
36+
#if Package3
37+
Package3Library1.hello()
38+
#endif
39+
#if Package4
40+
Package4Library1.hello()
41+
#endif
42+
#if Package5
43+
Package5Library1.hello()
44+
#endif
45+
#if Package7
46+
Package7Library1.hello()
47+
#endif
48+
#if Package9
49+
Package9Library1.hello()
50+
#endif
51+
#if Package10
52+
Package10Library1.hello()
53+
#endif
54+
#if DEFINE1
55+
print("DEFINE1 enabled")
56+
#else
57+
print("DEFINE1 disabled")
58+
#endif
59+
#if DEFINE2
60+
print("DEFINE2 enabled")
61+
#else
62+
print("DEFINE2 disabled")
63+
#endif
64+
#if DEFINE3
65+
print("DEFINE3 enabled")
66+
#else
67+
print("DEFINE3 disabled")
68+
#endif
69+
}
70+
}

Sources/Commands/SwiftTestCommand.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ struct TestCommandOptions: ParsableArguments {
170170
@Option(name: .customLong("experimental-event-stream-version"),
171171
help: .hidden)
172172
var eventStreamVersion: Int?
173+
174+
@OptionGroup(visibility: .hidden)
175+
package var traits: TraitOptions
173176
}
174177

175178
/// Tests filtering specifier, which is used to filter tests to run.
@@ -570,7 +573,8 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
570573
swiftCommandState: swiftCommandState,
571574
productsBuildParameters: productsBuildParameters,
572575
toolsBuildParameters: toolsBuildParameters,
573-
testProduct: self.options.sharedOptions.testProduct
576+
testProduct: self.options.sharedOptions.testProduct,
577+
traitConfiguration: .init(traitOptions: self.options.traits)
574578
)
575579
}
576580

@@ -652,6 +656,9 @@ extension SwiftTestCommand {
652656
@OptionGroup()
653657
var testLibraryOptions: TestLibraryOptions
654658

659+
@OptionGroup(visibility: .hidden)
660+
package var traits: TraitOptions
661+
655662
// for deprecated passthrough from SwiftTestTool (parse will fail otherwise)
656663
@Flag(name: [.customLong("list-tests"), .customShort("l")], help: .hidden)
657664
var _deprecated_passthrough: Bool = false
@@ -748,7 +755,8 @@ extension SwiftTestCommand {
748755
swiftCommandState: swiftCommandState,
749756
productsBuildParameters: productsBuildParameters,
750757
toolsBuildParameters: toolsBuildParameters,
751-
testProduct: self.sharedOptions.testProduct
758+
testProduct: self.sharedOptions.testProduct,
759+
traitConfiguration: .init(traitOptions: self.traits)
752760
)
753761
}
754762
}
@@ -1373,11 +1381,11 @@ private func buildTestsIfNeeded(
13731381
swiftCommandState: SwiftCommandState,
13741382
productsBuildParameters: BuildParameters,
13751383
toolsBuildParameters: BuildParameters,
1376-
testProduct: String?
1384+
testProduct: String?,
1385+
traitConfiguration: TraitConfiguration
13771386
) throws -> [BuiltTestProduct] {
13781387
let buildSystem = try swiftCommandState.createBuildSystem(
1379-
// TODO: Will support traits in test in a follow up PR
1380-
traitConfiguration: .init(),
1388+
traitConfiguration: traitConfiguration,
13811389
productsBuildParameters: productsBuildParameters,
13821390
toolsBuildParameters: toolsBuildParameters
13831391
)

Tests/FunctionalTests/TraitTests.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,5 +161,46 @@ final class TraitTests: XCTestCase {
161161
""")
162162
}
163163
}
164+
165+
func testTests_whenNoFlagPassed() async throws {
166+
try await fixture(name: "Traits") { fixturePath in
167+
let (stdout, _) = try await executeSwiftTest(fixturePath.appending("Example"))
168+
let expectedOut = """
169+
Package1Library1 trait1 enabled
170+
Package2Library1 trait2 enabled
171+
Package3Library1 trait3 enabled
172+
Package4Library1 trait1 disabled
173+
DEFINE1 enabled
174+
DEFINE2 disabled
175+
DEFINE3 disabled
176+
177+
"""
178+
XCTAssertEqual(String(stdout.suffix(expectedOut.count)), expectedOut)
179+
}
180+
}
181+
182+
func testTests_whenAllTraitsEnabled_andDefaultTraitsDisabled() async throws {
183+
try await fixture(name: "Traits") { fixturePath in
184+
let (stdout, _) = try await executeSwiftTest(fixturePath.appending("Example"), extraArgs: ["--experimental-enable-all-traits", "--experimental-disable-default-traits"])
185+
let expectedOut = """
186+
Package1Library1 trait1 enabled
187+
Package2Library1 trait2 enabled
188+
Package3Library1 trait3 enabled
189+
Package4Library1 trait1 disabled
190+
Package5Library1 trait1 enabled
191+
Package6Library1 trait1 enabled
192+
Package7Library1 trait1 disabled
193+
Package10Library1 trait1 enabled
194+
Package10Library1 trait2 enabled
195+
Package10Library1 trait1 enabled
196+
Package10Library1 trait2 enabled
197+
DEFINE1 enabled
198+
DEFINE2 enabled
199+
DEFINE3 enabled
200+
201+
"""
202+
XCTAssertEqual(String(stdout.suffix(expectedOut.count)), expectedOut)
203+
}
204+
}
164205
}
165206
#endif

0 commit comments

Comments
 (0)