@@ -16,7 +16,7 @@ import kotlin.reflect.*
16
16
import kotlin.test.*
17
17
18
18
@Suppress(" RemoveExplicitTypeArguments" ) // This is exactly what's being tested
19
- class TypeOfSerializerLookupTest : JsonTestBase () {
19
+ class SerializersLookupTest : JsonTestBase () {
20
20
21
21
@Test
22
22
fun testPrimitive () {
@@ -135,45 +135,64 @@ class TypeOfSerializerLookupTest : JsonTestBase() {
135
135
assertSerializedWithType(" {}" , SampleObject )
136
136
}
137
137
138
+ class IntBox (val i : Int )
138
139
139
- class CustomIntSerializer (isNullable : Boolean ) : KSerializer<Int ?> {
140
+ class CustomIntSerializer (isNullable : Boolean ) : KSerializer<IntBox ?> {
140
141
override val descriptor: SerialDescriptor
141
142
142
143
init {
143
144
val d = PrimitiveSerialDescriptor (" CIS" , PrimitiveKind .INT )
144
145
descriptor = if (isNullable) d.nullable else d
145
146
}
146
147
147
- override fun serialize (encoder : Encoder , value : Int ? ) {
148
+ override fun serialize (encoder : Encoder , value : IntBox ? ) {
148
149
if (value == null ) encoder.encodeInt(41 )
149
150
else encoder.encodeInt(42 )
150
151
}
151
152
152
- override fun deserialize (decoder : Decoder ): Int ? {
153
+ override fun deserialize (decoder : Decoder ): IntBox ? {
153
154
TODO ()
154
155
}
155
156
}
156
157
157
158
@Test
158
159
fun testContextualLookup () {
159
- val module = SerializersModule { contextual(CustomIntSerializer (false ).cast<Int >()) }
160
+ val module = SerializersModule { contextual(CustomIntSerializer (false ).cast<IntBox >()) }
160
161
val json = Json { serializersModule = module }
161
- val data = listOf (listOf (1 ))
162
+ val data = listOf (listOf (IntBox ( 1 ) ))
162
163
assertEquals(" [[42]]" , json.encodeToString(data))
163
164
}
164
165
165
166
@Test
166
167
fun testContextualLookupNullable () {
167
- val module = SerializersModule { contextual(CustomIntSerializer (true ).cast<Int >()) }
168
- val serializer = module.serializer<List <List <Int ?>>>()
169
- assertEquals(" [[41]]" , Json .encodeToString(serializer, listOf (listOf<Int ?>(null ))))
168
+ val module = SerializersModule { contextual(CustomIntSerializer (true ).cast<IntBox >()) }
169
+ val serializer = module.serializer<List <List <IntBox ?>>>()
170
+ assertEquals(" [[41]]" , Json .encodeToString(serializer, listOf (listOf<IntBox ?>(null ))))
170
171
}
171
172
172
173
@Test
173
174
fun testContextualLookupNonNullable () {
174
- val module = SerializersModule { contextual(CustomIntSerializer (false ).cast<Int >()) }
175
- val serializer = module.serializer<List <List <Int ?>>>()
176
- assertEquals(" [[null]]" , Json .encodeToString(serializer, listOf (listOf<Int ?>(null ))))
175
+ val module = SerializersModule { contextual(CustomIntSerializer (false ).cast<IntBox >()) }
176
+ val serializer = module.serializer<List <List <IntBox ?>>>()
177
+ assertEquals(" [[null]]" , Json .encodeToString(serializer, listOf (listOf<IntBox ?>(null ))))
178
+ }
179
+
180
+ @Test
181
+ fun testCompiledWinsOverContextual () {
182
+ val contextual = object : KSerializer <Int > {
183
+ override val descriptor: SerialDescriptor = Int .serializer().descriptor
184
+
185
+ override fun serialize (encoder : Encoder , value : Int ) {
186
+ fail()
187
+ }
188
+
189
+ override fun deserialize (decoder : Decoder ): Int {
190
+ fail()
191
+ }
192
+ }
193
+ val json = Json { serializersModule = SerializersModule { contextual(contextual) } }
194
+ assertEquals(" [[1]]" , json.encodeToString(listOf (listOf<Int >(1 ))))
195
+ assertEquals(" 42" , json.encodeToString(42 ))
177
196
}
178
197
179
198
// Tests with [constructSerializerForGivenTypeArgs] are unsupported on legacy Kotlin/JS
0 commit comments