summaryrefslogtreecommitdiff
path: root/formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonCoerceInputValuesDynamicTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonCoerceInputValuesDynamicTest.kt')
-rw-r--r--formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonCoerceInputValuesDynamicTest.kt98
1 files changed, 98 insertions, 0 deletions
diff --git a/formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonCoerceInputValuesDynamicTest.kt b/formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonCoerceInputValuesDynamicTest.kt
new file mode 100644
index 00000000..00053297
--- /dev/null
+++ b/formats/json-tests/jsTest/src/kotlinx/serialization/json/JsonCoerceInputValuesDynamicTest.kt
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+package kotlinx.serialization.json
+
+import kotlinx.serialization.*
+import kotlin.test.*
+
+class JsonCoerceInputValuesDynamicTest {
+ val json = Json {
+ coerceInputValues = true
+ isLenient = true
+ }
+
+ private fun <T> doTest(inputs: List<dynamic>, expected: T, serializer: KSerializer<T>) {
+ for (input in inputs) {
+ assertEquals(expected, json.decodeFromDynamic(serializer, input), "Failed on input: $input")
+ }
+ }
+
+ @Test
+ fun testUseDefaultOnNonNullableBooleanDynamic() = doTest(
+ listOf(
+ js("""{"b":false}"""),
+ js("""{"b":null}"""),
+ js("""{}"""),
+ ),
+ JsonCoerceInputValuesTest.WithBoolean(),
+ JsonCoerceInputValuesTest.WithBoolean.serializer()
+ )
+
+ @Test
+ fun testUseDefaultOnUnknownEnum() {
+ doTest(
+ listOf(
+ js("""{"e":"unknown_value"}"""),
+ js("""{"e":null}"""),
+ js("""{}"""),
+ ),
+ JsonCoerceInputValuesTest.WithEnum(),
+ JsonCoerceInputValuesTest.WithEnum.serializer()
+ )
+ assertFailsWith<SerializationException> {
+ json.decodeFromDynamic(
+ JsonCoerceInputValuesTest.WithEnum.serializer(),
+ js("""{"e":{"x":"definitely not a valid enum value"}}""")
+ )
+ }
+ }
+
+ @Test
+ fun testUseDefaultInMultipleCases() {
+ val testData = mapOf<dynamic, JsonCoerceInputValuesTest.MultipleValues>(
+ Pair(
+ js("""{"data":{"data":"foo"},"data2":null,"i":null,"e":null,"foo":"bar"}"""),
+ JsonCoerceInputValuesTest.MultipleValues(
+ StringData("foo"),
+ foo = "bar"
+ )
+ ),
+ Pair(
+ js("""{"data":{"data":"foo"},"data2":{"intV":42},"i":null,"e":null,"foo":"bar"}"""),
+ JsonCoerceInputValuesTest.MultipleValues(
+ StringData(
+ "foo"
+ ), IntData(42), foo = "bar"
+ )
+ ),
+ Pair(
+ js("""{"data":{"data":"foo"},"data2":{"intV":42},"i":0,"e":"NoOption","foo":"bar"}"""),
+ JsonCoerceInputValuesTest.MultipleValues(
+ StringData("foo"),
+ IntData(42),
+ i = 0,
+ foo = "bar"
+ )
+ ),
+ Pair(
+ js("""{"data":{"data":"foo"},"data2":{"intV":42},"i":0,"e":"OptionC","foo":"bar"}"""),
+ JsonCoerceInputValuesTest.MultipleValues(
+ StringData("foo"),
+ IntData(42),
+ i = 0,
+ e = SampleEnum.OptionC,
+ foo = "bar"
+ )
+ ),
+ )
+ for ((input, expected) in testData) {
+ assertEquals(
+ expected,
+ json.decodeFromDynamic(JsonCoerceInputValuesTest.MultipleValues.serializer(), input),
+ "Failed on input: $input"
+ )
+ }
+ }
+}