summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/features/LocalClassesTest.kt
blob: 82a5ca6458216f12f01cb4a89fc1667cfc39f20d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package kotlinx.serialization.features

import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.json.*
import kotlinx.serialization.test.*
import kotlin.test.*

class LocalClassesTest {
    object ObjectCustomSerializer: KSerializer<Any?> {
        override val descriptor: SerialDescriptor = buildSerialDescriptor("tmp", PrimitiveKind.INT)
        override fun serialize(encoder: Encoder, value: Any?) {
            encoder.encodeNull()
        }

        override fun deserialize(decoder: Decoder): Any? {
            return decoder.decodeNull()
        }
    }

    class ClassCustomSerializer: KSerializer<Any?> {
        override val descriptor: SerialDescriptor = buildSerialDescriptor("tmp", PrimitiveKind.INT)
        override fun serialize(encoder: Encoder, value: Any?) {
            encoder.encodeNull()
        }

        override fun deserialize(decoder: Decoder): Any? {
            return decoder.decodeNull()
        }
    }

    @Test
    fun testGeneratedSerializer() {
        @Serializable
        data class Local(val i: Int)

        val origin = Local(42)

        val decoded: Local = Json.decodeFromString(Json.encodeToString(origin))
        assertEquals(origin, decoded)
    }

    @Test
    fun testInLambda() {
        42.let {
            @Serializable
            data class Local(val i: Int)

            val origin = Local(it)

            val decoded: Local = Json.decodeFromString(Json.encodeToString(origin))
            assertEquals(origin, decoded)
        }
    }

    @Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
    @Test
    fun testObjectCustomSerializer() {
        @Serializable(with = ObjectCustomSerializer::class)
        data class Local(val i: Int)

        val origin: Local? = null

        val decoded: Local? = Json.decodeFromString(Json.encodeToString(origin))
        assertEquals(origin, decoded)
    }

    @Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
    @Test
    fun testClassCustomSerializer() {
        @Serializable(with = ClassCustomSerializer::class)
        data class Local(val i: Int)

        val origin: Local? = null

        // FIXME change to `noLegacyJs` when lookup of `ClassCustomSerializer` will work on Native and JS/IR
        jvmOnly {
            val decoded: Local? = Json.decodeFromString(Json.encodeToString(origin))
            assertEquals(origin, decoded)
        }
    }

}