Skip to content

Commit dd355fc

Browse files
authored
Merge pull request #2019 from spevans/pr_darwin_compat_nsnumber
NSNumber: Make comparing NaN with number match Darwin
2 parents 9a2ef52 + d995790 commit dd355fc

File tree

2 files changed

+75
-16
lines changed

2 files changed

+75
-16
lines changed

Foundation/NSNumber.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,8 @@ open class NSNumber : NSValue {
945945
// Apply special handling for NaN as <, >, == always return false
946946
// when comparing with NaN
947947
if lhs.isNaN && rhs.isNaN { return .orderedSame }
948-
if lhs.isNaN { return .orderedAscending }
949-
if rhs.isNaN { return .orderedDescending }
948+
if lhs.isNaN { return rhs < 0 ? .orderedDescending : .orderedAscending }
949+
if rhs.isNaN { return lhs < 0 ? .orderedAscending : .orderedDescending }
950950

951951
if lhs < rhs { return .orderedAscending }
952952
if lhs > rhs { return .orderedDescending }

TestFoundation/TestNSNumber.swift

Lines changed: 73 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,19 @@ class TestNSNumber : XCTestCase {
853853
XCTAssertEqual(NSNumber(value: Float(1)).doubleValue, Double(1))
854854
XCTAssertEqual(NSNumber(value: Float(-37.5)).doubleValue, Double(-37.5))
855855
XCTAssertEqual(NSNumber(value: Float(42.5)).doubleValue, Double(42.5))
856+
857+
let nanFloat = NSNumber(value: Float.nan)
858+
XCTAssertTrue(nanFloat.doubleValue.isNaN)
859+
XCTAssertEqual(nanFloat.intValue, Int(bitPattern: 1 << 63))
860+
XCTAssertEqual(nanFloat.uintValue, UInt(bitPattern: 1 << 63))
861+
XCTAssertEqual(nanFloat.int8Value, 0)
862+
XCTAssertEqual(nanFloat.uint8Value, 0)
863+
XCTAssertEqual(nanFloat.int16Value, 0)
864+
XCTAssertEqual(nanFloat.uint16Value, 0)
865+
XCTAssertEqual(nanFloat.int32Value, 0)
866+
XCTAssertEqual(nanFloat.uint32Value, 0)
867+
XCTAssertEqual(nanFloat.int64Value, Int64(bitPattern: 1 << 63))
868+
XCTAssertEqual(nanFloat.uint64Value, UInt64(bitPattern: 1 << 63))
856869
}
857870

858871
func test_numberWithDouble() {
@@ -885,6 +898,20 @@ class TestNSNumber : XCTestCase {
885898
XCTAssertEqual(NSNumber(value: Double(0)).doubleValue, Double(0))
886899
XCTAssertEqual(NSNumber(value: Double(-37.5)).doubleValue, Double(-37.5))
887900
XCTAssertEqual(NSNumber(value: Double(42.1)).doubleValue, Double(42.1))
901+
902+
let nanDouble = NSNumber(value: Double.nan)
903+
XCTAssertTrue(nanDouble.floatValue.isNaN)
904+
XCTAssertEqual(nanDouble.intValue, Int(bitPattern: 1 << 63))
905+
XCTAssertEqual(nanDouble.uintValue, UInt(bitPattern: 1 << 63))
906+
XCTAssertEqual(nanDouble.int8Value, 0)
907+
XCTAssertEqual(nanDouble.uint8Value, 0)
908+
XCTAssertEqual(nanDouble.int16Value, 0)
909+
XCTAssertEqual(nanDouble.uint16Value, 0)
910+
XCTAssertEqual(nanDouble.int32Value, 0)
911+
XCTAssertEqual(nanDouble.uint32Value, 0)
912+
XCTAssertEqual(nanDouble.int64Value, Int64(bitPattern: 1 << 63))
913+
XCTAssertEqual(nanDouble.uint64Value, UInt64(bitPattern: 1 << 63))
914+
888915
}
889916

890917
func test_compareNumberWithBool() {
@@ -1351,23 +1378,55 @@ class TestNSNumber : XCTestCase {
13511378
let num = NSNumber(value: Int8.min)
13521379
XCTAssertFalse(num == NSNumber(value: num.uint64Value))
13531380

1354-
let num1 = NSNumber(value: Float.nan)
1355-
XCTAssertEqual(num1.compare(num1), .orderedSame)
1381+
let zero = NSNumber(value: 0)
1382+
let one = NSNumber(value: 1)
1383+
let minusOne = NSNumber(value: -1)
1384+
let intMin = NSNumber(value: Int.min)
1385+
let intMax = NSNumber(value: Int.max)
1386+
1387+
let nanFloat = NSNumber(value: Float.nan)
1388+
XCTAssertEqual(nanFloat.compare(nanFloat), .orderedSame)
1389+
1390+
XCTAssertFalse(nanFloat == zero)
1391+
XCTAssertFalse(zero == nanFloat)
1392+
XCTAssertEqual(nanFloat.compare(zero), .orderedAscending)
1393+
XCTAssertEqual(zero.compare(nanFloat), .orderedDescending)
1394+
1395+
XCTAssertEqual(nanFloat.compare(one), .orderedAscending)
1396+
XCTAssertEqual(one.compare(nanFloat), .orderedDescending)
1397+
1398+
XCTAssertEqual(nanFloat.compare(intMax), .orderedAscending)
1399+
XCTAssertEqual(intMax.compare(nanFloat), .orderedDescending)
1400+
1401+
XCTAssertEqual(nanFloat.compare(minusOne), .orderedDescending)
1402+
XCTAssertEqual(minusOne.compare(nanFloat), .orderedAscending)
1403+
1404+
XCTAssertEqual(nanFloat.compare(intMin), .orderedDescending)
1405+
XCTAssertEqual(intMin.compare(nanFloat), .orderedAscending)
1406+
1407+
1408+
let nanDouble = NSNumber(value: Double.nan)
1409+
XCTAssertEqual(nanDouble.compare(nanDouble), .orderedSame)
1410+
1411+
XCTAssertFalse(nanDouble == zero)
1412+
XCTAssertFalse(zero == nanDouble)
1413+
XCTAssertEqual(nanDouble.compare(zero), .orderedAscending)
1414+
XCTAssertEqual(zero.compare(nanDouble), .orderedDescending)
1415+
1416+
XCTAssertEqual(nanDouble.compare(one), .orderedAscending)
1417+
XCTAssertEqual(one.compare(nanDouble), .orderedDescending)
1418+
1419+
XCTAssertEqual(nanDouble.compare(intMax), .orderedAscending)
1420+
XCTAssertEqual(intMax.compare(nanDouble), .orderedDescending)
13561421

1357-
let num2 = NSNumber(value: num1.uint8Value) // 0
1358-
XCTAssertFalse(num1 == num2)
1359-
XCTAssertFalse(num2 == num1)
1360-
XCTAssertEqual(num1.compare(num2), .orderedAscending)
1361-
XCTAssertEqual(num2.compare(num1), .orderedDescending)
1422+
XCTAssertEqual(nanDouble.compare(minusOne), .orderedDescending)
1423+
XCTAssertEqual(minusOne.compare(nanDouble), .orderedAscending)
13621424

1363-
let num3 = NSNumber(value: Double.nan)
1364-
XCTAssertEqual(num3.compare(num3), .orderedSame)
1425+
XCTAssertEqual(nanDouble.compare(intMin), .orderedDescending)
1426+
XCTAssertEqual(intMin.compare(nanDouble), .orderedAscending)
13651427

1366-
let num4 = NSNumber(value: num3.intValue) // 0
1367-
XCTAssertFalse(num3 == num2)
1368-
XCTAssertFalse(num4 == num3)
1369-
XCTAssertEqual(num3.compare(num4), .orderedAscending)
1370-
XCTAssertEqual(num4.compare(num3), .orderedDescending)
1428+
XCTAssertEqual(nanDouble, nanFloat)
1429+
XCTAssertEqual(nanFloat, nanDouble)
13711430

13721431
XCTAssertEqual(NSNumber(value: Double.leastNonzeroMagnitude).compare(NSNumber(value: 0)), .orderedDescending)
13731432
XCTAssertEqual(NSNumber(value: Double.greatestFiniteMagnitude).compare(NSNumber(value: 0)), .orderedDescending)

0 commit comments

Comments
 (0)