xref: /aosp_15_r20/external/golang-protobuf/testing/protopack/pack_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2018 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsenpackage protopack
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"bytes"
9*1c12ee1eSDan Willemsen	"encoding/hex"
10*1c12ee1eSDan Willemsen	"fmt"
11*1c12ee1eSDan Willemsen	"math"
12*1c12ee1eSDan Willemsen	"testing"
13*1c12ee1eSDan Willemsen
14*1c12ee1eSDan Willemsen	"github.com/google/go-cmp/cmp"
15*1c12ee1eSDan Willemsen
16*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
17*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protodesc"
18*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
19*1c12ee1eSDan Willemsen
20*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/types/descriptorpb"
21*1c12ee1eSDan Willemsen)
22*1c12ee1eSDan Willemsen
23*1c12ee1eSDan Willemsenvar msgDesc = func() protoreflect.MessageDescriptor {
24*1c12ee1eSDan Willemsen	const s = `
25*1c12ee1eSDan Willemsen		name:   "test.proto"
26*1c12ee1eSDan Willemsen		syntax: "proto2"
27*1c12ee1eSDan Willemsen		message_type: [{
28*1c12ee1eSDan Willemsen			name: "Message"
29*1c12ee1eSDan Willemsen			field: [
30*1c12ee1eSDan Willemsen				{name:"f1"  number:1  label:LABEL_REPEATED type:TYPE_BOOL     options:{packed:true}},
31*1c12ee1eSDan Willemsen				{name:"f2"  number:2  label:LABEL_REPEATED type:TYPE_INT64    options:{packed:true}},
32*1c12ee1eSDan Willemsen				{name:"f3"  number:3  label:LABEL_REPEATED type:TYPE_SINT64   options:{packed:true}},
33*1c12ee1eSDan Willemsen				{name:"f4"  number:4  label:LABEL_REPEATED type:TYPE_UINT64   options:{packed:true}},
34*1c12ee1eSDan Willemsen				{name:"f5"  number:5  label:LABEL_REPEATED type:TYPE_FIXED32  options:{packed:true}},
35*1c12ee1eSDan Willemsen				{name:"f6"  number:6  label:LABEL_REPEATED type:TYPE_SFIXED32 options:{packed:true}},
36*1c12ee1eSDan Willemsen				{name:"f7"  number:7  label:LABEL_REPEATED type:TYPE_FLOAT    options:{packed:true}},
37*1c12ee1eSDan Willemsen				{name:"f8"  number:8  label:LABEL_REPEATED type:TYPE_FIXED64  options:{packed:true}},
38*1c12ee1eSDan Willemsen				{name:"f9"  number:9  label:LABEL_REPEATED type:TYPE_SFIXED64 options:{packed:true}},
39*1c12ee1eSDan Willemsen				{name:"f10" number:10 label:LABEL_REPEATED type:TYPE_DOUBLE   options:{packed:true}},
40*1c12ee1eSDan Willemsen				{name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_STRING},
41*1c12ee1eSDan Willemsen				{name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BYTES},
42*1c12ee1eSDan Willemsen				{name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".Message"},
43*1c12ee1eSDan Willemsen				{name:"f14" number:14 label:LABEL_OPTIONAL type:TYPE_GROUP   type_name:".Message.F14"}
44*1c12ee1eSDan Willemsen			]
45*1c12ee1eSDan Willemsen			nested_type: [{name: "F14"}]
46*1c12ee1eSDan Willemsen		}]
47*1c12ee1eSDan Willemsen	`
48*1c12ee1eSDan Willemsen	pb := new(descriptorpb.FileDescriptorProto)
49*1c12ee1eSDan Willemsen	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
50*1c12ee1eSDan Willemsen		panic(err)
51*1c12ee1eSDan Willemsen	}
52*1c12ee1eSDan Willemsen	fd, err := protodesc.NewFile(pb, nil)
53*1c12ee1eSDan Willemsen	if err != nil {
54*1c12ee1eSDan Willemsen		panic(err)
55*1c12ee1eSDan Willemsen	}
56*1c12ee1eSDan Willemsen	return fd.Messages().Get(0)
57*1c12ee1eSDan Willemsen}()
58*1c12ee1eSDan Willemsen
59*1c12ee1eSDan Willemsen// dhex decodes a hex-string and returns the bytes and panics if s is invalid.
60*1c12ee1eSDan Willemsenfunc dhex(s string) []byte {
61*1c12ee1eSDan Willemsen	b, err := hex.DecodeString(s)
62*1c12ee1eSDan Willemsen	if err != nil {
63*1c12ee1eSDan Willemsen		panic(err)
64*1c12ee1eSDan Willemsen	}
65*1c12ee1eSDan Willemsen	return b
66*1c12ee1eSDan Willemsen}
67*1c12ee1eSDan Willemsen
68*1c12ee1eSDan Willemsenfunc TestPack(t *testing.T) {
69*1c12ee1eSDan Willemsen	tests := []struct {
70*1c12ee1eSDan Willemsen		raw      []byte
71*1c12ee1eSDan Willemsen		msg      Message
72*1c12ee1eSDan Willemsen		msgDesc  protoreflect.MessageDescriptor
73*1c12ee1eSDan Willemsen		inferMsg bool
74*1c12ee1eSDan Willemsen
75*1c12ee1eSDan Willemsen		wantOutCompact string
76*1c12ee1eSDan Willemsen		wantOutMulti   string
77*1c12ee1eSDan Willemsen		wantOutSource  string
78*1c12ee1eSDan Willemsen	}{{
79*1c12ee1eSDan Willemsen		raw: dhex("080088808080800002088280808080000a09010002828080808000"),
80*1c12ee1eSDan Willemsen		msg: Message{
81*1c12ee1eSDan Willemsen			Tag{1, VarintType}, Bool(false),
82*1c12ee1eSDan Willemsen			Denormalized{5, Tag{1, VarintType}}, Uvarint(2),
83*1c12ee1eSDan Willemsen			Tag{1, VarintType}, Denormalized{5, Uvarint(2)},
84*1c12ee1eSDan Willemsen			Tag{1, BytesType}, LengthPrefix{Bool(true), Bool(false), Uvarint(2), Denormalized{5, Uvarint(2)}},
85*1c12ee1eSDan Willemsen		},
86*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
87*1c12ee1eSDan Willemsen		wantOutSource: `protopack.Message{
88*1c12ee1eSDan Willemsen	protopack.Tag{1, protopack.VarintType}, protopack.Bool(false),
89*1c12ee1eSDan Willemsen	protopack.Denormalized{+5, protopack.Tag{1, protopack.VarintType}}, protopack.Uvarint(2),
90*1c12ee1eSDan Willemsen	protopack.Tag{1, protopack.VarintType}, protopack.Denormalized{+5, protopack.Uvarint(2)},
91*1c12ee1eSDan Willemsen	protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix{protopack.Bool(true), protopack.Bool(false), protopack.Uvarint(2), protopack.Denormalized{+5, protopack.Uvarint(2)}},
92*1c12ee1eSDan Willemsen}`,
93*1c12ee1eSDan Willemsen	}, {
94*1c12ee1eSDan Willemsen		raw: dhex("080088808080800002088280808080000a09010002828080808000"),
95*1c12ee1eSDan Willemsen		msg: Message{
96*1c12ee1eSDan Willemsen			Tag{1, VarintType}, Uvarint(0),
97*1c12ee1eSDan Willemsen			Denormalized{5, Tag{1, VarintType}}, Uvarint(2),
98*1c12ee1eSDan Willemsen			Tag{1, VarintType}, Denormalized{5, Uvarint(2)},
99*1c12ee1eSDan Willemsen			Tag{1, BytesType}, Bytes(Message{Bool(true), Bool(false), Uvarint(2), Denormalized{5, Uvarint(2)}}.Marshal()),
100*1c12ee1eSDan Willemsen		},
101*1c12ee1eSDan Willemsen		inferMsg: true,
102*1c12ee1eSDan Willemsen	}, {
103*1c12ee1eSDan Willemsen		raw: dhex("100010828080808000121980808080808080808001ffffffffffffffff7f828080808000"),
104*1c12ee1eSDan Willemsen		msg: Message{
105*1c12ee1eSDan Willemsen			Tag{2, VarintType}, Varint(0),
106*1c12ee1eSDan Willemsen			Tag{2, VarintType}, Denormalized{5, Varint(2)},
107*1c12ee1eSDan Willemsen			Tag{2, BytesType}, LengthPrefix{Varint(math.MinInt64), Varint(math.MaxInt64), Denormalized{5, Varint(2)}},
108*1c12ee1eSDan Willemsen		},
109*1c12ee1eSDan Willemsen		msgDesc:        msgDesc,
110*1c12ee1eSDan Willemsen		wantOutCompact: `Message{Tag{2, Varint}, Varint(0), Tag{2, Varint}, Denormalized{+5, Varint(2)}, Tag{2, Bytes}, LengthPrefix{Varint(-9223372036854775808), Varint(9223372036854775807), Denormalized{+5, Varint(2)}}}`,
111*1c12ee1eSDan Willemsen	}, {
112*1c12ee1eSDan Willemsen		raw: dhex("1801188180808080001a1affffffffffffffffff01feffffffffffffffff01818080808000"),
113*1c12ee1eSDan Willemsen		msg: Message{
114*1c12ee1eSDan Willemsen			Tag{3, VarintType}, Svarint(-1),
115*1c12ee1eSDan Willemsen			Tag{3, VarintType}, Denormalized{5, Svarint(-1)},
116*1c12ee1eSDan Willemsen			Tag{3, BytesType}, LengthPrefix{Svarint(math.MinInt64), Svarint(math.MaxInt64), Denormalized{5, Svarint(-1)}},
117*1c12ee1eSDan Willemsen		},
118*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
119*1c12ee1eSDan Willemsen		wantOutMulti: `Message{
120*1c12ee1eSDan Willemsen	Tag{3, Varint}, Svarint(-1),
121*1c12ee1eSDan Willemsen	Tag{3, Varint}, Denormalized{+5, Svarint(-1)},
122*1c12ee1eSDan Willemsen	Tag{3, Bytes}, LengthPrefix{Svarint(-9223372036854775808), Svarint(9223372036854775807), Denormalized{+5, Svarint(-1)}},
123*1c12ee1eSDan Willemsen}`,
124*1c12ee1eSDan Willemsen	}, {
125*1c12ee1eSDan Willemsen		raw: dhex("200120818080808000221100ffffffffffffffffff01818080808000"),
126*1c12ee1eSDan Willemsen		msg: Message{
127*1c12ee1eSDan Willemsen			Tag{4, VarintType}, Uvarint(+1),
128*1c12ee1eSDan Willemsen			Tag{4, VarintType}, Denormalized{5, Uvarint(+1)},
129*1c12ee1eSDan Willemsen			Tag{4, BytesType}, LengthPrefix{Uvarint(0), Uvarint(math.MaxUint64), Denormalized{5, Uvarint(+1)}},
130*1c12ee1eSDan Willemsen		},
131*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
132*1c12ee1eSDan Willemsen		wantOutSource: `protopack.Message{
133*1c12ee1eSDan Willemsen	protopack.Tag{4, protopack.VarintType}, protopack.Uvarint(1),
134*1c12ee1eSDan Willemsen	protopack.Tag{4, protopack.VarintType}, protopack.Denormalized{+5, protopack.Uvarint(1)},
135*1c12ee1eSDan Willemsen	protopack.Tag{4, protopack.BytesType}, protopack.LengthPrefix{protopack.Uvarint(0), protopack.Uvarint(18446744073709551615), protopack.Denormalized{+5, protopack.Uvarint(1)}},
136*1c12ee1eSDan Willemsen}`,
137*1c12ee1eSDan Willemsen	}, {
138*1c12ee1eSDan Willemsen		raw: dhex("2d010000002a0800000000ffffffff"),
139*1c12ee1eSDan Willemsen		msg: Message{
140*1c12ee1eSDan Willemsen			Tag{5, Fixed32Type}, Uint32(+1),
141*1c12ee1eSDan Willemsen			Tag{5, BytesType}, LengthPrefix{Uint32(0), Uint32(math.MaxUint32)},
142*1c12ee1eSDan Willemsen		},
143*1c12ee1eSDan Willemsen		msgDesc:        msgDesc,
144*1c12ee1eSDan Willemsen		wantOutCompact: `Message{Tag{5, Fixed32}, Uint32(1), Tag{5, Bytes}, LengthPrefix{Uint32(0), Uint32(4294967295)}}`,
145*1c12ee1eSDan Willemsen	}, {
146*1c12ee1eSDan Willemsen		raw: dhex("35ffffffff320800000080ffffff7f"),
147*1c12ee1eSDan Willemsen		msg: Message{
148*1c12ee1eSDan Willemsen			Tag{6, Fixed32Type}, Int32(-1),
149*1c12ee1eSDan Willemsen			Tag{6, BytesType}, LengthPrefix{Int32(math.MinInt32), Int32(math.MaxInt32)},
150*1c12ee1eSDan Willemsen		},
151*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
152*1c12ee1eSDan Willemsen		wantOutMulti: `Message{
153*1c12ee1eSDan Willemsen	Tag{6, Fixed32}, Int32(-1),
154*1c12ee1eSDan Willemsen	Tag{6, Bytes}, LengthPrefix{Int32(-2147483648), Int32(2147483647)},
155*1c12ee1eSDan Willemsen}`,
156*1c12ee1eSDan Willemsen	}, {
157*1c12ee1eSDan Willemsen		raw: dhex("3ddb0f49403a1001000000ffff7f7f0000807f000080ff"),
158*1c12ee1eSDan Willemsen		msg: Message{
159*1c12ee1eSDan Willemsen			Tag{7, Fixed32Type}, Float32(math.Pi),
160*1c12ee1eSDan Willemsen			Tag{7, BytesType}, LengthPrefix{Float32(math.SmallestNonzeroFloat32), Float32(math.MaxFloat32), Float32(math.Inf(+1)), Float32(math.Inf(-1))},
161*1c12ee1eSDan Willemsen		},
162*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
163*1c12ee1eSDan Willemsen		wantOutSource: `protopack.Message{
164*1c12ee1eSDan Willemsen	protopack.Tag{7, protopack.Fixed32Type}, protopack.Float32(3.1415927),
165*1c12ee1eSDan Willemsen	protopack.Tag{7, protopack.BytesType}, protopack.LengthPrefix{protopack.Float32(1e-45), protopack.Float32(3.4028235e+38), protopack.Float32(math.Inf(+1)), protopack.Float32(math.Inf(-1))},
166*1c12ee1eSDan Willemsen}`,
167*1c12ee1eSDan Willemsen	}, {
168*1c12ee1eSDan Willemsen		raw: dhex("41010000000000000042100000000000000000ffffffffffffffff"),
169*1c12ee1eSDan Willemsen		msg: Message{
170*1c12ee1eSDan Willemsen			Tag{8, Fixed64Type}, Uint64(+1),
171*1c12ee1eSDan Willemsen			Tag{8, BytesType}, LengthPrefix{Uint64(0), Uint64(math.MaxUint64)},
172*1c12ee1eSDan Willemsen		},
173*1c12ee1eSDan Willemsen		msgDesc:        msgDesc,
174*1c12ee1eSDan Willemsen		wantOutCompact: `Message{Tag{8, Fixed64}, Uint64(1), Tag{8, Bytes}, LengthPrefix{Uint64(0), Uint64(18446744073709551615)}}`,
175*1c12ee1eSDan Willemsen	}, {
176*1c12ee1eSDan Willemsen		raw: dhex("49ffffffffffffffff4a100000000000000080ffffffffffffff7f"),
177*1c12ee1eSDan Willemsen		msg: Message{
178*1c12ee1eSDan Willemsen			Tag{9, Fixed64Type}, Int64(-1),
179*1c12ee1eSDan Willemsen			Tag{9, BytesType}, LengthPrefix{Int64(math.MinInt64), Int64(math.MaxInt64)},
180*1c12ee1eSDan Willemsen		},
181*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
182*1c12ee1eSDan Willemsen		wantOutMulti: `Message{
183*1c12ee1eSDan Willemsen	Tag{9, Fixed64}, Int64(-1),
184*1c12ee1eSDan Willemsen	Tag{9, Bytes}, LengthPrefix{Int64(-9223372036854775808), Int64(9223372036854775807)},
185*1c12ee1eSDan Willemsen}`,
186*1c12ee1eSDan Willemsen	}, {
187*1c12ee1eSDan Willemsen		raw: dhex("51182d4454fb21094052200100000000000000ffffffffffffef7f000000000000f07f000000000000f0ff"),
188*1c12ee1eSDan Willemsen		msg: Message{
189*1c12ee1eSDan Willemsen			Tag{10, Fixed64Type}, Float64(math.Pi),
190*1c12ee1eSDan Willemsen			Tag{10, BytesType}, LengthPrefix{Float64(math.SmallestNonzeroFloat64), Float64(math.MaxFloat64), Float64(math.Inf(+1)), Float64(math.Inf(-1))},
191*1c12ee1eSDan Willemsen		},
192*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
193*1c12ee1eSDan Willemsen		wantOutMulti: `Message{
194*1c12ee1eSDan Willemsen	Tag{10, Fixed64}, Float64(3.141592653589793),
195*1c12ee1eSDan Willemsen	Tag{10, Bytes}, LengthPrefix{Float64(5e-324), Float64(1.7976931348623157e+308), Float64(+Inf), Float64(-Inf)},
196*1c12ee1eSDan Willemsen}`,
197*1c12ee1eSDan Willemsen	}, {
198*1c12ee1eSDan Willemsen		raw: dhex("5a06737472696e675a868080808000737472696e67"),
199*1c12ee1eSDan Willemsen		msg: Message{
200*1c12ee1eSDan Willemsen			Tag{11, BytesType}, String("string"),
201*1c12ee1eSDan Willemsen			Tag{11, BytesType}, Denormalized{+5, String("string")},
202*1c12ee1eSDan Willemsen		},
203*1c12ee1eSDan Willemsen		msgDesc:        msgDesc,
204*1c12ee1eSDan Willemsen		wantOutCompact: `Message{Tag{11, Bytes}, String("string"), Tag{11, Bytes}, Denormalized{+5, String("string")}}`,
205*1c12ee1eSDan Willemsen	}, {
206*1c12ee1eSDan Willemsen		raw: dhex("62056279746573628580808080006279746573"),
207*1c12ee1eSDan Willemsen		msg: Message{
208*1c12ee1eSDan Willemsen			Tag{12, BytesType}, Bytes("bytes"),
209*1c12ee1eSDan Willemsen			Tag{12, BytesType}, Denormalized{+5, Bytes("bytes")},
210*1c12ee1eSDan Willemsen		},
211*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
212*1c12ee1eSDan Willemsen		wantOutMulti: `Message{
213*1c12ee1eSDan Willemsen	Tag{12, Bytes}, Bytes("bytes"),
214*1c12ee1eSDan Willemsen	Tag{12, Bytes}, Denormalized{+5, Bytes("bytes")},
215*1c12ee1eSDan Willemsen}`,
216*1c12ee1eSDan Willemsen	}, {
217*1c12ee1eSDan Willemsen		raw: dhex("6a28a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a406"),
218*1c12ee1eSDan Willemsen		msg: Message{
219*1c12ee1eSDan Willemsen			Tag{13, BytesType}, LengthPrefix(Message{
220*1c12ee1eSDan Willemsen				Tag{100, VarintType}, Uvarint(math.MaxUint64),
221*1c12ee1eSDan Willemsen				Tag{100, Fixed32Type}, Uint32(math.MaxUint32),
222*1c12ee1eSDan Willemsen				Tag{100, Fixed64Type}, Uint64(math.MaxUint64),
223*1c12ee1eSDan Willemsen				Tag{100, BytesType}, Bytes("bytes"),
224*1c12ee1eSDan Willemsen				Tag{100, StartGroupType}, Tag{100, EndGroupType},
225*1c12ee1eSDan Willemsen			}),
226*1c12ee1eSDan Willemsen		},
227*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
228*1c12ee1eSDan Willemsen		wantOutSource: `protopack.Message{
229*1c12ee1eSDan Willemsen	protopack.Tag{13, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
230*1c12ee1eSDan Willemsen		protopack.Tag{100, protopack.VarintType}, protopack.Uvarint(18446744073709551615),
231*1c12ee1eSDan Willemsen		protopack.Tag{100, protopack.Fixed32Type}, protopack.Uint32(4294967295),
232*1c12ee1eSDan Willemsen		protopack.Tag{100, protopack.Fixed64Type}, protopack.Uint64(18446744073709551615),
233*1c12ee1eSDan Willemsen		protopack.Tag{100, protopack.BytesType}, protopack.Bytes("bytes"),
234*1c12ee1eSDan Willemsen		protopack.Tag{100, protopack.StartGroupType},
235*1c12ee1eSDan Willemsen		protopack.Tag{100, protopack.EndGroupType},
236*1c12ee1eSDan Willemsen	}),
237*1c12ee1eSDan Willemsen}`,
238*1c12ee1eSDan Willemsen	}, {
239*1c12ee1eSDan Willemsen		raw: dhex("6a28a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a406"),
240*1c12ee1eSDan Willemsen		msg: Message{
241*1c12ee1eSDan Willemsen			Tag{13, BytesType}, LengthPrefix(Message{
242*1c12ee1eSDan Willemsen				Tag{100, VarintType}, Uvarint(math.MaxUint64),
243*1c12ee1eSDan Willemsen				Tag{100, Fixed32Type}, Uint32(math.MaxUint32),
244*1c12ee1eSDan Willemsen				Tag{100, Fixed64Type}, Uint64(math.MaxUint64),
245*1c12ee1eSDan Willemsen				Tag{100, BytesType}, Bytes("bytes"),
246*1c12ee1eSDan Willemsen				Tag{100, StartGroupType}, Tag{100, EndGroupType},
247*1c12ee1eSDan Willemsen			}),
248*1c12ee1eSDan Willemsen		},
249*1c12ee1eSDan Willemsen		inferMsg: true,
250*1c12ee1eSDan Willemsen	}, {
251*1c12ee1eSDan Willemsen		raw: dhex("6a28a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306ac06"),
252*1c12ee1eSDan Willemsen		msg: Message{
253*1c12ee1eSDan Willemsen			Tag{13, BytesType}, Bytes(Message{
254*1c12ee1eSDan Willemsen				Tag{100, VarintType}, Uvarint(math.MaxUint64),
255*1c12ee1eSDan Willemsen				Tag{100, Fixed32Type}, Uint32(math.MaxUint32),
256*1c12ee1eSDan Willemsen				Tag{100, Fixed64Type}, Uint64(math.MaxUint64),
257*1c12ee1eSDan Willemsen				Tag{100, BytesType}, Bytes("bytes"),
258*1c12ee1eSDan Willemsen				Tag{100, StartGroupType}, Tag{101, EndGroupType},
259*1c12ee1eSDan Willemsen			}.Marshal()),
260*1c12ee1eSDan Willemsen		},
261*1c12ee1eSDan Willemsen		inferMsg: true,
262*1c12ee1eSDan Willemsen	}, {
263*1c12ee1eSDan Willemsen		raw: dhex("6aa88080808000a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a406"),
264*1c12ee1eSDan Willemsen		msg: Message{
265*1c12ee1eSDan Willemsen			Tag{13, BytesType}, Denormalized{5, LengthPrefix(Message{
266*1c12ee1eSDan Willemsen				Tag{100, VarintType}, Uvarint(math.MaxUint64),
267*1c12ee1eSDan Willemsen				Tag{100, Fixed32Type}, Uint32(math.MaxUint32),
268*1c12ee1eSDan Willemsen				Tag{100, Fixed64Type}, Uint64(math.MaxUint64),
269*1c12ee1eSDan Willemsen				Tag{100, BytesType}, Bytes("bytes"),
270*1c12ee1eSDan Willemsen				Tag{100, StartGroupType}, Tag{100, EndGroupType},
271*1c12ee1eSDan Willemsen			})},
272*1c12ee1eSDan Willemsen		},
273*1c12ee1eSDan Willemsen		msgDesc:        msgDesc,
274*1c12ee1eSDan Willemsen		wantOutCompact: `Message{Tag{13, Bytes}, Denormalized{+5, LengthPrefix(Message{Tag{100, Varint}, Uvarint(18446744073709551615), Tag{100, Fixed32}, Uint32(4294967295), Tag{100, Fixed64}, Uint64(18446744073709551615), Tag{100, Bytes}, Bytes("bytes"), Tag{100, StartGroup}, Tag{100, EndGroup}})}}`,
275*1c12ee1eSDan Willemsen	}, {
276*1c12ee1eSDan Willemsen		raw: dhex("73a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a40674"),
277*1c12ee1eSDan Willemsen		msg: Message{
278*1c12ee1eSDan Willemsen			Tag{14, StartGroupType}, Message{
279*1c12ee1eSDan Willemsen				Tag{100, VarintType}, Uvarint(math.MaxUint64),
280*1c12ee1eSDan Willemsen				Tag{100, Fixed32Type}, Uint32(math.MaxUint32),
281*1c12ee1eSDan Willemsen				Tag{100, Fixed64Type}, Uint64(math.MaxUint64),
282*1c12ee1eSDan Willemsen				Tag{100, BytesType}, Bytes("bytes"),
283*1c12ee1eSDan Willemsen				Tag{100, StartGroupType}, Tag{100, EndGroupType},
284*1c12ee1eSDan Willemsen			},
285*1c12ee1eSDan Willemsen			Tag{14, EndGroupType},
286*1c12ee1eSDan Willemsen		},
287*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
288*1c12ee1eSDan Willemsen		wantOutMulti: `Message{
289*1c12ee1eSDan Willemsen	Tag{14, StartGroup},
290*1c12ee1eSDan Willemsen	Message{
291*1c12ee1eSDan Willemsen		Tag{100, Varint}, Uvarint(18446744073709551615),
292*1c12ee1eSDan Willemsen		Tag{100, Fixed32}, Uint32(4294967295),
293*1c12ee1eSDan Willemsen		Tag{100, Fixed64}, Uint64(18446744073709551615),
294*1c12ee1eSDan Willemsen		Tag{100, Bytes}, Bytes("bytes"),
295*1c12ee1eSDan Willemsen		Tag{100, StartGroup},
296*1c12ee1eSDan Willemsen		Tag{100, EndGroup},
297*1c12ee1eSDan Willemsen	},
298*1c12ee1eSDan Willemsen	Tag{14, EndGroup},
299*1c12ee1eSDan Willemsen}`,
300*1c12ee1eSDan Willemsen	}, {
301*1c12ee1eSDan Willemsen		raw: dhex("d0faa972cd02a5f09051c2d8aa0d6a26a89c311eddef024b423c0f6f47b64227a1600db56e3f73d4113096c9a88e2b99f2d847516853d76a1a6e9811c85a2ab3"),
302*1c12ee1eSDan Willemsen		msg: Message{
303*1c12ee1eSDan Willemsen			Tag{29970346, VarintType}, Uvarint(333),
304*1c12ee1eSDan Willemsen			Tag{21268228, Fixed32Type}, Uint32(229300418),
305*1c12ee1eSDan Willemsen			Tag{13, BytesType}, LengthPrefix(Message{
306*1c12ee1eSDan Willemsen				Tag{100805, VarintType}, Uvarint(30),
307*1c12ee1eSDan Willemsen				Tag{5883, Fixed32Type}, Uint32(255607371),
308*1c12ee1eSDan Willemsen				Tag{13, Type(7)},
309*1c12ee1eSDan Willemsen				Raw("G\xb6B'\xa1`\r\xb5n?s\xd4\x110\x96ɨ\x8e+\x99\xf2\xd8GQhS"),
310*1c12ee1eSDan Willemsen			}),
311*1c12ee1eSDan Willemsen			Tag{1706, Type(7)},
312*1c12ee1eSDan Willemsen			Raw("\x1an\x98\x11\xc8Z*\xb3"),
313*1c12ee1eSDan Willemsen		},
314*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
315*1c12ee1eSDan Willemsen	}, {
316*1c12ee1eSDan Willemsen		raw: dhex("3d08d0e57f"),
317*1c12ee1eSDan Willemsen		msg: Message{
318*1c12ee1eSDan Willemsen			Tag{7, Fixed32Type}, Float32(math.Float32frombits(
319*1c12ee1eSDan Willemsen				// TODO: Remove workaround for compiler bug (see https://golang.org/issues/27193).
320*1c12ee1eSDan Willemsen				func() uint32 { return 0x7fe5d008 }(),
321*1c12ee1eSDan Willemsen			)),
322*1c12ee1eSDan Willemsen		},
323*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
324*1c12ee1eSDan Willemsen		wantOutSource: `protopack.Message{
325*1c12ee1eSDan Willemsen	protopack.Tag{7, protopack.Fixed32Type}, protopack.Float32(math.Float32frombits(0x7fe5d008)),
326*1c12ee1eSDan Willemsen}`,
327*1c12ee1eSDan Willemsen	}, {
328*1c12ee1eSDan Willemsen		raw: dhex("51a8d65110771bf97f"),
329*1c12ee1eSDan Willemsen		msg: Message{
330*1c12ee1eSDan Willemsen			Tag{10, Fixed64Type}, Float64(math.Float64frombits(0x7ff91b771051d6a8)),
331*1c12ee1eSDan Willemsen		},
332*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
333*1c12ee1eSDan Willemsen		wantOutSource: `protopack.Message{
334*1c12ee1eSDan Willemsen	protopack.Tag{10, protopack.Fixed64Type}, protopack.Float64(math.Float64frombits(0x7ff91b771051d6a8)),
335*1c12ee1eSDan Willemsen}`,
336*1c12ee1eSDan Willemsen	}, {
337*1c12ee1eSDan Willemsen		raw: dhex("ab2c14481ab3e9a76d937fb4dd5e6c616ef311f62b7fe888785fca5609ffe81c1064e50dd7a9edb408d317e2891c0d54c719446938d41ab0ccf8e61dc28b0ebb"),
338*1c12ee1eSDan Willemsen		msg: Message{
339*1c12ee1eSDan Willemsen			Tag{709, StartGroupType},
340*1c12ee1eSDan Willemsen			Tag{2, EndGroupType},
341*1c12ee1eSDan Willemsen			Tag{9, VarintType}, Uvarint(26),
342*1c12ee1eSDan Willemsen			Tag{28655254, StartGroupType},
343*1c12ee1eSDan Willemsen			Message{
344*1c12ee1eSDan Willemsen				Tag{2034, StartGroupType},
345*1c12ee1eSDan Willemsen				Tag{194006, EndGroupType},
346*1c12ee1eSDan Willemsen			},
347*1c12ee1eSDan Willemsen			Tag{13, EndGroupType},
348*1c12ee1eSDan Willemsen			Tag{12, Fixed64Type}, Uint64(9865274810543764334),
349*1c12ee1eSDan Willemsen			Tag{15, VarintType}, Uvarint(95),
350*1c12ee1eSDan Willemsen			Tag{1385, BytesType}, Bytes("\xff\xe8\x1c\x10d\xe5\rש"),
351*1c12ee1eSDan Willemsen			Tag{17229, Fixed32Type}, Uint32(2313295827),
352*1c12ee1eSDan Willemsen			Tag{3, EndGroupType},
353*1c12ee1eSDan Willemsen			Tag{1, Fixed32Type}, Uint32(1142540116),
354*1c12ee1eSDan Willemsen			Tag{13, Fixed64Type}, Uint64(2154683029754926136),
355*1c12ee1eSDan Willemsen			Tag{28856, BytesType},
356*1c12ee1eSDan Willemsen			Raw("\xbb"),
357*1c12ee1eSDan Willemsen		},
358*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
359*1c12ee1eSDan Willemsen	}, {
360*1c12ee1eSDan Willemsen		raw: dhex("29baa4ac1c1e0a20183393bac434b8d3559337ec940050038770eaa9937f98e4"),
361*1c12ee1eSDan Willemsen		msg: Message{
362*1c12ee1eSDan Willemsen			Tag{5, Fixed64Type}, Uint64(1738400580611384506),
363*1c12ee1eSDan Willemsen			Tag{6, StartGroupType},
364*1c12ee1eSDan Willemsen			Message{
365*1c12ee1eSDan Willemsen				Tag{13771682, StartGroupType},
366*1c12ee1eSDan Willemsen				Message{
367*1c12ee1eSDan Willemsen					Tag{175415, VarintType}, Uvarint(7059),
368*1c12ee1eSDan Willemsen				},
369*1c12ee1eSDan Willemsen				Denormalized{+1, Tag{333, EndGroupType}},
370*1c12ee1eSDan Willemsen				Tag{10, VarintType}, Uvarint(3),
371*1c12ee1eSDan Willemsen				Tag{1792, Type(7)},
372*1c12ee1eSDan Willemsen				Raw("꩓\u007f\x98\xe4"),
373*1c12ee1eSDan Willemsen			},
374*1c12ee1eSDan Willemsen		},
375*1c12ee1eSDan Willemsen		msgDesc: msgDesc,
376*1c12ee1eSDan Willemsen	}}
377*1c12ee1eSDan Willemsen
378*1c12ee1eSDan Willemsen	equateFloatBits := cmp.Options{
379*1c12ee1eSDan Willemsen		cmp.Comparer(func(x, y Float32) bool {
380*1c12ee1eSDan Willemsen			return math.Float32bits(float32(x)) == math.Float32bits(float32(y))
381*1c12ee1eSDan Willemsen		}),
382*1c12ee1eSDan Willemsen		cmp.Comparer(func(x, y Float64) bool {
383*1c12ee1eSDan Willemsen			return math.Float64bits(float64(x)) == math.Float64bits(float64(y))
384*1c12ee1eSDan Willemsen		}),
385*1c12ee1eSDan Willemsen	}
386*1c12ee1eSDan Willemsen	for _, tt := range tests {
387*1c12ee1eSDan Willemsen		t.Run("", func(t *testing.T) {
388*1c12ee1eSDan Willemsen			var msg Message
389*1c12ee1eSDan Willemsen			raw := tt.msg.Marshal()
390*1c12ee1eSDan Willemsen			msg.unmarshal(tt.raw, tt.msgDesc, tt.inferMsg)
391*1c12ee1eSDan Willemsen
392*1c12ee1eSDan Willemsen			if !bytes.Equal(raw, tt.raw) {
393*1c12ee1eSDan Willemsen				t.Errorf("Marshal() mismatch:\ngot  %x\nwant %x", raw, tt.raw)
394*1c12ee1eSDan Willemsen			}
395*1c12ee1eSDan Willemsen			if diff := cmp.Diff(tt.msg, msg, equateFloatBits); diff != "" {
396*1c12ee1eSDan Willemsen				t.Errorf("Unmarshal() mismatch (-want +got):\n%s", diff)
397*1c12ee1eSDan Willemsen			}
398*1c12ee1eSDan Willemsen			if got, want := tt.msg.Size(), len(tt.raw); got != want {
399*1c12ee1eSDan Willemsen				t.Errorf("Size() = %v, want %v", got, want)
400*1c12ee1eSDan Willemsen			}
401*1c12ee1eSDan Willemsen			if tt.wantOutCompact != "" {
402*1c12ee1eSDan Willemsen				gotOut := fmt.Sprintf("%v", tt.msg)
403*1c12ee1eSDan Willemsen				if string(gotOut) != tt.wantOutCompact {
404*1c12ee1eSDan Willemsen					t.Errorf("fmt.Sprintf(%q, msg):\ngot:  %s\nwant: %s", "%v", gotOut, tt.wantOutCompact)
405*1c12ee1eSDan Willemsen				}
406*1c12ee1eSDan Willemsen			}
407*1c12ee1eSDan Willemsen			if tt.wantOutMulti != "" {
408*1c12ee1eSDan Willemsen				gotOut := fmt.Sprintf("%+v", tt.msg)
409*1c12ee1eSDan Willemsen				if string(gotOut) != tt.wantOutMulti {
410*1c12ee1eSDan Willemsen					t.Errorf("fmt.Sprintf(%q, msg):\ngot:  %s\nwant: %s", "%+v", gotOut, tt.wantOutMulti)
411*1c12ee1eSDan Willemsen				}
412*1c12ee1eSDan Willemsen			}
413*1c12ee1eSDan Willemsen			if tt.wantOutSource != "" {
414*1c12ee1eSDan Willemsen				gotOut := fmt.Sprintf("%#v", tt.msg)
415*1c12ee1eSDan Willemsen				if string(gotOut) != tt.wantOutSource {
416*1c12ee1eSDan Willemsen					t.Errorf("fmt.Sprintf(%q, msg):\ngot:  %s\nwant: %s", "%#v", gotOut, tt.wantOutSource)
417*1c12ee1eSDan Willemsen				}
418*1c12ee1eSDan Willemsen			}
419*1c12ee1eSDan Willemsen		})
420*1c12ee1eSDan Willemsen	}
421*1c12ee1eSDan Willemsen}
422