blob: ffc6970019bcbef3e094698d5501a6e0ecef8af8 [file] [log] [blame]
/*
* Copyright 2017-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.serialization.features
import kotlinx.serialization.*
import kotlinx.serialization.internal.*
import kotlinx.serialization.test.CommonEnumSerializer
import kotlin.test.*
@Serializable
data class Data1(val l: List<Int> = emptyList(), val s: String) {
@Serializer(forClass = Data1::class)
companion object {
override val descriptor: SerialDescriptor = object : SerialClassDescImpl("Data1") {
init {
addElement("l", true)
pushDescriptor(ArrayListSerializer(IntSerializer).descriptor)
addElement("s")
pushDescriptor(StringSerializer.descriptor)
}
}
}
}
@Serializable
data class Data2(val l: List<Int> = emptyList(), val s: String)
@Serializable data class BoxHolder(val stringBox: Box<String>, val intBox: Box<Int>)
@Serializable
data class DataZoo(
@Transient val invisible: String = "",
val a: Int,
val b: String,
val c: List<Data1>,
val ll: List<List<Boolean>>,
val m: Map<String, Data2>?
)
@Serializable
data class DataZooIsomorphic(
@Transient val invisible: String = "",
val b: Int,
val a: String,
val cc: List<Data1>,
val lll: List<List<Boolean>>,
val mm: Map<String, Data2>? = null
)
@Serializable
private data class DataWithEnum(val s: String, val enum: SampleEnum, val enumList: List<SampleEnum> = emptyList())
class SchemaTest {
private fun checkDescriptor(serialDescriptor: SerialDescriptor) {
val nested = serialDescriptor.getElementDescriptor(0)
assertTrue(nested is ListLikeDescriptor)
val elem = nested.getElementDescriptor(0)
assertTrue(elem is PrimitiveDescriptor)
assertEquals("kotlin.Int", elem.name)
assertTrue(elem is IntDescriptor)
assertTrue(serialDescriptor.isElementOptional(0))
}
@Test
fun manualSchema() {
checkDescriptor(Data1.serializer().descriptor)
}
@Test
fun generatedSchema() {
checkDescriptor(Data2.serializer().descriptor)
}
@Test
fun richSchema() {
val d: SerialDescriptor = DataZoo.serializer().descriptor
val descs = d.elementDescriptors()
assertEquals(5, descs.size)
assertEquals(listOf<SerialDescriptor>(IntDescriptor, StringDescriptor, ArrayListClassDesc(Data1.serializer().descriptor)), descs.take(3))
val listListDesc = descs[3]
assertFalse(listListDesc.isNullable)
assertEquals(listListDesc.kind, StructureKind.LIST)
assertEquals(1, listListDesc.elementsCount)
assertEquals(BooleanDescriptor, listListDesc.elementDescriptors().first().elementDescriptors().first())
val mapDesc = descs[4]
assertTrue(mapDesc.isNullable)
assertFalse(d.isElementOptional(4), "Expected value to be marked as optional")
assertEquals(2, mapDesc.elementsCount)
assertEquals(listOf(StringDescriptor, Data2.serializer().descriptor), mapDesc.elementDescriptors())
}
@Test
fun equalDescriptors() {
val desc1: SerialDescriptor = DataZoo.serializer().descriptor
val desc2: SerialDescriptor = DataZooIsomorphic.serializer().descriptor
assertEquals(desc1.elementDescriptors(), desc2.elementDescriptors())
}
@Test
fun genericDescriptors() {
val boxes = BoxHolder.serializer().descriptor.elementDescriptors()
assertTrue(boxes[0].getElementDescriptor(0) is StringDescriptor)
assertTrue(boxes[1].getElementDescriptor(0) is IntDescriptor)
assertNotEquals(boxes[0], boxes[1])
val intBox = Box.serializer(IntSerializer).descriptor
assertEquals(intBox, boxes[1])
}
@Test
fun enumDescriptors() {
val dataDescriptor = DataWithEnum.serializer().descriptor
val enumDesc = dataDescriptor.getElementDescriptor(1)
val serialName = "kotlinx.serialization.SampleEnum"
val manualSerializer = CommonEnumSerializer<SampleEnum>(serialName)
assertEquals(enumDesc, manualSerializer.descriptor)
assertEquals(enumDesc, dataDescriptor.getElementDescriptor(2).getElementDescriptor(0))
}
@Test
fun kindNames() {
val classDesc = BoxHolder.serializer().descriptor
assertEquals("CLASS", classDesc.kind.toString())
val intDesc = classDesc.elementDescriptors()[1].elementDescriptors()[0]
assertEquals("INT", intDesc.kind.toString())
}
}