diff options
Diffstat (limited to 'core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt')
-rw-r--r-- | core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt b/core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt new file mode 100644 index 00000000..433f9baf --- /dev/null +++ b/core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt @@ -0,0 +1,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() + } + + +} |