blob: 9f259d0ac4f7bff67b83ab13b2d1adffb5480511 [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import XCTest
import SyncbaseCore
class MarshalTests: XCTestCase {
func adheresToProtocol(value: SyncbaseConvertible) {
}
func testCompatibility() {
// This is a compile-time test that makes sure that all primitive types conform to
// SyncbaseConvertible.
adheresToProtocol(true)
adheresToProtocol(Int(0))
adheresToProtocol(Int8(0))
adheresToProtocol(Int16(0))
adheresToProtocol(Int32(0))
adheresToProtocol(Int64(0))
adheresToProtocol(UInt(0))
adheresToProtocol(UInt8(0))
adheresToProtocol(UInt16(0))
adheresToProtocol(UInt32(0))
adheresToProtocol(UInt64(0))
adheresToProtocol(Double(0))
adheresToProtocol(Float(0))
adheresToProtocol(String(""))
}
func testBool() throws {
for value in [true, false] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Bool = try Bool.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testInt() throws {
for value in [Int.min, 0, Int.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Int = try Int.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testUInt() throws {
for value in [UInt.min, 0, UInt.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: UInt = try UInt.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testInt8() throws {
for value in [Int8.min, 0, Int8.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Int8 = try Int8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testUInt8() throws {
for value in [UInt8.min, 0, UInt8.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: UInt8 = try UInt8.deserializeFromSyncbase(serializedData)
// UInt8 are always encoded as one byte, but we also encode the version and type byte.
XCTAssertEqual(serializedData.length, 3)
XCTAssertEqual(deserializedValue, value)
}
}
func testInt16() throws {
for value in [Int16.min, 0, Int16.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Int16 = try Int16.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testUInt16() throws {
for value in [UInt16.min, 0, UInt16.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: UInt16 = try UInt16.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testInt32() throws {
for value in [Int32.min, 0, Int32.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Int32 = try Int32.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testUInt32() throws {
for value in [UInt32.min, 0, UInt32.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: UInt32 = try UInt32.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testInt64() throws {
for value in [Int64.min, 0, Int64.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Int64 = try Int64.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testInt64ToInt8() throws {
for value in [Int8.min, 0, Int8.max] {
let serializedData = try Int64(value).serializeToSyncbase()
let deserializedValue: Int8 = try Int8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int8(value))
}
}
func testInt64ToInt16() throws {
for value in [Int16.min, 0, Int16.max] {
let serializedData = try Int64(value).serializeToSyncbase()
let deserializedValue: Int16 = try Int16.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int16(value))
}
}
func testInt64ToInt32() throws {
for value in [Int32.min, 0, Int32.max] {
let serializedData = try Int64(value).serializeToSyncbase()
let deserializedValue: Int32 = try Int32.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int32(value))
}
}
func testInt32ToInt8() throws {
for value in [Int8.min, 0, Int8.max] {
let serializedData = try Int32(value).serializeToSyncbase()
let deserializedValue: Int8 = try Int8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int8(value))
}
}
func testInt32ToInt16() throws {
for value in [Int16.min, 0, Int16.max] {
let serializedData = try Int32(value).serializeToSyncbase()
let deserializedValue: Int16 = try Int16.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int16(value))
}
}
func testInt32ToInt64() throws {
for value in [Int32.min, 0, Int32.max] {
let serializedData = try Int32(value).serializeToSyncbase()
let deserializedValue: Int64 = try Int64.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int64(value))
}
}
func testInt16ToInt8() throws {
for value in [Int8.min, 0, Int8.max] {
let serializedData = try Int16(value).serializeToSyncbase()
let deserializedValue: Int8 = try Int8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int8(value))
}
}
func testInt16ToInt32() throws {
for value in [Int16.min, 0, Int16.max] {
let serializedData = try Int16(value).serializeToSyncbase()
let deserializedValue: Int32 = try Int32.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int32(value))
}
}
func testInt16ToInt64() throws {
for value in [Int16.min, 0, Int16.max] {
let serializedData = try Int16(value).serializeToSyncbase()
let deserializedValue: Int64 = try Int64.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Int64(value))
}
}
func testUInt64() throws {
for value in [UInt64.min, 0, UInt64.max] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: UInt64 = try UInt64.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testUInt64ToUInt8() throws {
for value in [UInt8.min, 0, UInt8.max] {
let serializedData = try UInt64(value).serializeToSyncbase()
let deserializedValue: UInt8 = try UInt8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt8(value))
}
}
func testUInt64ToUInt16() throws {
for value in [UInt16.min, 0, UInt16.max] {
let serializedData = try UInt64(value).serializeToSyncbase()
let deserializedValue: UInt16 = try UInt16.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt16(value))
}
}
func testUInt64ToUInt32() throws {
for value in [UInt32.min, 0, UInt32.max] {
let serializedData = try UInt64(value).serializeToSyncbase()
let deserializedValue: UInt32 = try UInt32.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt32(value))
}
}
func testUInt32ToUInt8() throws {
for value in [UInt8.min, 0, UInt8.max] {
let serializedData = try UInt32(value).serializeToSyncbase()
let deserializedValue: UInt8 = try UInt8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt8(value))
}
}
func testUInt32ToUInt16() throws {
for value in [UInt16.min, 0, UInt16.max] {
let serializedData = try UInt32(value).serializeToSyncbase()
let deserializedValue: UInt16 = try UInt16.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt16(value))
}
}
func testUInt32ToUInt64() throws {
for value in [UInt32.min, 0, UInt32.max] {
let serializedData = try UInt32(value).serializeToSyncbase()
let deserializedValue: UInt64 = try UInt64.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt64(value))
}
}
func testUInt16ToUInt8() throws {
for value in [UInt8.min, 0, UInt8.max] {
let serializedData = try UInt16(value).serializeToSyncbase()
let deserializedValue: UInt8 = try UInt8.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt8(value))
}
}
func testUInt16ToUInt32() throws {
for value in [UInt16.min, 0, UInt16.max] {
let serializedData = try UInt16(value).serializeToSyncbase()
let deserializedValue: UInt32 = try UInt32.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt32(value))
}
}
func testUInt16ToUInt64() throws {
for value in [UInt16.min, 0, UInt16.max] {
let serializedData = try UInt16(value).serializeToSyncbase()
let deserializedValue: UInt64 = try UInt64.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, UInt64(value))
}
}
func testFloat() throws {
let value = Float(13.17)
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Float = try Float.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testDouble() throws {
let value = Double(13.17)
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Double = try Double.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testDoubleToFloat() throws {
let value = Double(13.17)
let serializedData = try value.serializeToSyncbase()
let deserializedValue: Float = try Float.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, Float(value))
}
func testString() throws {
for value in ["", "Hello world", "你好,世界", "😊"] {
let serializedData = try value.serializeToSyncbase()
let deserializedValue: String = try String.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
}
func testNSData() throws {
let data: [UInt8] = [0, 1, 2, 3, 255]
let value = NSData(bytes: data, length: data.count)
let serializedData = try value.serializeToSyncbase()
let deserializedValue: NSData = try NSData.deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testUInt8List() throws {
let value: [UInt8] = [0, 1, 2, 3, 255]
let serializedData = try value.serializeToSyncbase()
let deserializedValue: [UInt8] = try [UInt8].deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testUInt8EmptyList() throws {
let value: [UInt8] = []
let serializedData = try value.serializeToSyncbase()
let deserializedValue: [UInt8] = try [UInt8].deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testStringList() throws {
let value = ["", "Hello world", "你好,世界", "😊"]
let serializedData = try value.serializeToSyncbase()
let deserializedValue: [String] = try [String].deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testStringEmptyList() throws {
let value: [String] = []
let serializedData = try value.serializeToSyncbase()
let deserializedValue: [String] = try [String].deserializeFromSyncbase(serializedData)
XCTAssertEqual(deserializedValue, value)
}
func testErrorUIntValueOfRange() throws {
let value: UInt32 = UInt32(UInt16.max) + 1
let serializedData = try value.serializeToSyncbase()
do {
let _: UInt16 = try UInt16.deserializeFromSyncbase(serializedData)
} catch SyncbaseError.CastError {
return
}
XCTFail()
}
func testErrorIntValueOfRange() throws {
let value: Int32 = Int32(Int16.max) + 1
let serializedData = try value.serializeToSyncbase()
do {
let _: Int16 = try Int16.deserializeFromSyncbase(serializedData)
} catch SyncbaseError.CastError {
return
}
XCTFail()
}
func testErrorErrorWrongType() throws {
let value = "Hello world"
let serializedData = try value.serializeToSyncbase()
do {
let _: Int16 = try Int16.deserializeFromSyncbase(serializedData)
} catch SyncbaseError.CastError {
return
}
XCTFail()
}
func testErrorInvalidData() throws {
let serializedData = NSData(bytes: [UInt8(0)], length: 1)
do {
let _: Int16 = try Int16.deserializeFromSyncbase(serializedData)
} catch SyncbaseError.DeserializationError {
return
}
XCTFail()
}
}