Skip to content

Commit f9e33b8

Browse files
committed
fix a bug in test discovery where tests define in extensions break the discovery
motivation: less bugs, happier users changes: modify test discovery code to key of class name rather than blindly iterate over tetst rdar://58435666
1 parent 3b4f86e commit f9e33b8

File tree

8 files changed

+81
-6
lines changed

8 files changed

+81
-6
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// swift-tools-version:4.2
2+
import PackageDescription
3+
4+
let package = Package(
5+
name: "Simple",
6+
targets: [
7+
.target(name: "Simple"),
8+
.testTarget(name: "SimpleTests", dependencies: ["Simple"]),
9+
]
10+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
struct Simple {
2+
3+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import XCTest
2+
@testable import Simple
3+
4+
class SimpleTests1: XCTestCase {
5+
func testExample1() {
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import XCTest
2+
@testable import Simple
3+
4+
class SimpleTests2: XCTestCase {
5+
func testExample2() {
6+
}
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import XCTest
2+
@testable import Simple
3+
4+
extension SimpleTests1 {
5+
func testExample1_a() {
6+
}
7+
}
8+
9+
extension SimpleTests2 {
10+
func testExample2_a() {
11+
}
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import XCTest
2+
@testable import Simple
3+
4+
class SimpleTests4: XCTestCase {
5+
func testExample() {
6+
}
7+
8+
func testExample1() {
9+
}
10+
11+
func testExample2() {
12+
}
13+
}

Sources/Build/BuildOperationBuildSystemDelegateHandler.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,18 @@ final class TestDiscoveryCommand: CustomLLBuildCommand {
5454
) throws {
5555
let stream = try LocalFileOutputByteStream(path)
5656

57+
let testsByClass = Dictionary(grouping: tests, by: { $0.name })
58+
5759
stream <<< "import XCTest" <<< "\n"
5860
stream <<< "@testable import " <<< module <<< "\n"
5961

60-
for klass in tests {
62+
for classTests in testsByClass {
63+
let className = classTests.key
64+
let testMethods = classTests.value.flatMap{ $0.methods }
6165
stream <<< "\n"
62-
stream <<< "fileprivate extension " <<< klass.name <<< " {" <<< "\n"
63-
stream <<< indent(4) <<< "static let __allTests__\(klass.name) = [" <<< "\n"
64-
for method in klass.methods {
66+
stream <<< "fileprivate extension " <<< className <<< " {" <<< "\n"
67+
stream <<< indent(4) <<< "static let __allTests__\(className) = [" <<< "\n"
68+
for method in testMethods {
6569
let method = method.hasSuffix("()") ? String(method.dropLast(2)) : method
6670
stream <<< indent(8) <<< "(\"\(method)\", \(method))," <<< "\n"
6771
}
@@ -74,8 +78,8 @@ final class TestDiscoveryCommand: CustomLLBuildCommand {
7478
return [\n
7579
"""
7680

77-
for klass in tests {
78-
stream <<< indent(8) <<< "testCase(\(klass.name).__allTests__\(klass.name)),\n"
81+
for className in testsByClass.keys {
82+
stream <<< indent(8) <<< "testCase(\(className).__allTests__\(className)),\n"
7983
}
8084

8185
stream <<< """

Tests/FunctionalTests/TestDiscoverTests.swift renamed to Tests/FunctionalTests/TestDiscoveryTests.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,23 @@ class TestDiscoveryTests: XCTestCase {
8383
}
8484
#endif
8585
}
86+
87+
func testTestExtensions() throws {
88+
#if os(macOS)
89+
try XCTSkipIf(true)
90+
#else
91+
fixture(name: "Miscellaneous/TestDiscovery/Extensions") { path in
92+
let (stdout, _) = try executeSwiftTest(path, extraArgs: ["--enable-test-discovery"])
93+
XCTAssertTrue(stdout.contains("Merging module Simple"), stdout)
94+
XCTAssertTrue(stdout.contains("SimpleTests1.testExample1"), stdout)
95+
XCTAssertTrue(stdout.contains("SimpleTests1.testExample1_a"), stdout)
96+
XCTAssertTrue(stdout.contains("SimpleTests2.testExample2"), stdout)
97+
XCTAssertTrue(stdout.contains("SimpleTests2.testExample2_a"), stdout)
98+
XCTAssertTrue(stdout.contains("SimpleTests4.testExample"), stdout)
99+
XCTAssertTrue(stdout.contains("SimpleTests4.testExample1"), stdout)
100+
XCTAssertTrue(stdout.contains("SimpleTests4.testExample2"), stdout)
101+
XCTAssertTrue(stdout.contains("Executed 7 tests"), stdout)
102+
}
103+
#endif
104+
}
86105
}

0 commit comments

Comments
 (0)