Skip to content

Commit cdda9d7

Browse files
committed
Implement XCTAssertIdentical & XCTAssertNotIdentical
These functions are available in Xcode 12.5, but aren't available on Linux/Windows. This change adds the implementations for them.
1 parent 20d53bc commit cdda9d7

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

Sources/XCTest/Public/XCTAssert.swift

+32
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
private enum _XCTAssertion {
1414
case equal
1515
case equalWithAccuracy
16+
case identical
17+
case notIdentical
1618
case greaterThan
1719
case greaterThanOrEqual
1820
case lessThan
@@ -32,6 +34,8 @@ private enum _XCTAssertion {
3234
switch(self) {
3335
case .equal: return "XCTAssertEqual"
3436
case .equalWithAccuracy: return "XCTAssertEqual"
37+
case .identical: return "XCTAssertIdentical"
38+
case .notIdentical: return "XCTAssertNotIdentical"
3539
case .greaterThan: return "XCTAssertGreaterThan"
3640
case .greaterThanOrEqual: return "XCTAssertGreaterThanOrEqual"
3741
case .lessThan: return "XCTAssertLessThan"
@@ -206,6 +210,34 @@ public func XCTAssertEqualWithAccuracy<T: FloatingPoint>(_ expression1: @autoclo
206210
XCTAssertEqual(try expression1(), try expression2(), accuracy: accuracy, message(), file: file, line: line)
207211
}
208212

213+
private func describe(_ object: AnyObject?) -> String {
214+
return object == nil ? String(describing: object) : String(describing: object!)
215+
}
216+
217+
/// Asserts that two values are identical.
218+
public func XCTAssertIdentical(_ expression1: @autoclosure () throws -> AnyObject?, _ expression2: @autoclosure () throws -> AnyObject?, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
219+
_XCTEvaluateAssertion(.identical, message: message(), file: file, line: line) {
220+
let (value1, value2) = (try expression1(), try expression2())
221+
if value1 === value2 {
222+
return .success
223+
} else {
224+
return .expectedFailure("(\"\(describe(value1))\") is not identical to (\"\(describe(value2))\")")
225+
}
226+
}
227+
}
228+
229+
/// Asserts that two values aren't identical.
230+
public func XCTAssertNotIdentical(_ expression1: @autoclosure () throws -> AnyObject?, _ expression2: @autoclosure () throws -> AnyObject?, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) {
231+
_XCTEvaluateAssertion(.notIdentical, message: message(), file: file, line: line) {
232+
let (value1, value2) = (try expression1(), try expression2())
233+
if value1 !== value2 {
234+
return .success
235+
} else {
236+
return .expectedFailure("(\"\(describe(value1))\") is identical to (\"\(describe(value2))\")")
237+
}
238+
}
239+
}
240+
209241
public func XCTAssertFalse(_ expression: @autoclosure () throws -> Bool, _ message: @autoclosure () -> String = "", file: StaticString = #file, line: UInt = #line) {
210242
_XCTEvaluateAssertion(.`false`, message: message(), file: file, line: line) {
211243
let value = try expression()

Tests/Functional/FailureMessagesTestCase/main.swift

+26-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class FailureMessagesTestCase: XCTestCase {
2828
("testAssertFalse", testAssertFalse),
2929
("testAssertGreaterThan", testAssertGreaterThan),
3030
("testAssertGreaterThanOrEqual", testAssertGreaterThanOrEqual),
31+
("testAssertIdentical", testAssertIdentical),
32+
("testAssertNotIdentical", testAssertNotIdentical),
3133
("testAssertLessThan", testAssertLessThan),
3234
("testAssertLessThanOrEqual", testAssertLessThanOrEqual),
3335
("testAssertNil", testAssertNil),
@@ -121,6 +123,27 @@ class FailureMessagesTestCase: XCTestCase {
121123
XCTAssertGreaterThanOrEqual(-1, 0, "message", file: "test.swift")
122124
}
123125

126+
// CHECK: Test Case 'FailureMessagesTestCase.testAssertIdentical' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
127+
// CHECK: test.swift:[[@LINE+7]]: error: FailureMessagesTestCase.testAssertIdentical : XCTAssertIdentical failed: \("a"\) is not identical to \("b"\) - message
128+
// CHECK: Test Case 'FailureMessagesTestCase.testAssertIdentical' failed \(\d+\.\d+ seconds\)
129+
func testAssertIdentical() {
130+
let object = XCTestExpectation()
131+
XCTAssertIdentical(object, object)
132+
XCTAssertIdentical(nil, nil)
133+
XCTAssertIdentical(true as AnyObject, true as AnyObject)
134+
XCTAssertIdentical("a" as AnyObject, "b" as AnyObject, "message", file: "test.swift")
135+
}
136+
137+
// CHECK: Test Case 'FailureMessagesTestCase.testAssertNotIdentical' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
138+
// CHECK: test.swift:[[@LINE+6]]: error: FailureMessagesTestCase.testAssertNotIdentical : XCTAssertNotIdentical failed: \("nil"\) is identical to \("nil"\) - message
139+
// CHECK: Test Case 'FailureMessagesTestCase.testAssertNotIdentical' failed \(\d+\.\d+ seconds\)
140+
func testAssertNotIdentical() {
141+
XCTAssertNotIdentical("a" as AnyObject, "b" as AnyObject)
142+
XCTAssertNotIdentical(true as AnyObject, false as AnyObject)
143+
XCTAssertNotIdentical(XCTestExpectation(), XCTestExpectation())
144+
XCTAssertNotIdentical(nil, nil, "message", file: "test.swift")
145+
}
146+
124147
// CHECK: Test Case 'FailureMessagesTestCase.testAssertLessThan' started at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
125148
// CHECK: test.swift:[[@LINE+3]]: error: FailureMessagesTestCase.testAssertLessThan : XCTAssertLessThan failed: \("0"\) is not less than \("0"\) - message
126149
// CHECK: Test Case 'FailureMessagesTestCase.testAssertLessThan' failed \(\d+\.\d+ seconds\)
@@ -213,11 +236,11 @@ class FailureMessagesTestCase: XCTestCase {
213236
}
214237
}
215238
// CHECK: Test Suite 'FailureMessagesTestCase' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
216-
// CHECK: \t Executed 24 tests, with 24 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
239+
// CHECK: \t Executed 26 tests, with 26 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
217240

218241
XCTMain([testCase(FailureMessagesTestCase.allTests)])
219242

220243
// CHECK: Test Suite '.*\.xctest' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
221-
// CHECK: \t Executed 24 tests, with 24 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
244+
// CHECK: \t Executed 26 tests, with 26 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
222245
// CHECK: Test Suite 'All tests' failed at \d+-\d+-\d+ \d+:\d+:\d+\.\d+
223-
// CHECK: \t Executed 24 tests, with 24 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds
246+
// CHECK: \t Executed 26 tests, with 26 failures \(0 unexpected\) in \d+\.\d+ \(\d+\.\d+\) seconds

0 commit comments

Comments
 (0)