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