• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.json
6 
7 import kotlinx.serialization.*
8 import kotlinx.serialization.builtins.*
9 import kotlinx.serialization.descriptors.*
10 import kotlinx.serialization.encoding.*
11 import kotlin.test.*
12 
13 class MapLikeSerializerTest : JsonTestBase() {
14 
15     @Serializable
16     data class StringPair(val a: String, val b: String)
17 
18     object StringPairSerializer : KSerializer<StringPair> {
19 
<lambda>null20         override val descriptor: SerialDescriptor = buildSerialDescriptor("package.StringPair", StructureKind.MAP) {
21             element<String>("a")
22             element<String>("b")
23         }
24 
serializenull25         override fun serialize(encoder: Encoder, value: StringPair) {
26             val structuredEncoder = encoder.beginStructure(descriptor)
27             structuredEncoder.encodeSerializableElement(descriptor, 0, String.serializer(), value.a)
28             structuredEncoder.encodeSerializableElement(descriptor, 1, String.serializer(), value.b)
29             structuredEncoder.endStructure(descriptor)
30         }
31 
deserializenull32         override fun deserialize(decoder: Decoder): StringPair {
33             val composite = decoder.beginStructure(descriptor)
34             if (composite.decodeSequentially()) {
35                 val key = composite.decodeSerializableElement(descriptor, 0, String.serializer())
36                 val value = composite.decodeSerializableElement(descriptor, 1, String.serializer())
37                 return StringPair(key, value)
38             }
39 
40             var key: String? = null
41             var value: String? = null
42             mainLoop@ while (true) {
43                 when (val idx = composite.decodeElementIndex(descriptor)) {
44                     CompositeDecoder.DECODE_DONE -> {
45                         break@mainLoop
46                     }
47                     0 -> {
48                         key = composite.decodeSerializableElement(descriptor, 0, String.serializer())
49                     }
50                     1 -> {
51                         value = composite.decodeSerializableElement(descriptor, 1, String.serializer())
52                     }
53                     else -> throw SerializationException("Invalid index: $idx")
54                 }
55             }
56             composite.endStructure(descriptor)
57             if (key == null) throw SerializationException("Element 'a' is missing")
58             if (value == null) throw SerializationException("Element 'b' is missing")
59             @Suppress("UNCHECKED_CAST")
60             return StringPair(key, value)
61         }
62     }
63 
64     @Test
testStringPairnull65     fun testStringPair() = assertJsonFormAndRestored(StringPairSerializer, StringPair("a", "b"), """{"a":"b"}""")
66 }
67