From 84f0f775e8096aeafddd1adf1393e2ebd037862d Mon Sep 17 00:00:00 2001 From: Benoit Deldicque Date: Sun, 10 Apr 2022 23:05:48 +0200 Subject: [PATCH 1/2] Fix wrong conversion from ObjC type --- Sources/AnyCodable/AnyEncodable.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/AnyCodable/AnyEncodable.swift b/Sources/AnyCodable/AnyEncodable.swift index 0695b5f..d5530e5 100644 --- a/Sources/AnyCodable/AnyEncodable.swift +++ b/Sources/AnyCodable/AnyEncodable.swift @@ -53,8 +53,6 @@ extension _AnyEncodable { switch value { #if canImport(Foundation) - case let number as NSNumber: - try encode(nsnumber: number, into: &container) case is NSNull: try container.encodeNil() #endif @@ -89,6 +87,8 @@ extension _AnyEncodable { case let string as String: try container.encode(string) #if canImport(Foundation) + case let number as NSNumber: + try encode(nsnumber: number, into: &container) case let date as Date: try container.encode(date) case let url as URL: @@ -109,21 +109,21 @@ extension _AnyEncodable { #if canImport(Foundation) private func encode(nsnumber: NSNumber, into container: inout SingleValueEncodingContainer) throws { switch Character(Unicode.Scalar(UInt8(nsnumber.objCType.pointee))) { - case "c", "C": + case "B": try container.encode(nsnumber.boolValue) - case "s": + case "c": try container.encode(nsnumber.int8Value) - case "i": + case "s": try container.encode(nsnumber.int16Value) - case "l": + case "i", "l": try container.encode(nsnumber.int32Value) case "q": try container.encode(nsnumber.int64Value) - case "S": + case "C": try container.encode(nsnumber.uint8Value) - case "I": + case "S": try container.encode(nsnumber.uint16Value) - case "L": + case "I", "L": try container.encode(nsnumber.uint32Value) case "Q": try container.encode(nsnumber.uint64Value) From 0acba39c7ce59f591ae0ff66a46155d983a9e749 Mon Sep 17 00:00:00 2001 From: Benoit Deldicque Date: Sun, 10 Apr 2022 23:06:11 +0200 Subject: [PATCH 2/2] Update unit tests --- Tests/AnyCodableTests/AnyEncodableTests.swift | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Tests/AnyCodableTests/AnyEncodableTests.swift b/Tests/AnyCodableTests/AnyEncodableTests.swift index 86561b7..bd81b70 100644 --- a/Tests/AnyCodableTests/AnyEncodableTests.swift +++ b/Tests/AnyCodableTests/AnyEncodableTests.swift @@ -70,7 +70,16 @@ class AnyEncodableTests: XCTestCase { func testEncodeNSNumber() throws { let dictionary: [String: NSNumber] = [ "boolean": true, - "integer": 42, + "char": -127, + "int": -32767, + "short": -32767, + "long": -2147483647, + "longlong": -9223372036854775807, + "uchar": 255, + "uint": 65535, + "ushort": 65535, + "ulong": 4294967295, + "ulonglong": 18446744073709615, "double": 3.141592653589793, ] @@ -82,7 +91,16 @@ class AnyEncodableTests: XCTestCase { let expected = """ { "boolean": true, - "integer": 42, + "char": -127, + "int": -32767, + "short": -32767, + "long": -2147483647, + "longlong": -9223372036854775807, + "uchar": 255, + "uint": 65535, + "ushort": 65535, + "ulong": 4294967295, + "ulonglong": 18446744073709615, "double": 3.141592653589793, } """.data(using: .utf8)! @@ -90,7 +108,19 @@ class AnyEncodableTests: XCTestCase { XCTAssertEqual(encodedJSONObject, expectedJSONObject) XCTAssert(encodedJSONObject["boolean"] is Bool) - XCTAssert(encodedJSONObject["integer"] is Int) + + XCTAssert(encodedJSONObject["char"] is Int8) + XCTAssert(encodedJSONObject["int"] is Int16) + XCTAssert(encodedJSONObject["short"] is Int32) + XCTAssert(encodedJSONObject["long"] is Int32) + XCTAssert(encodedJSONObject["longlong"] is Int64) + + XCTAssert(encodedJSONObject["uchar"] is UInt8) + XCTAssert(encodedJSONObject["uint"] is UInt16) + XCTAssert(encodedJSONObject["ushort"] is UInt32) + XCTAssert(encodedJSONObject["ulong"] is UInt32) + XCTAssert(encodedJSONObject["ulonglong"] is UInt64) + XCTAssert(encodedJSONObject["double"] is Double) }