1 /* 2 * Copyright 2017-2020 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.builtins.* 9 import kotlinx.serialization.json.internal.* 10 import kotlinx.serialization.test.assertFailsWithSerial 11 import kotlin.test.* 12 13 class LenientTest : JsonTestBase() { 14 15 @Serializable 16 data class Holder(val i: Int, val l: Long, val b: Boolean, val s: String) 17 val value = Holder(1, 2, true, "string") 18 19 @Serializable 20 data class ListHolder(val l: List<String>) 21 private val listValue = ListHolder(listOf("1", "2", "ss")) 22 23 @Test <lambda>null24 fun testQuotedInt() = parametrizedTest { 25 val json = """{"i":"1", "l":2, "b":true, "s":"string"}""" 26 assertEquals(value, default.decodeFromString(Holder.serializer(), json, it)) 27 assertEquals(value, lenient.decodeFromString(Holder.serializer(), json, it)) 28 } 29 30 @Test testQuotedLongnull31 fun testQuotedLong() = parametrizedTest { 32 val json = """{"i":1, "l":"2", "b":true, "s":"string"}""" 33 assertEquals(value, default.decodeFromString(Holder.serializer(), json, it)) 34 assertEquals(value, lenient.decodeFromString(Holder.serializer(), json, it)) 35 } 36 37 @Test <lambda>null38 fun testQuotedBoolean() = parametrizedTest { 39 val json = """{"i":1, "l":2, "b":"true", "s":"string"}""" 40 assertEquals(value, default.decodeFromString(Holder.serializer(), json, it)) 41 assertEquals(value, lenient.decodeFromString(Holder.serializer(), json, it)) 42 } 43 44 @Test <lambda>null45 fun testUnquotedStringValue() = parametrizedTest { 46 val json = """{"i":1, "l":2, "b":true, "s":string}""" 47 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), json, it) } 48 assertEquals(value, lenient.decodeFromString(Holder.serializer(), json, it)) 49 } 50 51 @Test <lambda>null52 fun testUnquotedKey() = parametrizedTest { 53 val json = """{"i":1, "l":2, b:true, "s":"string"}""" 54 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), json, it) } 55 assertEquals(value, lenient.decodeFromString(Holder.serializer(), json, it)) 56 } 57 58 @Test testUnquotedStringInArraynull59 fun testUnquotedStringInArray() = parametrizedTest { 60 val json = """{"l":[1, 2, ss]}""" 61 assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(ListHolder.serializer(), json, it) } 62 assertEquals(listValue, lenient.decodeFromString(ListHolder.serializer(), json, it)) 63 } 64 65 @Serializable 66 data class StringWrapper(val s: String) 67 68 @Test <lambda>null69 fun testNullsProhibited() = parametrizedTest { 70 assertEquals(StringWrapper("nul"), lenient.decodeFromString("""{"s":nul}""", it)) 71 assertEquals(StringWrapper("null1"), lenient.decodeFromString("""{"s":null1}""", it)) 72 assertFailsWithSerial("JsonDecodingException") { lenient.decodeFromString<StringWrapper>("""{"s":null}""", it) } 73 } 74 75 @Serializable 76 data class NullableString(val s: String?) 77 78 @Test <lambda>null79 fun testNullsAllowed() = parametrizedTest { 80 assertEquals(NullableString("nul"), lenient.decodeFromString("""{"s":nul}""", it)) 81 assertEquals(NullableString("null1"), lenient.decodeFromString("""{"s":null1}""", it)) 82 assertEquals(NullableString(null), lenient.decodeFromString("""{"s":null}""", it)) 83 assertEquals(NullableString("null"), lenient.decodeFromString("""{"s":"null"}""", it)) 84 assertEquals(NullableString("null"), lenient.decodeFromString("""{"s":"null" }""", it)) 85 assertEquals(NullableString("null "), lenient.decodeFromString("""{"s":"null " }""", it)) 86 } 87 88 @Test <lambda>null89 fun testTopLevelNulls() = parametrizedTest { 90 assertEquals("nul", lenient.decodeFromString("""nul""", it)) 91 assertEquals("null1", lenient.decodeFromString("""null1""", it)) 92 assertEquals(null, lenient.decodeFromString(String.serializer().nullable, """null""", it)) 93 assertEquals("null", lenient.decodeFromString(""""null"""", it)) 94 assertEquals("null ", lenient.decodeFromString(""""null """", it)) 95 } 96 } 97