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