• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017-2021 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 kotlin.test.*
9 
10 class JsonCoerceInputValuesDynamicTest {
<lambda>null11     val json = Json {
12         coerceInputValues = true
13         isLenient = true
14     }
15 
doTestnull16     private fun <T> doTest(inputs: List<dynamic>, expected: T, serializer: KSerializer<T>) {
17         for (input in inputs) {
18             assertEquals(expected, json.decodeFromDynamic(serializer, input), "Failed on input: $input")
19         }
20     }
21 
22     @Test
testUseDefaultOnNonNullableBooleanDynamicnull23     fun testUseDefaultOnNonNullableBooleanDynamic() = doTest(
24         listOf(
25             js("""{"b":false}"""),
26             js("""{"b":null}"""),
27             js("""{}"""),
28         ),
29         JsonCoerceInputValuesTest.WithBoolean(),
30         JsonCoerceInputValuesTest.WithBoolean.serializer()
31     )
32 
33     @Test
34     fun testUseDefaultOnUnknownEnum() {
35         doTest(
36             listOf(
37                 js("""{"e":"unknown_value"}"""),
38                 js("""{"e":null}"""),
39                 js("""{}"""),
40             ),
41             JsonCoerceInputValuesTest.WithEnum(),
42             JsonCoerceInputValuesTest.WithEnum.serializer()
43         )
44         assertFailsWith<SerializationException> {
45             json.decodeFromDynamic(
46                 JsonCoerceInputValuesTest.WithEnum.serializer(),
47                 js("""{"e":{"x":"definitely not a valid enum value"}}""")
48             )
49         }
50     }
51 
52     @Test
testUseDefaultInMultipleCasesnull53     fun testUseDefaultInMultipleCases() {
54         val testData = mapOf<dynamic, JsonCoerceInputValuesTest.MultipleValues>(
55             Pair(
56                 js("""{"data":{"data":"foo"},"data2":null,"i":null,"e":null,"foo":"bar"}"""),
57                 JsonCoerceInputValuesTest.MultipleValues(
58                     StringData("foo"),
59                     foo = "bar"
60                 )
61             ),
62             Pair(
63                 js("""{"data":{"data":"foo"},"data2":{"intV":42},"i":null,"e":null,"foo":"bar"}"""),
64                 JsonCoerceInputValuesTest.MultipleValues(
65                     StringData(
66                         "foo"
67                     ), IntData(42), foo = "bar"
68                 )
69             ),
70             Pair(
71                 js("""{"data":{"data":"foo"},"data2":{"intV":42},"i":0,"e":"NoOption","foo":"bar"}"""),
72                 JsonCoerceInputValuesTest.MultipleValues(
73                     StringData("foo"),
74                     IntData(42),
75                     i = 0,
76                     foo = "bar"
77                 )
78             ),
79             Pair(
80                 js("""{"data":{"data":"foo"},"data2":{"intV":42},"i":0,"e":"OptionC","foo":"bar"}"""),
81                 JsonCoerceInputValuesTest.MultipleValues(
82                     StringData("foo"),
83                     IntData(42),
84                     i = 0,
85                     e = SampleEnum.OptionC,
86                     foo = "bar"
87                 )
88             ),
89         )
90         for ((input, expected) in testData) {
91             assertEquals(
92                 expected,
93                 json.decodeFromDynamic(JsonCoerceInputValuesTest.MultipleValues.serializer(), input),
94                 "Failed on input: $input"
95             )
96         }
97     }
98 }
99