1 /* 2 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.serialization.modules 6 7 import kotlinx.serialization.* 8 import kotlinx.serialization.json.* 9 import kotlin.test.* 10 11 private const val prefix = "kotlinx.serialization.modules.SerialNameCollisionTest" 12 13 class SerialNameCollisionTest { 14 15 // Polymorphism 16 interface IBase 17 18 @Serializable 19 abstract class Base : IBase 20 21 @Serializable 22 data class Derived(val type: String, val type2: String) : Base() 23 24 @Serializable 25 data class DerivedCustomized( 26 @SerialName("type") val t: String, @SerialName("type2") val t2: String, val t3: String 27 ) : Base() 28 29 @Serializable 30 @SerialName("$prefix.Derived") 31 data class DerivedRenamed(val type: String, val type2: String) : Base() 32 <lambda>null33 private fun Json(discriminator: String, context: SerializersModule, useArrayPolymorphism: Boolean = false) = Json { 34 classDiscriminator = discriminator 35 this.useArrayPolymorphism = useArrayPolymorphism 36 serializersModule = context 37 38 } 39 40 @Test testCollisionWithDiscriminatornull41 fun testCollisionWithDiscriminator() { 42 val module = SerializersModule { 43 polymorphic(Base::class) { 44 subclass(Derived.serializer()) 45 } 46 } 47 48 assertFailsWith<IllegalArgumentException> { Json("type", module) } 49 assertFailsWith<IllegalArgumentException> { Json("type2", module) } 50 Json("type3", module) // OK 51 } 52 53 @Test testNoCollisionWithArrayPolymorphismnull54 fun testNoCollisionWithArrayPolymorphism() { 55 val module = SerializersModule { 56 polymorphic(Base::class) { 57 subclass(Derived.serializer()) 58 } 59 } 60 Json("type", module, true) 61 } 62 63 @Test testCollisionWithDiscriminatorViaSerialNamesnull64 fun testCollisionWithDiscriminatorViaSerialNames() { 65 val module = SerializersModule { 66 polymorphic(Base::class) { 67 subclass(DerivedCustomized.serializer()) 68 } 69 } 70 71 assertFailsWith<IllegalArgumentException> { Json("type", module) } 72 assertFailsWith<IllegalArgumentException> { Json("type2", module) } 73 assertFailsWith<IllegalArgumentException> { Json("t3", module) } 74 Json("t4", module) // OK 75 76 } 77 78 @Test testCollisionWithinHierarchynull79 fun testCollisionWithinHierarchy() { 80 SerializersModule { 81 assertFailsWith<IllegalArgumentException> { 82 polymorphic(Base::class) { 83 subclass(Derived.serializer()) 84 subclass(DerivedRenamed.serializer()) 85 } 86 } 87 } 88 } 89 90 @Test testCollisionWithinHierarchyViaConcatenationnull91 fun testCollisionWithinHierarchyViaConcatenation() { 92 val module = SerializersModule { 93 polymorphic(Base::class) { 94 subclass(Derived.serializer()) 95 } 96 } 97 val module2 = SerializersModule { 98 polymorphic(Base::class) { 99 subclass(DerivedRenamed.serializer()) 100 } 101 } 102 103 assertFailsWith<IllegalArgumentException> { module + module2 } 104 } 105 106 @Test testNoCollisionWithinHierarchynull107 fun testNoCollisionWithinHierarchy() { 108 val module = SerializersModule { 109 polymorphic(Base::class) { 110 subclass(Derived.serializer()) 111 } 112 113 polymorphic(IBase::class) { 114 subclass(DerivedRenamed.serializer()) 115 } 116 } 117 118 assertSame(Derived.serializer(), module.getPolymorphic(Base::class, "$prefix.Derived")) 119 assertSame( 120 DerivedRenamed.serializer(), 121 module.getPolymorphic(IBase::class, "$prefix.Derived") 122 ) 123 } 124 } 125