All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonTest.kotlinx.serialization.SerialDescriptorBuilderTest.kt Maven / Gradle / Ivy

/*
 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.serialization

import kotlinx.serialization.builtins.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.test.*
import kotlin.test.*

class SerialDescriptorBuilderTest {

    @Serializable
    @SerialName("Wrapper")
    class Wrapper(val i: Int)

    private val wrapperDescriptor = buildClassSerialDescriptor("Wrapper") {
        element("i", Int.serializer().descriptor)
    }

    private val dataHolderDescriptor = buildClassSerialDescriptor("DataHolder") {
        element("string")
        element("nullableWrapper", wrapperDescriptor.nullable)
        element("wrapper", wrapperDescriptor)
        element("int")
        element("nullableOptionalLong", isOptional = true)
    }

    @Serializable
    @SerialName("DataHolder")
    class DataHolder(
        val string: String,
        val nullableWrapper: Wrapper?,
        val wrapper: Wrapper,
        val int: Int,
        val nullableOptionalLong: Long? = null
    )

    @Test
    fun testTrivialDescriptor() {
        Wrapper.serializer().descriptor.assertDescriptorEqualsTo(wrapperDescriptor)
    }


    @Test
    fun testNestedDescriptors() {
        DataHolder.serializer().descriptor.assertDescriptorEqualsTo(dataHolderDescriptor)
    }

    @Serializable
    @SerialName("Box")
    class Box(val value: T, val list: List)

    class CustomBoxSerializer(val typeSerializer: KSerializer) {
        val descriptor: SerialDescriptor = buildClassSerialDescriptor("Box") {
            element("value", typeSerializer.descriptor)
            element("list", listSerialDescriptor(typeSerializer.descriptor))
        }
    }

    @Test
    fun testGenericDescriptor() {
        val original = Box.serializer(Wrapper.serializer()).descriptor
        val userDefined = CustomBoxSerializer(object : KSerializer {
            override val descriptor: SerialDescriptor = wrapperDescriptor
            override fun serialize(encoder: Encoder, value: Wrapper) = TODO()
            override fun deserialize(decoder: Decoder): Wrapper = TODO()
        }).descriptor
        original.assertDescriptorEqualsTo(userDefined)
    }

    @Test
    fun testMisconfiguration() {
        assertFailsWith {
            buildClassSerialDescriptor("a") {
                element("i")
                element("i")
            }
        }

        assertFailsWith { buildClassSerialDescriptor("") }
        assertFailsWith { buildClassSerialDescriptor("\t") }
        assertFailsWith { buildClassSerialDescriptor("   ") }
        assertFailsWith { PrimitiveSerialDescriptor("", PrimitiveKind.STRING) }
        assertFailsWith { PrimitiveSerialDescriptor(" ", PrimitiveKind.STRING) }
        assertFailsWith { PrimitiveSerialDescriptor("\t", PrimitiveKind.STRING) }
    }

    @Test
    fun testNullableBuild() {
        val descriptor = buildClassSerialDescriptor("my.Simple") {}.nullable
        assertTrue(descriptor.isNullable)
        assertEquals("my.Simple?", descriptor.serialName)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy