Created
April 5, 2021 05:40
-
-
Save bricker/529d519e1b0c92fb417b8923ed8947ee to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import XCTest | |
fileprivate extension JSONValue { | |
var objectValue: [String: JSONValue]? { | |
switch self { | |
case .object(let value): return value | |
default: return nil | |
} | |
} | |
var arrayValue: [JSONValue]? { | |
switch self { | |
case .array(let value): return value | |
default: return nil | |
} | |
} | |
} | |
private let testData = """ | |
{ | |
"data": { | |
"intValue": 100, | |
"intValueNegative": -100, | |
"intValueAsFloat": 120.0, | |
"doubleValue": 150.5, | |
"stringValue": "1.9", | |
"boolValue": true, | |
"arrayValue": ["array1", "array2"], | |
"dictValue": {"value1": true, "value2": "golf"} | |
} | |
} | |
""" | |
class JSONValueTests: XCTestCase { | |
var sut: Data! | |
override func setUp() { | |
super.setUp() | |
sut = testData.data(using: .utf8) | |
} | |
func testJSONValueDecoding() { | |
let value = try? JSONDecoder().decode(JSONValue.self, from: sut) | |
XCTAssertTrue(value != nil) | |
} | |
func testJSONValueTypes() { | |
let root = try! JSONDecoder().decode(JSONValue.self, from: sut) | |
let data = root.objectValue!["data"] | |
switch data { | |
case .object(let value): | |
XCTAssertEqual(value["intValue"]!.value as! Double, 100.0) | |
XCTAssertEqual(value["intValueNegative"]!.value as! Double, -100.0) | |
XCTAssertEqual(value["intValueAsFloat"]!.value as! Double, 120.0) | |
XCTAssertEqual(value["doubleValue"]!.value as! Double, 150.5) | |
XCTAssertEqual(value["stringValue"]!.value as! String, "1.9") | |
XCTAssertEqual(value["boolValue"]!.value as! Bool, true) | |
XCTAssertEqual(value["arrayValue"]!.arrayValue![0].value as! String, "array1") | |
XCTAssertEqual(value["dictValue"]!.objectValue!["value2"]!.value as! String, "golf") | |
default: | |
XCTFail("Expected to parse a `object` but got \(data!)") | |
} | |
} | |
func test_BooleanEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.boolean(true)) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), "true") | |
} | |
func test_StringEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.string("test")) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), #""test""#) | |
} | |
func test_IntEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.number(1)) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), "1") | |
} | |
func test_DoubleEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.number(1.2)) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), "1.2") | |
} | |
func test_IntAsDoubleEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.number(1.0)) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), "1") | |
} | |
func test_DoubleEncodingWithRoundingError() { | |
let encoded = try! JSONEncoder().encode(JSONValue.number(1.9)) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8)!.prefix(4), "1.89") | |
} | |
func test_ObjectEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.object(["test": .string("data")])) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), #"{"test":"data"}"#) | |
} | |
func test_ArrayEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.array([.string("test"), .string("test")])) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), #"["test","test"]"#) | |
} | |
func test_NullEncoding() { | |
let encoded = try! JSONEncoder().encode(JSONValue.null) | |
XCTAssertEqual(String(data: encoded, encoding: .utf8), "null") | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment