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