1 /* 2 * Copyright 2017-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.serialization.features 6 7 import kotlinx.serialization.* 8 import kotlinx.serialization.json.* 9 import kotlinx.serialization.modules.* 10 import kotlinx.serialization.test.* 11 import kotlin.test.* 12 13 class ObjectSerializationTest : JsonTestBase() { 14 15 sealed class ApiResponse { 16 @Serializable 17 @SerialName("ApiError") 18 object Error : ApiResponse() 19 20 @Serializable 21 @SerialName("ApiResponse") 22 data class Response(val message: String) : ApiResponse() 23 } 24 25 @Serializable 26 data class ApiCarrier(@Polymorphic val response: ApiResponse) 27 <lambda>null28 val module = SerializersModule { 29 polymorphic(ApiResponse::class) { 30 subclass(ApiResponse.Error.serializer()) 31 subclass(ApiResponse.Response.serializer()) 32 } 33 } 34 <lambda>null35 val json = Json { serializersModule = module } 36 37 @Test testSealedClassSerializationnull38 fun testSealedClassSerialization() { 39 val carrier1 = ApiCarrier(ApiResponse.Error) 40 val carrier2 = ApiCarrier(ApiResponse.Response("OK")) 41 assertJsonFormAndRestored(ApiCarrier.serializer(), carrier1, """{"response":{"type":"ApiError"}}""", json) 42 assertJsonFormAndRestored( 43 ApiCarrier.serializer(), 44 carrier2, 45 """{"response":{"type":"ApiResponse","message":"OK"}}""", 46 json 47 ) 48 } 49 50 @Test testUnknownKeysnull51 fun testUnknownKeys() { 52 val string = """{"metadata":"foo"}""" 53 assertFailsWithMessage<SerializationException>("ignoreUnknownKeys") { 54 Json.decodeFromString( 55 ApiResponse.Error.serializer(), 56 string 57 ) 58 } 59 val json = Json { ignoreUnknownKeys = true } 60 assertEquals(ApiResponse.Error, json.decodeFromString(ApiResponse.Error.serializer(), string)) 61 } 62 } 63