summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt')
-rw-r--r--formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt113
1 files changed, 113 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt
new file mode 100644
index 00000000..c571ec9e
--- /dev/null
+++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/serializers/JsonArraySerializerTest.kt
@@ -0,0 +1,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")
+ }
+ }
+ }
+}