summaryrefslogtreecommitdiff
path: root/core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt
blob: 433f9bafd7dc7cb412a35f147ce916eae821dc9a (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
/*
 * 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()
    }


}