All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonTest.kotlinx.serialization.features.SealedInterfacesSerializationTest.kt Maven / Gradle / Ivy

/*
 * 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 {
        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() = noJsLegacy {
        serializer().descriptor.haveSealedSubclasses()
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy