Skip to content

Commit 778321f

Browse files
authored
Enum and onject serializer lookup tests (Kotlin#1505)
Tests for Kotlin#1386 : * added `.serializer()` invoke for enums with generated and external serializers * added tests on object's serializer lookup and `.serializer()` invoke * added `assertFails` calls for platforms on which the lookup is broken and needs to be fixed in the future
1 parent f7a7141 commit 778321f

File tree

3 files changed

+108
-8
lines changed

3 files changed

+108
-8
lines changed

core/commonTest/src/kotlinx/serialization/SerializersLookupEnumTest.kt

+17-8
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ class SerializersLookupEnumTest {
3131
@Serializable(with = EnumExternalClassSerializer::class)
3232
enum class EnumExternalClass
3333

34-
@Serializer(forClass = EnumExternalObject::class)
34+
@Serializer(forClass = EnumExternalClass::class)
3535
class EnumExternalClassSerializer {
3636
override val descriptor: SerialDescriptor = buildSerialDescriptor("tmp", SerialKind.ENUM)
3737

38-
override fun serialize(encoder: Encoder, value: EnumExternalObject) {
38+
override fun serialize(encoder: Encoder, value: EnumExternalClass) {
3939
TODO()
4040
}
4141

42-
override fun deserialize(decoder: Decoder): EnumExternalObject {
42+
override fun deserialize(decoder: Decoder): EnumExternalClass {
4343
TODO()
4444
}
4545
}
@@ -56,24 +56,33 @@ class SerializersLookupEnumTest {
5656
}
5757

5858
@Test
59-
@Ignore
6059
fun testEnumExternalObject() {
61-
assertFailsWith<SerializationException> { (serializer<EnumExternalObject>()) }
60+
assertSame(EnumExternalObjectSerializer, EnumExternalObject.serializer())
61+
assertSame(EnumExternalObjectSerializer, serializer<EnumExternalObject>())
6262
}
6363

6464
@Test
65-
@Ignore
6665
fun testEnumExternalClass() {
67-
assertFailsWith<SerializationException> { serializer<EnumExternalClass>() }
66+
assertIs<EnumExternalClassSerializer>(EnumExternalClass.serializer())
67+
68+
if (isJvm()) {
69+
assertIs<EnumExternalClassSerializer>(serializer<EnumExternalClass>())
70+
} else if (isJsIr() || isNative()) {
71+
// FIXME serializer<EnumWithClassSerializer> is broken for K/JS and K/Native. Remove `assertFails` after fix
72+
assertFails { serializer<EnumExternalClass>() }
73+
}
6874
}
6975

7076
@Test
7177
fun testEnumPolymorphic() {
72-
jvmOnly {
78+
if (isJvm()) {
7379
assertEquals(
7480
PolymorphicSerializer(EnumPolymorphic::class).descriptor,
7581
serializer<EnumPolymorphic>().descriptor
7682
)
83+
} else {
84+
// FIXME serializer<PolymorphicEnum> is broken for K/JS and K/Native. Remove `assertFails` after fix
85+
assertFails { serializer<EnumPolymorphic>() }
7786
}
7887
}
7988
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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
6+
7+
import kotlinx.serialization.descriptors.*
8+
import kotlinx.serialization.encoding.*
9+
import kotlinx.serialization.test.*
10+
import kotlin.test.*
11+
12+
@Suppress("RemoveExplicitTypeArguments") // This is exactly what's being tested
13+
class SerializersLookupObjectTest {
14+
@Serializable(with = ObjectExternalObjectSerializer::class)
15+
object ObjectExternalObject
16+
17+
@Serializer(forClass = ObjectExternalObject::class)
18+
object ObjectExternalObjectSerializer {
19+
override val descriptor: SerialDescriptor = buildSerialDescriptor("tmp", StructureKind.OBJECT)
20+
21+
override fun serialize(encoder: Encoder, value: ObjectExternalObject) {
22+
TODO()
23+
}
24+
25+
override fun deserialize(decoder: Decoder): ObjectExternalObject {
26+
TODO()
27+
}
28+
}
29+
30+
@Serializable(with = ObjectExternalClassSerializer::class)
31+
object ObjectExternalClass
32+
33+
@Serializer(forClass = ObjectExternalClass::class)
34+
class ObjectExternalClassSerializer {
35+
override val descriptor: SerialDescriptor = buildSerialDescriptor("tmp", StructureKind.OBJECT)
36+
37+
override fun serialize(encoder: Encoder, value: ObjectExternalClass) {
38+
TODO()
39+
}
40+
41+
override fun deserialize(decoder: Decoder): ObjectExternalClass {
42+
TODO()
43+
}
44+
}
45+
46+
@Polymorphic
47+
object ObjectPolymorphic
48+
49+
@Serializable
50+
object PlainObject
51+
52+
@Test
53+
fun testPlainObject() {
54+
if (!isJsLegacy()) {
55+
assertSame(PlainObject.serializer(), serializer<PlainObject>())
56+
}
57+
}
58+
59+
60+
@Test
61+
fun testObjectExternalObject() {
62+
assertSame(ObjectExternalObjectSerializer, ObjectExternalObject.serializer())
63+
if (!isJsLegacy()) {
64+
assertSame(ObjectExternalObjectSerializer, serializer<ObjectExternalObject>())
65+
}
66+
}
67+
68+
@Test
69+
fun testObjectExternalClass() {
70+
assertIs<ObjectExternalClassSerializer>(ObjectExternalClass.serializer())
71+
72+
if (!isJsLegacy()) {
73+
assertIs<ObjectExternalClassSerializer>(serializer<ObjectExternalClass>())
74+
}
75+
}
76+
77+
@Test
78+
fun testEnumPolymorphic() {
79+
if (isJvm()) {
80+
assertEquals(
81+
PolymorphicSerializer(ObjectPolymorphic::class).descriptor,
82+
serializer<ObjectPolymorphic>().descriptor
83+
)
84+
} else {
85+
// FIXME serializer<PolymorphicObject> is broken for K/JS and K/Native. Remove `assertFails` after fix
86+
assertFails { serializer<ObjectPolymorphic>() }
87+
}
88+
89+
}
90+
}

core/commonTest/src/kotlinx/serialization/test/CurrentPlatform.common.kt

+1
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public expect val currentPlatform: Platform
1212

1313
public fun isJs(): Boolean = currentPlatform == Platform.JS_LEGACY || currentPlatform == Platform.JS_IR
1414
public fun isJsLegacy(): Boolean = currentPlatform == Platform.JS_LEGACY
15+
public fun isJsIr(): Boolean = currentPlatform == Platform.JS_IR
1516
public fun isJvm(): Boolean = currentPlatform == Platform.JVM
1617
public fun isNative(): Boolean = currentPlatform == Platform.NATIVE

0 commit comments

Comments
 (0)