• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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