• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 @file:Suppress("RUNTIME_ANNOTATION_NOT_SUPPORTED")
6 
7 package kotlinx.serialization
8 
9 import kotlinx.serialization.builtins.*
10 import kotlinx.serialization.descriptors.*
11 import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
12 import kotlinx.serialization.encoding.*
13 import kotlinx.serialization.internal.*
14 import kotlinx.serialization.test.*
15 import kotlin.reflect.*
16 import kotlin.test.*
17 
18 class SerializersLookupNamedCompanionTest {
19     @Serializable
20     class Plain(val i: Int) {
21         companion object Named
22     }
23 
24     @Serializable
25     class Parametrized<T>(val value: T) {
26         companion object Named
27     }
28 
29 
30     @Serializer(forClass = PlainWithCustom::class)
31     object PlainSerializer
32 
33     @Serializable(PlainSerializer::class)
34     class PlainWithCustom(val i: Int) {
35         companion object Named
36     }
37 
38     class ParametrizedSerializer<T : Any>(val serializer: KSerializer<T>) : KSerializer<ParametrizedWithCustom<T>> {
39         override val descriptor: SerialDescriptor =
40             PrimitiveSerialDescriptor("parametrized (${serializer.descriptor})", PrimitiveKind.STRING)
41 
deserializenull42         override fun deserialize(decoder: Decoder): ParametrizedWithCustom<T> = TODO("Not yet implemented")
43         override fun serialize(encoder: Encoder, value: ParametrizedWithCustom<T>) = TODO("Not yet implemented")
44     }
45 
46     @Serializable(ParametrizedSerializer::class)
47     class ParametrizedWithCustom<T>(val i: T) {
48         companion object Named
49     }
50 
51     @Serializable
52     sealed interface SealedInterface {
53         companion object Named
54     }
55 
56     @Serializable
57     sealed interface SealedInterfaceWithExplicitAnnotation {
58         @NamedCompanion
59         companion object Named
60     }
61 
62 
63     @Test
testnull64     fun test() {
65         assertSame<KSerializer<*>>(Plain.serializer(), serializer(typeOf<Plain>()))
66 
67         shouldFail<SerializationException>(beforeKotlin = "1.9.20", onJs = false, onNative = false, onWasm = false) {
68             assertSame<KSerializer<*>>(PlainSerializer, serializer(typeOf<PlainWithCustom>()))
69         }
70 
71         shouldFail<SerializationException>(beforeKotlin = "1.9.20", onJs = false, onNative = false, onWasm = false) {
72             assertEquals(
73                 Parametrized.serializer(Int.serializer()).descriptor.toString(),
74                 serializer(typeOf<Parametrized<Int>>()).descriptor.toString()
75             )
76         }
77 
78         shouldFail<SerializationException>(beforeKotlin = "1.9.20", onJs = false, onNative = false, onWasm = false) {
79             assertEquals(
80                 ParametrizedWithCustom.serializer(Int.serializer()).descriptor.toString(),
81                 serializer(typeOf<ParametrizedWithCustom<Int>>()).descriptor.toString()
82             )
83         }
84 
85         shouldFail<SerializationException>(beforeKotlin = "1.9.20", onJs = false, onNative = false, onWasm = false) {
86             assertEquals(
87                 SealedInterface.serializer().descriptor.toString(),
88                 serializer(typeOf<SealedInterface>()).descriptor.toString()
89             )
90         }
91     }
92 
93 
94 }
95