summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/features/sealed/SealedDiamondTest.kt
blob: 6ba4713bf4b916349e5f9f3c25374145a2e66355 (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.sealed

import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.json.*
import kotlin.test.*

class SealedDiamondTest : JsonTestBase() {

    @Serializable
    sealed interface A {}

    @Serializable
    sealed interface B : A {}

    @Serializable
    sealed interface C : A {}

    @Serializable
    @SerialName("X")
    data class X(val i: Int) : B, C

    @Serializable
    @SerialName("Y")
    object Y : B, C

    @SerialName("E")
    enum class E : B, C {
        Q, W
    }

    @Test
    fun testMultipleSuperSealedInterfacesDescriptor() {
        val subclasses = A.serializer().descriptor.getElementDescriptor(1).elementDescriptors.map { it.serialName }
        assertEquals(listOf("E", "X", "Y"), subclasses)
    }

    @Test
    fun testMultipleSuperSealedInterfaces() {
        @Serializable
        data class Carrier(val a: A, val b: B, val c: C)
        assertJsonFormAndRestored(
            Carrier.serializer(),
            Carrier(X(1), X(2), Y),
            """{"a":{"type":"X","i":1},"b":{"type":"X","i":2},"c":{"type":"Y"}}"""
        )
    }

}