Skip to content

Commit 67e9e79

Browse files
committed
Expose test traits dynamically
1 parent e876472 commit 67e9e79

File tree

6 files changed

+60
-16
lines changed

6 files changed

+60
-16
lines changed

Package.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ let package = Package(
2222
],
2323
targets: [
2424
.target(
25-
name: "IssueReporting"
25+
name: "IssueReportingPackageSupport"
26+
),
27+
.target(
28+
name: "IssueReporting",
29+
dependencies: [
30+
"IssueReportingPackageSupport"
31+
]
2632
),
2733
.testTarget(
2834
name: "IssueReportingTests",
@@ -32,7 +38,10 @@ let package = Package(
3238
]
3339
),
3440
.target(
35-
name: "IssueReportingTestSupport"
41+
name: "IssueReportingTestSupport",
42+
dependencies: [
43+
"IssueReportingPackageSupport"
44+
]
3645
),
3746
.target(
3847
name: "XCTestDynamicOverlay",

Package@swift-6.0.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@ let package = Package(
2121
],
2222
targets: [
2323
.target(
24-
name: "IssueReporting"
24+
name: "IssueReportingPackageSupport"
25+
),
26+
.target(
27+
name: "IssueReporting",
28+
dependencies: [
29+
"IssueReportingPackageSupport",
30+
]
2531
),
2632
.testTarget(
2733
name: "IssueReportingTests",
@@ -31,7 +37,10 @@ let package = Package(
3137
]
3238
),
3339
.target(
34-
name: "IssueReportingTestSupport"
40+
name: "IssueReportingTestSupport",
41+
dependencies: [
42+
"IssueReportingPackageSupport",
43+
]
3544
),
3645
.target(
3746
name: "XCTestDynamicOverlay",

Sources/IssueReporting/Internal/SwiftTesting.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Foundation
2+
import IssueReportingPackageSupport
23

34
#if canImport(WinSDK)
45
import WinSDK
@@ -313,17 +314,17 @@ func _withKnownIssue(
313314
#endif
314315

315316
@usableFromInline
316-
func _currentTestID() -> AnyHashable? {
317-
guard let function = function(for: "$s25IssueReportingTestSupport08_currentC2IDypyF")
317+
func _currentTest() -> _Test? {
318+
guard let function = function(for: "$s25IssueReportingTestSupport08_currentC0ypyF")
318319
else {
319320
#if DEBUG
320-
return Test.current?.id
321+
return Test.current.map { _Test(id: $0.id, traits: $0.traits) }
321322
#else
322323
return nil
323324
#endif
324325
}
325326

326-
return (function as! @Sendable () -> AnyHashable?)()
327+
return (function as! @Sendable () -> _Test?)()
327328
}
328329

329330
#if DEBUG
@@ -446,7 +447,7 @@ func _currentTestID() -> AnyHashable? {
446447
struct Case {}
447448
private var name: String
448449
private var displayName: String?
449-
private var traits: [any Trait]
450+
fileprivate var traits: [any Trait]
450451
private var sourceLocation: SourceLocation
451452
private var containingTypeInfo: TypeInfo?
452453
private var xcTestCompatibleSelector: __XCTestCompatibleSelector?

Sources/IssueReporting/TestContext.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public enum TestContext: Equatable, Sendable {
2323
/// If executed outside of a test process, this will return `nil`.
2424
public static var current: Self? {
2525
guard isTesting else { return nil }
26-
if let currentTestID = _currentTestID() {
27-
return .swiftTesting(Testing(id: currentTestID))
26+
if let currentTest = _currentTest() {
27+
return .swiftTesting(Testing(id: currentTest.id, traits: currentTest.traits))
2828
} else {
2929
return .xcTest
3030
}
@@ -42,10 +42,19 @@ public enum TestContext: Equatable, Sendable {
4242

4343
public struct Test: Equatable, Hashable, Identifiable, Sendable {
4444
public let id: ID
45+
public let traits: [any Sendable]
4546

4647
public struct ID: Equatable, Hashable, @unchecked Sendable {
4748
public let rawValue: AnyHashable
4849
}
50+
51+
public static func == (lhs: Self, rhs: Self) -> Bool {
52+
lhs.id == rhs.id
53+
}
54+
55+
public func hash(into hasher: inout Hasher) {
56+
hasher.combine(id)
57+
}
4958
}
5059
}
5160

@@ -73,7 +82,7 @@ public enum TestContext: Equatable, Sendable {
7382
}
7483

7584
extension TestContext.Testing {
76-
fileprivate init(id: AnyHashable) {
77-
self.init(test: Test(id: Test.ID(rawValue: id)))
85+
fileprivate init(id: AnyHashable, traits: [any Sendable]) {
86+
self.init(test: Test(id: Test.ID(rawValue: id), traits: traits))
7887
}
7988
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@usableFromInline
2+
package struct _Test {
3+
@usableFromInline
4+
package let id: AnyHashable
5+
6+
@usableFromInline
7+
package let traits: [any Sendable]
8+
9+
@usableFromInline
10+
package init(id: AnyHashable, traits: [any Sendable]) {
11+
self.id = id
12+
self.traits = traits
13+
}
14+
}

Sources/IssueReportingTestSupport/SwiftTesting.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import IssueReportingPackageSupport
2+
13
#if canImport(Testing)
24
import Testing
35
#endif
@@ -134,11 +136,11 @@ private func __withKnownIssueAsync(
134136
}
135137
#endif
136138

137-
public func _currentTestID() -> Any { __currentTestID }
139+
public func _currentTest() -> Any { __currentTest }
138140
@Sendable
139-
private func __currentTestID() -> AnyHashable? {
141+
private func __currentTest() -> _Test? {
140142
#if canImport(Testing)
141-
return Test.current?.id
143+
return Test.current.map { _Test(id: $0.id, traits: $0.traits) }
142144
#else
143145
return nil
144146
#endif

0 commit comments

Comments
 (0)