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

jvmTest.kotlinx.serialization.SerializationMethodInvocationOrderTest.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.descriptors.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.modules.*
import org.junit.Test
import kotlin.test.*

class SerializationMethodInvocationOrderTest {

    @Serializable
    @SerialName("kotlinx.serialization.Container")
    data class Container(val data: Data)

    @Test
    fun testRec() {
        val out = Out()
        out.encodeSerializableValue(serializer(), Container(Data("s1", 42)))
        out.done()

        val inp = Inp()
        inp.decodeSerializableValue(serializer())
        inp.done()
    }

    companion object {
        fun checkContainerDesc(desc: SerialDescriptor) {
            if (desc.serialName != "kotlinx.serialization.Container") fail("checkContainerDesc name $desc")
            if (desc.getElementName(0) != "data") fail("checkContainerDesc $desc")
        }

        fun checkDataDesc(desc: SerialDescriptor) {
            if (desc.serialName != "kotlinx.serialization.Data") fail("checkDataDesc name $desc")
            if (desc.getElementName(0) != "value1") fail("checkDataDesc.0 $desc")
            if (desc.getElementName(1) != "value2") fail("checkDataDesc.1 $desc")
        }
    }

    class Out : AbstractEncoder() {
        var step = 0

        override val serializersModule: SerializersModule = EmptySerializersModule()

        override fun beginStructure(descriptor: SerialDescriptor): CompositeEncoder {
            when (step) {
                1 -> {
                    checkContainerDesc(descriptor); step++
                    return this
                }
                4 -> {
                    checkDataDesc(descriptor); step++
                    return this
                }
            }
            fail("@$step: beginStructure($descriptor)")
        }

        override fun encodeElement(descriptor: SerialDescriptor, index: Int): Boolean {
            when (step) {
                2 -> {
                    checkContainerDesc(descriptor); if (index == 0) {
                        step++
                        return true
                    }
                }
                5 -> {
                    checkDataDesc(descriptor); if (index == 0) {
                        step++
                        return true
                    }
                }
                7 -> {
                    checkDataDesc(descriptor); if (index == 1) {
                        step++
                        return true
                    }
                }
            }
            fail("@$step: encodeElement($descriptor, $index)")
        }

        override fun  encodeSerializableValue(serializer: SerializationStrategy, value: T) {
            when (step) {
                0, 3 -> {
                    step++; serializer.serialize(this, value)
                    return
                }
            }
            fail("@$step: encodeSerializableValue($value)")
        }

        override fun encodeString(value: String) {
            when (step) {
                6 -> if (value == "s1") {
                    step++
                    return
                }
            }
            fail("@$step: encodeString($value)")
        }

        override fun encodeInt(value: Int) {
            when (step) {
                8 -> if (value == 42) {
                    step++
                    return
                }
            }
            fail("@$step: decodeInt($value)")
        }

        override fun endStructure(descriptor: SerialDescriptor) {
            when (step) {
                9 -> {
                    checkDataDesc(descriptor); step++
                    return
                }
                10 -> {
                    checkContainerDesc(descriptor); step++
                    return
                }
            }
            fail("@$step: endStructure($descriptor)")
        }

        fun done() {
            if (step != 11) fail("@$step: OUT FAIL")
        }
    }

    class Inp : AbstractDecoder() {
        var step = 0

        override val serializersModule: SerializersModule = EmptySerializersModule()

        override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder {
            when (step) {
                1 -> {
                    checkContainerDesc(descriptor); step++
                    return this
                }
                4 -> {
                    checkDataDesc(descriptor); step++
                    return this
                }
            }
            fail("@$step: beginStructure($descriptor)")
        }

        override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
            when (step) {
                2 -> {
                    checkContainerDesc(descriptor); step++
                    return 0
                }
                5 -> {
                    checkDataDesc(descriptor); step++
                    return 0
                }
                7 -> {
                    checkDataDesc(descriptor); step++
                    return 1
                }
                9 -> {
                    checkDataDesc(descriptor); step++
                    return -1
                }
                11 -> {
                    checkContainerDesc(descriptor); step++
                    return -1
                }
            }
            fail("@$step: decodeElementIndex($descriptor)")
        }

        override fun  decodeSerializableValue(deserializer: DeserializationStrategy): T {
            when (step) {
                0, 3 -> {
                    step++
                    return deserializer.deserialize(this)
                }
            }
            fail("@$step: decodeSerializableValue()")
        }

        override fun decodeString(): String {
            when (step) {
                6 -> {
                    step++
                    return "s1"
                }
            }
            fail("@$step: decodeString()")
        }

        override fun decodeInt(): Int {
            when (step) {
                8 -> {
                    step++
                    return 42
                }
            }
            fail("@$step: decodeInt()")
        }

        override fun endStructure(descriptor: SerialDescriptor) {
            when (step) {
                10 -> {
                    checkDataDesc(descriptor); step++
                    return
                }
                12 -> {
                    checkContainerDesc(descriptor); step++
                    return
                }
            }
            fail("@$step: endStructure($descriptor)")
        }

        fun done() {
            if (step != 13) fail("@$step: INP FAIL")
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy