From b414213661873915e7b93430a39b6e2941bfb9e0 Mon Sep 17 00:00:00 2001 From: Brian Croom Date: Wed, 23 Dec 2015 12:19:29 -0500 Subject: [PATCH] Refactor to rely less on global state for failure reporting * Also allows removing a weird public method from XCTestCase --- Sources/XCTest/XCTAssert.swift | 4 ++-- Sources/XCTest/XCTestCase.swift | 37 ++++++++++++++++----------------- Sources/XCTest/XCTestMain.swift | 4 +--- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/Sources/XCTest/XCTAssert.swift b/Sources/XCTest/XCTAssert.swift index 5d03499fb..fc2d09992 100644 --- a/Sources/XCTest/XCTAssert.swift +++ b/Sources/XCTest/XCTAssert.swift @@ -84,8 +84,8 @@ private enum _XCTAssertion { private func _XCTAssert(@autoclosure expression: () -> BooleanType, @autoclosure assertion: () -> _XCTAssertion, @autoclosure _ message: () -> String, file: StaticString, line: UInt) { if !expression().boolValue { - if let test = XCTCurrentTestCase { - test.testFailure(message(), failureDescription: assertion().failureDescription, expected: true, file: file, line: line) + if let handler = XCTFailureHandler { + handler(XCTFailure(message: message(), failureDescription: assertion().failureDescription, expected: true, file: file, line: line)) } } } diff --git a/Sources/XCTest/XCTestCase.swift b/Sources/XCTest/XCTestCase.swift index bf41701f0..e43d1cbf2 100644 --- a/Sources/XCTest/XCTestCase.swift +++ b/Sources/XCTest/XCTestCase.swift @@ -34,8 +34,18 @@ extension XCTestCase { var unexpectedFailures = 0 let overallDuration = measureTimeExecutingBlock { for (name, test) in tests { - XCTCurrentTestCase = self let method = "\(self.dynamicType).\(name)" + + var failures = [XCTFailure]() + XCTFailureHandler = { failure in + if !self.continueAfterFailure { + failure.emit(method) + fatalError("Terminating execution due to test failure", file: failure.file, line: failure.line) + } else { + failures.append(failure) + } + } + print("Test Case '\(method)' started.") setUp() @@ -45,21 +55,19 @@ extension XCTestCase { tearDown() totalDuration += duration - for failure in XCTCurrentFailures { + for failure in failures { failure.emit(method) totalFailures += 1 if !failure.expected { unexpectedFailures += 1 } + + let result = failures.count > 0 ? "failed" : "passed" + + print("Test Case '\(method)' \(result) (\(printableStringForTimeInterval(duration)) seconds).") + XCTAllRuns.append(XCTRun(duration: duration, method: method, passed: failures.count == 0, failures: failures)) } - var result = "passed" - if XCTCurrentFailures.count > 0 { - result = "failed" - } - print("Test Case '\(method)' \(result) (\(printableStringForTimeInterval(duration)) seconds).") - XCTAllRuns.append(XCTRun(duration: duration, method: method, passed: XCTCurrentFailures.count == 0, failures: XCTCurrentFailures)) - XCTCurrentFailures.removeAll() - XCTCurrentTestCase = nil + XCTFailureHandler = nil } } @@ -75,15 +83,6 @@ extension XCTestCase { print("Executed \(tests.count) test\(testCountSuffix), with \(totalFailures) failure\(failureSuffix) (\(unexpectedFailures) unexpected) in \(printableStringForTimeInterval(totalDuration)) (\(printableStringForTimeInterval(overallDuration))) seconds") } - // 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) - public func testFailure(message: String, failureDescription: String, expected: Bool, file: StaticString, line: UInt) { - if !continueAfterFailure { - assert(false, message, file: file, line: line) - } else { - XCTCurrentFailures.append(XCTFailure(message: message, failureDescription: failureDescription, expected: expected, file: file, line: line)) - } - } - public func setUp() { } diff --git a/Sources/XCTest/XCTestMain.swift b/Sources/XCTest/XCTestMain.swift index b13774678..630e835a0 100644 --- a/Sources/XCTest/XCTestMain.swift +++ b/Sources/XCTest/XCTestMain.swift @@ -66,7 +66,5 @@ internal struct XCTRun { exit(totalFailures > 0 ? 1 : 0) } -internal var XCTCurrentTestCase: XCTestCase? -internal var XCTCurrentFailures = [XCTFailure]() +internal var XCTFailureHandler: (XCTFailure -> Void)? internal var XCTAllRuns = [XCTRun]() -