Files
swift-mirror/validation-test/stdlib/SwiftPrivateSerialization.swift
Dmitri Hrybenko b7498a1efd stdlib: add a private serialization API
These APIs will be used for writing automation tools in Swift.  Just
like other private APIs, this module is not exposed to extrenal users.

The primary motivation for doing instead of using NSCoder this is that
NSCoder does not work with structs and Swift containers.  Using classes
for everything just to satisfy NSCoder forces unnatural code.

This API requires two times (!) less boilerplate than NSCoding, since
the same method is used for serialization and deserialization.  This API
is also more type-safe, it does not require the user to write 'as' type
casts, unlike NSCoding.

Please take a look at
validation-test/stdlib/SwiftPrivateSerialization.swift to see the
intended use pattern.

The performance of the underlying implementation is already decent, and
there's a lot of room for improvement.

This is a re-commit of r25678, with a fix for 32-bit platforms.

Swift SVN r25877
2015-03-09 06:55:19 +00:00

353 lines
8.3 KiB
Swift

// RUN: %target-run-simple-swift
import SwiftPrivateSerialization
import StdlibUnittest
var SerializationTestSuite = TestSuite("Serialization")
struct SimpleSerializableType : SerializableFixedDictionaryType {
var i: Int
init(i: Int) {
self.i = i
}
init(forDeserialization: ()) {
self.i = 0
}
mutating func serializeDeserialize<
Serializer : FixedDictionarySerializerType
>(inout s: Serializer) {
s.addKey("i", value: &self.i)
}
}
SerializationTestSuite.test("Smoketest") {
var input = SimpleSerializableType(i: 42)
var bytes = MsgPackSerializer.serialize(input)
expectType([UInt8].self, &bytes)
var deserialized =
MsgPackDeserializer.deserialize(bytes) as SimpleSerializableType
expectEqual(42, deserialized.i)
}
struct SerializableTypeWithScalars : SerializableFixedDictionaryType {
var i01: Int = 0
var i02: UInt = 0
var i03: Int8 = 0
var i04: Int16 = 0
var i05: Int32 = 0
var i06: Int64 = 0
var i07: UInt8 = 0
var i08: UInt16 = 0
var i09: UInt32 = 0
var i10: UInt64 = 0
var f01: Float = 0.0
var f02: Double = 0.0
var b01: Bool = false
var s01: String = ""
init() {}
init(forDeserialization: ()) {}
mutating func serializeDeserialize<
Serializer : FixedDictionarySerializerType
>(inout s: Serializer) {
s.addKey("i01", value: &self.i01)
s.addKey("i02", value: &self.i02)
s.addKey("i03", value: &self.i03)
s.addKey("i04", value: &self.i04)
s.addKey("i05", value: &self.i05)
s.addKey("i06", value: &self.i06)
s.addKey("i07", value: &self.i07)
s.addKey("i08", value: &self.i08)
s.addKey("i09", value: &self.i09)
s.addKey("i10", value: &self.i10)
s.addKey("f01", value: &self.f01)
s.addKey("f02", value: &self.f02)
s.addKey("b01", value: &self.b01)
s.addKey("s01", value: &self.s01)
}
}
SerializationTestSuite.test("Scalars") {
var input = SerializableTypeWithScalars()
input.i01 = 1
input.i02 = 2
input.i03 = 3
input.i04 = 4
input.i05 = 5
input.i06 = 6
input.i07 = 7
input.i08 = 8
input.i09 = 9
input.i10 = 10
input.f01 = 0.25
input.f02 = 0.75
input.b01 = true
input.s01 = "hello"
var bytes = MsgPackSerializer.serialize(input)
expectType([UInt8].self, &bytes)
var deserialized =
MsgPackDeserializer.deserialize(bytes) as SerializableTypeWithScalars
expectEqual(1, deserialized.i01)
expectEqual(2, deserialized.i02)
expectEqual(3, deserialized.i03)
expectEqual(4, deserialized.i04)
expectEqual(5, deserialized.i05)
expectEqual(6, deserialized.i06)
expectEqual(7, deserialized.i07)
expectEqual(8, deserialized.i08)
expectEqual(9, deserialized.i09)
expectEqual(10, deserialized.i10)
expectEqual(0.25, deserialized.f01)
expectEqual(0.75, deserialized.f02)
expectEqual(true, deserialized.b01)
expectEqual("hello", deserialized.s01)
}
struct SerializableTypeWithArraysOfScalars :
SerializableFixedDictionaryType {
var i01: [Int] = []
var i02: [UInt] = []
var i03: [Int8] = []
var i04: [Int16] = []
var i05: [Int32] = []
var i06: [Int64] = []
var i07: [UInt8] = []
var i08: [UInt16] = []
var i09: [UInt32] = []
var i10: [UInt64] = []
var f01: [Float] = []
var f02: [Double] = []
var b01: [Bool] = []
var s01: [String] = []
init() {}
init(forDeserialization: ()) {}
mutating func serializeDeserialize<
Serializer : FixedDictionarySerializerType
>(inout s: Serializer) {
s.addKey("i01", value: &self.i01)
s.addKey("i02", value: &self.i02)
s.addKey("i03", value: &self.i03)
s.addKey("i04", value: &self.i04)
s.addKey("i05", value: &self.i05)
s.addKey("i06", value: &self.i06)
s.addKey("i07", value: &self.i07)
s.addKey("i08", value: &self.i08)
s.addKey("i09", value: &self.i09)
s.addKey("i10", value: &self.i10)
s.addKey("f01", value: &self.f01)
s.addKey("f02", value: &self.f02)
s.addKey("b01", value: &self.b01)
s.addKey("s01", value: &self.s01)
}
}
SerializationTestSuite.test("ArraysOfScalars") {
var input = SerializableTypeWithArraysOfScalars()
input.i01 = [ 1 ]
input.i02 = [ 2 ]
input.i03 = [ 3 ]
input.i04 = [ 4 ]
input.i05 = [ 5 ]
input.i06 = [ 6 ]
input.i07 = [ 7 ]
input.i08 = [ 8 ]
input.i09 = [ 9 ]
input.i10 = [ 10 ]
input.f01 = [ 0.25 ]
input.f02 = [ 0.75 ]
input.b01 = [ true ]
input.s01 = [ "hello" ]
var bytes = MsgPackSerializer.serialize(input)
expectType([UInt8].self, &bytes)
var deserialized =
MsgPackDeserializer.deserialize(bytes) as
SerializableTypeWithArraysOfScalars
expectEqual([ 1 ], deserialized.i01)
expectEqual([ 2 ], deserialized.i02)
expectEqual([ 3 ], deserialized.i03)
expectEqual([ 4 ], deserialized.i04)
expectEqual([ 5 ], deserialized.i05)
expectEqual([ 6 ], deserialized.i06)
expectEqual([ 7 ], deserialized.i07)
expectEqual([ 8 ], deserialized.i08)
expectEqual([ 9 ], deserialized.i09)
expectEqual([ 10 ], deserialized.i10)
expectEqual([ 0.25 ], deserialized.f01)
expectEqual([ 0.75 ], deserialized.f02)
expectEqual([ true ], deserialized.b01)
expectEqual([ "hello" ], deserialized.s01)
}
struct SerializableTypeWithDictionariesOfScalars :
SerializableFixedDictionaryType {
var i01: [String : Int] = [:]
var i02: [String : UInt] = [:]
var i03: [String : Int8] = [:]
var i04: [String : Int16] = [:]
var i05: [String : Int32] = [:]
var i06: [String : Int64] = [:]
var i07: [String : UInt8] = [:]
var i08: [String : UInt16] = [:]
var i09: [String : UInt32] = [:]
var i10: [String : UInt64] = [:]
var f01: [String : Float] = [:]
var f02: [String : Double] = [:]
var b01: [String : Bool] = [:]
var s01: [String : String] = [:]
init() {}
init(forDeserialization: ()) {}
mutating func serializeDeserialize<
Serializer : FixedDictionarySerializerType
>(inout s: Serializer) {
s.addKey("i01", value: &self.i01)
s.addKey("i02", value: &self.i02)
s.addKey("i03", value: &self.i03)
s.addKey("i04", value: &self.i04)
s.addKey("i05", value: &self.i05)
s.addKey("i06", value: &self.i06)
s.addKey("i07", value: &self.i07)
s.addKey("i08", value: &self.i08)
s.addKey("i09", value: &self.i09)
s.addKey("i10", value: &self.i10)
s.addKey("f01", value: &self.f01)
s.addKey("f02", value: &self.f02)
s.addKey("b01", value: &self.b01)
s.addKey("s01", value: &self.s01)
}
}
SerializationTestSuite.test("DictionariesOfScalars") {
var input = SerializableTypeWithDictionariesOfScalars()
input.i01 = [ "a": 1 ]
input.i02 = [ "a": 2 ]
input.i03 = [ "a": 3 ]
input.i04 = [ "a": 4 ]
input.i05 = [ "a": 5 ]
input.i06 = [ "a": 6 ]
input.i07 = [ "a": 7 ]
input.i08 = [ "a": 8 ]
input.i09 = [ "a": 9 ]
input.i10 = [ "a": 10 ]
input.f01 = [ "a": 0.25 ]
input.f02 = [ "a": 0.75 ]
input.b01 = [ "a": true ]
input.s01 = [ "a": "hello" ]
var bytes = MsgPackSerializer.serialize(input)
expectType([UInt8].self, &bytes)
var deserialized =
MsgPackDeserializer.deserialize(bytes) as
SerializableTypeWithDictionariesOfScalars
expectEqual([ "a": 1 ], deserialized.i01)
expectEqual([ "a": 2 ], deserialized.i02)
expectEqual([ "a": 3 ], deserialized.i03)
expectEqual([ "a": 4 ], deserialized.i04)
expectEqual([ "a": 5 ], deserialized.i05)
expectEqual([ "a": 6 ], deserialized.i06)
expectEqual([ "a": 7 ], deserialized.i07)
expectEqual([ "a": 8 ], deserialized.i08)
expectEqual([ "a": 9 ], deserialized.i09)
expectEqual([ "a": 10 ], deserialized.i10)
expectEqual([ "a": 0.25 ], deserialized.f01)
expectEqual([ "a": 0.75 ], deserialized.f02)
expectEqual([ "a": true ], deserialized.b01)
expectEqual([ "a": "hello" ], deserialized.s01)
}
struct SerializableTypeWithFixedDictionaries :
SerializableFixedDictionaryType {
var fd01: SimpleSerializableType = SimpleSerializableType(i: 0)
init() {}
init(forDeserialization: ()) {}
mutating func serializeDeserialize<
Serializer : FixedDictionarySerializerType
>(inout s: Serializer) {
s.addKey("fd01", value: &self.fd01)
}
}
SerializationTestSuite.test("FixedDictionaries") {
var input = SerializableTypeWithFixedDictionaries()
input.fd01 = SimpleSerializableType(i: 42)
var bytes = MsgPackSerializer.serialize(input)
expectType([UInt8].self, &bytes)
var deserialized =
MsgPackDeserializer.deserialize(bytes) as
SerializableTypeWithFixedDictionaries
expectEqual(42, deserialized.fd01.i)
}
runAllTests()