| //===--- NSNumberBridging.swift - Test bridging through NSNumber ----------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| // RUN: %target-run-simple-swift |
| // REQUIRES: executable_test |
| // REQUIRES: objc_interop |
| |
| |
| import StdlibUnittest |
| import Foundation |
| import CoreGraphics |
| |
| extension Float { |
| init?(reasonably value: Float) { |
| self = value |
| } |
| |
| init?(reasonably value: Double) { |
| guard !value.isNaN else { |
| self = Float.nan |
| return |
| } |
| |
| guard !value.isInfinite else { |
| if value.sign == .minus { |
| self = -Float.infinity |
| } else { |
| self = Float.infinity |
| } |
| return |
| } |
| |
| guard abs(value) <= Double(Float.greatestFiniteMagnitude) else { |
| return nil |
| } |
| |
| self = Float(value) |
| } |
| } |
| |
| extension Double { |
| init?(reasonably value: Float) { |
| guard !value.isNaN else { |
| self = Double.nan |
| return |
| } |
| |
| guard !value.isInfinite else { |
| if value.sign == .minus { |
| self = -Double.infinity |
| } else { |
| self = Double.infinity |
| } |
| return |
| } |
| |
| self = Double(value) |
| } |
| |
| init?(reasonably value: Double) { |
| self = value |
| } |
| } |
| |
| var nsNumberBridging = TestSuite("NSNumberBridgingValidation") |
| |
| func testFloat(_ lhs: Float?, _ rhs: Float?, file: String = #file, line: UInt = #line) { |
| let message = "\(String(describing: lhs)) != \(String(describing: rhs)) Float" |
| if let lhsValue = lhs { |
| if let rhsValue = rhs { |
| if lhsValue.isNaN != rhsValue.isNaN { |
| expectUnreachable(message, file: file, line: line) |
| } else if lhsValue != rhsValue && !lhsValue.isNaN { |
| expectUnreachable(message, file: file, line: line) |
| } |
| } else { |
| expectUnreachable(message, file: file, line: line) |
| } |
| } else { |
| if rhs != nil { |
| expectUnreachable(message, file: file, line: line) |
| } |
| } |
| } |
| |
| func testDouble(_ lhs: Double?, _ rhs: Double?, file: String = #file, line: UInt = #line) { |
| let message = "\(String(describing: lhs)) != \(String(describing: rhs)) Double" |
| if let lhsValue = lhs { |
| if let rhsValue = rhs { |
| if lhsValue.isNaN != rhsValue.isNaN { |
| expectUnreachable(message, file: file, line: line) |
| } else if lhsValue != rhsValue && !lhsValue.isNaN { |
| expectUnreachable(message, file: file, line: line) |
| } |
| } else { |
| expectUnreachable(message, file: file, line: line) |
| } |
| } else { |
| if rhs != nil { |
| expectUnreachable(message, file: file, line: line) |
| } |
| } |
| } |
| |
| |
| extension Int8 { |
| static var _interestingValues: [Int8] { |
| return [ |
| Int8.min, |
| Int8.min + 1, |
| Int8.max, |
| Int8.max - 1, |
| 0, |
| -1, 1, |
| -42, 42, |
| ] |
| } |
| } |
| |
| extension UInt8 { |
| static var _interestingValues: [UInt8] { |
| return [ |
| UInt8.min, |
| UInt8.min + 1, |
| UInt8.max, |
| UInt8.max - 1, |
| 42, |
| ] |
| } |
| } |
| |
| extension Int16 { |
| static var _interestingValues: [Int16] { |
| return [ |
| Int16.min, |
| Int16.min + 1, |
| Int16.max, |
| Int16.max - 1, |
| 0, |
| -1, 1, |
| -42, 42, |
| ] |
| } |
| } |
| |
| extension UInt16 { |
| static var _interestingValues: [UInt16] { |
| return [ |
| UInt16.min, |
| UInt16.min + 1, |
| UInt16.max, |
| UInt16.max - 1, |
| 42, |
| ] |
| } |
| } |
| |
| extension Int32 { |
| static var _interestingValues: [Int32] { |
| return [ |
| Int32.min, |
| Int32.min + 1, |
| Int32.max, |
| Int32.max - 1, |
| 0, |
| -1, 1, |
| -42, 42, |
| ] |
| } |
| } |
| |
| extension UInt32 { |
| static var _interestingValues: [UInt32] { |
| return [ |
| UInt32.min, |
| UInt32.min + 1, |
| UInt32.max, |
| UInt32.max - 1, |
| 42, |
| ] |
| } |
| } |
| |
| extension Int64 { |
| static var _interestingValues: [Int64] { |
| return [ |
| Int64.min, |
| Int64.min + 1, |
| Int64.max, |
| Int64.max - 1, |
| 0, |
| -1, 1, |
| -42, 42, |
| ] |
| } |
| } |
| |
| extension UInt64 { |
| static var _interestingValues: [UInt64] { |
| return [ |
| UInt64.min, |
| UInt64.min + 1, |
| UInt64.max, |
| UInt64.max - 1, |
| 42, |
| ] |
| } |
| } |
| |
| extension Int { |
| static var _interestingValues: [Int] { |
| return [ |
| Int.min, |
| Int.min + 1, |
| Int.max, |
| Int.max - 1, |
| 0, |
| -1, 1, |
| -42, 42, |
| ] |
| } |
| } |
| |
| extension UInt { |
| static var _interestingValues: [UInt] { |
| return [ |
| UInt.min, |
| UInt.min + 1, |
| UInt.max, |
| UInt.max - 1, |
| 42, |
| ] |
| } |
| } |
| |
| extension Float { |
| static var _interestingValues: [Float] { |
| return [ |
| -Float.infinity, |
| -Float.greatestFiniteMagnitude, |
| -1.0, |
| -Float.ulpOfOne, |
| -Float.leastNormalMagnitude, |
| -0.0, |
| 0.0, |
| Float.leastNormalMagnitude, |
| Float.ulpOfOne, |
| 1.0, |
| Float.greatestFiniteMagnitude, |
| Float.infinity, |
| Float.nan, |
| ] |
| } |
| } |
| |
| extension Double { |
| static var _interestingValues: [Double] { |
| return [ |
| -Double.infinity, |
| -Double.greatestFiniteMagnitude, |
| -1.0, |
| -Double.ulpOfOne, |
| -Double.leastNormalMagnitude, |
| -0.0, |
| 0.0, |
| Double.leastNormalMagnitude, |
| Double.ulpOfOne, |
| 1.0, |
| Double.greatestFiniteMagnitude, |
| Double.infinity, |
| Double.nan, |
| ] |
| } |
| } |
| |
| extension CGFloat { |
| static var _interestingValues: [CGFloat] { |
| return [ |
| -CGFloat.infinity, |
| -CGFloat.greatestFiniteMagnitude, |
| -1.0, |
| -CGFloat.ulpOfOne, |
| -CGFloat.leastNormalMagnitude, |
| -0.0, |
| 0.0, |
| CGFloat.leastNormalMagnitude, |
| CGFloat.ulpOfOne, |
| 1.0, |
| CGFloat.greatestFiniteMagnitude, |
| CGFloat.infinity, |
| CGFloat.nan, |
| ] |
| } |
| } |
| |
| extension Bool { |
| static var _interestingValues: [Bool] { |
| return [false, true] |
| } |
| } |
| |
| func testNSNumberBridgeFromInt8() { |
| for interestingValue in Int8._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| let float = (number!) as? Float |
| expectEqual(Float(interestingValue), float) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromUInt8() { |
| for interestingValue in UInt8._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| let float = (number!) as? Float |
| expectEqual(Float(interestingValue), float) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromInt16() { |
| for interestingValue in Int16._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| let float = (number!) as? Float |
| expectEqual(Float(interestingValue), float) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromUInt16() { |
| for interestingValue in UInt8._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| let float = (number!) as? Float |
| expectEqual(Float(interestingValue), float) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromInt32() { |
| for interestingValue in Int32._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| |
| let float = (number!) as? Float |
| let expectedFloat = Float(exactly: int32!) |
| // these are disabled because of https://bugs.swift.org/browse/SR-4634 |
| if (int32! != Int32.min && int32! != Int32.max && |
| int32! != Int32.min + 1 && int32! != Int32.max - 1) { |
| testFloat(expectedFloat, float) |
| } |
| |
| |
| let double = (number!) as? Double |
| let expectedDouble = Double(int32!) |
| testDouble(expectedDouble, double) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromUInt32() { |
| for interestingValue in UInt32._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| |
| let float = (number!) as? Float |
| let expectedFloat = Float(uint32!) |
| // these are disabled because of https://bugs.swift.org/browse/SR-4634 |
| if (uint32! != UInt32.max && uint32! != UInt32.max - 1) { |
| testFloat(expectedFloat, float) |
| } |
| |
| let double = (number!) as? Double |
| let expectedDouble = Double(uint32!) |
| testDouble(expectedDouble, double) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromInt64() { |
| for interestingValue in Int64._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromUInt64() { |
| for interestingValue in UInt64._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromInt() { |
| for interestingValue in Int._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromUInt() { |
| for interestingValue in UInt._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| |
| // these are disabled because of https://bugs.swift.org/browse/SR-4634 |
| if uint! != UInt(UInt32.max) && uint! != UInt(UInt32.max - 1) { |
| let float = (number!) as? Float |
| let expectedFloat = Float(uint!) |
| testFloat(expectedFloat, float) |
| } |
| |
| |
| let double = (number!) as? Double |
| let expectedDouble = Double(uint!) |
| testDouble(expectedDouble, double) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromFloat() { |
| for interestingValue in Float._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| |
| let float = (number!) as? Float |
| let expectedFloat = Float(reasonably: interestingValue) |
| testFloat(expectedFloat, float) |
| |
| let double = (number!) as? Double |
| let expectedDouble = Double(interestingValue) |
| testDouble(expectedDouble, double) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromDouble() { |
| for interestingValue in Double._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue), uint) |
| |
| let float = (number!) as? Float |
| let expectedFloat = Float(reasonably: interestingValue) |
| testFloat(expectedFloat, float) |
| |
| let double = (number!) as? Double |
| let expectedDouble = interestingValue |
| testDouble(expectedDouble, double) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue) |
| testNumber(created) |
| } |
| } |
| |
| func testNSNumberBridgeFromCGFloat() { |
| for interestingValue in CGFloat._interestingValues { |
| func testNumber(_ number: NSNumber?) { |
| expectNotNil(number) |
| let int8 = (number!) as? Int8 |
| expectEqual(Int8(exactly: interestingValue.native), int8) |
| let uint8 = (number!) as? UInt8 |
| expectEqual(UInt8(exactly: interestingValue.native), uint8) |
| let int16 = (number!) as? Int16 |
| expectEqual(Int16(exactly: interestingValue.native), int16) |
| let uint16 = (number!) as? UInt16 |
| expectEqual(UInt16(exactly: interestingValue.native), uint16) |
| let int32 = (number!) as? Int32 |
| expectEqual(Int32(exactly: interestingValue.native), int32) |
| let uint32 = (number!) as? UInt32 |
| expectEqual(UInt32(exactly: interestingValue.native), uint32) |
| let int64 = (number!) as? Int64 |
| expectEqual(Int64(exactly: interestingValue.native), int64) |
| let uint64 = (number!) as? UInt64 |
| expectEqual(UInt64(exactly: interestingValue.native), uint64) |
| let int = (number!) as? Int |
| expectEqual(Int(exactly: interestingValue.native), int) |
| let uint = (number!) as? UInt |
| expectEqual(UInt(exactly: interestingValue.native), uint) |
| |
| let float = (number!) as? Float |
| let expectedFloat = Float(reasonably: interestingValue.native) |
| testFloat(expectedFloat, float) |
| |
| let double = (number!) as? Double |
| let expectedDouble = Double(interestingValue) |
| testDouble(expectedDouble, double) |
| } |
| let bridged = interestingValue as NSNumber |
| testNumber(bridged) |
| let created = NSNumber(value: interestingValue.native) |
| testNumber(created) |
| } |
| } |
| |
| func test_numericBitPatterns_to_floatingPointTypes() { |
| let signed_numbers: [NSNumber] = [ |
| NSNumber(value: Int64(6)), |
| NSNumber(value: Int64(bitPattern: 1 << 56)), |
| NSNumber(value: Int64(bitPattern: 1 << 53)), |
| NSNumber(value: Int64(bitPattern: 1 << 52)), |
| NSNumber(value: Int64(bitPattern: 1 << 25)), |
| NSNumber(value: Int64(bitPattern: 1 << 24)), |
| NSNumber(value: Int64(bitPattern: 1 << 23)), |
| NSNumber(value: -Int64(bitPattern: 1 << 53)), |
| NSNumber(value: -Int64(bitPattern: 1 << 52)), |
| NSNumber(value: -Int64(6)), |
| NSNumber(value: -Int64(bitPattern: 1 << 56)), |
| NSNumber(value: -Int64(bitPattern: 1 << 25)), |
| NSNumber(value: -Int64(bitPattern: 1 << 24)), |
| NSNumber(value: -Int64(bitPattern: 1 << 23)), |
| ] |
| |
| let signed_values: [Int64] = [ |
| Int64(6), |
| Int64(bitPattern: 1 << 56), |
| Int64(bitPattern: 1 << 53), |
| Int64(bitPattern: 1 << 52), |
| Int64(bitPattern: 1 << 25), |
| Int64(bitPattern: 1 << 24), |
| Int64(bitPattern: 1 << 23), |
| -Int64(bitPattern: 1 << 53), |
| -Int64(bitPattern: 1 << 52), |
| -Int64(6), |
| -Int64(bitPattern: 1 << 56), |
| -Int64(bitPattern: 1 << 25), |
| -Int64(bitPattern: 1 << 24), |
| -Int64(bitPattern: 1 << 23), |
| ] |
| |
| let unsigned_numbers: [NSNumber] = [ |
| NSNumber(value: UInt64(bitPattern: 6)), |
| NSNumber(value: UInt64(bitPattern: 1 << 56)), |
| NSNumber(value: UInt64(bitPattern: 1 << 63)), |
| NSNumber(value: UInt64(bitPattern: 1 << 53)), |
| NSNumber(value: UInt64(bitPattern: 1 << 52)), |
| NSNumber(value: UInt64(bitPattern: 1 << 25)), |
| NSNumber(value: UInt64(bitPattern: 1 << 24)), |
| NSNumber(value: UInt64(bitPattern: 1 << 23)), |
| ] |
| |
| let unsigned_values: [UInt64] = [ |
| UInt64(bitPattern: 6), |
| UInt64(bitPattern: 1 << 56), |
| UInt64(bitPattern: 1 << 63), |
| UInt64(bitPattern: 1 << 53), |
| UInt64(bitPattern: 1 << 52), |
| UInt64(bitPattern: 1 << 25), |
| UInt64(bitPattern: 1 << 24), |
| UInt64(bitPattern: 1 << 23) |
| ] |
| |
| for (number, value) in zip(signed_numbers, signed_values) { |
| let numberCast = Double(exactly: number) |
| let valueCast = Double(exactly: value) |
| expectEqual(numberCast, valueCast) |
| } |
| |
| for (number, value) in zip(unsigned_numbers, unsigned_values) { |
| let numberCast = Double(exactly: number) |
| let valueCast = Double(exactly: value) |
| expectEqual(numberCast, valueCast) |
| } |
| |
| for (number, value) in zip(signed_numbers, signed_values) { |
| let numberCast = Float(exactly: number) |
| let valueCast = Float(exactly: value) |
| expectEqual(numberCast, valueCast) |
| } |
| |
| for (number, value) in zip(unsigned_numbers, unsigned_values) { |
| let numberCast = Float(exactly: number) |
| let valueCast = Float(exactly: value) |
| expectEqual(numberCast, valueCast) |
| } |
| } |
| |
| nsNumberBridging.test("Bridge Int8") { testNSNumberBridgeFromInt8() } |
| nsNumberBridging.test("Bridge UInt8") { testNSNumberBridgeFromUInt8() } |
| nsNumberBridging.test("Bridge Int16") { testNSNumberBridgeFromInt16() } |
| nsNumberBridging.test("Bridge UInt16") { testNSNumberBridgeFromUInt16() } |
| nsNumberBridging.test("Bridge Int32") { testNSNumberBridgeFromInt32() } |
| nsNumberBridging.test("Bridge UInt32") { testNSNumberBridgeFromUInt32() } |
| nsNumberBridging.test("Bridge Int64") { testNSNumberBridgeFromInt64() } |
| nsNumberBridging.test("Bridge UInt64") { testNSNumberBridgeFromUInt64() } |
| nsNumberBridging.test("Bridge Int") { testNSNumberBridgeFromInt() } |
| nsNumberBridging.test("Bridge UInt") { testNSNumberBridgeFromUInt() } |
| nsNumberBridging.test("Bridge Float") { testNSNumberBridgeFromFloat() } |
| nsNumberBridging.test("Bridge Double") { testNSNumberBridgeFromDouble() } |
| nsNumberBridging.test("Bridge CGFloat") { testNSNumberBridgeFromCGFloat() } |
| nsNumberBridging.test("bitPattern to exactly") { test_numericBitPatterns_to_floatingPointTypes() } |
| runAllTests() |