1 /* <lambda>null2 * 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 kotlinx.serialization.test.* 9 import kotlin.test.* 10 11 class JsonModesTest : JsonTestBase() { 12 13 @Test 14 fun testNan() = parametrizedTest(lenient) { 15 assertStringFormAndRestored("{\"double\":NaN,\"float\":NaN}", Box(Double.NaN, Float.NaN), Box.serializer()) 16 } 17 18 @Test 19 fun testInfinity() = parametrizedTest(lenient) { 20 assertStringFormAndRestored( 21 "{\"double\":Infinity,\"float\":-Infinity}", 22 Box(Double.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY), 23 Box.serializer() 24 ) 25 } 26 27 @Test 28 fun nonStrictJsonCanSkipValues() = parametrizedTest { jsonTestingMode -> 29 val data = JsonOptionalTests.Data() 30 assertEquals( 31 lenient.decodeFromString(JsonOptionalTests.Data.serializer(), "{strangeField: 100500, a:0}", jsonTestingMode), 32 data 33 ) 34 assertEquals( 35 lenient.decodeFromString(JsonOptionalTests.Data.serializer(), "{a:0, strangeField: 100500}", jsonTestingMode), 36 data 37 ) 38 } 39 40 @Test 41 fun nonStrictJsonCanSkipComplexValues() = parametrizedTest { jsonTestingMode -> 42 val data = JsonOptionalTests.Data() 43 44 assertEquals( 45 lenient.decodeFromString( 46 JsonOptionalTests.Data.serializer(), 47 "{a: 0, strangeField: {a: b, c: {d: e}, f: [g,h,j] }}", 48 jsonTestingMode 49 ), 50 data 51 ) 52 assertEquals( 53 lenient.decodeFromString( 54 JsonOptionalTests.Data.serializer(), 55 "{strangeField: {a: b, c: {d: e}, f: [g,h,j] }, a: 0}", 56 jsonTestingMode 57 ), 58 data 59 ) 60 } 61 62 @Test 63 fun ignoreKeysCanIgnoreWeirdStringValues() { 64 val data = JsonOptionalTests.Data() 65 fun doTest(input: String) { 66 assertEquals(data, lenient.decodeFromString(input)) 67 } 68 doTest("{a: 0, strangeField: [\"imma string with } bracket\", \"sss\"]}") 69 doTest("{a: 0, strangeField: [\"imma string with ] bracket\", \"sss\"]}") 70 doTest("{a: 0, strangeField: \"imma string with } bracket\"}") 71 doTest("{a: 0, strangeField: \"imma string with ] bracket\"}") 72 doTest("{a: 0, strangeField: {key: \"imma string with ] bracket\"}}") 73 doTest("{a: 0, strangeField: {key: \"imma string with } bracket\"}}") 74 doTest("""{"a": 0, "strangeField": {"key": "imma string with } bracket"}}""") 75 doTest("""{"a": 0, "strangeField": {"key": "imma string with ] bracket"}}""") 76 doTest("""{"a": 0, "strangeField": ["imma string with ] bracket"]}""") 77 doTest("""{"a": 0, "strangeField": ["imma string with } bracket"]}""") 78 } 79 80 @Serializable 81 class Empty 82 83 @Test 84 fun lenientThrowOnMalformedString() { 85 fun doTest(input: String) { 86 assertFailsWith<SerializationException> { lenient.decodeFromString(Empty.serializer(), input) } 87 } 88 doTest("""{"a":[{"b":[{"c":{}d",""e"":"}]}""") 89 doTest("""{"a":[}""") 90 doTest("""{"a":""") 91 lenient.decodeFromString(Empty.serializer(), """{"a":[]}""") // should not throw 92 } 93 94 @Test 95 fun testSerializeQuotedJson() = parametrizedTest { jsonTestingMode -> 96 assertEquals( 97 """{"a":10,"e":false,"c":"Hello"}""", default.encodeToString( 98 JsonTransientTest.Data.serializer(), 99 JsonTransientTest.Data(10, 100), jsonTestingMode 100 ) 101 ) 102 } 103 104 @Test 105 fun testStrictJsonCanNotSkipValues() = parametrizedTest { jsonTestingMode -> 106 assertFailsWith(SerializationException::class) { 107 default.decodeFromString(JsonOptionalTests.Data.serializer(), "{strangeField: 100500, a:0}", jsonTestingMode) 108 } 109 } 110 111 @Serializable 112 data class Box(val double: Double, val float: Float) 113 114 115 @Serializable 116 object Object 117 118 @Serializable 119 data class Holder(val o: Object) 120 121 @Test 122 fun testIgnoreUnknownKeysObject() = parametrizedTest { jsonTestingMode -> 123 assertEquals(Holder(Object), lenient.decodeFromString("""{"o":{}}""", jsonTestingMode)) 124 assertEquals(Holder(Object), lenient.decodeFromString("""{"o":{"unknown":{"b":"c"}}}""", jsonTestingMode)) 125 assertEquals(Object, lenient.decodeFromString("""{}""", jsonTestingMode)) 126 assertEquals(Object, lenient.decodeFromString("""{"o":{"unknown":{"b":"c"}}}""", jsonTestingMode)) 127 } 128 } 129