Skip to content

Commit 0987cf9

Browse files
author
Mike Ferris
committed
Merge pull request #12 from mike-ferris-apple/master
Splitting implementation into several files in anticipation of growth of the code base.
2 parents e21c93e + 3375fb9 commit 0987cf9

File tree

6 files changed

+249
-187
lines changed

6 files changed

+249
-187
lines changed

XCTest.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
B11FFA2A1C1603B6004297C2 /* XCTAssert.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11FFA291C1603B6004297C2 /* XCTAssert.swift */; };
11+
B11FFA2C1C160434004297C2 /* XCTestCaseProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11FFA2B1C160434004297C2 /* XCTestCaseProvider.swift */; };
12+
B11FFA2E1C16053C004297C2 /* XCTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B11FFA2D1C16053C004297C2 /* XCTestCase.swift */; };
1013
EA6E86BB1BDEA7DE007C0323 /* XCTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6E86BA1BDEA7DE007C0323 /* XCTest.swift */; };
1114
/* End PBXBuildFile section */
1215

1316
/* Begin PBXFileReference section */
1417
5B5D86DB1BBC74AD00234F36 /* SwiftXCTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftXCTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
18+
B11FFA291C1603B6004297C2 /* XCTAssert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTAssert.swift; sourceTree = "<group>"; };
19+
B11FFA2B1C160434004297C2 /* XCTestCaseProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCaseProvider.swift; sourceTree = "<group>"; };
20+
B11FFA2D1C16053C004297C2 /* XCTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTestCase.swift; sourceTree = "<group>"; };
1521
EA3E74BB1BF2B6D500635A73 /* build_script.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = build_script.py; sourceTree = "<group>"; };
1622
EA6E86BA1BDEA7DE007C0323 /* XCTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTest.swift; sourceTree = "<group>"; };
1723
/* End PBXFileReference section */
@@ -50,6 +56,9 @@
5056
isa = PBXGroup;
5157
children = (
5258
EA6E86BA1BDEA7DE007C0323 /* XCTest.swift */,
59+
B11FFA2D1C16053C004297C2 /* XCTestCase.swift */,
60+
B11FFA2B1C160434004297C2 /* XCTestCaseProvider.swift */,
61+
B11FFA291C1603B6004297C2 /* XCTAssert.swift */,
5362
);
5463
path = XCTest;
5564
sourceTree = "<group>";
@@ -142,6 +151,9 @@
142151
buildActionMask = 2147483647;
143152
files = (
144153
EA6E86BB1BDEA7DE007C0323 /* XCTest.swift in Sources */,
154+
B11FFA2C1C160434004297C2 /* XCTestCaseProvider.swift in Sources */,
155+
B11FFA2E1C16053C004297C2 /* XCTestCase.swift in Sources */,
156+
B11FFA2A1C1603B6004297C2 /* XCTAssert.swift in Sources */,
145157
);
146158
runOnlyForDeploymentPostprocessing = 0;
147159
};

XCTest/XCTAssert.swift

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// This source file is part of the Swift.org open source project
2+
//
3+
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
4+
// Licensed under Apache License v2.0 with Runtime Library Exception
5+
//
6+
// See http://swift.org/LICENSE.txt for license information
7+
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
8+
//
9+
//
10+
// XCTAssert.swift
11+
// Test assertion functions
12+
//
13+
14+
public func XCTAssert(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
15+
if !expression().boolValue {
16+
if let test = XCTCurrentTestCase {
17+
test.testFailure(message, file: file, line: line)
18+
}
19+
}
20+
}
21+
22+
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
23+
XCTAssert(expression1() == expression2(), message, file: file, line: line)
24+
}
25+
26+
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> ArraySlice<T>, @autoclosure _ expression2: () -> ArraySlice<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
27+
XCTAssert(expression1() == expression2(), message, file: file, line: line)
28+
}
29+
30+
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> ContiguousArray<T>, @autoclosure _ expression2: () -> ContiguousArray<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
31+
XCTAssert(expression1() == expression2(), message, file: file, line: line)
32+
}
33+
34+
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
35+
XCTAssert(expression1() == expression2(), message, file: file, line: line)
36+
}
37+
38+
public func XCTAssertEqual<T, U : Equatable>(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
39+
XCTAssert(expression1() == expression2(), message, file: file, line: line)
40+
}
41+
42+
public func XCTAssertEqualWithAccuracy<T : FloatingPointType>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
43+
XCTAssert(abs(expression1().distanceTo(expression2())) <= abs(accuracy.distanceTo(T(0))), message, file: file, line: line)
44+
}
45+
46+
public func XCTAssertFalse(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
47+
XCTAssert(!expression().boolValue, message, file: file, line: line)
48+
}
49+
50+
public func XCTAssertGreaterThan<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
51+
XCTAssert(expression1() > expression2(), message, file: file, line: line)
52+
}
53+
54+
public func XCTAssertGreaterThanOrEqual<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
55+
XCTAssert(expression1() >= expression2(), message, file: file, line: line)
56+
}
57+
58+
public func XCTAssertLessThan<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
59+
XCTAssert(expression1() < expression2(), message, file: file, line: line)
60+
}
61+
62+
public func XCTAssertLessThanOrEqual<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
63+
XCTAssert(expression1() <= expression2(), message, file: file, line: line)
64+
}
65+
66+
public func XCTAssertNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
67+
XCTAssert(expression() == nil, message, file: file, line: line)
68+
}
69+
70+
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
71+
XCTAssert(expression1() != expression2(), message, file: file, line: line)
72+
}
73+
74+
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> ContiguousArray<T>, @autoclosure _ expression2: () -> ContiguousArray<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
75+
XCTAssert(expression1() != expression2(), message, file: file, line: line)
76+
}
77+
78+
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> ArraySlice<T>, @autoclosure _ expression2: () -> ArraySlice<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
79+
XCTAssert(expression1() != expression2(), message, file: file, line: line)
80+
}
81+
82+
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
83+
XCTAssert(expression1() != expression2(), message, file: file, line: line)
84+
}
85+
86+
public func XCTAssertNotEqual<T, U : Equatable>(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
87+
XCTAssert(expression1() != expression2(), message, file: file, line: line)
88+
}
89+
90+
public func XCTAssertNotEqualWithAccuracy<T : FloatingPointType>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
91+
XCTAssert(abs(expression1().distanceTo(expression2())) > abs(accuracy.distanceTo(T(0))), message, file: file, line: line)
92+
}
93+
94+
public func XCTAssertNotNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
95+
XCTAssert(expression() != nil, message, file: file, line: line)
96+
}
97+
98+
public func XCTAssertTrue(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
99+
XCTAssert(expression().boolValue, message, file: file, line: line)
100+
}
101+
102+
public func XCTFail(message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
103+
XCTAssert(false, message, file: file, line: line)
104+
}

