Skip to content

Instantly share code, notes, and snippets.

@bricker
Created April 5, 2021 05:40
Show Gist options
  • Save bricker/529d519e1b0c92fb417b8923ed8947ee to your computer and use it in GitHub Desktop.
Save bricker/529d519e1b0c92fb417b8923ed8947ee to your computer and use it in GitHub Desktop.
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