diff options
Diffstat (limited to 'core/commonTest/src/kotlinx/serialization/SerializersModuleTest.kt')
-rw-r--r-- | core/commonTest/src/kotlinx/serialization/SerializersModuleTest.kt | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/core/commonTest/src/kotlinx/serialization/SerializersModuleTest.kt b/core/commonTest/src/kotlinx/serialization/SerializersModuleTest.kt new file mode 100644 index 00000000..9e255f27 --- /dev/null +++ b/core/commonTest/src/kotlinx/serialization/SerializersModuleTest.kt @@ -0,0 +1,135 @@ +/* + * Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.serialization + +import kotlinx.serialization.builtins.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.internal.* +import kotlinx.serialization.modules.* +import kotlinx.serialization.test.* +import kotlin.reflect.* +import kotlin.test.* + +class SerializersModuleTest { + @Serializable + object Object + + @Serializable + sealed class SealedParent { + @Serializable + data class Child(val i: Int) : SealedParent() + } + + @Serializable + abstract class Abstract + + @Serializable + enum class SerializableEnum { A, B } + + @Serializable(CustomSerializer::class) + class WithCustomSerializer(val i: Int) + + @Serializer(forClass = WithCustomSerializer::class) + object CustomSerializer + + @Serializable + class Parametrized<T : Any>(val a: T) + + @Serializable + class ParametrizedOfNullable<T>(val a: T) + + class ContextualType(val i: Int) + + @Serializer(forClass = ContextualType::class) + object ContextualSerializer + + @Serializable + class ContextualHolder(@Contextual val contextual: ContextualType) + + @Test + fun testCompiled() { + assertSame<KSerializer<*>>(Object.serializer(), serializer(Object::class, emptyList(), false)) + assertSame<KSerializer<*>>(SealedParent.serializer(), serializer(SealedParent::class, emptyList(), false)) + assertSame<KSerializer<*>>( + SealedParent.Child.serializer(), + serializer(SealedParent.Child::class, emptyList(), false) + ) + + assertSame<KSerializer<*>>(Abstract.serializer(), serializer(Abstract::class, emptyList(), false)) + assertSame<KSerializer<*>>(SerializableEnum.serializer(), serializer(SerializableEnum::class, emptyList(), false)) + } + + @Test + fun testBuiltIn() { + assertSame<KSerializer<*>>(Int.serializer(), serializer(Int::class, emptyList(), false)) + } + + @Test + fun testCustom() { + val m = SerializersModule { } + assertSame<KSerializer<*>>(CustomSerializer, m.serializer(WithCustomSerializer::class, emptyList(), false)) + } + + @Test + fun testParametrized() { + val serializer = serializer(Parametrized::class, listOf(Int.serializer()), false) + assertEquals<KClass<*>>(Parametrized.serializer(Int.serializer())::class, serializer::class) + assertEquals(PrimitiveKind.INT, serializer.descriptor.getElementDescriptor(0).kind) + + val mapSerializer = serializer(Map::class, listOf(String.serializer(), Int.serializer()), false) + assertIs<MapLikeSerializer<*, *, *, *>>(mapSerializer) + assertEquals(PrimitiveKind.STRING, mapSerializer.descriptor.getElementDescriptor(0).kind) + assertEquals(PrimitiveKind.INT, mapSerializer.descriptor.getElementDescriptor(1).kind) + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testNothingAndParameterizedOfNothing() { + assertEquals(NothingSerializer, Nothing::class.serializer()) + //assertEquals(NothingSerializer, serializer<Nothing>()) // prohibited by compiler + assertEquals(NothingSerializer, serializer(Nothing::class, emptyList(), false) as KSerializer<Nothing>) + //assertEquals(NullableSerializer(NothingSerializer), serializer<Nothing?>()) // prohibited by compiler + assertEquals( + NullableSerializer(NothingSerializer), + serializer(Nothing::class, emptyList(), true) as KSerializer<Nothing?> + ) + + val parameterizedNothingSerializer = serializer<Parametrized<Nothing>>() + val nothingDescriptor = parameterizedNothingSerializer.descriptor.getElementDescriptor(0) + assertEquals(NothingSerialDescriptor, nothingDescriptor) + + val parameterizedNullableNothingSerializer = serializer<ParametrizedOfNullable<Nothing?>>() + val nullableNothingDescriptor = parameterizedNullableNothingSerializer.descriptor.getElementDescriptor(0) + assertEquals(SerialDescriptorForNullable(NothingSerialDescriptor), nullableNothingDescriptor) + } + + @Test + fun testUnsupportedArray() { + assertFails { + serializer(Array::class, listOf(Int.serializer()), false) + } + } + + @Suppress("UNCHECKED_CAST") + @Test + fun testContextual() { + val m = SerializersModule { + contextual<ContextualType>(ContextualSerializer) + contextual(ContextualGenericsTest.ThirdPartyBox::class) { args -> ContextualGenericsTest.ThirdPartyBoxSerializer(args[0]) } + } + + val contextualSerializer = m.serializer(ContextualType::class, emptyList(), false) + assertSame<KSerializer<*>>(ContextualSerializer, contextualSerializer) + + val boxSerializer = m.serializer(ContextualGenericsTest.ThirdPartyBox::class, listOf(Int.serializer()), false) + assertIs<ContextualGenericsTest.ThirdPartyBoxSerializer<Int>>(boxSerializer) + assertEquals(PrimitiveKind.INT, boxSerializer.descriptor.getElementDescriptor(0).kind) + + val holderSerializer = m.serializer(ContextualHolder::class, emptyList(), false) + assertSame<KSerializer<*>>(ContextualHolder.serializer(), holderSerializer) + } + +} + |