|
10 | 10 | // XCTAssert.swift
|
11 | 11 | //
|
12 | 12 |
|
| 13 | +private enum _XCTAssertion { |
| 14 | + case Equal(Any, Any) |
| 15 | + case EqualWithAccuracy(Any, Any, accuracy: Any) |
| 16 | + case GreaterThan(Any, Any) |
| 17 | + case GreaterThanOrEqual(Any, Any) |
| 18 | + case LessThan(Any, Any) |
| 19 | + case LessThanOrEqual(Any, Any) |
| 20 | + case NotEqual(Any, Any) |
| 21 | + case NotEqualWithAccuracy(Any, Any, accuracy: Any) |
| 22 | + case Nil |
| 23 | + case NotNil |
| 24 | + case True |
| 25 | + case False |
| 26 | + case Fail |
| 27 | + |
| 28 | + var name: String? { |
| 29 | + switch(self) { |
| 30 | + case .Equal: return "XCTAssertEqual" |
| 31 | + case .EqualWithAccuracy: return "XCTAssertEqualWithAccuracy" |
| 32 | + case .GreaterThan: return "XCTAssertGreaterThan" |
| 33 | + case .GreaterThanOrEqual: return "XCTAssertGreaterThanOrEqual" |
| 34 | + case .LessThan: return "XCTAssertLessThan" |
| 35 | + case .LessThanOrEqual: return "XCTAssertLessThanOrEqual" |
| 36 | + case .NotEqual: return "XCTAssertNotEqual" |
| 37 | + case .NotEqualWithAccuracy: return "XCTAssertNotEqualWithAccuracy" |
| 38 | + case .Nil: return "XCTAssertNil" |
| 39 | + case .NotNil: return "XCTAssertNotNil" |
| 40 | + case .True: return "XCTAssertTrue" |
| 41 | + case .False: return "XCTAssertFalse" |
| 42 | + case .Fail: return nil |
| 43 | + } |
| 44 | + } |
| 45 | + |
| 46 | + var failureDetails: String? { |
| 47 | + switch(self) { |
| 48 | + case .Equal(let value1, let value2): |
| 49 | + return "(\"\(value1)\") is not equal to (\"\(value2)\")" |
| 50 | + case .EqualWithAccuracy(let value1, let value2, let accuracy): |
| 51 | + return "(\"\(value1)\") is not equal to (\"\(value2)\") +/- (\"\(accuracy)\")" |
| 52 | + case .GreaterThan(let value1, let value2): |
| 53 | + return "(\"\(value1)\") is not greater than (\"\(value2)\")" |
| 54 | + case .GreaterThanOrEqual(let value1, let value2): |
| 55 | + return "(\"\(value1)\") is less than (\"\(value2)\")" |
| 56 | + case .LessThan(let value1, let value2): |
| 57 | + return "(\"\(value1)\") is not less than (\"\(value2)\")" |
| 58 | + case .LessThanOrEqual(let value1, let value2): |
| 59 | + return "(\"\(value1)\") is greater than (\"\(value2)\")" |
| 60 | + case .NotEqual(let value1, let value2): |
| 61 | + return "(\"\(value1)\") is equal to (\"\(value2)\")" |
| 62 | + case .NotEqualWithAccuracy(let value1, let value2, let accuracy): |
| 63 | + return "(\"\(value1)\") is equal to (\"\(value2)\") +/- (\"\(accuracy)\")" |
| 64 | + case .Nil: |
| 65 | + return "\"notnil\"" |
| 66 | + case .NotNil: return nil |
| 67 | + case .True: return nil |
| 68 | + case .False: return nil |
| 69 | + case .Fail: return nil |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + var failureDescription: String { |
| 74 | + switch (name, failureDetails) { |
| 75 | + case let (name?, description?): |
| 76 | + return "\(name) failed: \(description)" |
| 77 | + case let (name?, _): |
| 78 | + return "\(name) failed" |
| 79 | + default: |
| 80 | + return "failed" |
| 81 | + } |
| 82 | + } |
| 83 | +} |
| 84 | + |
| 85 | +private func _XCTAssert(@autoclosure expression: () -> BooleanType, @autoclosure assertion: () -> _XCTAssertion, _ message: String, file: StaticString, line: UInt) { |
| 86 | + if !expression().boolValue { |
| 87 | + if let test = XCTCurrentTestCase { |
| 88 | + test.testFailure(message, failureDescription: assertion().failureDescription, expected: true, file: file, line: line) |
| 89 | + } |
| 90 | + } |
| 91 | +} |
| 92 | + |
13 | 93 | /**
|
14 |
| -The primitive assertion function for XCTest. All other XCTAssert* functions are implemented in terms of this. This function emits a test failure if the general Bool expression passed to it evaluates to false. |
| 94 | +This function emits a test failure if the general Bool expression passed to it evaluates to false. |
15 | 95 | - Parameter expression: A boolean test. If it evaluates to false, the assertion fails and emits a test failure.
|
16 |
| -- Parameter message: An optional message to use in the failure if the assetion fails. If no message is supplied a default message is used. |
| 96 | +- Parameter message: An optional message to use in the failure if the assertion fails. |
17 | 97 | - 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.
|
18 | 98 | - 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.
|
19 | 99 | */
|
20 | 100 | public func XCTAssert(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
21 |
| - if !expression().boolValue { |
22 |
| - if let test = XCTCurrentTestCase { |
23 |
| - test.testFailure(message, expected: true, file: file, line: line) |
24 |
| - } |
25 |
| - } |
| 101 | + XCTAssertTrue(expression, message, file: file, line: line) |
26 | 102 | }
|
27 | 103 |
|
28 | 104 | public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
29 |
| - XCTAssert(expression1() == expression2(), message, file: file, line: line) |
| 105 | + let (value1, value2) = (expression1(), expression2()) |
| 106 | + _XCTAssert(value1 == value2, assertion: .Equal(value1, value2), message, file: file, line: line) |
30 | 107 | }
|
31 | 108 |
|
32 | 109 | public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> ArraySlice<T>, @autoclosure _ expression2: () -> ArraySlice<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
33 |
| - XCTAssert(expression1() == expression2(), message, file: file, line: line) |
| 110 | + let (value1, value2) = (expression1(), expression2()) |
| 111 | + _XCTAssert(value1 == value2, assertion: .Equal(value1, value2), message, file: file, line: line) |
34 | 112 | }
|
35 | 113 |
|
36 | 114 | public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> ContiguousArray<T>, @autoclosure _ expression2: () -> ContiguousArray<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
37 |
| - XCTAssert(expression1() == expression2(), message, file: file, line: line) |
| 115 | + let (value1, value2) = (expression1(), expression2()) |
| 116 | + _XCTAssert(value1 == value2, assertion: .Equal(value1, value2), message, file: file, line: line) |
38 | 117 | }
|
39 | 118 |
|
40 | 119 | public func XCTAssertEqual<T : Equatable>(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
41 |
| - XCTAssert(expression1() == expression2(), message, file: file, line: line) |
| 120 | + let (value1, value2) = (expression1(), expression2()) |
| 121 | + _XCTAssert(value1 == value2, assertion: .Equal(value1, value2), message, file: file, line: line) |
42 | 122 | }
|
43 | 123 |
|
44 | 124 | public func XCTAssertEqual<T, U : Equatable>(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
45 |
| - XCTAssert(expression1() == expression2(), message, file: file, line: line) |
| 125 | + let (value1, value2) = (expression1(), expression2()) |
| 126 | + _XCTAssert(value1 == value2, assertion: .Equal(value1, value2), message, file: file, line: line) |
46 | 127 | }
|
47 | 128 |
|
48 | 129 | public func XCTAssertEqualWithAccuracy<T : FloatingPointType>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
49 |
| - XCTAssert(abs(expression1().distanceTo(expression2())) <= abs(accuracy.distanceTo(T(0))), message, file: file, line: line) |
| 130 | + let (value1, value2) = (expression1(), expression2()) |
| 131 | + _XCTAssert(abs(value1.distanceTo(value2)) <= abs(accuracy.distanceTo(T(0))), assertion: .EqualWithAccuracy(value1, value2, accuracy: accuracy), message, file: file, line: line) |
50 | 132 | }
|
51 | 133 |
|
52 | 134 | public func XCTAssertFalse(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
53 |
| - XCTAssert(!expression().boolValue, message, file: file, line: line) |
| 135 | + _XCTAssert(!expression().boolValue, assertion: .False, message, file: file, line: line) |
54 | 136 | }
|
55 | 137 |
|
56 | 138 | public func XCTAssertGreaterThan<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
57 |
| - XCTAssert(expression1() > expression2(), message, file: file, line: line) |
| 139 | + let (value1, value2) = (expression1(), expression2()) |
| 140 | + _XCTAssert(value1 > value2, assertion: .GreaterThan(value1, value2), message, file: file, line: line) |
58 | 141 | }
|
59 | 142 |
|
60 | 143 | public func XCTAssertGreaterThanOrEqual<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
61 |
| - XCTAssert(expression1() >= expression2(), message, file: file, line: line) |
| 144 | + let (value1, value2) = (expression1(), expression2()) |
| 145 | + _XCTAssert(value1 >= value2, assertion: .GreaterThanOrEqual(value1, value2), message, file: file, line: line) |
62 | 146 | }
|
63 | 147 |
|
64 | 148 | public func XCTAssertLessThan<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
65 |
| - XCTAssert(expression1() < expression2(), message, file: file, line: line) |
| 149 | + let (value1, value2) = (expression1(), expression2()) |
| 150 | + _XCTAssert(value1 < value2, assertion: .LessThan(value1, value2), message, file: file, line: line) |
66 | 151 | }
|
67 | 152 |
|
68 | 153 | public func XCTAssertLessThanOrEqual<T : Comparable>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
69 |
| - XCTAssert(expression1() <= expression2(), message, file: file, line: line) |
| 154 | + let (value1, value2) = (expression1(), expression2()) |
| 155 | + _XCTAssert(value1 <= value2, assertion: .LessThanOrEqual(value1, value2), message, file: file, line: line) |
70 | 156 | }
|
71 | 157 |
|
72 | 158 | public func XCTAssertNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
73 |
| - XCTAssert(expression() == nil, message, file: file, line: line) |
| 159 | + _XCTAssert(expression() == nil, assertion: .Nil, message, file: file, line: line) |
74 | 160 | }
|
75 | 161 |
|
76 | 162 | public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> T?, @autoclosure _ expression2: () -> T?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
77 |
| - XCTAssert(expression1() != expression2(), message, file: file, line: line) |
| 163 | + let (value1, value2) = (expression1(), expression2()) |
| 164 | + _XCTAssert(value1 != value2, assertion: .NotEqual(value1, value2), message, file: file, line: line) |
78 | 165 | }
|
79 | 166 |
|
80 | 167 | public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> ContiguousArray<T>, @autoclosure _ expression2: () -> ContiguousArray<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
81 |
| - XCTAssert(expression1() != expression2(), message, file: file, line: line) |
| 168 | + let (value1, value2) = (expression1(), expression2()) |
| 169 | + _XCTAssert(value1 != value2, assertion: .NotEqual(value1, value2), message, file: file, line: line) |
82 | 170 | }
|
83 | 171 |
|
84 | 172 | public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> ArraySlice<T>, @autoclosure _ expression2: () -> ArraySlice<T>, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
85 |
| - XCTAssert(expression1() != expression2(), message, file: file, line: line) |
| 173 | + let (value1, value2) = (expression1(), expression2()) |
| 174 | + _XCTAssert(value1 != value2, assertion: .NotEqual(value1, value2), message, file: file, line: line) |
86 | 175 | }
|
87 | 176 |
|
88 | 177 | public func XCTAssertNotEqual<T : Equatable>(@autoclosure expression1: () -> [T], @autoclosure _ expression2: () -> [T], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
89 |
| - XCTAssert(expression1() != expression2(), message, file: file, line: line) |
| 178 | + let (value1, value2) = (expression1(), expression2()) |
| 179 | + _XCTAssert(value1 != value2, assertion: .NotEqual(value1, value2), message, file: file, line: line) |
90 | 180 | }
|
91 | 181 |
|
92 | 182 | public func XCTAssertNotEqual<T, U : Equatable>(@autoclosure expression1: () -> [T : U], @autoclosure _ expression2: () -> [T : U], _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
93 |
| - XCTAssert(expression1() != expression2(), message, file: file, line: line) |
| 183 | + let (value1, value2) = (expression1(), expression2()) |
| 184 | + _XCTAssert(value1 != value2, assertion: .NotEqual(value1, value2), message, file: file, line: line) |
94 | 185 | }
|
95 | 186 |
|
96 | 187 | public func XCTAssertNotEqualWithAccuracy<T : FloatingPointType>(@autoclosure expression1: () -> T, @autoclosure _ expression2: () -> T, _ accuracy: T, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
97 |
| - XCTAssert(abs(expression1().distanceTo(expression2())) > abs(accuracy.distanceTo(T(0))), message, file: file, line: line) |
| 188 | + let (value1, value2) = (expression1(), expression2()) |
| 189 | + _XCTAssert(abs(value1.distanceTo(value2)) > abs(accuracy.distanceTo(T(0))), assertion: .NotEqualWithAccuracy(value1, value2, accuracy: accuracy), message, file: file, line: line) |
98 | 190 | }
|
99 | 191 |
|
100 | 192 | public func XCTAssertNotNil(@autoclosure expression: () -> Any?, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
101 |
| - XCTAssert(expression() != nil, message, file: file, line: line) |
| 193 | + _XCTAssert(expression() != nil, assertion: .NotNil, message, file: file, line: line) |
102 | 194 | }
|
103 | 195 |
|
104 | 196 | public func XCTAssertTrue(@autoclosure expression: () -> BooleanType, _ message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
105 |
| - XCTAssert(expression().boolValue, message, file: file, line: line) |
| 197 | + _XCTAssert(expression().boolValue, assertion: .True, message, file: file, line: line) |
106 | 198 | }
|
107 | 199 |
|
108 | 200 | public func XCTFail(message: String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
|
109 |
| - XCTAssert(false, message, file: file, line: line) |
| 201 | + _XCTAssert(false, assertion: .Fail, message, file: file, line: line) |
110 | 202 | }
|
0 commit comments