Skip to content

Commit 0b206d1

Browse files
authored
Merge pull request #1092 from bubski/is-equal
2 parents 79b511a + f8b36bd commit 0b206d1

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

Foundation/NSCharacterSet.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,18 @@ open class NSCharacterSet : NSObject, NSCopying, NSMutableCopying, NSCoding {
5050
}
5151

5252
open override func isEqual(_ value: Any?) -> Bool {
53+
guard let runtimeClass = _CFRuntimeGetClassWithTypeID(CFCharacterSetGetTypeID()) else {
54+
fatalError("Could not obtain CFRuntimeClass of CFCharacterSet")
55+
}
56+
57+
guard let equalFunction = runtimeClass.pointee.equal else {
58+
fatalError("Could not obtain equal function from CFRuntimeClass of CFCharacterSet")
59+
}
60+
5361
switch value {
54-
case let other as CharacterSet:
55-
return CFEqual(_cfObject, other._cfObject)
56-
case let other as NSCharacterSet:
57-
return CFEqual(_cfObject, other._cfObject)
58-
default:
59-
return false
62+
case let other as CharacterSet: return equalFunction(self._cfObject, other._cfObject) == true
63+
case let other as NSCharacterSet: return equalFunction(self._cfObject, other._cfObject) == true
64+
default: return false
6065
}
6166
}
6267

TestFoundation/TestNSCharacterSet.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class TestNSCharacterSet : XCTestCase {
3636
("test_AnnexPlanes", test_AnnexPlanes),
3737
("test_Planes", test_Planes),
3838
("test_InlineBuffer", test_InlineBuffer),
39+
("test_Equatable", test_Equatable),
3940
// The following tests must remain disabled until SR-2509 is resolved.
4041
// ("test_Subtracting", test_Subtracting),
4142
// ("test_SubtractEmptySet", test_SubtractEmptySet),
@@ -282,5 +283,28 @@ class TestNSCharacterSet : XCTestCase {
282283
let expected = CharacterSet(charactersIn: "abc")
283284
XCTAssertEqual(expected, symmetricDifference)
284285
}
286+
287+
func test_Equatable() {
288+
XCTAssertEqual(NSCharacterSet(charactersIn: ""), NSCharacterSet(charactersIn: ""))
289+
XCTAssertEqual(NSCharacterSet(charactersIn: "a"), NSCharacterSet(charactersIn: "a"))
290+
XCTAssertEqual(NSCharacterSet(charactersIn: "ab"), NSCharacterSet(charactersIn: "ab"))
291+
292+
XCTAssertNotEqual(NSCharacterSet(charactersIn: "abc"), NSCharacterSet(charactersIn: "123"))
293+
XCTAssertNotEqual(NSCharacterSet(charactersIn: "123"), NSCharacterSet(charactersIn: "abc"))
294+
295+
XCTAssertNotEqual(NSCharacterSet(charactersIn: ""), nil)
296+
297+
/*
298+
Tests disabled due to CoreFoundation bug?
299+
These NSCharacterSet pairs are (wrongly?) evaluated to be equal. Same behaviour can be observed on macOS 10.12.
300+
Interestingly, on iOS 11 Simulator, they are evaluted to be _not_ equal,
301+
while on iOS 10.3.1 Simulator, they are evaluted to be equal.
302+
*/
303+
// XCTAssertNotEqual(NSCharacterSet(charactersIn: "ab"), NSCharacterSet(charactersIn: "abc"))
304+
// XCTAssertNotEqual(NSCharacterSet(charactersIn: "abc"), NSCharacterSet(charactersIn: "ab"))
305+
// XCTAssertNotEqual(NSCharacterSet(charactersIn: "abc"), NSCharacterSet(charactersIn: ""))
306+
// XCTAssertNotEqual(NSCharacterSet(charactersIn: ""), NSCharacterSet(charactersIn: "abc"))
307+
}
308+
285309
}
286310

0 commit comments

Comments
 (0)