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 kotlinx.serialization.*
9 import kotlinx.serialization.protobuf.*
10 import kotlin.test.*
11 
12 @Serializable
13 data class KTestMessagesProto3Message(
14     @ProtoNumber(18) val optionalNestedMessage: KNestedMessage? = null,
15     @ProtoNumber(19) val optionalForeignMessage: KForeignMessage? = null,
16 ) {
17     @Serializable
18     data class KNestedMessage(
19         @ProtoNumber(1) val a: Int = 0,
20         @ProtoNumber(2) val corecursive: KTestMessagesProto3Message? = null,
21     ) {
toProtonull22         fun toProto(): TestMessagesProto3.TestAllTypesProto3.NestedMessage =
23             TestMessagesProto3.TestAllTypesProto3.NestedMessage.parseFrom(
24                 ProtoBuf.encodeToByteArray(this)
25             )
26     }
27 }
28 
29 @Serializable
30 data class KForeignMessage(
31     @ProtoNumber(1) val c: Int = 0,
32 ) {
33     fun toProto(): TestMessagesProto3.ForeignMessage =
34         TestMessagesProto3.ForeignMessage.parseFrom(
35             ProtoBuf.encodeToByteArray(this)
36         )
37 }
38 
39 class Proto3MessageTest {
40     @Test
defaultnull41     fun default() {
42         val message = KTestMessagesProto3Message(
43             optionalNestedMessage = KTestMessagesProto3Message.KNestedMessage(
44                 a = 150,
45                 corecursive = KTestMessagesProto3Message(
46                     optionalNestedMessage = KTestMessagesProto3Message.KNestedMessage(
47                         a = 42,
48                     )
49                 )
50             ),
51             optionalForeignMessage = KForeignMessage(
52                 c = 150,
53             )
54         )
55 
56         val bytes = ProtoBuf.encodeToByteArray(message)
57         val restored = TestMessagesProto3.TestAllTypesProto3.parseFrom(bytes)
58         assertEquals(message.optionalNestedMessage?.a, restored.optionalNestedMessage.a)
59         assertEquals(
60             message.optionalNestedMessage?.corecursive?.optionalNestedMessage?.a,
61             restored.optionalNestedMessage.corecursive.optionalNestedMessage.a
62         )
63         assertEquals(message.optionalForeignMessage?.c, restored.optionalForeignMessage.c)
64     }
65 }
66