diff options
author | Clara Fok <clarafok@google.com> | 2024-04-23 10:28:10 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2024-04-23 14:03:42 -0700 |
commit | 3eabe70bae2e9e08a9325f57c4cc558cbb947257 (patch) | |
tree | 1e0665b0be3c1eff26b3b737cb3a17a3a3a13388 /formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonElementDecodingTest.kt | |
parent | 45d6ad7772c2ea15a55ef6cf30561583da352e99 (diff) | |
parent | 3efe324be422ead21ca44f2f6318e1791c166556 (diff) | |
download | kotlinx.serialization-3eabe70bae2e9e08a9325f57c4cc558cbb947257.tar.gz |
Upgrade kotlinx.serialization to v1.6.3
This project was upgraded with external_updater.
Usage: tools/external_updater/updater.sh update external/kotlinx.serialization
For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md
Test: TreeHugger
Change-Id: I0a33712c9ac0a953307b3e8c3470f29cdd6dcaec
Diffstat (limited to 'formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonElementDecodingTest.kt')
-rw-r--r-- | formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonElementDecodingTest.kt | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonElementDecodingTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonElementDecodingTest.kt new file mode 100644 index 00000000..3cdfa082 --- /dev/null +++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonElementDecodingTest.kt @@ -0,0 +1,110 @@ +package kotlinx.serialization.json + +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import kotlin.test.* + +class JsonElementDecodingTest : JsonTestBase() { + + @Serializable + data class A(val a: Int = 42) + + @Test + fun testTopLevelClass() = assertSerializedForm(A(), """{}""".trimMargin()) + + @Test + fun testTopLevelNullableClass() { + assertSerializedForm<A?>(A(), """{}""") + assertSerializedForm<A?>(null, "null") + } + + @Test + fun testTopLevelPrimitive() = assertSerializedForm(42, """42""") + + @Test + fun testTopLevelNullablePrimitive() { + assertSerializedForm<Int?>(42, """42""") + assertSerializedForm<Int?>(null, """null""") + } + + @Test + fun testTopLevelList() = assertSerializedForm(listOf(42), """[42]""") + + @Test + fun testTopLevelNullableList() { + assertSerializedForm<List<Int>?>(listOf(42), """[42]""") + assertSerializedForm<List<Int>?>(null, """null""") + } + + private inline fun <reified T> assertSerializedForm(value: T, expectedString: String) { + val element = Json.encodeToJsonElement(value) + assertEquals(expectedString, element.toString()) + assertEquals(value, Json.decodeFromJsonElement(element)) + } + + @Test + fun testDeepRecursion() { + // Reported as https://github.com/Kotlin/kotlinx.serialization/issues/1594 + var json = """{ "a": %}""" + for (i in 0..12) { + json = json.replace("%", json) + } + json = json.replace("%", "0") + Json.parseToJsonElement(json) + } + + private open class NullAsElementSerializer<T : Any>(private val serializer: KSerializer<T>, val nullElement: T) : KSerializer<T?> { + final override val descriptor: SerialDescriptor = serializer.descriptor.nullable + + final override fun serialize(encoder: Encoder, value: T?) { + serializer.serialize(encoder, value ?: nullElement) + } + + final override fun deserialize(decoder: Decoder): T = serializer.deserialize(decoder) + } + + private object NullAsJsonNullJsonElementSerializer : NullAsElementSerializer<JsonElement>(JsonElement.serializer(), JsonNull) + private object NullAsJsonNullJsonPrimitiveSerializer : NullAsElementSerializer<JsonPrimitive>(JsonPrimitive.serializer(), JsonNull) + private object NullAsJsonNullJsonNullSerializer : NullAsElementSerializer<JsonNull>(JsonNull.serializer(), JsonNull) + private val noExplicitNullsOrDefaultsJson = Json { + explicitNulls = false + encodeDefaults = false + } + + @Test + fun testNullableJsonElementDecoding() { + @Serializable + data class Wrapper( + @Serializable(NullAsJsonNullJsonElementSerializer::class) + val value: JsonElement? = null, + ) + + assertJsonFormAndRestored(Wrapper.serializer(), Wrapper(value = JsonNull), """{"value":null}""", noExplicitNullsOrDefaultsJson) + assertJsonFormAndRestored(Wrapper.serializer(), Wrapper(value = null), """{}""", noExplicitNullsOrDefaultsJson) + } + + @Test + fun testNullableJsonPrimitiveDecoding() { + @Serializable + data class Wrapper( + @Serializable(NullAsJsonNullJsonPrimitiveSerializer::class) + val value: JsonPrimitive? = null, + ) + + assertJsonFormAndRestored(Wrapper.serializer(), Wrapper(value = JsonNull), """{"value":null}""", noExplicitNullsOrDefaultsJson) + assertJsonFormAndRestored(Wrapper.serializer(), Wrapper(value = null), """{}""", noExplicitNullsOrDefaultsJson) + } + + @Test + fun testNullableJsonNullDecoding() { + @Serializable + data class Wrapper( + @Serializable(NullAsJsonNullJsonNullSerializer::class) + val value: JsonNull? = null, + ) + + assertJsonFormAndRestored(Wrapper.serializer(), Wrapper(value = JsonNull), """{"value":null}""", noExplicitNullsOrDefaultsJson) + assertJsonFormAndRestored(Wrapper.serializer(), Wrapper(value = null), """{}""", noExplicitNullsOrDefaultsJson) + } +} |