1717package kotlinx.serialization
1818
1919import kotlinx.serialization.json.Json
20+ import kotlinx.serialization.test.typeTokenOf
2021import org.junit.Test
2122import java.util.HashMap
2223import java.util.HashSet
2324import kotlin.collections.LinkedHashMap
2425import kotlin.collections.Map
2526import kotlin.collections.hashMapOf
2627import kotlin.collections.hashSetOf
27- import kotlin.test.assertEquals
28+ import kotlin.reflect.*
29+ import kotlin.test.*
2830
2931
3032class JavaCollectionsTest {
@@ -38,7 +40,7 @@ class JavaCollectionsTest {
3840 )
3941
4042 @Test
41- fun test () {
43+ fun testJavaCollectionsInsideClass () {
4244 val original = HasHashMap (" 42" , hashMapOf(1 to " 1" , 2 to " 2" ), hashSetOf(11 ), LinkedHashMap (), null )
4345 val serializer = HasHashMap .serializer()
4446 val string = Json .encodeToString(serializer = serializer, value = original)
@@ -49,4 +51,62 @@ class JavaCollectionsTest {
4951 val restored = Json .decodeFromString(deserializer = serializer, string = string)
5052 assertEquals(expected = original, actual = restored)
5153 }
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+ }
52111}
112+
0 commit comments