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 KTestMessagesProto3Primitive(
14     @ProtoNumber(1) val optionalInt32: Int = 0,
15     @ProtoNumber(2) val optionalInt64: Long = 0,
16     @ProtoNumber(3) val optionalUint32: UInt = 0U,
17     @ProtoNumber(4) val optionalUint64: ULong = 0UL,
18     @ProtoNumber(5) @ProtoType(ProtoIntegerType.SIGNED) val optionalSint32: Int = 0,
19     @ProtoNumber(6) @ProtoType(ProtoIntegerType.SIGNED) val optionalSint64: Long = 0,
20     @ProtoNumber(7) @ProtoType(ProtoIntegerType.FIXED) val optionalFixed32: Int = 0,
21     @ProtoNumber(8) @ProtoType(ProtoIntegerType.FIXED) val optionalFixed64: Long = 0,
22     @ProtoNumber(9) @ProtoType(ProtoIntegerType.FIXED) val optionalSfixed32: Int = 0,
23     @ProtoNumber(10) @ProtoType(ProtoIntegerType.FIXED) val optionalSfixed64: Long = 0,
24     @ProtoNumber(11) val optionalFloat: Float = 0.0f,
25     @ProtoNumber(12) val optionalDouble: Double = 0.0,
26     @ProtoNumber(13) val optionalBool: Boolean = false,
27     @ProtoNumber(14) val optionalString: String = "",
28     @ProtoNumber(15) val optionalBytes: ByteArray = byteArrayOf(),
29 )
30 
31 class Proto3PrimitiveTest {
32     @Test
defaultnull33     fun default() {
34         val message = KTestMessagesProto3Primitive(
35             optionalInt32 = Int.MAX_VALUE,
36             optionalInt64 = Long.MAX_VALUE,
37             optionalUint32 = UInt.MAX_VALUE,
38             optionalUint64 = ULong.MAX_VALUE,
39             optionalSint32 = Int.MAX_VALUE,
40             optionalSint64 = Long.MAX_VALUE,
41             optionalFixed32 = Int.MAX_VALUE,
42             optionalFixed64 = Long.MAX_VALUE,
43             optionalSfixed32 = Int.MAX_VALUE,
44             optionalSfixed64 = Long.MAX_VALUE,
45             optionalFloat = Float.MAX_VALUE,
46             optionalDouble = Double.MAX_VALUE,
47             optionalBool = true,
48             optionalString = "string",
49             optionalBytes = byteArrayOf(1, 2, 3, 4, 5)
50         )
51 
52         val bytes = ProtoBuf.encodeToByteArray(message)
53         val restored = TestMessagesProto3.TestAllTypesProto3.parseFrom(bytes)
54 
55         assertEquals(message.optionalInt32, restored.optionalInt32)
56         assertEquals(message.optionalInt64, restored.optionalInt64)
57         assertEquals(message.optionalUint32, restored.optionalUint32.toUInt())
58         assertEquals(message.optionalUint64, restored.optionalUint64.toULong())
59         assertEquals(message.optionalSint32, restored.optionalSint32)
60         assertEquals(message.optionalSint64, restored.optionalSint64)
61         assertEquals(message.optionalFixed32, restored.optionalFixed32)
62         assertEquals(message.optionalFixed64, restored.optionalFixed64)
63         assertEquals(message.optionalSfixed32, restored.optionalSfixed32)
64         assertEquals(message.optionalSfixed64, restored.optionalSfixed64)
65         assertEquals(message.optionalFloat, restored.optionalFloat)
66         assertEquals(message.optionalDouble, restored.optionalDouble)
67         assertEquals(message.optionalBool, restored.optionalBool)
68         assertEquals(message.optionalString, restored.optionalString)
69         assertContentEquals(message.optionalBytes, restored.optionalBytes.toByteArray())
70 
71         val restoredMessage = ProtoBuf.decodeFromByteArray<KTestMessagesProto3Primitive>(restored.toByteArray())
72 
73         // [equals] method is not implemented for [ByteArray] so we need to compare it separately.
74         assertEquals(message, restoredMessage.copy(optionalBytes = message.optionalBytes))
75         assertContentEquals(message.optionalBytes, restoredMessage.optionalBytes)
76     }
77 }
78