summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonModesTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonModesTest.kt')
-rw-r--r--formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonModesTest.kt128
1 files changed, 128 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonModesTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonModesTest.kt
new file mode 100644
index 00000000..e7f107c8
--- /dev/null
+++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonModesTest.kt
@@ -0,0 +1,128 @@
+/*
+ * 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 kotlinx.serialization.test.*
+import kotlin.test.*
+
+class JsonModesTest : JsonTestBase() {
+
+ @Test
+ fun testNan() = parametrizedTest(lenient) {
+ assertStringFormAndRestored("{\"double\":NaN,\"float\":NaN}", Box(Double.NaN, Float.NaN), Box.serializer())
+ }
+
+ @Test
+ fun testInfinity() = parametrizedTest(lenient) {
+ assertStringFormAndRestored(
+ "{\"double\":Infinity,\"float\":-Infinity}",
+ Box(Double.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY),
+ Box.serializer()
+ )
+ }
+
+ @Test
+ fun nonStrictJsonCanSkipValues() = parametrizedTest { jsonTestingMode ->
+ val data = JsonOptionalTests.Data()
+ assertEquals(
+ lenient.decodeFromString(JsonOptionalTests.Data.serializer(), "{strangeField: 100500, a:0}", jsonTestingMode),
+ data
+ )
+ assertEquals(
+ lenient.decodeFromString(JsonOptionalTests.Data.serializer(), "{a:0, strangeField: 100500}", jsonTestingMode),
+ data
+ )
+ }
+
+ @Test
+ fun nonStrictJsonCanSkipComplexValues() = parametrizedTest { jsonTestingMode ->
+ val data = JsonOptionalTests.Data()
+
+ assertEquals(
+ lenient.decodeFromString(
+ JsonOptionalTests.Data.serializer(),
+ "{a: 0, strangeField: {a: b, c: {d: e}, f: [g,h,j] }}",
+ jsonTestingMode
+ ),
+ data
+ )
+ assertEquals(
+ lenient.decodeFromString(
+ JsonOptionalTests.Data.serializer(),
+ "{strangeField: {a: b, c: {d: e}, f: [g,h,j] }, a: 0}",
+ jsonTestingMode
+ ),
+ data
+ )
+ }
+
+ @Test
+ fun ignoreKeysCanIgnoreWeirdStringValues() {
+ val data = JsonOptionalTests.Data()
+ fun doTest(input: String) {
+ assertEquals(data, lenient.decodeFromString(input))
+ }
+ doTest("{a: 0, strangeField: [\"imma string with } bracket\", \"sss\"]}")
+ doTest("{a: 0, strangeField: [\"imma string with ] bracket\", \"sss\"]}")
+ doTest("{a: 0, strangeField: \"imma string with } bracket\"}")
+ doTest("{a: 0, strangeField: \"imma string with ] bracket\"}")
+ doTest("{a: 0, strangeField: {key: \"imma string with ] bracket\"}}")
+ doTest("{a: 0, strangeField: {key: \"imma string with } bracket\"}}")
+ doTest("""{"a": 0, "strangeField": {"key": "imma string with } bracket"}}""")
+ doTest("""{"a": 0, "strangeField": {"key": "imma string with ] bracket"}}""")
+ doTest("""{"a": 0, "strangeField": ["imma string with ] bracket"]}""")
+ doTest("""{"a": 0, "strangeField": ["imma string with } bracket"]}""")
+ }
+
+ @Serializable
+ class Empty
+
+ @Test
+ fun lenientThrowOnMalformedString() {
+ fun doTest(input: String) {
+ assertFailsWith<SerializationException> { lenient.decodeFromString(Empty.serializer(), input) }
+ }
+ doTest("""{"a":[{"b":[{"c":{}d",""e"":"}]}""")
+ doTest("""{"a":[}""")
+ doTest("""{"a":""")
+ lenient.decodeFromString(Empty.serializer(), """{"a":[]}""") // should not throw
+ }
+
+ @Test
+ fun testSerializeQuotedJson() = parametrizedTest { jsonTestingMode ->
+ assertEquals(
+ """{"a":10,"e":false,"c":"Hello"}""", default.encodeToString(
+ JsonTransientTest.Data.serializer(),
+ JsonTransientTest.Data(10, 100), jsonTestingMode
+ )
+ )
+ }
+
+ @Test
+ fun testStrictJsonCanNotSkipValues() = parametrizedTest { jsonTestingMode ->
+ assertFailsWith(SerializationException::class) {
+ default.decodeFromString(JsonOptionalTests.Data.serializer(), "{strangeField: 100500, a:0}", jsonTestingMode)
+ }
+ }
+
+ @Serializable
+ data class Box(val double: Double, val float: Float)
+
+
+ @Serializable
+ object Object
+
+ @Serializable
+ data class Holder(val o: Object)
+
+ @Test
+ fun testIgnoreUnknownKeysObject() = parametrizedTest { jsonTestingMode ->
+ assertEquals(Holder(Object), lenient.decodeFromString("""{"o":{}}""", jsonTestingMode))
+ assertEquals(Holder(Object), lenient.decodeFromString("""{"o":{"unknown":{"b":"c"}}}""", jsonTestingMode))
+ assertEquals(Object, lenient.decodeFromString("""{}""", jsonTestingMode))
+ assertEquals(Object, lenient.decodeFromString("""{"o":{"unknown":{"b":"c"}}}""", jsonTestingMode))
+ }
+}