summaryrefslogtreecommitdiff
path: root/formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconPolymorphismTest.kt
blob: db038e70b650769b4131788a0eef31cab17fd1f5 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package kotlinx.serialization.hocon

import kotlinx.serialization.*
import org.junit.*

class HoconPolymorphismTest {
    @Serializable
    sealed class Sealed(val intField: Int) {
        @Serializable
        @SerialName("object")
        object ObjectChild : Sealed(0)

        @Serializable
        @SerialName("data_class")
        data class DataClassChild(val name: String) : Sealed(1)

        @Serializable
        @SerialName("type_child")
        data class TypeChild(val type: String) : Sealed(2)

        @Serializable
        @SerialName("annotated_type_child")
        data class AnnotatedTypeChild(@SerialName("my_type") val type: String) : Sealed(3)
    }

    @Serializable
    data class CompositeClass(var sealed: Sealed)


    private val arrayHocon = Hocon {
        useArrayPolymorphism = true
    }

    private val objectHocon = Hocon {
        useArrayPolymorphism = false
    }


    @Test
    fun testArrayDataClass() {
        arrayHocon.assertStringFormAndRestored(
            expected = "sealed: [ data_class, { name = testDataClass, intField = 1 } ]",
            original = CompositeClass(Sealed.DataClassChild("testDataClass")),
            serializer = CompositeClass.serializer(),
        )
    }

    @Test
    fun testArrayObject() {
        arrayHocon.assertStringFormAndRestored(
            expected = "sealed: [ object, {} ]",
            original = CompositeClass(Sealed.ObjectChild),
            serializer = CompositeClass.serializer(),
        )
    }

    @Test
    fun testObject() {
        objectHocon.assertStringFormAndRestored(
            expected = "type = object",
            original = Sealed.ObjectChild,
            serializer = Sealed.serializer(),
        )
    }

    @Test
    fun testNestedDataClass() {
        objectHocon.assertStringFormAndRestored(
            expected = "sealed { type = data_class, name = testDataClass, intField = 1 }",
            original = CompositeClass(Sealed.DataClassChild("testDataClass")),
            serializer = CompositeClass.serializer(),
        )
    }

    @Test
    fun testDataClassDecode() {
        objectHocon.assertStringFormAndRestored(
            expected = "type = data_class, name = testDataClass, intField = 1",
            original = Sealed.DataClassChild("testDataClass"),
            serializer = Sealed.serializer(),
        )
    }

    @Test
    fun testChangedDiscriminator() {
        val hocon = Hocon(objectHocon) {
            classDiscriminator = "key"
        }

        hocon.assertStringFormAndRestored(
            expected = "type = override, key = type_child, intField = 2",
            original = Sealed.TypeChild(type = "override"),
            serializer = Sealed.serializer(),
        )
    }

    @Test
    fun testChangedTypePropertyName() {
        objectHocon.assertStringFormAndRestored(
            expected = "type = annotated_type_child, my_type = override, intField = 3",
            original = Sealed.AnnotatedTypeChild(type = "override"),
            serializer = Sealed.serializer(),
        )
    }
}