diff --git a/XCTest/XCTAssert.swift b/XCTest/XCTAssert.swift index fdb01e900..7ebfb028f 100644 --- a/XCTest/XCTAssert.swift +++ b/XCTest/XCTAssert.swift @@ -17,94 +17,94 @@ The primitive assertion function for XCTest. All other XCTAssert* functions are - Parameter file: The file name to use in the error message if the assertion fails. Default is the file containing the call to this function. It is rare to provide this parameter when calling this function. - Parameter line: The line number to use in the error message if the assertion fails. Default is the line number of the call to this function in the calling file. It is rare to provide this parameter when calling this function. */ -public func XCTAssert(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssert(@autoclosure expression: () -> BooleanType, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { if !expression().boolValue { - if let test = XCTCurrentTestCase { - test.testFailure(message, expected: true, file: file, line: line) + if let handler = XCTFailureHandler { + handler(XCTFailure(message: message, expected: true, file: file, line: line)) } } } -public func XCTAssertEqual(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertEqual(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() == expression2(), message, file: file, line: line) } -public func XCTAssertEqual(@autoclosure expression1: () -> ArraySlice, @autoclosure _ expression2: () -> ArraySlice, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertEqual(@autoclosure expression1: () -> ArraySlice, @autoclosure _ expression2: () -> ArraySlice, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() == expression2(), message, file: file, line: line) } -public func XCTAssertEqual(@autoclosure expression1: () -> ContiguousArray, @autoclosure _ expression2: () -> ContiguousArray, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertEqual(@autoclosure expression1: () -> ContiguousArray, @autoclosure _ expression2: () -> ContiguousArray, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() == expression2(), message, file: file, line: line) } -public func XCTAssertEqual(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertEqual(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() == expression2(), message, file: file, line: line) } -public func XCTAssertEqual(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertEqual(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() == expression2(), message, file: file, line: line) } -public func XCTAssertEqualWithAccuracy(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertEqualWithAccuracy(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, accuracy: T, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(abs(expression1().distanceTo(expression2())) <= abs(accuracy.distanceTo(T(0))), message, file: file, line: line) } -public func XCTAssertFalse(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertFalse(@autoclosure expression: () -> BooleanType, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(!expression().boolValue, message, file: file, line: line) } -public func XCTAssertGreaterThan(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertGreaterThan(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() > expression2(), message, file: file, line: line) } -public func XCTAssertGreaterThanOrEqual(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertGreaterThanOrEqual(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() >= expression2(), message, file: file, line: line) } -public func XCTAssertLessThan(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertLessThan(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() < expression2(), message, file: file, line: line) } -public func XCTAssertLessThanOrEqual(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertLessThanOrEqual(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() <= expression2(), message, file: file, line: line) } -public func XCTAssertNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNil(@autoclosure expression: () -> Any?, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression() == nil, message, file: file, line: line) } -public func XCTAssertNotEqual(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotEqual(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() != expression2(), message, file: file, line: line) } -public func XCTAssertNotEqual(@autoclosure expression1: () -> ContiguousArray, @autoclosure _ expression2: () -> ContiguousArray, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotEqual(@autoclosure expression1: () -> ContiguousArray, @autoclosure _ expression2: () -> ContiguousArray, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() != expression2(), message, file: file, line: line) } -public func XCTAssertNotEqual(@autoclosure expression1: () -> ArraySlice, @autoclosure _ expression2: () -> ArraySlice, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotEqual(@autoclosure expression1: () -> ArraySlice, @autoclosure _ expression2: () -> ArraySlice, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() != expression2(), message, file: file, line: line) } -public func XCTAssertNotEqual(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotEqual(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() != expression2(), message, file: file, line: line) } -public func XCTAssertNotEqual(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotEqual(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression1() != expression2(), message, file: file, line: line) } -public func XCTAssertNotEqualWithAccuracy(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotEqualWithAccuracy(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ accuracy: T, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(abs(expression1().distanceTo(expression2())) > abs(accuracy.distanceTo(T(0))), message, file: file, line: line) } -public func XCTAssertNotNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertNotNil(@autoclosure expression: () -> Any?, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression() != nil, message, file: file, line: line) } -public func XCTAssertTrue(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTAssertTrue(@autoclosure expression: () -> BooleanType, _ message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(expression().boolValue, message, file: file, line: line) } -public func XCTFail(message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) { +public func XCTFail(message: String = "", file: String = __FILE__, line: UInt = __LINE__) { XCTAssert(false, message, file: file, line: line) } diff --git a/XCTest/XCTestCase.swift b/XCTest/XCTestCase.swift index d15c13851..35c15110c 100644 --- a/XCTest/XCTestCase.swift +++ b/XCTest/XCTestCase.swift @@ -32,8 +32,18 @@ extension XCTestCase { var totalFailures = 0 var unexpectedFailures = 0 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") + } else { + failures.append(failure) + } + } + var duration: Double = 0.0 print("Test Case '\(method)' started.") @@ -47,7 +57,7 @@ extension XCTestCase { duration = end - start totalDuration += duration - for failure in XCTCurrentFailures { + for failure in failures { failure.emit(method) totalFailures += 1 if !failure.expected { @@ -55,13 +65,12 @@ extension XCTestCase { } } var result = "passed" - if XCTCurrentFailures.count > 0 { + if failures.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 + XCTAllRuns.append(XCTRun(duration: duration, method: method, passed: failures.count == 0, failures: failures)) + XCTFailureHandler = nil } var testCountSuffix = "s" if tests.count == 1 { @@ -75,16 +84,7 @@ extension XCTestCase { print("Executed \(tests.count) test\(testCountSuffix), with \(totalFailures) failure\(failureSuffix) (\(unexpectedFailures) unexpected) in \(printableStringForTimeInterval(averageDuration)) (\(printableStringForTimeInterval(totalDuration))) 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, expected: Bool, file: StaticString , line: UInt) { - if !continueAfterFailure { - assert(false, message, file: file, line: line) - } else { - XCTCurrentFailures.append(XCTFailure(message: message, expected: expected, file: file, line: line)) - } - } - + public func setUp() { } diff --git a/XCTest/XCTestMain.swift b/XCTest/XCTestMain.swift index 433956034..62fb0c322 100644 --- a/XCTest/XCTestMain.swift +++ b/XCTest/XCTestMain.swift @@ -21,7 +21,7 @@ import Darwin struct XCTFailure { var message: String var expected: Bool - var file: StaticString + var file: String var line: UInt func emit(method: String) { @@ -62,7 +62,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]() -