summaryrefslogtreecommitdiff
path: root/core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt')
-rw-r--r--core/commonTest/src/kotlinx/serialization/features/SealedInterfacesSerializationTest.kt100
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()
+ }
+
+
+}