From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use Test::More tests => 3;
use strict;
Google::ProtocolBuffers->parse(<<'PROTO');
message Double {
message NestedMessage {
optional int32 a1 = 1;
optional int32 a2 = 2;
}
enum NestedEnum {
FOO = 1;
BAR = 2;
BAZ = 3;
}
// Singular
optional int32 a1 = 1;
optional int32 a2 = 2;
optional int32 a3 = 3;
optional int32 a4 = 4;
optional int64 b1 = 5;
optional int64 b2 = 6;
optional uint32 c1 = 7;
optional uint32 c2 = 8;
optional uint64 d1 = 9;
optional uint64 d2 = 10;
optional sint32 e1 = 11;
optional sint32 e2 = 12;
optional sint64 f1 = 13;
optional sint64 f2 = 14;
optional fixed32 g1 = 15;
optional fixed32 g2 = 16;
optional fixed64 h1 = 17;
optional fixed64 h2 = 18;
optional sfixed32 i1 = 19;
optional sfixed32 i2 = 20;
optional sfixed64 j1 = 21;
optional sfixed64 j2 = 22;
optional float k1 = 23;
optional float k2 = 24;
optional double l1 = 25;
optional double l2 = 26;
optional bool m1 = 27;
optional bool m2 = 28;
optional string n1 = 29;
optional string n2 = 30;
optional bytes o1 = 31;
optional bytes o2 = 32;
optional group Group1 = 33 {
optional int32 a1 = 1;
optional int32 a2 = 2;
}
optional group Group2 = 34 {
optional int32 a1 = 1;
optional int32 a2 = 2;
}
optional NestedMessage p1 = 35 ;
optional NestedMessage p2 = 36 ;
optional NestedEnum q1 = 37 ;
optional NestedEnum q2 = 38 ;
}
message Single {
message NestedMessage {
optional int32 a1 = 1;
//optional int32 a2 = 2;
}
enum NestedEnum {
FOO = 1;
BAR = 2;
BAZ = 3;
}
// Singular
optional int32 a1 = 1;
//optional int32 a2 = 2;
optional int32 a3 = 3;
//optional int32 a4 = 4;
optional int64 b1 = 5;
//optional int64 b2 = 6;
optional uint32 c1 = 7;
//optional uint32 c2 = 8;
optional uint64 d1 = 9;
//optional uint64 d2 = 10;
optional sint32 e1 = 11;
//optional sint32 e2 = 12;
optional sint64 f1 = 13;
//optional sint64 f2 = 14;
optional fixed32 g1 = 15;
//optional fixed32 g2 = 16;
optional fixed64 h1 = 17;
//optional fixed64 h2 = 18;
optional sfixed32 i1 = 19;
//optional sfixed32 i2 = 20;
optional sfixed64 j1 = 21;
//optional sfixed64 j2 = 22;
optional float k1 = 23;
//optional float k2 = 24;
optional double l1 = 25;
//optional double l2 = 26;
optional bool m1 = 27;
//optional bool m2 = 28;
optional string n1 = 29;
//optional string n2 = 30;
optional bytes o1 = 31;
//optional bytes o2 = 32;
optional group Group1 = 33 {
optional int32 a1 = 1;
//optional int32 a2 = 2;
}
//optional group Group2 = 34 {
// optional int32 a1 = 1;
// optional int32 a2 = 2;
//}
optional NestedMessage p1 = 35 ;
//optional NestedMessage p2 = 36 ;
optional NestedEnum q1 = 37 ;
//optional NestedEnum q2 = 38 ;
}
PROTO
my $double = {
a1 => 1,
a2 => 2,
a3 => 3,
a4 => 4,
b1 => 5,
b2 => 6,
c1 => 7,
c2 => 8,
d1 => 9,
d2 => 10,
e1 => 11,
e2 => 12,
f1 => 13,
f2 => 14,
g1 => 15,
g2 => 16,
h1 => 17,
h2 => 18,
i1 => 19,
i2 => 20,
j1 => 21,
j2 => 22,
k1 => 23,
k2 => 24,
l1 => 25,
l2 => 26,
m1 => 1,
m2 => 1,
n1 => "asdf",
n2 => "zxcv",
o1 => "123",
o2 => "098",
Group1 => {
a1 => 1,
a2 => 2,
},
Group2 => {
a1 => 1,
a2 => 2,
},
p1 => { a1 => 100, a2 => 200 },
p2 => { a1 => 300, a2 => 400 },
q1 => 2 ,
q2 => 2 ,
};
my $single = {
a1 => 1,
a3 => 3,
b1 => 5,
c1 => 7,
d1 => 9,
e1 => 11,
f1 => 13,
g1 => 15,
h1 => 17,
i1 => 19,
j1 => 21,
k1 => 23,
l1 => 25,
m1 => 1,
n1 => "asdf",
o1 => "123",
Group1 => {
a1 => 1,
},
p1 => { a1 => 100, },
q1 => 2 ,
};
my $str = Double->encode($double);
is($str,
"\x{08}\x{01}\x{10}\x{02}\x{18}\x{03}\x{20}\x{04}\x{28}\x{05}\x{30}\x{06}".
"\x{38}\x{07}\x{40}\x{08}\x{48}\x{09}\x{50}\x{0a}\x{58}\x{16}\x{60}\x{18}".
"\x{68}\x{1a}\x{70}\x{1c}\x{7d}\x{0f}\x{00}\x{00}\x{00}\x{85}\x{01}\x{10}".
"\x{00}\x{00}\x{00}\x{89}\x{01}\x{11}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}".
"\x{00}\x{91}\x{01}\x{12}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{9d}".
"\x{01}\x{13}\x{00}\x{00}\x{00}\x{a5}\x{01}\x{14}\x{00}\x{00}\x{00}\x{a9}".
"\x{01}\x{15}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{b1}\x{01}\x{16}".
"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{bd}\x{01}\x{00}\x{00}\x{b8}".
"\x{41}\x{c5}\x{01}\x{00}\x{00}\x{c0}\x{41}\x{c9}\x{01}\x{00}\x{00}\x{00}".
"\x{00}\x{00}\x{00}\x{39}\x{40}\x{d1}\x{01}\x{00}\x{00}\x{00}\x{00}\x{00}".
"\x{00}\x{3a}\x{40}\x{d8}\x{01}\x{01}\x{e0}\x{01}\x{01}\x{ea}\x{01}\x{04}".
"\x{61}\x{73}\x{64}\x{66}\x{f2}\x{01}\x{04}\x{7a}\x{78}\x{63}\x{76}\x{fa}".
"\x{01}\x{03}\x{31}\x{32}\x{33}\x{82}\x{02}\x{03}\x{30}\x{39}\x{38}\x{8b}".
"\x{02}\x{08}\x{01}\x{10}\x{02}\x{8c}\x{02}\x{93}\x{02}\x{08}\x{01}\x{10}".
"\x{02}\x{94}\x{02}\x{9a}\x{02}\x{05}\x{08}\x{64}\x{10}\x{c8}\x{01}\x{a2}".
"\x{02}\x{06}\x{08}\x{ac}\x{02}\x{10}\x{90}\x{03}\x{a8}\x{02}\x{02}\x{b0}".
"\x{02}\x{02}"
);
is_deeply(Double->decode($str), $double);
is_deeply(Single->decode($str), $single);