Review comments:

Swap ints to shorts for storing chars as there is no point wasting the
16 bits otherwise

Add better char tests, i.e. Unicode points that aren't going to fit into
the bottom 8 bits
This commit is contained in:
Katelyn Baker 2017-07-27 14:34:36 +01:00
parent 06a8a4bada
commit 3fd4baa9b2
2 changed files with 31 additions and 7 deletions

View File

@ -117,12 +117,12 @@ sealed class PropertySerializer(val name: String, val readMethod: Method, val re
override fun writeClassInfo(output: SerializationOutput) {} override fun writeClassInfo(output: SerializationOutput) {}
override fun readProperty(obj: Any?, schema: Schema, input: DeserializationInput): Any? { override fun readProperty(obj: Any?, schema: Schema, input: DeserializationInput): Any? {
return if(obj == null) null else (obj as Int).toChar() return if(obj == null) null else (obj as Short).toChar()
} }
override fun writeProperty(obj: Any?, data: Data, output: SerializationOutput) { override fun writeProperty(obj: Any?, data: Data, output: SerializationOutput) {
val input = readMethod.invoke(obj) val input = readMethod.invoke(obj)
if (input != null) data.putChar((input as Char).toInt()) else data.putNull() if (input != null) data.putShort((input as Char).toShort()) else data.putNull()
} }
} }
} }

View File

@ -32,11 +32,24 @@ class DeserializeSimpleTypesTests {
fun testChar() { fun testChar() {
data class C(val c: Char) data class C(val c: Char)
val c = C('c') var deserializedC = DeserializationInput().deserialize(SerializationOutput().serialize(C('c')))
val serialisedC = SerializationOutput().serialize(c) assertEquals('c', deserializedC.c)
val deserializedC = DeserializationInput().deserialize(serialisedC)
assertEquals(c.c, deserializedC.c) // CYRILLIC CAPITAL LETTER YU (U+042E)
deserializedC = DeserializationInput().deserialize(SerializationOutput().serialize(C('Ю')))
assertEquals('Ю', deserializedC.c)
// ARABIC LETTER FEH WITH DOT BELOW (U+06A3)
deserializedC = DeserializationInput().deserialize(SerializationOutput().serialize(C('ڣ')))
assertEquals('ڣ', deserializedC.c)
// ARABIC LETTER DAD WITH DOT BELOW (U+06FB)
deserializedC = DeserializationInput().deserialize(SerializationOutput().serialize(C('ۻ')))
assertEquals('ۻ', deserializedC.c)
// BENGALI LETTER AA (U+0986)
deserializedC = DeserializationInput().deserialize(SerializationOutput().serialize(C('আ')))
assertEquals('আ', deserializedC.c)
} }
@Test @Test
@ -150,12 +163,23 @@ class DeserializeSimpleTypesTests {
assertEquals(SerializerFactory.nameForType(c.c::class.java), "char[p]") assertEquals(SerializerFactory.nameForType(c.c::class.java), "char[p]")
val serialisedC = TestSerializationOutput(VERBOSE, sf).serialize(c) val serialisedC = TestSerializationOutput(VERBOSE, sf).serialize(c)
val deserializedC = DeserializationInput(sf).deserialize(serialisedC) var deserializedC = DeserializationInput(sf).deserialize(serialisedC)
assertEquals(c.c.size, deserializedC.c.size) assertEquals(c.c.size, deserializedC.c.size)
assertEquals(c.c[0], deserializedC.c[0]) assertEquals(c.c[0], deserializedC.c[0])
assertEquals(c.c[1], deserializedC.c[1]) assertEquals(c.c[1], deserializedC.c[1])
assertEquals(c.c[2], deserializedC.c[2]) assertEquals(c.c[2], deserializedC.c[2])
// second test with more interesting characters
v[0] = 'ই'; v[1] = ' '; v[2] = 'ਔ'
val c2 = C(v)
deserializedC = DeserializationInput(sf).deserialize(TestSerializationOutput(VERBOSE, sf).serialize(c2))
assertEquals(c2.c.size, deserializedC.c.size)
assertEquals(c2.c[0], deserializedC.c[0])
assertEquals(c2.c[1], deserializedC.c[1])
assertEquals(c2.c[2], deserializedC.c[2])
} }
@Test @Test