XCTest/XCTest.swift

Lines changed: 8 additions & 185 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
//
99
//
1010
// XCTest.swift
11-
// a mini version XCTest
11+
// This is the main file for the framework. It provides the entry point function
12+
// for running tests and some infrastructure for running them.
1213
//
1314

1415
#if os(Linux)
@@ -17,90 +18,13 @@ import Glibc
1718
import Darwin
1819
#endif
1920

20-
public protocol XCTestCaseProvider {
21-
// In the Objective-C version of XCTest, it is possible to discover all tests when the test is executed by asking the runtime for all methods and looking for the string "test". In Swift, we ask test providers to tell us the list of tests by implementing this property.
22-
var allTests : [(String, () -> ())] { get }
23-
}
24-
25-
public protocol XCTestCase : XCTestCaseProvider {
26-
27-
}
28-
29-
extension XCTestCase {
30-
31-
public var continueAfterFailure: Bool {
32-
get {
33-
return true
34-
}
35-
set {
36-
// TODO: When using the Objective-C runtime, XCTest is able to throw an exception from an assert and then catch it at the frame above the test method. This enables the framework to effectively stop all execution in the current test. There is no such facility in Swift. Until we figure out how to get a compatible behavior, we have decided to hard-code the value of 'true' for continue after failure.
37-
}
38-
}
39-
40-
public func invokeTest() {
41-
let tests = self.allTests
42-
var totalDuration = 0.0
43-
var totalFailures = 0
44-
for (name, test) in tests {
45-
XCTCurrentTestCase = self
46-
let method = "\(self.dynamicType).\(name)"
47-
var duration: Double = 0.0
48-
print("Test Case '\(method)' started.")
49-
var tv = timeval()
50-
let start = withUnsafeMutablePointer(&tv, { (t: UnsafeMutablePointer<timeval>) -> Double in
51-
gettimeofday(t, nil)
52-
return Double(t.memory.tv_sec) + Double(t.memory.tv_usec) / 1000000.0
53-
})
54-
55-
test()
56-
let end = withUnsafeMutablePointer(&tv, { (t: UnsafeMutablePointer<timeval>) -> Double in
57-
gettimeofday(t, nil)
58-
return Double(t.memory.tv_sec) + Double(t.memory.tv_usec) / 1000000.0
59-
})
60-
duration = end - start
61-
totalDuration += duration
62-
for failure in XCTCurrentFailures {
63-
failure.emit(method)
64-
totalFailures++
65-
}
66-
var result = "passed"
67-
if XCTCurrentFailures.count > 0 {
68-
result = "failed"
69-
}
70-
print("Test Case '\(method)' \(result) (\(round(duration * 1000.0) / 1000.0) seconds).")
71-
XCTAllRuns.append(XCTRun(duration: duration, method: method, passed: XCTCurrentFailures.count == 0, failures: XCTCurrentFailures))
72-
XCTCurrentFailures.removeAll()
73-
XCTCurrentTestCase = nil
74-
}
75-
var testCountSuffix = "s"
76-
if tests.count == 1 {
77-
testCountSuffix = ""
78-
}
79-
var failureSuffix = "s"
80-
if totalFailures == 1 {
81-
failureSuffix = ""
82-
}
83-
let averageDuration = totalDuration / Double(tests.count)
84-
85-
86-
print("Executed \(tests.count) test\(testCountSuffix), with \(totalFailures) failure\(failureSuffix) (0 unexpected) in \(round(averageDuration * 1000.0) / 1000.0) (\(round(totalDuration * 1000.0) / 1000.0)) seconds")
87-
}
88-
89-
// 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)
90-
public func testFailure(message: String, file: StaticString , line: UInt) {
91-
if !continueAfterFailure {
92-
assert(false, message, file: file, line: line)
93-
} else {
94-
XCTCurrentFailures.append(XCTFailure(message: message, file: file, line: line))
95-
}
96-
}
97-
98-
public func setUp() {
99-
100-
}
21+
struct XCTFailure {
22+
var message: String
23+
var file: StaticString
24+
var line: UInt
10125

102-
public func tearDown() {
103-
26+
func emit(method: String) {
27+
print("\(file):\(line): error: \(method) : \(message)")
10428
}
10529
}
10630

@@ -134,108 +58,7 @@ internal struct XCTRun {
13458
exit(totalFailures > 0 ? 1 : 0)
13559
}
13660

137-
struct XCTFailure {
138-
var message: String
139-
var file: StaticString
140-
var line: UInt
141-
142-
func emit(method: String) {
143-
print("\(file):\(line): error: \(method) : \(message)")
144-
}
145-
}
146-
14761
internal var XCTCurrentTestCase: XCTestCase?
14862
internal var XCTCurrentFailures = [XCTFailure]()
14963
internal var XCTAllRuns = [XCTRun]()
15064

151-
public func XCTAssert(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
152-
if !expression().boolValue {
153-
if let test = XCTCurrentTestCase {
154-
test.testFailure(message, file: file, line: line)
155-
}
156-
}
157-
}
158-
159-
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
160-
XCTAssert(expression1() == expression2(), message, file: file, line: line)
161-
}
162-
163-
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> ArraySlice<T>, @autoclosure _ expression2: () -> ArraySlice<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
164-
XCTAssert(expression1() == expression2(), message, file: file, line: line)
165-
}
166-
167-
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> ContiguousArray<T>, @autoclosure _ expression2: () -> ContiguousArray<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
168-
XCTAssert(expression1() == expression2(), message, file: file, line: line)
169-
}
170-
171-
public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
172-
XCTAssert(expression1() == expression2(), message, file: file, line: line)
173-
}
174-
175-
public func XCTAssertEqual<T, U : Equatable>(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
176-
XCTAssert(expression1() == expression2(), message, file: file, line: line)
177-
}
178-
179-
public func XCTAssertEqualWithAccuracy<T : FloatingPointType>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
180-
XCTAssert(abs(expression1().distanceTo(expression2())) <= abs(accuracy.distanceTo(T(0))), message, file: file, line: line)
181-
}
182-
183-
public func XCTAssertFalse(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
184-
XCTAssert(!expression().boolValue, message, file: file, line: line)
185-
}
186-
187-
public func XCTAssertGreaterThan<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
188-
XCTAssert(expression1() > expression2(), message, file: file, line: line)
189-
}
190-
191-
public func XCTAssertGreaterThanOrEqual<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
192-
XCTAssert(expression1() >= expression2(), message, file: file, line: line)
193-
}
194-
195-
public func XCTAssertLessThan<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
196-
XCTAssert(expression1() < expression2(), message, file: file, line: line)
197-
}
198-
199-
public func XCTAssertLessThanOrEqual<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
200-
XCTAssert(expression1() <= expression2(), message, file: file, line: line)
201-
}
202-
203-
public func XCTAssertNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
204-
XCTAssert(expression() == nil, message, file: file, line: line)
205-
}
206-
207-
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
208-
XCTAssert(expression1() != expression2(), message, file: file, line: line)
209-
}
210-
211-
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> ContiguousArray<T>, @autoclosure _ expression2: () -> ContiguousArray<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
212-
XCTAssert(expression1() != expression2(), message, file: file, line: line)
213-
}
214-
215-
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> ArraySlice<T>, @autoclosure _ expression2: () -> ArraySlice<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
216-
XCTAssert(expression1() != expression2(), message, file: file, line: line)
217-
}
218-
219-
public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
220-
XCTAssert(expression1() != expression2(), message, file: file, line: line)
221-
}
222-
223-
public func XCTAssertNotEqual<T, U : Equatable>(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
224-
XCTAssert(expression1() != expression2(), message, file: file, line: line)
225-
}
226-
227-
public func XCTAssertNotEqualWithAccuracy<T : FloatingPointType>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
228-
XCTAssert(abs(expression1().distanceTo(expression2())) > abs(accuracy.distanceTo(T(0))), message, file: file, line: line)
229-
}
230-
231-
public func XCTAssertNotNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
232-
XCTAssert(expression() != nil, message, file: file, line: line)
233-
}
234-
235-
public func XCTAssertTrue(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
236-
XCTAssert(expression().boolValue, message, file: file, line: line)
237-
}
238-
239-
public func XCTFail(message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
240-
XCTAssert(false, message, file: file, line: line)
241-
}

0 commit comments

Comments
 (0)