summaryrefslogtreecommitdiff
path: root/formats/protobuf/commonTest/src/kotlinx/serialization/protobuf/schema/SchemaValidationsTest.kt
blob: b73323129d2cad42ff7d64d945e06aff64cdd16a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package kotlinx.serialization.protobuf.schema

import kotlinx.serialization.*
import kotlinx.serialization.protobuf.*
import kotlin.test.Test
import kotlin.test.assertContains
import kotlin.test.assertFailsWith

class SchemaValidationsTest {
    @Serializable
    data class ValidClass(val i: Int)

    @Serializable
    @SerialName("ValidClass")
    data class DuplicateClass(val l: Long)

    @Serializable
    @SerialName("invalid serial name")
    data class InvalidClassName(val i: Int)

    @Serializable
    data class InvalidClassFieldName(@SerialName("invalid serial name") val i: Int)

    @Serializable
    data class FieldNumberDuplicates(@ProtoNumber(42) val i: Int, @ProtoNumber(42) val j: Int)

    @Serializable
    data class FieldNumberImplicitlyDuplicates(@ProtoNumber(2) val i: Int, val j: Int)

    @Serializable
    @SerialName("invalid serial name")
    enum class InvalidEnumName { SINGLETON }

    @Serializable
    enum class InvalidEnumElementName {
        FIRST,

        @SerialName("invalid serial name")
        SECOND
    }

    @Test
    fun testInvalidEnumElementSerialName() {
        val descriptors = listOf(InvalidEnumElementName.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
    }

    @Test
    fun testInvalidClassSerialName() {
        val descriptors = listOf(InvalidClassName.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
    }

    @Test
    fun testInvalidClassFieldSerialName() {
        val descriptors = listOf(InvalidClassFieldName.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
    }

    @Test
    fun testDuplicateSerialNames() {
        val descriptors = listOf(InvalidClassFieldName.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
    }

    @Test
    fun testInvalidEnumSerialName() {
        val descriptors = listOf(InvalidEnumName.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
    }

    @Test
    fun testDuplicationSerialName() {
        val descriptors = listOf(ValidClass.serializer().descriptor, DuplicateClass.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors) }
    }

    @Test
    fun testInvalidOptionName() {
        val descriptors = listOf(ValidClass.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) {
            ProtoBufSchemaGenerator.generateSchemaText(
                descriptors,
                options = mapOf("broken name" to "value")
            )
        }
    }

    @Test
    fun testIllegalPackageNames() {
        val descriptors = listOf(ValidClass.serializer().descriptor)
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "") }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, ".") }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, ".first.dot") }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "ended.with.dot.") }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "first._underscore") }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "first.1digit") }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(descriptors, "illegal.sym+bol") }
    }

    @Test
    fun testValidPackageNames() {
        val descriptors = listOf(ValidClass.serializer().descriptor)
        ProtoBufSchemaGenerator.generateSchemaText(descriptors, "singleIdent")
        ProtoBufSchemaGenerator.generateSchemaText(descriptors, "double.ident")
        ProtoBufSchemaGenerator.generateSchemaText(descriptors, "with.digits0123")
        ProtoBufSchemaGenerator.generateSchemaText(descriptors, "with.underscore_")
    }

    @Test
    fun testFieldNumberDuplicates() {
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(listOf(FieldNumberDuplicates.serializer().descriptor)) }
        assertFailsWith(IllegalArgumentException::class) { ProtoBufSchemaGenerator.generateSchemaText(listOf(FieldNumberImplicitlyDuplicates.serializer().descriptor)) }
    }
}