1 /*
2  * Copyright 2017-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 package kotlinx.serialization.protobuf.conformance
6 
7 import com.google.protobuf_test_messages.proto3.*
8 import io.kotlintest.properties.*
9 import kotlinx.serialization.*
10 import kotlinx.serialization.protobuf.*
11 import kotlin.test.*
12 
13 @Serializable
14 data class KTestMessagesProto3Packed(
15     @ProtoNumber(75) @ProtoPacked val packedInt32: List<Int> = emptyList(),
16     @ProtoNumber(76) @ProtoPacked val packedInt64: List<Long> = emptyList(),
17     @ProtoNumber(77) @ProtoPacked val packedUint32: List<UInt> = emptyList(),
18     @ProtoNumber(78) @ProtoPacked val packedUint64: List<ULong> = emptyList(),
19     @ProtoNumber(79) @ProtoPacked val packedSint32: List<Int> = emptyList(),
20     @ProtoNumber(80) @ProtoPacked val packedSint64: List<Long> = emptyList(),
21     @ProtoNumber(81) @ProtoPacked val packedFixed32: List<Int> = emptyList(),
22     @ProtoNumber(82) @ProtoPacked val packedFixed64: List<Long> = emptyList(),
23     @ProtoNumber(83) @ProtoPacked val packedSfixed32: List<Int> = emptyList(),
24     @ProtoNumber(84) @ProtoPacked val packedSfixed64: List<Long> = emptyList(),
25     @ProtoNumber(85) @ProtoPacked val packedFloat: List<Float> = emptyList(),
26     @ProtoNumber(86) @ProtoPacked val packedDouble: List<Double> = emptyList(),
27     @ProtoNumber(87) @ProtoPacked val packedBool: List<Boolean> = emptyList(),
28 )
29 
30 class Proto3PackedTest {
31     @Test
defaultnull32     fun default() {
33         val message = KTestMessagesProto3Packed(
34             packedInt32 = Gen.list(Gen.int()).generate(),
35             packedInt64 = Gen.list(Gen.long()).generate(),
36             packedFloat = Gen.list(Gen.float()).generate(),
37             packedDouble = Gen.list(Gen.double()).generate(),
38             packedBool = Gen.list(Gen.bool()).generate(),
39         )
40 
41         val bytes = ProtoBuf.encodeToByteArray(message)
42         val restored = TestMessagesProto3.TestAllTypesProto3.parseFrom(bytes)
43 
44         assertEquals(message.packedInt32, restored.packedInt32List)
45         assertEquals(message.packedInt64, restored.packedInt64List)
46         assertEquals(message.packedFloat, restored.packedFloatList)
47         assertEquals(message.packedDouble, restored.packedDoubleList)
48         assertEquals(message.packedBool, restored.packedBoolList)
49 
50         val restoredMessage = ProtoBuf.decodeFromByteArray<KTestMessagesProto3Packed>(restored.toByteArray())
51         assertEquals(message, restoredMessage)
52     }
53 
54     @Test
55     @Ignore
56     // Issue: https://github.com/Kotlin/kotlinx.serialization/issues/2419
signedAndFixednull57     fun signedAndFixed() {
58         val message = KTestMessagesProto3Packed(
59             packedSint32 = Gen.list(Gen.int()).generate(),
60             packedSint64 = Gen.list(Gen.long()).generate(),
61             packedFixed32 = Gen.list(Gen.int()).generate(),
62             packedFixed64 = Gen.list(Gen.long()).generate(),
63             packedSfixed32 = Gen.list(Gen.int()).generate(),
64             packedSfixed64 = Gen.list(Gen.long()).generate(),
65         )
66 
67         val bytes = ProtoBuf.encodeToByteArray(message)
68         val restored = TestMessagesProto3.TestAllTypesProto3.parseFrom(bytes)
69 
70         assertEquals(message.packedSint32, restored.packedSint32List)
71         assertEquals(message.packedSint64, restored.packedSint64List)
72         assertEquals(message.packedFixed32, restored.packedFixed32List)
73         assertEquals(message.packedFixed64, restored.packedFixed64List)
74         assertEquals(message.packedSfixed32, restored.packedSfixed32List)
75         assertEquals(message.packedSfixed64, restored.packedSfixed64List)
76 
77         val restoredMessage = ProtoBuf.decodeFromByteArray<KTestMessagesProto3Packed>(restored.toByteArray())
78         assertEquals(message, restoredMessage)
79     }
80 
81     @Test
82     @Ignore
83     // Issue: https://github.com/Kotlin/kotlinx.serialization/issues/2418
unsignednull84     fun unsigned() {
85         val message = KTestMessagesProto3Packed(
86             packedUint32 = Gen.list(Gen.int().map { it.toUInt() }).generate(),
87             packedUint64 = Gen.list(Gen.long().map { it.toULong() }).generate(),
88         )
89 
90         val bytes = ProtoBuf.encodeToByteArray(message)
91         val restored = TestMessagesProto3.TestAllTypesProto3.parseFrom(bytes)
92 
93         assertEquals(message.packedUint32, restored.packedUint32List.map { it.toUInt() })
94         assertEquals(message.packedUint64, restored.packedUint64List.map { it.toULong() })
95 
96         val restoredMessage = ProtoBuf.decodeFromByteArray<KTestMessagesProto3Packed>(restored.toByteArray())
97         assertEquals(message, restoredMessage)
98     }
99 }
100