This adds a new ParamParser private error constructor to be used on a failed cast. It will populate the description of the thrown error with information about the destination type of the failed cast.
143 lines
5.0 KiB
Swift
143 lines
5.0 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import XCTest
|
|
|
|
class ParamParserTest: SignalBaseTest {
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
}
|
|
|
|
override func tearDown() {
|
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
super.tearDown()
|
|
}
|
|
|
|
let dict: [String: Any] = ["some_int": 11, "some_string": "asdf", "large_int": Int64.max, "negative_int": -10]
|
|
var parser: ParamParser {
|
|
return ParamParser(dictionary: dict)
|
|
}
|
|
|
|
func testExample() {
|
|
XCTAssertEqual(11, try parser.required(key: "some_int"))
|
|
XCTAssertEqual(11, try parser.optional(key: "some_int"))
|
|
|
|
let expectedString: String = "asdf"
|
|
XCTAssertEqual(expectedString, try parser.required(key: "some_string"))
|
|
XCTAssertEqual(expectedString, try parser.optional(key: "some_string"))
|
|
|
|
XCTAssertEqual(nil, try parser.optional(key: "does_not_exist") as String?)
|
|
XCTAssertThrowsError(try parser.required(key: "does_not_exist") as String)
|
|
}
|
|
|
|
func testCastingFailures() {
|
|
// Required
|
|
do {
|
|
let _: Int = try parser.required(key: "some_string")
|
|
XCTFail("Expected last statement to throw")
|
|
} catch ParamParser.ParseError.invalidFormat(let key, let description) {
|
|
XCTAssertEqual(key, "some_string")
|
|
XCTAssertNotNil(description, "Expected description string explaining failed cast")
|
|
} catch {
|
|
XCTFail("Unexpected error: \(error)")
|
|
}
|
|
|
|
// Optional
|
|
do {
|
|
let _: Int? = try parser.optional(key: "some_string")
|
|
XCTFail("Expected last statement to throw")
|
|
} catch ParamParser.ParseError.invalidFormat(let key, let description) {
|
|
XCTAssertEqual(key, "some_string")
|
|
XCTAssertNotNil(description, "Expected description string explaining failed cast")
|
|
} catch {
|
|
XCTFail("Unexpected error: \(error)")
|
|
}
|
|
}
|
|
|
|
func testNumeric() {
|
|
let expectedInt32: Int32 = 11
|
|
XCTAssertEqual(expectedInt32, try parser.required(key: "some_int"))
|
|
XCTAssertEqual(expectedInt32, try parser.optional(key: "some_int"))
|
|
|
|
let expectedInt64: Int64 = 11
|
|
XCTAssertEqual(expectedInt64, try parser.required(key: "some_int"))
|
|
XCTAssertEqual(expectedInt64, try parser.optional(key: "some_int"))
|
|
}
|
|
|
|
func testNumericSizeFailures() {
|
|
XCTAssertThrowsError(try {
|
|
let _: Int32 = try parser.required(key: "large_int")
|
|
}())
|
|
|
|
XCTAssertThrowsError(try {
|
|
let _: Int32? = try parser.optional(key: "large_int")
|
|
}())
|
|
|
|
XCTAssertNoThrow(try {
|
|
let _: Int64 = try parser.required(key: "large_int")
|
|
}())
|
|
}
|
|
|
|
func testNumericSignFailures() {
|
|
XCTAssertNoThrow(try {
|
|
let _: Int = try parser.required(key: "negative_int")
|
|
}())
|
|
|
|
XCTAssertNoThrow(try {
|
|
let _: Int64 = try parser.required(key: "negative_int")
|
|
}())
|
|
|
|
XCTAssertThrowsError(try {
|
|
let _: UInt64 = try parser.required(key: "negative_int")
|
|
}())
|
|
}
|
|
|
|
// MARK: Base64EncodedData
|
|
|
|
func testBase64Data_Valid() {
|
|
let originalString = "asdf"
|
|
let utf8Data: Data = originalString.data(using: .utf8)!
|
|
let base64EncodedString = utf8Data.base64EncodedString()
|
|
|
|
let dict: [String: Any] = ["some_data": base64EncodedString]
|
|
let parser = ParamParser(dictionary: dict)
|
|
|
|
XCTAssertEqual(utf8Data, try parser.requiredBase64EncodedData(key: "some_data"))
|
|
XCTAssertEqual(utf8Data, try parser.optionalBase64EncodedData(key: "some_data"))
|
|
|
|
let data: Data = try! parser.requiredBase64EncodedData(key: "some_data")
|
|
let roundTripString = String(data: data, encoding: .utf8)
|
|
XCTAssertEqual(originalString, roundTripString)
|
|
}
|
|
|
|
func testBase64Data_EmptyString() {
|
|
let dict: [String: Any] = ["some_data": ""]
|
|
let parser = ParamParser(dictionary: dict)
|
|
|
|
XCTAssertThrowsError(try parser.requiredBase64EncodedData(key: "some_data"))
|
|
XCTAssertEqual(nil, try parser.optionalBase64EncodedData(key: "some_data"))
|
|
}
|
|
|
|
func testBase64Data_NSNull() {
|
|
let dict: [String: Any] = ["some_data": NSNull()]
|
|
let parser = ParamParser(dictionary: dict)
|
|
|
|
XCTAssertThrowsError(try parser.requiredBase64EncodedData(key: "some_data"))
|
|
XCTAssertEqual(nil, try parser.optionalBase64EncodedData(key: "some_data"))
|
|
}
|
|
|
|
func testBase64Data_Invalid() {
|
|
// invalid base64 data
|
|
let base64EncodedString = "YXNkZg"
|
|
|
|
let dict: [String: Any] = ["some_data": base64EncodedString]
|
|
let parser = ParamParser(dictionary: dict)
|
|
|
|
XCTAssertThrowsError(try parser.requiredBase64EncodedData(key: "some_data"))
|
|
XCTAssertThrowsError(try parser.optionalBase64EncodedData(key: "some_data"))
|
|
}
|
|
}
|