Skip to content

Commit b4a7e01

Browse files
add unit test for unknown one-of field
1 parent 77afee7 commit b4a7e01

File tree

1 file changed

+66
-5
lines changed

1 file changed

+66
-5
lines changed

formats/protobuf/commonTest/src/kotlinx/serialization/protobuf/ProtobufUnknownFieldsTest.kt

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import kotlin.test.*
1212
class ProtobufUnknownFieldsTest {
1313
@Serializable
1414
data class InnerData(val name: String, val b: Int, val c: List<String>)
15+
1516
@Serializable
1617
data class BuildData(val a: Int, val b: String, val c: ByteArray, val d: List<Int>, val e: InnerData) {
1718
override fun equals(other: Any?): Boolean {
@@ -48,7 +49,13 @@ class ProtobufUnknownFieldsTest {
4849

4950
@Test
5051
fun testDecodeWithUnknownField() {
51-
val data = BuildData(42, "42", byteArrayOf(42, 42, 42), listOf(42, 42, 42), InnerData("42", 42, listOf("42", "42", "42")))
52+
val data = BuildData(
53+
42,
54+
"42",
55+
byteArrayOf(42, 42, 42),
56+
listOf(42, 42, 42),
57+
InnerData("42", 42, listOf("42", "42", "42"))
58+
)
5259

5360
/**
5461
* 1: 42
@@ -116,7 +123,13 @@ class ProtobufUnknownFieldsTest {
116123

117124
@Test
118125
fun testUnknownFieldBeforeKnownField() {
119-
val data = BuildData(42, "42", byteArrayOf(42, 42, 42), listOf(42, 42, 42), InnerData("42", 42, listOf("42", "42", "42")))
126+
val data = BuildData(
127+
42,
128+
"42",
129+
byteArrayOf(42, 42, 42),
130+
listOf(42, 42, 42),
131+
InnerData("42", 42, listOf("42", "42", "42"))
132+
)
120133

121134
/**
122135
* 1: 42
@@ -167,7 +180,11 @@ class ProtobufUnknownFieldsTest {
167180
data class TotalKnownData(@ProtoUnknownFields val fields: ProtoMessage = ProtoMessage.Empty)
168181

169182
@Serializable
170-
data class NestedUnknownData(val a: Int, @ProtoNumber(5) val inner: TotalKnownData, @ProtoUnknownFields val unknown: ProtoMessage)
183+
data class NestedUnknownData(
184+
val a: Int,
185+
@ProtoNumber(5) val inner: TotalKnownData,
186+
@ProtoUnknownFields val unknown: ProtoMessage
187+
)
171188

172189
@Test
173190
fun testDecodeNestedUnknownData() {
@@ -191,7 +208,7 @@ class ProtobufUnknownFieldsTest {
191208
assertEquals(5, decoded.unknown.size)
192209
}
193210

194-
object CustomSerializer: KSerializer<DataWithUnknownFields> {
211+
object CustomSerializer : KSerializer<DataWithUnknownFields> {
195212
override val descriptor: SerialDescriptor
196213
get() = buildClassSerialDescriptor("CustomData") {
197214
element<Int>("a", annotations = listOf(ProtoNumber(1)))
@@ -224,7 +241,13 @@ class ProtobufUnknownFieldsTest {
224241

225242
@Test
226243
fun testCustomSerializer() {
227-
val data = BuildData(42, "42", byteArrayOf(42, 42, 42), listOf(42, 42, 42), InnerData("42", 42, listOf("42", "42", "42")))
244+
val data = BuildData(
245+
42,
246+
"42",
247+
byteArrayOf(42, 42, 42),
248+
listOf(42, 42, 42),
249+
InnerData("42", 42, listOf("42", "42", "42"))
250+
)
228251

229252
/**
230253
* 1: 42
@@ -286,6 +309,7 @@ class ProtobufUnknownFieldsTest {
286309
@ProtoNumber(1) val a: Int,
287310
@ProtoUnknownFields val unknownFields: ProtoMessage? = null
288311
)
312+
289313
@Test
290314
fun testDataWithNullableUnknownFields() {
291315
val encoded = "082a120234321a032a2a2a202a202a202a2a120a023432102a1a0234321a0234321a023432"
@@ -298,4 +322,41 @@ class ProtobufUnknownFieldsTest {
298322
assertEquals(42, decoded2.a)
299323
assertNull(decoded2.unknownFields)
300324
}
325+
326+
@Serializable
327+
data class ToBuildOneOf(val a: String? = null, val b: Long? = null, val c: InnerData? = null)
328+
329+
@Serializable
330+
data class TestFewerOneOf(
331+
@ProtoOneOf val oneOf: OneOf? = null,
332+
@ProtoUnknownFields val unknownFields: ProtoMessage = ProtoMessage.Empty
333+
)
334+
335+
@Serializable
336+
sealed interface OneOf {
337+
@Serializable
338+
data class A(
339+
@ProtoNumber(1) val a: String
340+
) : OneOf
341+
342+
@Serializable
343+
data class B(
344+
@ProtoNumber(2) val b: Long
345+
) : OneOf
346+
}
347+
348+
@Test
349+
fun testUnknownOneOfField() {
350+
val present = ToBuildOneOf(a = "test")
351+
val encoded = ProtoBuf.encodeToHexString(present)
352+
val decoded = ProtoBuf.decodeFromHexString(TestFewerOneOf.serializer(), encoded)
353+
assertEquals(OneOf.A("test"), decoded.oneOf)
354+
assertEquals(0, decoded.unknownFields.size)
355+
356+
val absent = ToBuildOneOf(c = InnerData("test", 42, listOf("test")))
357+
val encoded2 = ProtoBuf.encodeToHexString(absent)
358+
val decoded2 = ProtoBuf.decodeFromHexString(TestFewerOneOf.serializer(), encoded2)
359+
assertNull(decoded2.oneOf)
360+
assertEquals(1, decoded2.unknownFields.size)
361+
}
301362
}

0 commit comments

Comments
 (0)