• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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