1 /* <lambda>null2 * Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.serialization 6 7 import kotlinx.serialization.builtins.* 8 import kotlinx.serialization.descriptors.* 9 import kotlinx.serialization.internal.* 10 import kotlinx.serialization.modules.* 11 import kotlinx.serialization.test.* 12 import kotlin.reflect.* 13 import kotlin.test.* 14 15 class SerializersModuleTest { 16 @Serializable 17 object Object 18 19 @Serializable 20 sealed class SealedParent { 21 @Serializable 22 data class Child(val i: Int) : SealedParent() 23 } 24 25 @Serializable 26 abstract class Abstract 27 28 @Serializable 29 enum class SerializableEnum { A, B } 30 31 @Serializable(CustomSerializer::class) 32 class WithCustomSerializer(val i: Int) 33 34 @Serializer(forClass = WithCustomSerializer::class) 35 object CustomSerializer 36 37 @Serializable 38 class Parametrized<T : Any>(val a: T) 39 40 @Serializable 41 class ParametrizedOfNullable<T>(val a: T) 42 43 class ContextualType(val i: Int) 44 45 @Serializer(forClass = ContextualType::class) 46 object ContextualSerializer 47 48 @Serializable 49 class ContextualHolder(@Contextual val contextual: ContextualType) 50 51 @Test 52 fun testCompiled() { 53 assertSame<KSerializer<*>>(Object.serializer(), serializer(Object::class, emptyList(), false)) 54 assertSame<KSerializer<*>>(SealedParent.serializer(), serializer(SealedParent::class, emptyList(), false)) 55 assertSame<KSerializer<*>>( 56 SealedParent.Child.serializer(), 57 serializer(SealedParent.Child::class, emptyList(), false) 58 ) 59 60 assertSame<KSerializer<*>>(Abstract.serializer(), serializer(Abstract::class, emptyList(), false)) 61 assertSame<KSerializer<*>>(SerializableEnum.serializer(), serializer(SerializableEnum::class, emptyList(), false)) 62 } 63 64 @Test 65 fun testBuiltIn() { 66 assertSame<KSerializer<*>>(Int.serializer(), serializer(Int::class, emptyList(), false)) 67 } 68 69 @Test 70 fun testCustom() { 71 val m = SerializersModule { } 72 assertSame<KSerializer<*>>(CustomSerializer, m.serializer(WithCustomSerializer::class, emptyList(), false)) 73 } 74 75 @Test 76 fun testParametrized() { 77 val serializer = serializer(Parametrized::class, listOf(Int.serializer()), false) 78 assertEquals<KClass<*>>(Parametrized.serializer(Int.serializer())::class, serializer::class) 79 assertEquals(PrimitiveKind.INT, serializer.descriptor.getElementDescriptor(0).kind) 80 81 val mapSerializer = serializer(Map::class, listOf(String.serializer(), Int.serializer()), false) 82 assertIs<MapLikeSerializer<*, *, *, *>>(mapSerializer) 83 assertEquals(PrimitiveKind.STRING, mapSerializer.descriptor.getElementDescriptor(0).kind) 84 assertEquals(PrimitiveKind.INT, mapSerializer.descriptor.getElementDescriptor(1).kind) 85 } 86 87 @Suppress("UNCHECKED_CAST") 88 @Test 89 fun testNothingAndParameterizedOfNothing() { 90 assertEquals(NothingSerializer, Nothing::class.serializer()) 91 //assertEquals(NothingSerializer, serializer<Nothing>()) // prohibited by compiler 92 assertEquals(NothingSerializer, serializer(Nothing::class, emptyList(), false) as KSerializer<Nothing>) 93 //assertEquals(NullableSerializer(NothingSerializer), serializer<Nothing?>()) // prohibited by compiler 94 assertEquals( 95 NullableSerializer(NothingSerializer), 96 serializer(Nothing::class, emptyList(), true) as KSerializer<Nothing?> 97 ) 98 99 val parameterizedNothingSerializer = serializer<Parametrized<Nothing>>() 100 val nothingDescriptor = parameterizedNothingSerializer.descriptor.getElementDescriptor(0) 101 assertEquals(NothingSerialDescriptor, nothingDescriptor) 102 103 val parameterizedNullableNothingSerializer = serializer<ParametrizedOfNullable<Nothing?>>() 104 val nullableNothingDescriptor = parameterizedNullableNothingSerializer.descriptor.getElementDescriptor(0) 105 assertEquals(SerialDescriptorForNullable(NothingSerialDescriptor), nullableNothingDescriptor) 106 } 107 108 @Test 109 fun testUnsupportedArray() { 110 assertFails { 111 serializer(Array::class, listOf(Int.serializer()), false) 112 } 113 } 114 115 @Suppress("UNCHECKED_CAST") 116 @Test 117 fun testContextual() { 118 val m = SerializersModule { 119 contextual<ContextualType>(ContextualSerializer) 120 contextual(ContextualGenericsTest.ThirdPartyBox::class) { args -> ContextualGenericsTest.ThirdPartyBoxSerializer(args[0]) } 121 } 122 123 val contextualSerializer = m.serializer(ContextualType::class, emptyList(), false) 124 assertSame<KSerializer<*>>(ContextualSerializer, contextualSerializer) 125 126 val boxSerializer = m.serializer(ContextualGenericsTest.ThirdPartyBox::class, listOf(Int.serializer()), false) 127 assertIs<ContextualGenericsTest.ThirdPartyBoxSerializer<Int>>(boxSerializer) 128 assertEquals(PrimitiveKind.INT, boxSerializer.descriptor.getElementDescriptor(0).kind) 129 130 val holderSerializer = m.serializer(ContextualHolder::class, emptyList(), false) 131 assertSame<KSerializer<*>>(ContextualHolder.serializer(), holderSerializer) 132 } 133 134 } 135 136