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 KTestMessagesProto3Enum(
14     @ProtoNumber(21) val optionalNestedEnum: KNestedEnum = KNestedEnum.FOO,
15     @ProtoNumber(22) val optionalForeignEnum: KForeignEnum = KForeignEnum.FOREIGN_FOO,
16     @ProtoNumber(23) val optionalAliasedEnum: KAliasedEnum = KAliasedEnum.ALIAS_FOO,
17 ) {
18     enum class KNestedEnum {
19         @ProtoNumber(0)
20         FOO,
21 
22         @ProtoNumber(1)
23         BAR,
24 
25         @ProtoNumber(2)
26         BAZ,
27 
28         @ProtoNumber(-1)
29         NEG;
30 
toProtonull31         fun toProto() = TestMessagesProto3.TestAllTypesProto3.NestedEnum.valueOf(this.name)
32     }
33 
34 
35     enum class KAliasedEnum {
36         @ProtoNumber(0)
37         ALIAS_FOO,
38 
39         @ProtoNumber(1)
40         ALIAS_BAR,
41 
42         @ProtoNumber(2)
43         ALIAS_BAZ,
44 
45         @ProtoNumber(2)
46         MOO,
47 
48         @ProtoNumber(2)
49         moo,
50 
51         @ProtoNumber(2)
52         bAz;
53 
54         fun toProto() = TestMessagesProto3.TestAllTypesProto3.AliasedEnum.valueOf(this.name)
55     }
56 }
57 
58 enum class KForeignEnum {
59     @ProtoNumber(0)
60     FOREIGN_FOO,
61 
62     @ProtoNumber(1)
63     FOREIGN_BAR,
64 
65     @ProtoNumber(2)
66     FOREIGN_BAZ;
67 
toProtonull68     fun toProto() = TestMessagesProto3.ForeignEnum.valueOf(this.name)
69 }
70 
71 class Proto3EnumTest {
72     @Test
73     fun default() {
74         val message = KTestMessagesProto3Enum(
75             optionalNestedEnum = KTestMessagesProto3Enum.KNestedEnum.NEG,
76             optionalForeignEnum = KForeignEnum.FOREIGN_BAR,
77             optionalAliasedEnum = KTestMessagesProto3Enum.KAliasedEnum.ALIAS_BAR
78         )
79 
80         val bytes = ProtoBuf.encodeToByteArray(message)
81         val restored = TestMessagesProto3.TestAllTypesProto3.parseFrom(bytes)
82 
83         assertEquals(message.optionalNestedEnum.toProto(), restored.optionalNestedEnum)
84         assertEquals(message.optionalForeignEnum.toProto(), restored.optionalForeignEnum)
85         assertEquals(message.optionalAliasedEnum.toProto(), restored.optionalAliasedEnum)
86 
87         val restoredMessage = ProtoBuf.decodeFromByteArray<KTestMessagesProto3Enum>(restored.toByteArray())
88         assertEquals(message, restoredMessage)
89     }
90 }
91