summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt
blob: c571ec9edb948cf2c23c39e17f192222aa2371de (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
/*
 * Copyright 2017-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.serialization.json.serializers

import kotlinx.serialization.json.*
import kotlinx.serialization.test.*

import kotlin.test.*

class JsonArraySerializerTest : JsonTestBase() {

    private val expected = "{\"array\":[1,null,[\"nested literal\"],[],{\"key\":\"value\"}]}"
    private val expectedTopLevel = "[1,null,[\"nested literal\"],[],{\"key\":\"value\"}]"

    @Test
    fun testJsonArray() = parametrizedTest(default) {
        assertStringFormAndRestored(expected, JsonArrayWrapper(prebuiltJson()), JsonArrayWrapper.serializer())
    }

    @Test
    fun testJsonArrayAsElement() = parametrizedTest(default) {
        assertStringFormAndRestored(expected.replace("array", "element"), JsonElementWrapper(prebuiltJson()), JsonElementWrapper.serializer())
    }

    @Test
    fun testTopLevelJsonObjectAsElement() = parametrizedTest(default) {
        assertStringFormAndRestored(expectedTopLevel, prebuiltJson(), JsonElement.serializer())
    }

    @Test
    fun testJsonArrayToString() {
        val prebuiltJson = prebuiltJson()
        val string = lenient.encodeToString(JsonArray.serializer(), prebuiltJson)
        assertEquals(string, prebuiltJson.toString())
    }

    @Test
    fun testMixedLiterals() = parametrizedTest { jsonTestingMode ->
        val json = """[1, "2", 3, "4"]"""
        val array = default.decodeFromString(JsonArray.serializer(), json, jsonTestingMode)
        array.forEachIndexed { index, element ->
            require(element is JsonPrimitive)
            assertEquals(index % 2 == 1, element.isString)
        }
    }

    @Test
    fun testMissingCommas() = parametrizedTest { jsonTestingMode ->
        val message = "Expected end of the array or comma"
        testFails("[a b c]", message, jsonTestingMode)
        testFails("[ 1 2 3 ]", message, jsonTestingMode)
        testFails("[null 1 null]", message, jsonTestingMode)
        testFails("[1 \n 2]", message, jsonTestingMode)
    }

    @Test
    fun testEmptyArray() = parametrizedTest { jsonTestingMode ->
        assertEquals(JsonArray(emptyList()), lenient.decodeFromString(JsonArray.serializer(), "[]", jsonTestingMode))
        assertEquals(JsonArray(emptyList()), lenient.decodeFromString(JsonArray.serializer(), "[    ]", jsonTestingMode))
        assertEquals(JsonArray(emptyList()), lenient.decodeFromString(JsonArray.serializer(), "[\n\n]", jsonTestingMode))
        assertEquals(JsonArray(emptyList()), lenient.decodeFromString(JsonArray.serializer(), "[     \t]", jsonTestingMode))
    }

    @Test
    fun testWhitespaces() = parametrizedTest { jsonTestingMode ->
        assertEquals(
            JsonArray(listOf(1, 2, 3, 4, 5).map(::JsonPrimitive)),
            lenient.decodeFromString(JsonArray.serializer(), "[1, 2,   3, \n 4, 5]", jsonTestingMode)
        )
    }

    @Test
    fun testExcessiveCommas() = parametrizedTest { jsonTestingMode ->
        val trailing = "Unexpected trailing comma"
        val leading = "Unexpected leading comma"
        testFails("[a,]", trailing, jsonTestingMode)
        testFails("[,1]", leading, jsonTestingMode)
        testFails("[,1,]", leading, jsonTestingMode)
        testFails("[,]", leading, jsonTestingMode)
        testFails("[,,]", leading, jsonTestingMode)
        testFails("[,,1]", leading, jsonTestingMode)
        testFails("[1,,]", trailing, jsonTestingMode)
        testFails("[1,,2]", trailing, jsonTestingMode)
        testFails("[,   ,]", leading, jsonTestingMode)
        testFails("[,\n,]", leading, jsonTestingMode)
    }

    private fun testFails(input: String, errorMessage: String, jsonTestingMode: JsonTestingMode) {
        assertFailsWithSerial("JsonDecodingException", errorMessage) {
            lenient.decodeFromString(
                JsonArray.serializer(),
                input,
                jsonTestingMode
            )
        }
    }

    private fun prebuiltJson(): JsonArray {
        return buildJsonArray {
            add(1)
            add(JsonNull)
            addJsonArray {
                add("nested literal")
            }
            addJsonArray {}
            addJsonObject {
                put("key", "value")
            }
        }
    }
}