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