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
|
/*
* Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
@file:Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
package kotlinx.serialization.features
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.test.*
import kotlin.test.Test
import kotlin.test.assertEquals
class SealedInterfacesSerializationTest {
interface A
sealed interface B
@Serializable
sealed interface C
@Serializable(DummySerializer::class)
sealed interface D
@Serializable(DummySerializer::class)
interface E
@Serializable
@Polymorphic
sealed interface F
@Serializable
class ImplA : A, B, C, D, E, F
@Serializable
class ImplB : A, B, C, D, E, F
@Serializable
class Holder(
val a: A,
val b: B,
val c: C,
val d: D,
val e: E,
@Polymorphic val polyC: C,
val f: F
)
class DummySerializer : KSerializer<Any> {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Dummy")
override fun serialize(encoder: Encoder, value: Any) {
error("serialize")
}
override fun deserialize(decoder: Decoder): Any {
error("deserialize")
}
}
private fun SerialDescriptor.haveSealedSubclasses() {
assertEquals(PolymorphicKind.SEALED, kind)
val subclasses = getElementDescriptor(1).elementDescriptors.map { it.serialName.substringAfterLast('.') }
assertEquals(listOf("ImplA", "ImplB"), subclasses)
}
private fun SerialDescriptor.isDummy() = serialName == "Dummy"
private fun SerialDescriptor.isPolymorphic() = kind == PolymorphicKind.OPEN
operator fun SerialDescriptor.get(i: Int) = getElementDescriptor(i)
@Test
fun testInHolder() {
val desc = Holder.serializer().descriptor
desc[0].isPolymorphic()
desc[1].isPolymorphic()
desc[2].haveSealedSubclasses()
desc[3].isDummy()
desc[4].isDummy()
desc[5].isPolymorphic()
desc[6].isPolymorphic()
}
@Test
fun testGenerated() {
C.serializer().descriptor.haveSealedSubclasses()
}
@Test
fun testResolved() {
serializer<C>().descriptor.haveSealedSubclasses()
}
}
|