17
17
package kotlinx.serialization
18
18
19
19
import kotlinx.serialization.json.Json
20
+ import kotlinx.serialization.test.typeTokenOf
20
21
import org.junit.Test
21
22
import java.util.HashMap
22
23
import java.util.HashSet
23
24
import kotlin.collections.LinkedHashMap
24
25
import kotlin.collections.Map
25
26
import kotlin.collections.hashMapOf
26
27
import kotlin.collections.hashSetOf
27
- import kotlin.test.assertEquals
28
+ import kotlin.reflect.*
29
+ import kotlin.test.*
28
30
29
31
30
32
class JavaCollectionsTest {
@@ -38,7 +40,7 @@ class JavaCollectionsTest {
38
40
)
39
41
40
42
@Test
41
- fun test () {
43
+ fun testJavaCollectionsInsideClass () {
42
44
val original = HasHashMap (" 42" , hashMapOf(1 to " 1" , 2 to " 2" ), hashSetOf(11 ), LinkedHashMap (), null )
43
45
val serializer = HasHashMap .serializer()
44
46
val string = Json .encodeToString(serializer = serializer, value = original)
@@ -49,4 +51,62 @@ class JavaCollectionsTest {
49
51
val restored = Json .decodeFromString(deserializer = serializer, string = string)
50
52
assertEquals(expected = original, actual = restored)
51
53
}
54
+
55
+ @Test
56
+ fun testTopLevelMaps () {
57
+ // Returning null here is a deliberate choice: map constructor functions may return different specialized
58
+ // implementations (e.g., kotlin.collections.EmptyMap or java.util.Collections.SingletonMap)
59
+ // that may or may not be generic. Since we generally cannot return a generic serializer using Java class only,
60
+ // all attempts to get map serializer using only .javaClass should return null.
61
+ assertNull(serializerOrNull(emptyMap<String , String >().javaClass))
62
+ assertNull(serializerOrNull(mapOf<String , String >(" a" to " b" ).javaClass))
63
+ assertNull(serializerOrNull(mapOf<String , String >(" a" to " b" , " b" to " c" ).javaClass))
64
+ // Correct ways of retrieving map serializer:
65
+ assertContains(
66
+ serializer(typeTokenOf<Map <String , String >>()).descriptor.serialName,
67
+ " kotlin.collections.LinkedHashMap"
68
+ )
69
+ assertContains(
70
+ serializer(typeTokenOf< java.util.LinkedHashMap <String , String >>()).descriptor.serialName,
71
+ " kotlin.collections.LinkedHashMap"
72
+ )
73
+ assertContains(
74
+ serializer(typeOf<LinkedHashMap <String , String >>()).descriptor.serialName,
75
+ " kotlin.collections.LinkedHashMap"
76
+ )
77
+ }
78
+
79
+ @Test
80
+ fun testTopLevelSetsAndLists () {
81
+ // Same reasoning as for maps
82
+ assertNull(serializerOrNull(emptyList<String >().javaClass))
83
+ assertNull(serializerOrNull(listOf<String >(" a" ).javaClass))
84
+ assertNull(serializerOrNull(listOf<String >(" a" , " b" ).javaClass))
85
+ assertNull(serializerOrNull(emptySet<String >().javaClass))
86
+ assertNull(serializerOrNull(setOf<String >(" a" ).javaClass))
87
+ assertNull(serializerOrNull(setOf<String >(" a" , " b" ).javaClass))
88
+ assertContains(
89
+ serializer(typeTokenOf<Set <String >>()).descriptor.serialName,
90
+ " kotlin.collections.LinkedHashSet"
91
+ )
92
+ assertContains(
93
+ serializer(typeTokenOf<List <String >>()).descriptor.serialName,
94
+ " kotlin.collections.ArrayList"
95
+ )
96
+ assertContains(
97
+ serializer(typeTokenOf< java.util.LinkedHashSet <String >>()).descriptor.serialName,
98
+ " kotlin.collections.LinkedHashSet"
99
+ )
100
+ assertContains(
101
+ serializer(typeTokenOf< java.util.ArrayList <String >>()).descriptor.serialName,
102
+ " kotlin.collections.ArrayList"
103
+ )
104
+ }
105
+
106
+ @Test
107
+ fun testAnonymousObject () {
108
+ val obj: Any = object {}
109
+ assertNull(serializerOrNull(obj.javaClass))
110
+ }
52
111
}
112
+
0 commit comments