Skip to content

Commit b414213

Browse files
committed
Refactor to rely less on global state for failure reporting
* Also allows removing a weird public method from XCTestCase
1 parent b64c1a4 commit b414213

File tree

3 files changed

+21
-24
lines changed

3 files changed

+21
-24
lines changed

Sources/XCTest/XCTAssert.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ private enum _XCTAssertion {
8484

8585
private func _XCTAssert(@autoclosure expression: () -> BooleanType, @autoclosure assertion: () -> _XCTAssertion, @autoclosure _ message: () -> String, file: StaticString, line: UInt) {
8686
if !expression().boolValue {
87-
if let test = XCTCurrentTestCase {
88-
test.testFailure(message(), failureDescription: assertion().failureDescription, expected: true, file: file, line: line)
87+
if let handler = XCTFailureHandler {
88+
handler(XCTFailure(message: message(), failureDescription: assertion().failureDescription, expected: true, file: file, line: line))
8989
}
9090
}
9191
}

Sources/XCTest/XCTestCase.swift

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,18 @@ extension XCTestCase {
3434
var unexpectedFailures = 0
3535
let overallDuration = measureTimeExecutingBlock {
3636
for (name, test) in tests {
37-
XCTCurrentTestCase = self
3837
let method = "\(self.dynamicType).\(name)"
38+
39+
var failures = [XCTFailure]()
40+
XCTFailureHandler = { failure in
41+
if !self.continueAfterFailure {
42+
failure.emit(method)
43+
fatalError("Terminating execution due to test failure", file: failure.file, line: failure.line)
44+
} else {
45+
failures.append(failure)
46+
}
47+
}
48+
3949
print("Test Case '\(method)' started.")
4050

4151
setUp()
@@ -45,21 +55,19 @@ extension XCTestCase {
4555
tearDown()
4656

4757
totalDuration += duration
48-
for failure in XCTCurrentFailures {
58+
for failure in failures {
4959
failure.emit(method)
5060
totalFailures += 1
5161
if !failure.expected {
5262
unexpectedFailures += 1
5363
}
64+
65+
let result = failures.count > 0 ? "failed" : "passed"
66+
67+
print("Test Case '\(method)' \(result) (\(printableStringForTimeInterval(duration)) seconds).")
68+
XCTAllRuns.append(XCTRun(duration: duration, method: method, passed: failures.count == 0, failures: failures))
5469
}
55-
var result = "passed"
56-
if XCTCurrentFailures.count > 0 {
57-
result = "failed"
58-
}
59-
print("Test Case '\(method)' \(result) (\(printableStringForTimeInterval(duration)) seconds).")
60-
XCTAllRuns.append(XCTRun(duration: duration, method: method, passed: XCTCurrentFailures.count == 0, failures: XCTCurrentFailures))
61-
XCTCurrentFailures.removeAll()
62-
XCTCurrentTestCase = nil
70+
XCTFailureHandler = nil
6371
}
6472
}
6573

@@ -75,15 +83,6 @@ extension XCTestCase {
7583
print("Executed \(tests.count) test\(testCountSuffix), with \(totalFailures) failure\(failureSuffix) (\(unexpectedFailures) unexpected) in \(printableStringForTimeInterval(totalDuration)) (\(printableStringForTimeInterval(overallDuration))) seconds")
7684
}
7785

78-
// This function is for the use of XCTestCase only, but we must make it public or clients will get a link failure when using XCTest (23476006)
79-
public func testFailure(message: String, failureDescription: String, expected: Bool, file: StaticString, line: UInt) {
80-
if !continueAfterFailure {
81-
assert(false, message, file: file, line: line)
82-
} else {
83-
XCTCurrentFailures.append(XCTFailure(message: message, failureDescription: failureDescription, expected: expected, file: file, line: line))
84-
}
85-
}
86-
8786
public func setUp() {
8887

8988
}

Sources/XCTest/XCTestMain.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,5 @@ internal struct XCTRun {
6666
exit(totalFailures > 0 ? 1 : 0)
6767
}
6868

69-
internal var XCTCurrentTestCase: XCTestCase?
70-
internal var XCTCurrentFailures = [XCTFailure]()
69+
internal var XCTFailureHandler: (XCTFailure -> Void)?
7170
internal var XCTAllRuns = [XCTRun]()
72-

0 commit comments

Comments
 (0)