summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/features/ObjectSerialization.kt
blob: da5919c1f2c15dba604f63520f1fe0f8ffc44830 (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
/*
 * Copyright 2017-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.serialization.features

import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.modules.*
import kotlinx.serialization.test.*
import kotlin.test.*

class ObjectSerializationTest : JsonTestBase() {

    sealed class ApiResponse {
        @Serializable
        @SerialName("ApiError")
        object Error : ApiResponse()

        @Serializable
        @SerialName("ApiResponse")
        data class Response(val message: String) : ApiResponse()
    }

    @Serializable
    data class ApiCarrier(@Polymorphic val response: ApiResponse)

    val module = SerializersModule {
        polymorphic(ApiResponse::class) {
            subclass(ApiResponse.Error.serializer())
            subclass(ApiResponse.Response.serializer())
        }
    }

    val json = Json { serializersModule = module }

    @Test
    fun testSealedClassSerialization() {
        val carrier1 = ApiCarrier(ApiResponse.Error)
        val carrier2 = ApiCarrier(ApiResponse.Response("OK"))
        assertJsonFormAndRestored(ApiCarrier.serializer(), carrier1, """{"response":{"type":"ApiError"}}""", json)
        assertJsonFormAndRestored(
            ApiCarrier.serializer(),
            carrier2,
            """{"response":{"type":"ApiResponse","message":"OK"}}""",
            json
        )
    }

    @Test
    fun testUnknownKeys() {
        val string = """{"metadata":"foo"}"""
        assertFailsWithMessage<SerializationException>("ignoreUnknownKeys") {
            Json.decodeFromString(
                ApiResponse.Error.serializer(),
                string
            )
        }
        val json = Json { ignoreUnknownKeys = true }
        assertEquals(ApiResponse.Error, json.decodeFromString(ApiResponse.Error.serializer(), string))
    }
}