Skip to content

Commit cffdab3

Browse files
spevansianpartridge
authored andcommitted
SR-5803: NSNumber no longer equates 1 and true (#1201)
* SR-5803: NSNumber no longer equates 1 and true - Fix isEqual to work with NSNumbers initialised with different types (eg, float and UInt). - Match the behaviour of Darwin where true can only equal an NSNumber with a value of exactly 1.
1 parent 3609b9c commit cffdab3

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

Foundation/NSNumber.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ open class NSNumber : NSValue {
226226
case let other as Bool:
227227
return boolValue == other
228228
case let other as NSNumber:
229-
return CFEqual(_cfObject, other._cfObject)
229+
return compare(other) == .orderedSame
230230
default:
231231
return false
232232
}

TestFoundation/TestNSNumber.swift

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class TestNSNumber : XCTestCase {
4444
("test_descriptionWithLocale", test_descriptionWithLocale ),
4545
("test_objCType", test_objCType ),
4646
("test_stringValue", test_stringValue),
47+
("test_Equals", test_Equals),
4748
]
4849
}
4950

@@ -1087,4 +1088,50 @@ class TestNSNumber : XCTestCase {
10871088
XCTAssertEqual(NSNumber(value: Int64.max).stringValue, "9223372036854775807")
10881089
XCTAssertEqual(NSNumber(value: Int64.max - 1).stringValue, "9223372036854775806")
10891090
}
1091+
1092+
func test_Equals() {
1093+
// Booleans: false only equals 0, true only equals 1
1094+
XCTAssertTrue(NSNumber(value: true) == NSNumber(value: true))
1095+
XCTAssertTrue(NSNumber(value: true) == NSNumber(value: 1))
1096+
XCTAssertTrue(NSNumber(value: true) == NSNumber(value: Float(1)))
1097+
XCTAssertTrue(NSNumber(value: true) == NSNumber(value: Double(1)))
1098+
XCTAssertTrue(NSNumber(value: true) == NSNumber(value: Int8(1)))
1099+
XCTAssertTrue(NSNumber(value: true) != NSNumber(value: false))
1100+
XCTAssertTrue(NSNumber(value: true) != NSNumber(value: Int8(-1)))
1101+
XCTAssertTrue(NSNumber(value: true) != NSNumber(value: Float(1.01)))
1102+
XCTAssertTrue(NSNumber(value: true) != NSNumber(value: Double(1234.56)))
1103+
XCTAssertTrue(NSNumber(value: true) != NSNumber(value: 2))
1104+
XCTAssertTrue(NSNumber(value: true) != NSNumber(value: Int.max))
1105+
XCTAssertTrue(NSNumber(value: false) == NSNumber(value: false))
1106+
XCTAssertTrue(NSNumber(value: false) == NSNumber(value: 0))
1107+
XCTAssertTrue(NSNumber(value: false) == NSNumber(value: Float(0)))
1108+
XCTAssertTrue(NSNumber(value: false) == NSNumber(value: Double(0)))
1109+
XCTAssertTrue(NSNumber(value: false) == NSNumber(value: Int8(0)))
1110+
XCTAssertTrue(NSNumber(value: false) == NSNumber(value: UInt64(0)))
1111+
XCTAssertTrue(NSNumber(value: false) != NSNumber(value: 1))
1112+
XCTAssertTrue(NSNumber(value: false) != NSNumber(value: 2))
1113+
XCTAssertTrue(NSNumber(value: false) != NSNumber(value: Int.max))
1114+
1115+
XCTAssertTrue(NSNumber(value: Int8(-1)) == NSNumber(value: Int16(-1)))
1116+
XCTAssertTrue(NSNumber(value: Int16(-1)) == NSNumber(value: Int32(-1)))
1117+
XCTAssertTrue(NSNumber(value: Int32(-1)) == NSNumber(value: Int64(-1)))
1118+
XCTAssertTrue(NSNumber(value: Int8.max) != NSNumber(value: Int16.max))
1119+
XCTAssertTrue(NSNumber(value: Int16.max) != NSNumber(value: Int32.max))
1120+
XCTAssertTrue(NSNumber(value: Int32.max) != NSNumber(value: Int64.max))
1121+
XCTAssertTrue(NSNumber(value: UInt8.min) == NSNumber(value: UInt16.min))
1122+
XCTAssertTrue(NSNumber(value: UInt16.min) == NSNumber(value: UInt32.min))
1123+
XCTAssertTrue(NSNumber(value: UInt32.min) == NSNumber(value: UInt64.min))
1124+
XCTAssertTrue(NSNumber(value: UInt8.max) != NSNumber(value: UInt16.max))
1125+
XCTAssertTrue(NSNumber(value: UInt16.max) != NSNumber(value: UInt32.max))
1126+
XCTAssertTrue(NSNumber(value: UInt32.max) != NSNumber(value: UInt64.max))
1127+
XCTAssertTrue(NSNumber(value: Int8(0)) == NSNumber(value: UInt16(0)))
1128+
XCTAssertTrue(NSNumber(value: UInt16(0)) == NSNumber(value: Int32(0)))
1129+
XCTAssertTrue(NSNumber(value: Int32(0)) == NSNumber(value: UInt64(0)))
1130+
XCTAssertTrue(NSNumber(value: Int(0)) == NSNumber(value: UInt(0)))
1131+
XCTAssertTrue(NSNumber(value: Int8.min) == NSNumber(value: Float(-128)))
1132+
XCTAssertTrue(NSNumber(value: Int8.max) == NSNumber(value: Double(127)))
1133+
XCTAssertTrue(NSNumber(value: UInt16.min) == NSNumber(value: Float(0)))
1134+
XCTAssertTrue(NSNumber(value: UInt16.max) == NSNumber(value: Double(65535)))
1135+
XCTAssertTrue(NSNumber(value: 1.1) != NSNumber(value: Int64(1)))
1136+
}
10901137
}

0 commit comments

Comments
 (0)