summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonUnquotedLiteralTest.kt
blob: e8090044cb5fa8575f891b1ec9cb619621f42bb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package kotlinx.serialization.json.serializers

import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.json.*
import kotlinx.serialization.test.assertFailsWithSerialMessage
import kotlin.test.Test
import kotlin.test.assertEquals

class JsonUnquotedLiteralTest : JsonTestBase() {

    private fun assertUnquotedLiteralEncoded(inputValue: String) {
        val unquotedElement = JsonUnquotedLiteral(inputValue)

        assertEquals(
            inputValue,
            unquotedElement.toString(),
            "expect JsonElement.toString() returns the unquoted input value"
        )

        parametrizedTest { mode ->
            assertEquals(inputValue, default.encodeToString(JsonElement.serializer(), unquotedElement, mode))
        }
    }

    @Test
    fun testUnquotedJsonNumbers() {
        assertUnquotedLiteralEncoded("1")
        assertUnquotedLiteralEncoded("-1")
        assertUnquotedLiteralEncoded("100.0")
        assertUnquotedLiteralEncoded("-100.0")

        assertUnquotedLiteralEncoded("9999999999999999999999999999999999999999999999999999999.9999999999999999999999999999999999999999999999999999999")
        assertUnquotedLiteralEncoded("-9999999999999999999999999999999999999999999999999999999.9999999999999999999999999999999999999999999999999999999")

        assertUnquotedLiteralEncoded("99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999")
        assertUnquotedLiteralEncoded("-99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999")

        assertUnquotedLiteralEncoded("2.99792458e8")
        assertUnquotedLiteralEncoded("-2.99792458e8")

        assertUnquotedLiteralEncoded("2.99792458E8")
        assertUnquotedLiteralEncoded("-2.99792458E8")

        assertUnquotedLiteralEncoded("11.399999999999")
        assertUnquotedLiteralEncoded("0.30000000000000004")
        assertUnquotedLiteralEncoded("0.1000000000000000055511151231257827021181583404541015625")
    }

    @Test
    fun testUnquotedJsonWhitespaceStrings() {
        assertUnquotedLiteralEncoded("")
        assertUnquotedLiteralEncoded("         ")
        assertUnquotedLiteralEncoded("\t")
        assertUnquotedLiteralEncoded("\t\t\t")
        assertUnquotedLiteralEncoded("\r\n")
        assertUnquotedLiteralEncoded("\n")
        assertUnquotedLiteralEncoded("\n\n\n")
    }

    @Test
    fun testUnquotedJsonStrings() {
        assertUnquotedLiteralEncoded("lorem")
        assertUnquotedLiteralEncoded(""""lorem"""")
        assertUnquotedLiteralEncoded(
            """
                Well, my name is Freddy Kreuger
                I've got the Elm Street blues
                I've got a hand like a knife rack
                And I die in every film!
            """.trimIndent()
        )
    }

    @Test
    fun testUnquotedJsonObjects() {
        assertUnquotedLiteralEncoded("""{"some":"json"}""")
        assertUnquotedLiteralEncoded("""{"some":"json","object":true,"count":1,"array":[1,2.0,-333,"4",boolean]}""")
    }

    @Test
    fun testUnquotedJsonArrays() {
        assertUnquotedLiteralEncoded("""[1,2,3]""")
        assertUnquotedLiteralEncoded("""["a","b","c"]""")
        assertUnquotedLiteralEncoded("""[true,false]""")
        assertUnquotedLiteralEncoded("""[1,2.0,-333,"4",boolean]""")
        assertUnquotedLiteralEncoded("""[{"some":"json","object":true,"count":1,"array":[1,2.0,-333,"4",boolean]}]""")
        assertUnquotedLiteralEncoded("""[{"some":"json","object":true,"count":1,"array":[1,2.0,-333,"4",boolean]},{"some":"json","object":true,"count":1,"array":[1,2.0,-333,"4",boolean]}]""")
    }

    @Test
    fun testUnquotedJsonNull() {
        assertEquals(JsonNull, JsonUnquotedLiteral(null))
    }

    @Test
    fun testUnquotedJsonNullString() {
        fun test(block: () -> Unit) {
            assertFailsWithSerialMessage(
                exceptionName = "JsonEncodingException",
                message = "Creating a literal unquoted value of 'null' is forbidden. If you want to create JSON null literal, use JsonNull object, otherwise, use JsonPrimitive",
                block = block,
            )
        }

        test { JsonUnquotedLiteral("null") }
        test { JsonUnquotedLiteral(JsonNull.content) }
        test { buildJsonObject { put("key", JsonUnquotedLiteral("null")) } }
    }

    @Test
    fun testUnquotedJsonInvalidMapKeyIsEscaped() {
        val mapSerializer = MapSerializer(
            JsonPrimitive.serializer(),
            JsonPrimitive.serializer(),
        )

        fun test(expected: String, input: String) = parametrizedTest { mode ->
            val data = mapOf(JsonUnquotedLiteral(input) to JsonPrimitive("invalid key"))

            assertEquals(
                """ {"$expected":"invalid key"} """.trim(),
                default.encodeToString(mapSerializer, data, mode),
            )
        }

        test(" ", " ")
        test(
            """ \\\"\\\" """.trim(),
            """  \"\"    """.trim(),
        )
        test(
            """  \\\\\\\"  """.trim(),
            """  \\\"      """.trim(),
        )
        test(
            """  {\\\"I'm not a valid JSON object key\\\"}  """.trim(),
            """  {\"I'm not a valid JSON object key\"}      """.trim(),
        )
    }
}