Files

105 lines
4.6 KiB
Swift

// CodableTests.swift
//
// Created by Lei Wang on 2018/1/9.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import XCTest
import SwiftyJSON
class CodableTests: XCTestCase {
func testEncodeNull() {
var json = JSON([NSNull()])
_ = try! JSONEncoder().encode(json)
json = JSON([nil])
_ = try! JSONEncoder().encode(json)
let dictionary: [String: Any?] = ["key": nil]
json = JSON(dictionary)
_ = try! JSONEncoder().encode(json)
}
func testArrayCodable() {
let jsonString = """
[1,"false", ["A", 4.3231],"3",true]
"""
var data = jsonString.data(using: .utf8)!
let json = try! JSONDecoder().decode(JSON.self, from: data)
XCTAssertEqual(json.arrayValue.first?.int, 1)
XCTAssertEqual(json[1].bool, nil)
XCTAssertEqual(json[1].string, "false")
XCTAssertEqual(json[3].string, "3")
XCTAssertEqual(json[2][1].double!, 4.3231)
XCTAssertEqual(json.arrayValue[0].bool, nil)
XCTAssertEqual(json.array!.last!.bool, true)
let jsonList = try! JSONDecoder().decode([JSON].self, from: data)
XCTAssertEqual(jsonList.first?.int, 1)
XCTAssertEqual(jsonList.last!.bool, true)
data = try! JSONEncoder().encode(json)
let list = try! JSONSerialization.jsonObject(with: data, options: []) as! [Any]
XCTAssertEqual(list[0] as! Int, 1)
XCTAssertEqual((list[2] as! [Any])[1] as! NSNumber, 4.3231)
}
func testDictionaryCodable() {
let dictionary: [String: Any] = ["number": 9823.212, "name": "NAME", "list": [1234, 4.21223256], "object": ["sub_number": 877.2323, "sub_name": "sub_name"], "bool": true]
var data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
let json = try! JSONDecoder().decode(JSON.self, from: data)
XCTAssertNotNil(json.dictionary)
XCTAssertEqual(json["number"].float, 9823.212)
XCTAssertEqual(json["list"].arrayObject is [NSNumber], true)
XCTAssertEqual(json["object"]["sub_number"].float, 877.2323)
XCTAssertEqual(json["bool"].bool, true)
let jsonDict = try! JSONDecoder().decode([String: JSON].self, from: data)
XCTAssertEqual(jsonDict["number"]?.int, 9823)
XCTAssertEqual(jsonDict["object"]?["sub_name"], "sub_name")
data = try! JSONEncoder().encode(json)
var encoderDict = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
XCTAssertEqual(encoderDict["list"] as! [NSNumber], [1234, 4.21223256])
XCTAssertEqual(encoderDict["bool"] as! Bool, true)
data = try! JSONEncoder().encode(jsonDict)
encoderDict = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
XCTAssertEqual(encoderDict["name"] as! String, dictionary["name"] as! String)
XCTAssertEqual((encoderDict["object"] as! [String: Any])["sub_number"] as! NSNumber, 877.2323)
}
func testCodableModel() {
let dictionary: [String: Any] = [
"number": 9823.212,
"name": "NAME",
"list": [1234, 4.21223256],
"object": ["sub_number": 877.2323, "sub_name": "sub_name"],
"bool": true]
let data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
let model = try! JSONDecoder().decode(CodableModel.self, from: data)
XCTAssertEqual(model.subName, "sub_name")
}
}
private struct CodableModel: Codable {
let name: String
let number: Double
let bool: Bool
let list: [Double]
private let object: JSON
var subName: String? {
return object["sub_name"].string
}
}