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(),
)
}
}
|