diff options
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/features/DerivedContextualSerializerTest.kt')
-rw-r--r-- | formats/json-tests/commonTest/src/kotlinx/serialization/features/DerivedContextualSerializerTest.kt | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/features/DerivedContextualSerializerTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/features/DerivedContextualSerializerTest.kt new file mode 100644 index 00000000..7da16fb8 --- /dev/null +++ b/formats/json-tests/commonTest/src/kotlinx/serialization/features/DerivedContextualSerializerTest.kt @@ -0,0 +1,49 @@ +package kotlinx.serialization.features + +import kotlin.test.* +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.* + +class DerivedContextualSerializerTest { + + @Serializable + abstract class Message + + @Serializable + class SimpleMessage(val body: String) : Message() + + @Serializable + class Holder(@Contextual val message: Message) + + object MessageAsStringSerializer : KSerializer<Message> { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("kotlinx.serialization.MessageAsStringSerializer", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Message) { + // dummy serializer that assumes Message is always SimpleMessage + check(value is SimpleMessage) + encoder.encodeString(value.body) + } + + override fun deserialize(decoder: Decoder): Message { + return SimpleMessage(decoder.decodeString()) + } + } + + @Test + fun testDerivedContextualSerializer() { + val module = SerializersModule { + contextual(MessageAsStringSerializer) + } + val format = Json { serializersModule = module } + val data = Holder(SimpleMessage("hello")) + val serialized = format.encodeToString(data) + assertEquals("""{"message":"hello"}""", serialized) + val deserialized = format.decodeFromString<Holder>(serialized) + assertTrue(deserialized.message is SimpleMessage) + assertEquals("hello", deserialized.message.body) + } +} |