summaryrefslogtreecommitdiff
path: root/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonParserFailureModesTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonParserFailureModesTest.kt')
-rw-r--r--formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonParserFailureModesTest.kt160
1 files changed, 160 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonParserFailureModesTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonParserFailureModesTest.kt
new file mode 100644
index 00000000..892696b8
--- /dev/null
+++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonParserFailureModesTest.kt
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+package kotlinx.serialization.json
+
+import kotlinx.serialization.*
+import kotlinx.serialization.test.*
+import kotlin.test.*
+
+class JsonParserFailureModesTest : JsonTestBase() {
+
+ @Serializable
+ data class Holder(
+ val id: Long
+ )
+
+ @Test
+ fun testFailureModes() = parametrizedTest {
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id": "}""",
+ it
+ )
+ }
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id": ""}""",
+ it
+ )
+ }
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id":a}""",
+ it
+ )
+ }
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id":2.0}""",
+ it
+ )
+ }
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id2":2}""",
+ it
+ )
+ }
+ // 9223372036854775807 is Long.MAX_VALUE
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id":${Long.MAX_VALUE}""" + "00" + "}",
+ it
+ )
+ }
+ // -9223372036854775808 is Long.MIN_VALUE
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ Holder.serializer(),
+ """{"id":9223372036854775808}""",
+ it
+ )
+ }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"id"}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"id}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"i}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{"}""", it) }
+ assertFailsWithMissingField { default.decodeFromString(Holder.serializer(), """{}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString(Holder.serializer(), """{""", it) }
+ }
+
+ @Serializable
+ class BooleanHolder(val b: Boolean)
+
+ @Test
+ fun testBoolean() = parametrizedTest {
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ BooleanHolder.serializer(),
+ """{"b": fals}""",
+ it
+ )
+ }
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString(
+ BooleanHolder.serializer(),
+ """{"b": 123}""",
+ it
+ )
+ }
+ }
+
+ @Serializable
+ class PrimitiveHolder(
+ val b: Byte = 0, val s: Short = 0, val i: Int = 0
+ )
+
+ @Test
+ fun testOverflow() = parametrizedTest {
+ // Byte overflow
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<PrimitiveHolder>("""{"b": 128}""", it) }
+ // Short overflow
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<PrimitiveHolder>("""{"s": 32768}""", it) }
+ // Int overflow
+ assertFailsWithSerial("JsonDecodingException") {
+ default.decodeFromString<PrimitiveHolder>(
+ """{"i": 2147483648}""",
+ it
+ )
+ }
+ }
+
+ @Test
+ fun testNoOverflow() = parametrizedTest {
+ default.decodeFromString<PrimitiveHolder>("""{"b": ${Byte.MAX_VALUE}}""", it)
+ default.decodeFromString<PrimitiveHolder>("""{"b": ${Byte.MIN_VALUE}}""", it)
+ default.decodeFromString<PrimitiveHolder>("""{"s": ${Short.MAX_VALUE}}""", it)
+ default.decodeFromString<PrimitiveHolder>("""{"s": ${Short.MIN_VALUE}}""", it)
+ default.decodeFromString<PrimitiveHolder>("""{"i": ${Int.MAX_VALUE}}""", it)
+ default.decodeFromString<PrimitiveHolder>("""{"i": ${Int.MIN_VALUE}}""", it)
+ default.decodeFromString<Holder>("""{"id": ${Long.MIN_VALUE.toString()}}""", it)
+ default.decodeFromString<Holder>("""{"id": ${Long.MAX_VALUE.toString()}}""", it)
+ }
+
+ @Test
+ fun testInvalidNumber() = parametrizedTest {
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":-}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":+}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":--}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":1-1}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":0-1}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":0-}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":a}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<Holder>("""{"id":-a}""", it) }
+ }
+
+
+ @Serializable
+ data class BooleanWrapper(val b: Boolean)
+
+ @Serializable
+ data class StringWrapper(val s: String)
+
+ @Test
+ fun testUnexpectedNull() = parametrizedTest {
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<BooleanWrapper>("""{"b":{"b":"b"}}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<BooleanWrapper>("""{"b":null}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<StringWrapper>("""{"s":{"s":"s"}}""", it) }
+ assertFailsWithSerial("JsonDecodingException") { default.decodeFromString<StringWrapper>("""{"s":null}""", it) }
+ }
+}