Merge pull request #1128 from corda/kat-serialiseNullableChars

Serialising null chars was broken
This commit is contained in:
Katelyn Baker 2017-07-27 15:07:26 +01:00 committed by GitHub
commit 75a8e4d610
2 changed files with 46 additions and 8 deletions

View File

@ -113,13 +113,16 @@ sealed class PropertySerializer(val name: String, val readMethod: Method, val re
* casting back to a char otherwise it's treated as an Integer and a TypeMismatch occurs * casting back to a char otherwise it's treated as an Integer and a TypeMismatch occurs
*/ */
class AMQPCharPropertySerializer(name: String, readMethod: Method) : class AMQPCharPropertySerializer(name: String, readMethod: Method) :
PropertySerializer(name, readMethod, Char::class.java) { PropertySerializer(name, readMethod, Character::class.java) {
override fun writeClassInfo(output: SerializationOutput) {} override fun writeClassInfo(output: SerializationOutput) {}
override fun readProperty(obj: Any?, schema: Schema, input: DeserializationInput) = (obj as Int).toChar() override fun readProperty(obj: Any?, schema: Schema, input: DeserializationInput): Any? {
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) {
data.putChar((readMethod.invoke(obj) as Char).toInt()) val input = readMethod.invoke(obj)
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
@ -50,6 +63,17 @@ class DeserializeSimpleTypesTests {
assertEquals(c.c, deserializedC.c) assertEquals(c.c, deserializedC.c)
} }
@Test
fun testNullCharacter() {
data class C(val c: Char?)
val c = C(null)
val serialisedC = SerializationOutput().serialize(c)
val deserializedC = DeserializationInput().deserialize(serialisedC)
assertEquals(c.c, deserializedC.c)
}
@Test @Test
fun testArrayOfInt() { fun testArrayOfInt() {
class IA(val ia: Array<Int>) class IA(val ia: Array<Int>)
@ -139,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