summaryrefslogtreecommitdiff
path: root/formats/json/commonTest/src/kotlinx/serialization/features/DerivedContextualSerializerTest.kt
blob: 7da16fb8388334ab394b297bbb8f76beacf3a4cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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)
    }
}