xref: /aosp_15_r20/external/golang-protobuf/proto/testmessages_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2019 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 proto_test
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/protowire"
9*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/impl"
10*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/protobuild"
11*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
12*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
13*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoregistry"
14*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/testing/protopack"
15*1c12ee1eSDan Willemsen
16*1c12ee1eSDan Willemsen	legacypb "google.golang.org/protobuf/internal/testprotos/legacy"
17*1c12ee1eSDan Willemsen	requiredpb "google.golang.org/protobuf/internal/testprotos/required"
18*1c12ee1eSDan Willemsen	testpb "google.golang.org/protobuf/internal/testprotos/test"
19*1c12ee1eSDan Willemsen	test3pb "google.golang.org/protobuf/internal/testprotos/test3"
20*1c12ee1eSDan Willemsen)
21*1c12ee1eSDan Willemsen
22*1c12ee1eSDan Willemsentype testProto struct {
23*1c12ee1eSDan Willemsen	desc             string
24*1c12ee1eSDan Willemsen	decodeTo         []proto.Message
25*1c12ee1eSDan Willemsen	wire             []byte
26*1c12ee1eSDan Willemsen	partial          bool
27*1c12ee1eSDan Willemsen	noEncode         bool
28*1c12ee1eSDan Willemsen	checkFastInit    bool
29*1c12ee1eSDan Willemsen	unmarshalOptions proto.UnmarshalOptions
30*1c12ee1eSDan Willemsen	validationStatus impl.ValidationStatus
31*1c12ee1eSDan Willemsen	nocheckValidInit bool
32*1c12ee1eSDan Willemsen}
33*1c12ee1eSDan Willemsen
34*1c12ee1eSDan Willemsenfunc makeMessages(in protobuild.Message, messages ...proto.Message) []proto.Message {
35*1c12ee1eSDan Willemsen	if len(messages) == 0 {
36*1c12ee1eSDan Willemsen		messages = []proto.Message{
37*1c12ee1eSDan Willemsen			&testpb.TestAllTypes{},
38*1c12ee1eSDan Willemsen			&test3pb.TestAllTypes{},
39*1c12ee1eSDan Willemsen			&testpb.TestAllExtensions{},
40*1c12ee1eSDan Willemsen		}
41*1c12ee1eSDan Willemsen	}
42*1c12ee1eSDan Willemsen	for _, m := range messages {
43*1c12ee1eSDan Willemsen		in.Build(m.ProtoReflect())
44*1c12ee1eSDan Willemsen	}
45*1c12ee1eSDan Willemsen	return messages
46*1c12ee1eSDan Willemsen}
47*1c12ee1eSDan Willemsen
48*1c12ee1eSDan Willemsenfunc templateMessages(messages ...proto.Message) []protoreflect.MessageType {
49*1c12ee1eSDan Willemsen	if len(messages) == 0 {
50*1c12ee1eSDan Willemsen		messages = []proto.Message{
51*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
52*1c12ee1eSDan Willemsen			(*test3pb.TestAllTypes)(nil),
53*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
54*1c12ee1eSDan Willemsen		}
55*1c12ee1eSDan Willemsen	}
56*1c12ee1eSDan Willemsen	var out []protoreflect.MessageType
57*1c12ee1eSDan Willemsen	for _, m := range messages {
58*1c12ee1eSDan Willemsen		out = append(out, m.ProtoReflect().Type())
59*1c12ee1eSDan Willemsen	}
60*1c12ee1eSDan Willemsen	return out
61*1c12ee1eSDan Willemsen
62*1c12ee1eSDan Willemsen}
63*1c12ee1eSDan Willemsen
64*1c12ee1eSDan Willemsenvar testValidMessages = []testProto{
65*1c12ee1eSDan Willemsen	{
66*1c12ee1eSDan Willemsen		desc:          "basic scalar types",
67*1c12ee1eSDan Willemsen		checkFastInit: true,
68*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
69*1c12ee1eSDan Willemsen			"optional_int32":       1001,
70*1c12ee1eSDan Willemsen			"optional_int64":       1002,
71*1c12ee1eSDan Willemsen			"optional_uint32":      1003,
72*1c12ee1eSDan Willemsen			"optional_uint64":      1004,
73*1c12ee1eSDan Willemsen			"optional_sint32":      1005,
74*1c12ee1eSDan Willemsen			"optional_sint64":      1006,
75*1c12ee1eSDan Willemsen			"optional_fixed32":     1007,
76*1c12ee1eSDan Willemsen			"optional_fixed64":     1008,
77*1c12ee1eSDan Willemsen			"optional_sfixed32":    1009,
78*1c12ee1eSDan Willemsen			"optional_sfixed64":    1010,
79*1c12ee1eSDan Willemsen			"optional_float":       1011.5,
80*1c12ee1eSDan Willemsen			"optional_double":      1012.5,
81*1c12ee1eSDan Willemsen			"optional_bool":        true,
82*1c12ee1eSDan Willemsen			"optional_string":      "string",
83*1c12ee1eSDan Willemsen			"optional_bytes":       []byte("bytes"),
84*1c12ee1eSDan Willemsen			"optional_nested_enum": "BAR",
85*1c12ee1eSDan Willemsen		}),
86*1c12ee1eSDan Willemsen		wire: protopack.Message{
87*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType}, protopack.Varint(1001),
88*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1002),
89*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.VarintType}, protopack.Uvarint(1003),
90*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.VarintType}, protopack.Uvarint(1004),
91*1c12ee1eSDan Willemsen			protopack.Tag{5, protopack.VarintType}, protopack.Svarint(1005),
92*1c12ee1eSDan Willemsen			protopack.Tag{6, protopack.VarintType}, protopack.Svarint(1006),
93*1c12ee1eSDan Willemsen			protopack.Tag{7, protopack.Fixed32Type}, protopack.Uint32(1007),
94*1c12ee1eSDan Willemsen			protopack.Tag{8, protopack.Fixed64Type}, protopack.Uint64(1008),
95*1c12ee1eSDan Willemsen			protopack.Tag{9, protopack.Fixed32Type}, protopack.Int32(1009),
96*1c12ee1eSDan Willemsen			protopack.Tag{10, protopack.Fixed64Type}, protopack.Int64(1010),
97*1c12ee1eSDan Willemsen			protopack.Tag{11, protopack.Fixed32Type}, protopack.Float32(1011.5),
98*1c12ee1eSDan Willemsen			protopack.Tag{12, protopack.Fixed64Type}, protopack.Float64(1012.5),
99*1c12ee1eSDan Willemsen			protopack.Tag{13, protopack.VarintType}, protopack.Bool(true),
100*1c12ee1eSDan Willemsen			protopack.Tag{14, protopack.BytesType}, protopack.String("string"),
101*1c12ee1eSDan Willemsen			protopack.Tag{15, protopack.BytesType}, protopack.Bytes([]byte("bytes")),
102*1c12ee1eSDan Willemsen			protopack.Tag{21, protopack.VarintType}, protopack.Varint(int(testpb.TestAllTypes_BAR)),
103*1c12ee1eSDan Willemsen		}.Marshal(),
104*1c12ee1eSDan Willemsen	},
105*1c12ee1eSDan Willemsen	{
106*1c12ee1eSDan Willemsen		desc: "zero values",
107*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
108*1c12ee1eSDan Willemsen			"optional_int32":    0,
109*1c12ee1eSDan Willemsen			"optional_int64":    0,
110*1c12ee1eSDan Willemsen			"optional_uint32":   0,
111*1c12ee1eSDan Willemsen			"optional_uint64":   0,
112*1c12ee1eSDan Willemsen			"optional_sint32":   0,
113*1c12ee1eSDan Willemsen			"optional_sint64":   0,
114*1c12ee1eSDan Willemsen			"optional_fixed32":  0,
115*1c12ee1eSDan Willemsen			"optional_fixed64":  0,
116*1c12ee1eSDan Willemsen			"optional_sfixed32": 0,
117*1c12ee1eSDan Willemsen			"optional_sfixed64": 0,
118*1c12ee1eSDan Willemsen			"optional_float":    0,
119*1c12ee1eSDan Willemsen			"optional_double":   0,
120*1c12ee1eSDan Willemsen			"optional_bool":     false,
121*1c12ee1eSDan Willemsen			"optional_string":   "",
122*1c12ee1eSDan Willemsen			"optional_bytes":    []byte{},
123*1c12ee1eSDan Willemsen		}),
124*1c12ee1eSDan Willemsen		wire: protopack.Message{
125*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType}, protopack.Varint(0),
126*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(0),
127*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.VarintType}, protopack.Uvarint(0),
128*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.VarintType}, protopack.Uvarint(0),
129*1c12ee1eSDan Willemsen			protopack.Tag{5, protopack.VarintType}, protopack.Svarint(0),
130*1c12ee1eSDan Willemsen			protopack.Tag{6, protopack.VarintType}, protopack.Svarint(0),
131*1c12ee1eSDan Willemsen			protopack.Tag{7, protopack.Fixed32Type}, protopack.Uint32(0),
132*1c12ee1eSDan Willemsen			protopack.Tag{8, protopack.Fixed64Type}, protopack.Uint64(0),
133*1c12ee1eSDan Willemsen			protopack.Tag{9, protopack.Fixed32Type}, protopack.Int32(0),
134*1c12ee1eSDan Willemsen			protopack.Tag{10, protopack.Fixed64Type}, protopack.Int64(0),
135*1c12ee1eSDan Willemsen			protopack.Tag{11, protopack.Fixed32Type}, protopack.Float32(0),
136*1c12ee1eSDan Willemsen			protopack.Tag{12, protopack.Fixed64Type}, protopack.Float64(0),
137*1c12ee1eSDan Willemsen			protopack.Tag{13, protopack.VarintType}, protopack.Bool(false),
138*1c12ee1eSDan Willemsen			protopack.Tag{14, protopack.BytesType}, protopack.String(""),
139*1c12ee1eSDan Willemsen			protopack.Tag{15, protopack.BytesType}, protopack.Bytes(nil),
140*1c12ee1eSDan Willemsen		}.Marshal(),
141*1c12ee1eSDan Willemsen	},
142*1c12ee1eSDan Willemsen	{
143*1c12ee1eSDan Willemsen		desc: "proto3 zero values",
144*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
145*1c12ee1eSDan Willemsen			"singular_int32":    0,
146*1c12ee1eSDan Willemsen			"singular_int64":    0,
147*1c12ee1eSDan Willemsen			"singular_uint32":   0,
148*1c12ee1eSDan Willemsen			"singular_uint64":   0,
149*1c12ee1eSDan Willemsen			"singular_sint32":   0,
150*1c12ee1eSDan Willemsen			"singular_sint64":   0,
151*1c12ee1eSDan Willemsen			"singular_fixed32":  0,
152*1c12ee1eSDan Willemsen			"singular_fixed64":  0,
153*1c12ee1eSDan Willemsen			"singular_sfixed32": 0,
154*1c12ee1eSDan Willemsen			"singular_sfixed64": 0,
155*1c12ee1eSDan Willemsen			"singular_float":    0,
156*1c12ee1eSDan Willemsen			"singular_double":   0,
157*1c12ee1eSDan Willemsen			"singular_bool":     false,
158*1c12ee1eSDan Willemsen			"singular_string":   "",
159*1c12ee1eSDan Willemsen			"singular_bytes":    []byte{},
160*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
161*1c12ee1eSDan Willemsen		wire: protopack.Message{
162*1c12ee1eSDan Willemsen			protopack.Tag{81, protopack.VarintType}, protopack.Varint(0),
163*1c12ee1eSDan Willemsen			protopack.Tag{82, protopack.VarintType}, protopack.Varint(0),
164*1c12ee1eSDan Willemsen			protopack.Tag{83, protopack.VarintType}, protopack.Uvarint(0),
165*1c12ee1eSDan Willemsen			protopack.Tag{84, protopack.VarintType}, protopack.Uvarint(0),
166*1c12ee1eSDan Willemsen			protopack.Tag{85, protopack.VarintType}, protopack.Svarint(0),
167*1c12ee1eSDan Willemsen			protopack.Tag{86, protopack.VarintType}, protopack.Svarint(0),
168*1c12ee1eSDan Willemsen			protopack.Tag{87, protopack.Fixed32Type}, protopack.Uint32(0),
169*1c12ee1eSDan Willemsen			protopack.Tag{88, protopack.Fixed64Type}, protopack.Uint64(0),
170*1c12ee1eSDan Willemsen			protopack.Tag{89, protopack.Fixed32Type}, protopack.Int32(0),
171*1c12ee1eSDan Willemsen			protopack.Tag{90, protopack.Fixed64Type}, protopack.Int64(0),
172*1c12ee1eSDan Willemsen			protopack.Tag{91, protopack.Fixed32Type}, protopack.Float32(0),
173*1c12ee1eSDan Willemsen			protopack.Tag{92, protopack.Fixed64Type}, protopack.Float64(0),
174*1c12ee1eSDan Willemsen			protopack.Tag{93, protopack.VarintType}, protopack.Bool(false),
175*1c12ee1eSDan Willemsen			protopack.Tag{94, protopack.BytesType}, protopack.String(""),
176*1c12ee1eSDan Willemsen			protopack.Tag{95, protopack.BytesType}, protopack.Bytes(nil),
177*1c12ee1eSDan Willemsen		}.Marshal(),
178*1c12ee1eSDan Willemsen	},
179*1c12ee1eSDan Willemsen	{
180*1c12ee1eSDan Willemsen		desc: "groups",
181*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
182*1c12ee1eSDan Willemsen			"optionalgroup": protobuild.Message{
183*1c12ee1eSDan Willemsen				"a":                 1017,
184*1c12ee1eSDan Willemsen				"same_field_number": 1016,
185*1c12ee1eSDan Willemsen			},
186*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &testpb.TestAllExtensions{}),
187*1c12ee1eSDan Willemsen		wire: protopack.Message{
188*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.StartGroupType},
189*1c12ee1eSDan Willemsen			protopack.Tag{17, protopack.VarintType}, protopack.Varint(1017),
190*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.VarintType}, protopack.Varint(1016),
191*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.EndGroupType},
192*1c12ee1eSDan Willemsen		}.Marshal(),
193*1c12ee1eSDan Willemsen	},
194*1c12ee1eSDan Willemsen	{
195*1c12ee1eSDan Willemsen		desc: "groups (field overridden)",
196*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
197*1c12ee1eSDan Willemsen			"optionalgroup": protobuild.Message{
198*1c12ee1eSDan Willemsen				"a": 2,
199*1c12ee1eSDan Willemsen			},
200*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &testpb.TestAllExtensions{}),
201*1c12ee1eSDan Willemsen		wire: protopack.Message{
202*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.StartGroupType},
203*1c12ee1eSDan Willemsen			protopack.Tag{17, protopack.VarintType}, protopack.Varint(1),
204*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.EndGroupType},
205*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.StartGroupType},
206*1c12ee1eSDan Willemsen			protopack.Tag{17, protopack.VarintType}, protopack.Varint(2),
207*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.EndGroupType},
208*1c12ee1eSDan Willemsen		}.Marshal(),
209*1c12ee1eSDan Willemsen	},
210*1c12ee1eSDan Willemsen	{
211*1c12ee1eSDan Willemsen		desc: "messages",
212*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
213*1c12ee1eSDan Willemsen			"optional_nested_message": protobuild.Message{
214*1c12ee1eSDan Willemsen				"a": 42,
215*1c12ee1eSDan Willemsen				"corecursive": protobuild.Message{
216*1c12ee1eSDan Willemsen					"optional_int32": 43,
217*1c12ee1eSDan Willemsen				},
218*1c12ee1eSDan Willemsen			},
219*1c12ee1eSDan Willemsen		}),
220*1c12ee1eSDan Willemsen		wire: protopack.Message{
221*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
222*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(42),
223*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
224*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(43),
225*1c12ee1eSDan Willemsen				}),
226*1c12ee1eSDan Willemsen			}),
227*1c12ee1eSDan Willemsen		}.Marshal(),
228*1c12ee1eSDan Willemsen	},
229*1c12ee1eSDan Willemsen	{
230*1c12ee1eSDan Willemsen		desc: "messages (split across multiple tags)",
231*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
232*1c12ee1eSDan Willemsen			"optional_nested_message": protobuild.Message{
233*1c12ee1eSDan Willemsen				"a": 42,
234*1c12ee1eSDan Willemsen				"corecursive": protobuild.Message{
235*1c12ee1eSDan Willemsen					"optional_int32": 43,
236*1c12ee1eSDan Willemsen				},
237*1c12ee1eSDan Willemsen			},
238*1c12ee1eSDan Willemsen		}),
239*1c12ee1eSDan Willemsen		wire: protopack.Message{
240*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
241*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(42),
242*1c12ee1eSDan Willemsen			}),
243*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
244*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
245*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(43),
246*1c12ee1eSDan Willemsen				}),
247*1c12ee1eSDan Willemsen			}),
248*1c12ee1eSDan Willemsen		}.Marshal(),
249*1c12ee1eSDan Willemsen	},
250*1c12ee1eSDan Willemsen	{
251*1c12ee1eSDan Willemsen		desc: "messages (field overridden)",
252*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
253*1c12ee1eSDan Willemsen			"optional_nested_message": protobuild.Message{
254*1c12ee1eSDan Willemsen				"a": 2,
255*1c12ee1eSDan Willemsen			},
256*1c12ee1eSDan Willemsen		}),
257*1c12ee1eSDan Willemsen		wire: protopack.Message{
258*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
259*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
260*1c12ee1eSDan Willemsen			}),
261*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
262*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
263*1c12ee1eSDan Willemsen			}),
264*1c12ee1eSDan Willemsen		}.Marshal(),
265*1c12ee1eSDan Willemsen	},
266*1c12ee1eSDan Willemsen	{
267*1c12ee1eSDan Willemsen		desc: "basic repeated types",
268*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
269*1c12ee1eSDan Willemsen			"repeated_int32":       []int32{1001, 2001},
270*1c12ee1eSDan Willemsen			"repeated_int64":       []int64{1002, 2002},
271*1c12ee1eSDan Willemsen			"repeated_uint32":      []uint32{1003, 2003},
272*1c12ee1eSDan Willemsen			"repeated_uint64":      []uint64{1004, 2004},
273*1c12ee1eSDan Willemsen			"repeated_sint32":      []int32{1005, 2005},
274*1c12ee1eSDan Willemsen			"repeated_sint64":      []int64{1006, 2006},
275*1c12ee1eSDan Willemsen			"repeated_fixed32":     []uint32{1007, 2007},
276*1c12ee1eSDan Willemsen			"repeated_fixed64":     []uint64{1008, 2008},
277*1c12ee1eSDan Willemsen			"repeated_sfixed32":    []int32{1009, 2009},
278*1c12ee1eSDan Willemsen			"repeated_sfixed64":    []int64{1010, 2010},
279*1c12ee1eSDan Willemsen			"repeated_float":       []float32{1011.5, 2011.5},
280*1c12ee1eSDan Willemsen			"repeated_double":      []float64{1012.5, 2012.5},
281*1c12ee1eSDan Willemsen			"repeated_bool":        []bool{true, false},
282*1c12ee1eSDan Willemsen			"repeated_string":      []string{"foo", "bar"},
283*1c12ee1eSDan Willemsen			"repeated_bytes":       []string{"FOO", "BAR"},
284*1c12ee1eSDan Willemsen			"repeated_nested_enum": []string{"FOO", "BAR"},
285*1c12ee1eSDan Willemsen		}),
286*1c12ee1eSDan Willemsen		wire: protopack.Message{
287*1c12ee1eSDan Willemsen			protopack.Tag{31, protopack.VarintType}, protopack.Varint(1001),
288*1c12ee1eSDan Willemsen			protopack.Tag{31, protopack.VarintType}, protopack.Varint(2001),
289*1c12ee1eSDan Willemsen			protopack.Tag{32, protopack.VarintType}, protopack.Varint(1002),
290*1c12ee1eSDan Willemsen			protopack.Tag{32, protopack.VarintType}, protopack.Varint(2002),
291*1c12ee1eSDan Willemsen			protopack.Tag{33, protopack.VarintType}, protopack.Uvarint(1003),
292*1c12ee1eSDan Willemsen			protopack.Tag{33, protopack.VarintType}, protopack.Uvarint(2003),
293*1c12ee1eSDan Willemsen			protopack.Tag{34, protopack.VarintType}, protopack.Uvarint(1004),
294*1c12ee1eSDan Willemsen			protopack.Tag{34, protopack.VarintType}, protopack.Uvarint(2004),
295*1c12ee1eSDan Willemsen			protopack.Tag{35, protopack.VarintType}, protopack.Svarint(1005),
296*1c12ee1eSDan Willemsen			protopack.Tag{35, protopack.VarintType}, protopack.Svarint(2005),
297*1c12ee1eSDan Willemsen			protopack.Tag{36, protopack.VarintType}, protopack.Svarint(1006),
298*1c12ee1eSDan Willemsen			protopack.Tag{36, protopack.VarintType}, protopack.Svarint(2006),
299*1c12ee1eSDan Willemsen			protopack.Tag{37, protopack.Fixed32Type}, protopack.Uint32(1007),
300*1c12ee1eSDan Willemsen			protopack.Tag{37, protopack.Fixed32Type}, protopack.Uint32(2007),
301*1c12ee1eSDan Willemsen			protopack.Tag{38, protopack.Fixed64Type}, protopack.Uint64(1008),
302*1c12ee1eSDan Willemsen			protopack.Tag{38, protopack.Fixed64Type}, protopack.Uint64(2008),
303*1c12ee1eSDan Willemsen			protopack.Tag{39, protopack.Fixed32Type}, protopack.Int32(1009),
304*1c12ee1eSDan Willemsen			protopack.Tag{39, protopack.Fixed32Type}, protopack.Int32(2009),
305*1c12ee1eSDan Willemsen			protopack.Tag{40, protopack.Fixed64Type}, protopack.Int64(1010),
306*1c12ee1eSDan Willemsen			protopack.Tag{40, protopack.Fixed64Type}, protopack.Int64(2010),
307*1c12ee1eSDan Willemsen			protopack.Tag{41, protopack.Fixed32Type}, protopack.Float32(1011.5),
308*1c12ee1eSDan Willemsen			protopack.Tag{41, protopack.Fixed32Type}, protopack.Float32(2011.5),
309*1c12ee1eSDan Willemsen			protopack.Tag{42, protopack.Fixed64Type}, protopack.Float64(1012.5),
310*1c12ee1eSDan Willemsen			protopack.Tag{42, protopack.Fixed64Type}, protopack.Float64(2012.5),
311*1c12ee1eSDan Willemsen			protopack.Tag{43, protopack.VarintType}, protopack.Bool(true),
312*1c12ee1eSDan Willemsen			protopack.Tag{43, protopack.VarintType}, protopack.Bool(false),
313*1c12ee1eSDan Willemsen			protopack.Tag{44, protopack.BytesType}, protopack.String("foo"),
314*1c12ee1eSDan Willemsen			protopack.Tag{44, protopack.BytesType}, protopack.String("bar"),
315*1c12ee1eSDan Willemsen			protopack.Tag{45, protopack.BytesType}, protopack.Bytes([]byte("FOO")),
316*1c12ee1eSDan Willemsen			protopack.Tag{45, protopack.BytesType}, protopack.Bytes([]byte("BAR")),
317*1c12ee1eSDan Willemsen			protopack.Tag{51, protopack.VarintType}, protopack.Varint(int(testpb.TestAllTypes_FOO)),
318*1c12ee1eSDan Willemsen			protopack.Tag{51, protopack.VarintType}, protopack.Varint(int(testpb.TestAllTypes_BAR)),
319*1c12ee1eSDan Willemsen		}.Marshal(),
320*1c12ee1eSDan Willemsen	},
321*1c12ee1eSDan Willemsen	{
322*1c12ee1eSDan Willemsen		desc: "basic repeated types (packed encoding)",
323*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
324*1c12ee1eSDan Willemsen			"repeated_int32":       []int32{1001, 2001},
325*1c12ee1eSDan Willemsen			"repeated_int64":       []int64{1002, 2002},
326*1c12ee1eSDan Willemsen			"repeated_uint32":      []uint32{1003, 2003},
327*1c12ee1eSDan Willemsen			"repeated_uint64":      []uint64{1004, 2004},
328*1c12ee1eSDan Willemsen			"repeated_sint32":      []int32{1005, 2005},
329*1c12ee1eSDan Willemsen			"repeated_sint64":      []int64{1006, 2006},
330*1c12ee1eSDan Willemsen			"repeated_fixed32":     []uint32{1007, 2007},
331*1c12ee1eSDan Willemsen			"repeated_fixed64":     []uint64{1008, 2008},
332*1c12ee1eSDan Willemsen			"repeated_sfixed32":    []int32{1009, 2009},
333*1c12ee1eSDan Willemsen			"repeated_sfixed64":    []int64{1010, 2010},
334*1c12ee1eSDan Willemsen			"repeated_float":       []float32{1011.5, 2011.5},
335*1c12ee1eSDan Willemsen			"repeated_double":      []float64{1012.5, 2012.5},
336*1c12ee1eSDan Willemsen			"repeated_bool":        []bool{true, false},
337*1c12ee1eSDan Willemsen			"repeated_nested_enum": []string{"FOO", "BAR"},
338*1c12ee1eSDan Willemsen		}),
339*1c12ee1eSDan Willemsen		wire: protopack.Message{
340*1c12ee1eSDan Willemsen			protopack.Tag{31, protopack.BytesType}, protopack.LengthPrefix{
341*1c12ee1eSDan Willemsen				protopack.Varint(1001), protopack.Varint(2001),
342*1c12ee1eSDan Willemsen			},
343*1c12ee1eSDan Willemsen			protopack.Tag{32, protopack.BytesType}, protopack.LengthPrefix{
344*1c12ee1eSDan Willemsen				protopack.Varint(1002), protopack.Varint(2002),
345*1c12ee1eSDan Willemsen			},
346*1c12ee1eSDan Willemsen			protopack.Tag{33, protopack.BytesType}, protopack.LengthPrefix{
347*1c12ee1eSDan Willemsen				protopack.Uvarint(1003), protopack.Uvarint(2003),
348*1c12ee1eSDan Willemsen			},
349*1c12ee1eSDan Willemsen			protopack.Tag{34, protopack.BytesType}, protopack.LengthPrefix{
350*1c12ee1eSDan Willemsen				protopack.Uvarint(1004), protopack.Uvarint(2004),
351*1c12ee1eSDan Willemsen			},
352*1c12ee1eSDan Willemsen			protopack.Tag{35, protopack.BytesType}, protopack.LengthPrefix{
353*1c12ee1eSDan Willemsen				protopack.Svarint(1005), protopack.Svarint(2005),
354*1c12ee1eSDan Willemsen			},
355*1c12ee1eSDan Willemsen			protopack.Tag{36, protopack.BytesType}, protopack.LengthPrefix{
356*1c12ee1eSDan Willemsen				protopack.Svarint(1006), protopack.Svarint(2006),
357*1c12ee1eSDan Willemsen			},
358*1c12ee1eSDan Willemsen			protopack.Tag{37, protopack.BytesType}, protopack.LengthPrefix{
359*1c12ee1eSDan Willemsen				protopack.Uint32(1007), protopack.Uint32(2007),
360*1c12ee1eSDan Willemsen			},
361*1c12ee1eSDan Willemsen			protopack.Tag{38, protopack.BytesType}, protopack.LengthPrefix{
362*1c12ee1eSDan Willemsen				protopack.Uint64(1008), protopack.Uint64(2008),
363*1c12ee1eSDan Willemsen			},
364*1c12ee1eSDan Willemsen			protopack.Tag{39, protopack.BytesType}, protopack.LengthPrefix{
365*1c12ee1eSDan Willemsen				protopack.Int32(1009), protopack.Int32(2009),
366*1c12ee1eSDan Willemsen			},
367*1c12ee1eSDan Willemsen			protopack.Tag{40, protopack.BytesType}, protopack.LengthPrefix{
368*1c12ee1eSDan Willemsen				protopack.Int64(1010), protopack.Int64(2010),
369*1c12ee1eSDan Willemsen			},
370*1c12ee1eSDan Willemsen			protopack.Tag{41, protopack.BytesType}, protopack.LengthPrefix{
371*1c12ee1eSDan Willemsen				protopack.Float32(1011.5), protopack.Float32(2011.5),
372*1c12ee1eSDan Willemsen			},
373*1c12ee1eSDan Willemsen			protopack.Tag{42, protopack.BytesType}, protopack.LengthPrefix{
374*1c12ee1eSDan Willemsen				protopack.Float64(1012.5), protopack.Float64(2012.5),
375*1c12ee1eSDan Willemsen			},
376*1c12ee1eSDan Willemsen			protopack.Tag{43, protopack.BytesType}, protopack.LengthPrefix{
377*1c12ee1eSDan Willemsen				protopack.Bool(true), protopack.Bool(false),
378*1c12ee1eSDan Willemsen			},
379*1c12ee1eSDan Willemsen			protopack.Tag{51, protopack.BytesType}, protopack.LengthPrefix{
380*1c12ee1eSDan Willemsen				protopack.Varint(int(testpb.TestAllTypes_FOO)),
381*1c12ee1eSDan Willemsen				protopack.Varint(int(testpb.TestAllTypes_BAR)),
382*1c12ee1eSDan Willemsen			},
383*1c12ee1eSDan Willemsen		}.Marshal(),
384*1c12ee1eSDan Willemsen	},
385*1c12ee1eSDan Willemsen	{
386*1c12ee1eSDan Willemsen		desc: "basic repeated types (zero-length packed encoding)",
387*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
388*1c12ee1eSDan Willemsen			"repeated_int32":       []int32{},
389*1c12ee1eSDan Willemsen			"repeated_int64":       []int64{},
390*1c12ee1eSDan Willemsen			"repeated_uint32":      []uint32{},
391*1c12ee1eSDan Willemsen			"repeated_uint64":      []uint64{},
392*1c12ee1eSDan Willemsen			"repeated_sint32":      []int32{},
393*1c12ee1eSDan Willemsen			"repeated_sint64":      []int64{},
394*1c12ee1eSDan Willemsen			"repeated_fixed32":     []uint32{},
395*1c12ee1eSDan Willemsen			"repeated_fixed64":     []uint64{},
396*1c12ee1eSDan Willemsen			"repeated_sfixed32":    []int32{},
397*1c12ee1eSDan Willemsen			"repeated_sfixed64":    []int64{},
398*1c12ee1eSDan Willemsen			"repeated_float":       []float32{},
399*1c12ee1eSDan Willemsen			"repeated_double":      []float64{},
400*1c12ee1eSDan Willemsen			"repeated_bool":        []bool{},
401*1c12ee1eSDan Willemsen			"repeated_nested_enum": []string{},
402*1c12ee1eSDan Willemsen		}),
403*1c12ee1eSDan Willemsen		wire: protopack.Message{
404*1c12ee1eSDan Willemsen			protopack.Tag{31, protopack.BytesType}, protopack.LengthPrefix{},
405*1c12ee1eSDan Willemsen			protopack.Tag{32, protopack.BytesType}, protopack.LengthPrefix{},
406*1c12ee1eSDan Willemsen			protopack.Tag{33, protopack.BytesType}, protopack.LengthPrefix{},
407*1c12ee1eSDan Willemsen			protopack.Tag{34, protopack.BytesType}, protopack.LengthPrefix{},
408*1c12ee1eSDan Willemsen			protopack.Tag{35, protopack.BytesType}, protopack.LengthPrefix{},
409*1c12ee1eSDan Willemsen			protopack.Tag{36, protopack.BytesType}, protopack.LengthPrefix{},
410*1c12ee1eSDan Willemsen			protopack.Tag{37, protopack.BytesType}, protopack.LengthPrefix{},
411*1c12ee1eSDan Willemsen			protopack.Tag{38, protopack.BytesType}, protopack.LengthPrefix{},
412*1c12ee1eSDan Willemsen			protopack.Tag{39, protopack.BytesType}, protopack.LengthPrefix{},
413*1c12ee1eSDan Willemsen			protopack.Tag{40, protopack.BytesType}, protopack.LengthPrefix{},
414*1c12ee1eSDan Willemsen			protopack.Tag{41, protopack.BytesType}, protopack.LengthPrefix{},
415*1c12ee1eSDan Willemsen			protopack.Tag{42, protopack.BytesType}, protopack.LengthPrefix{},
416*1c12ee1eSDan Willemsen			protopack.Tag{43, protopack.BytesType}, protopack.LengthPrefix{},
417*1c12ee1eSDan Willemsen			protopack.Tag{51, protopack.BytesType}, protopack.LengthPrefix{},
418*1c12ee1eSDan Willemsen		}.Marshal(),
419*1c12ee1eSDan Willemsen	},
420*1c12ee1eSDan Willemsen	{
421*1c12ee1eSDan Willemsen		desc: "packed repeated types",
422*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
423*1c12ee1eSDan Willemsen			"packed_int32":    []int32{1001, 2001},
424*1c12ee1eSDan Willemsen			"packed_int64":    []int64{1002, 2002},
425*1c12ee1eSDan Willemsen			"packed_uint32":   []uint32{1003, 2003},
426*1c12ee1eSDan Willemsen			"packed_uint64":   []uint64{1004, 2004},
427*1c12ee1eSDan Willemsen			"packed_sint32":   []int32{1005, 2005},
428*1c12ee1eSDan Willemsen			"packed_sint64":   []int64{1006, 2006},
429*1c12ee1eSDan Willemsen			"packed_fixed32":  []uint32{1007, 2007},
430*1c12ee1eSDan Willemsen			"packed_fixed64":  []uint64{1008, 2008},
431*1c12ee1eSDan Willemsen			"packed_sfixed32": []int32{1009, 2009},
432*1c12ee1eSDan Willemsen			"packed_sfixed64": []int64{1010, 2010},
433*1c12ee1eSDan Willemsen			"packed_float":    []float32{1011.5, 2011.5},
434*1c12ee1eSDan Willemsen			"packed_double":   []float64{1012.5, 2012.5},
435*1c12ee1eSDan Willemsen			"packed_bool":     []bool{true, false},
436*1c12ee1eSDan Willemsen			"packed_enum":     []string{"FOREIGN_FOO", "FOREIGN_BAR"},
437*1c12ee1eSDan Willemsen		}, &testpb.TestPackedTypes{}, &testpb.TestPackedExtensions{}),
438*1c12ee1eSDan Willemsen		wire: protopack.Message{
439*1c12ee1eSDan Willemsen			protopack.Tag{90, protopack.BytesType}, protopack.LengthPrefix{
440*1c12ee1eSDan Willemsen				protopack.Varint(1001), protopack.Varint(2001),
441*1c12ee1eSDan Willemsen			},
442*1c12ee1eSDan Willemsen			protopack.Tag{91, protopack.BytesType}, protopack.LengthPrefix{
443*1c12ee1eSDan Willemsen				protopack.Varint(1002), protopack.Varint(2002),
444*1c12ee1eSDan Willemsen			},
445*1c12ee1eSDan Willemsen			protopack.Tag{92, protopack.BytesType}, protopack.LengthPrefix{
446*1c12ee1eSDan Willemsen				protopack.Uvarint(1003), protopack.Uvarint(2003),
447*1c12ee1eSDan Willemsen			},
448*1c12ee1eSDan Willemsen			protopack.Tag{93, protopack.BytesType}, protopack.LengthPrefix{
449*1c12ee1eSDan Willemsen				protopack.Uvarint(1004), protopack.Uvarint(2004),
450*1c12ee1eSDan Willemsen			},
451*1c12ee1eSDan Willemsen			protopack.Tag{94, protopack.BytesType}, protopack.LengthPrefix{
452*1c12ee1eSDan Willemsen				protopack.Svarint(1005), protopack.Svarint(2005),
453*1c12ee1eSDan Willemsen			},
454*1c12ee1eSDan Willemsen			protopack.Tag{95, protopack.BytesType}, protopack.LengthPrefix{
455*1c12ee1eSDan Willemsen				protopack.Svarint(1006), protopack.Svarint(2006),
456*1c12ee1eSDan Willemsen			},
457*1c12ee1eSDan Willemsen			protopack.Tag{96, protopack.BytesType}, protopack.LengthPrefix{
458*1c12ee1eSDan Willemsen				protopack.Uint32(1007), protopack.Uint32(2007),
459*1c12ee1eSDan Willemsen			},
460*1c12ee1eSDan Willemsen			protopack.Tag{97, protopack.BytesType}, protopack.LengthPrefix{
461*1c12ee1eSDan Willemsen				protopack.Uint64(1008), protopack.Uint64(2008),
462*1c12ee1eSDan Willemsen			},
463*1c12ee1eSDan Willemsen			protopack.Tag{98, protopack.BytesType}, protopack.LengthPrefix{
464*1c12ee1eSDan Willemsen				protopack.Int32(1009), protopack.Int32(2009),
465*1c12ee1eSDan Willemsen			},
466*1c12ee1eSDan Willemsen			protopack.Tag{99, protopack.BytesType}, protopack.LengthPrefix{
467*1c12ee1eSDan Willemsen				protopack.Int64(1010), protopack.Int64(2010),
468*1c12ee1eSDan Willemsen			},
469*1c12ee1eSDan Willemsen			protopack.Tag{100, protopack.BytesType}, protopack.LengthPrefix{
470*1c12ee1eSDan Willemsen				protopack.Float32(1011.5), protopack.Float32(2011.5),
471*1c12ee1eSDan Willemsen			},
472*1c12ee1eSDan Willemsen			protopack.Tag{101, protopack.BytesType}, protopack.LengthPrefix{
473*1c12ee1eSDan Willemsen				protopack.Float64(1012.5), protopack.Float64(2012.5),
474*1c12ee1eSDan Willemsen			},
475*1c12ee1eSDan Willemsen			protopack.Tag{102, protopack.BytesType}, protopack.LengthPrefix{
476*1c12ee1eSDan Willemsen				protopack.Bool(true), protopack.Bool(false),
477*1c12ee1eSDan Willemsen			},
478*1c12ee1eSDan Willemsen			protopack.Tag{103, protopack.BytesType}, protopack.LengthPrefix{
479*1c12ee1eSDan Willemsen				protopack.Varint(int(testpb.ForeignEnum_FOREIGN_FOO)),
480*1c12ee1eSDan Willemsen				protopack.Varint(int(testpb.ForeignEnum_FOREIGN_BAR)),
481*1c12ee1eSDan Willemsen			},
482*1c12ee1eSDan Willemsen		}.Marshal(),
483*1c12ee1eSDan Willemsen	},
484*1c12ee1eSDan Willemsen	{
485*1c12ee1eSDan Willemsen		desc: "packed repeated types (zero length)",
486*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
487*1c12ee1eSDan Willemsen			"packed_int32":    []int32{},
488*1c12ee1eSDan Willemsen			"packed_int64":    []int64{},
489*1c12ee1eSDan Willemsen			"packed_uint32":   []uint32{},
490*1c12ee1eSDan Willemsen			"packed_uint64":   []uint64{},
491*1c12ee1eSDan Willemsen			"packed_sint32":   []int32{},
492*1c12ee1eSDan Willemsen			"packed_sint64":   []int64{},
493*1c12ee1eSDan Willemsen			"packed_fixed32":  []uint32{},
494*1c12ee1eSDan Willemsen			"packed_fixed64":  []uint64{},
495*1c12ee1eSDan Willemsen			"packed_sfixed32": []int32{},
496*1c12ee1eSDan Willemsen			"packed_sfixed64": []int64{},
497*1c12ee1eSDan Willemsen			"packed_float":    []float32{},
498*1c12ee1eSDan Willemsen			"packed_double":   []float64{},
499*1c12ee1eSDan Willemsen			"packed_bool":     []bool{},
500*1c12ee1eSDan Willemsen			"packed_enum":     []string{},
501*1c12ee1eSDan Willemsen		}, &testpb.TestPackedTypes{}, &testpb.TestPackedExtensions{}),
502*1c12ee1eSDan Willemsen		wire: protopack.Message{
503*1c12ee1eSDan Willemsen			protopack.Tag{90, protopack.BytesType}, protopack.LengthPrefix{},
504*1c12ee1eSDan Willemsen			protopack.Tag{91, protopack.BytesType}, protopack.LengthPrefix{},
505*1c12ee1eSDan Willemsen			protopack.Tag{92, protopack.BytesType}, protopack.LengthPrefix{},
506*1c12ee1eSDan Willemsen			protopack.Tag{93, protopack.BytesType}, protopack.LengthPrefix{},
507*1c12ee1eSDan Willemsen			protopack.Tag{94, protopack.BytesType}, protopack.LengthPrefix{},
508*1c12ee1eSDan Willemsen			protopack.Tag{95, protopack.BytesType}, protopack.LengthPrefix{},
509*1c12ee1eSDan Willemsen			protopack.Tag{96, protopack.BytesType}, protopack.LengthPrefix{},
510*1c12ee1eSDan Willemsen			protopack.Tag{97, protopack.BytesType}, protopack.LengthPrefix{},
511*1c12ee1eSDan Willemsen			protopack.Tag{98, protopack.BytesType}, protopack.LengthPrefix{},
512*1c12ee1eSDan Willemsen			protopack.Tag{99, protopack.BytesType}, protopack.LengthPrefix{},
513*1c12ee1eSDan Willemsen			protopack.Tag{100, protopack.BytesType}, protopack.LengthPrefix{},
514*1c12ee1eSDan Willemsen			protopack.Tag{101, protopack.BytesType}, protopack.LengthPrefix{},
515*1c12ee1eSDan Willemsen			protopack.Tag{102, protopack.BytesType}, protopack.LengthPrefix{},
516*1c12ee1eSDan Willemsen			protopack.Tag{103, protopack.BytesType}, protopack.LengthPrefix{},
517*1c12ee1eSDan Willemsen		}.Marshal(),
518*1c12ee1eSDan Willemsen	},
519*1c12ee1eSDan Willemsen	{
520*1c12ee1eSDan Willemsen		desc: "repeated messages",
521*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
522*1c12ee1eSDan Willemsen			"repeated_nested_message": []protobuild.Message{
523*1c12ee1eSDan Willemsen				{"a": 1},
524*1c12ee1eSDan Willemsen				{},
525*1c12ee1eSDan Willemsen				{"a": 2},
526*1c12ee1eSDan Willemsen			},
527*1c12ee1eSDan Willemsen		}),
528*1c12ee1eSDan Willemsen		wire: protopack.Message{
529*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
530*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
531*1c12ee1eSDan Willemsen			}),
532*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
533*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
534*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
535*1c12ee1eSDan Willemsen			}),
536*1c12ee1eSDan Willemsen		}.Marshal(),
537*1c12ee1eSDan Willemsen	},
538*1c12ee1eSDan Willemsen	{
539*1c12ee1eSDan Willemsen		desc: "repeated nil messages",
540*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{&testpb.TestAllTypes{
541*1c12ee1eSDan Willemsen			RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{
542*1c12ee1eSDan Willemsen				{A: proto.Int32(1)},
543*1c12ee1eSDan Willemsen				nil,
544*1c12ee1eSDan Willemsen				{A: proto.Int32(2)},
545*1c12ee1eSDan Willemsen			},
546*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{
547*1c12ee1eSDan Willemsen			RepeatedNestedMessage: []*test3pb.TestAllTypes_NestedMessage{
548*1c12ee1eSDan Willemsen				{A: 1},
549*1c12ee1eSDan Willemsen				nil,
550*1c12ee1eSDan Willemsen				{A: 2},
551*1c12ee1eSDan Willemsen			},
552*1c12ee1eSDan Willemsen		}, build(
553*1c12ee1eSDan Willemsen			&testpb.TestAllExtensions{},
554*1c12ee1eSDan Willemsen			extend(testpb.E_RepeatedNestedMessage, []*testpb.TestAllExtensions_NestedMessage{
555*1c12ee1eSDan Willemsen				{A: proto.Int32(1)},
556*1c12ee1eSDan Willemsen				nil,
557*1c12ee1eSDan Willemsen				{A: proto.Int32(2)},
558*1c12ee1eSDan Willemsen			}),
559*1c12ee1eSDan Willemsen		)},
560*1c12ee1eSDan Willemsen		wire: protopack.Message{
561*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
562*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
563*1c12ee1eSDan Willemsen			}),
564*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
565*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
566*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
567*1c12ee1eSDan Willemsen			}),
568*1c12ee1eSDan Willemsen		}.Marshal(),
569*1c12ee1eSDan Willemsen	},
570*1c12ee1eSDan Willemsen	{
571*1c12ee1eSDan Willemsen		desc: "repeated groups",
572*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
573*1c12ee1eSDan Willemsen			"repeatedgroup": []protobuild.Message{
574*1c12ee1eSDan Willemsen				{"a": 1017},
575*1c12ee1eSDan Willemsen				{},
576*1c12ee1eSDan Willemsen				{"a": 2017},
577*1c12ee1eSDan Willemsen			},
578*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &testpb.TestAllExtensions{}),
579*1c12ee1eSDan Willemsen		wire: protopack.Message{
580*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
581*1c12ee1eSDan Willemsen			protopack.Tag{47, protopack.VarintType}, protopack.Varint(1017),
582*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
583*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
584*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
585*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
586*1c12ee1eSDan Willemsen			protopack.Tag{47, protopack.VarintType}, protopack.Varint(2017),
587*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
588*1c12ee1eSDan Willemsen		}.Marshal(),
589*1c12ee1eSDan Willemsen	},
590*1c12ee1eSDan Willemsen	{
591*1c12ee1eSDan Willemsen		desc: "repeated nil groups",
592*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{&testpb.TestAllTypes{
593*1c12ee1eSDan Willemsen			Repeatedgroup: []*testpb.TestAllTypes_RepeatedGroup{
594*1c12ee1eSDan Willemsen				{A: proto.Int32(1017)},
595*1c12ee1eSDan Willemsen				nil,
596*1c12ee1eSDan Willemsen				{A: proto.Int32(2017)},
597*1c12ee1eSDan Willemsen			},
598*1c12ee1eSDan Willemsen		}, build(
599*1c12ee1eSDan Willemsen			&testpb.TestAllExtensions{},
600*1c12ee1eSDan Willemsen			extend(testpb.E_Repeatedgroup, []*testpb.RepeatedGroup{
601*1c12ee1eSDan Willemsen				{A: proto.Int32(1017)},
602*1c12ee1eSDan Willemsen				nil,
603*1c12ee1eSDan Willemsen				{A: proto.Int32(2017)},
604*1c12ee1eSDan Willemsen			}),
605*1c12ee1eSDan Willemsen		)},
606*1c12ee1eSDan Willemsen		wire: protopack.Message{
607*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
608*1c12ee1eSDan Willemsen			protopack.Tag{47, protopack.VarintType}, protopack.Varint(1017),
609*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
610*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
611*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
612*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
613*1c12ee1eSDan Willemsen			protopack.Tag{47, protopack.VarintType}, protopack.Varint(2017),
614*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
615*1c12ee1eSDan Willemsen		}.Marshal(),
616*1c12ee1eSDan Willemsen	},
617*1c12ee1eSDan Willemsen	{
618*1c12ee1eSDan Willemsen		desc: "maps",
619*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
620*1c12ee1eSDan Willemsen			"map_int32_int32":       map[int32]int32{1056: 1156, 2056: 2156},
621*1c12ee1eSDan Willemsen			"map_int64_int64":       map[int64]int64{1057: 1157, 2057: 2157},
622*1c12ee1eSDan Willemsen			"map_uint32_uint32":     map[uint32]uint32{1058: 1158, 2058: 2158},
623*1c12ee1eSDan Willemsen			"map_uint64_uint64":     map[uint64]uint64{1059: 1159, 2059: 2159},
624*1c12ee1eSDan Willemsen			"map_sint32_sint32":     map[int32]int32{1060: 1160, 2060: 2160},
625*1c12ee1eSDan Willemsen			"map_sint64_sint64":     map[int64]int64{1061: 1161, 2061: 2161},
626*1c12ee1eSDan Willemsen			"map_fixed32_fixed32":   map[uint32]uint32{1062: 1162, 2062: 2162},
627*1c12ee1eSDan Willemsen			"map_fixed64_fixed64":   map[uint64]uint64{1063: 1163, 2063: 2163},
628*1c12ee1eSDan Willemsen			"map_sfixed32_sfixed32": map[int32]int32{1064: 1164, 2064: 2164},
629*1c12ee1eSDan Willemsen			"map_sfixed64_sfixed64": map[int64]int64{1065: 1165, 2065: 2165},
630*1c12ee1eSDan Willemsen			"map_int32_float":       map[int32]float32{1066: 1166.5, 2066: 2166.5},
631*1c12ee1eSDan Willemsen			"map_int32_double":      map[int32]float64{1067: 1167.5, 2067: 2167.5},
632*1c12ee1eSDan Willemsen			"map_bool_bool":         map[bool]bool{true: false, false: true},
633*1c12ee1eSDan Willemsen			"map_string_string":     map[string]string{"69.1.key": "69.1.val", "69.2.key": "69.2.val"},
634*1c12ee1eSDan Willemsen			"map_string_bytes":      map[string][]byte{"70.1.key": []byte("70.1.val"), "70.2.key": []byte("70.2.val")},
635*1c12ee1eSDan Willemsen			"map_string_nested_message": map[string]protobuild.Message{
636*1c12ee1eSDan Willemsen				"71.1.key": {"a": 1171},
637*1c12ee1eSDan Willemsen				"71.2.key": {"a": 2171},
638*1c12ee1eSDan Willemsen			},
639*1c12ee1eSDan Willemsen			"map_string_nested_enum": map[string]string{"73.1.key": "FOO", "73.2.key": "BAR"},
640*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
641*1c12ee1eSDan Willemsen		wire: protopack.Message{
642*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
643*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1056),
644*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1156),
645*1c12ee1eSDan Willemsen			}),
646*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
647*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2056),
648*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(2156),
649*1c12ee1eSDan Willemsen			}),
650*1c12ee1eSDan Willemsen			protopack.Tag{57, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
651*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1057),
652*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1157),
653*1c12ee1eSDan Willemsen			}),
654*1c12ee1eSDan Willemsen			protopack.Tag{57, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
655*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2057),
656*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(2157),
657*1c12ee1eSDan Willemsen			}),
658*1c12ee1eSDan Willemsen			protopack.Tag{58, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
659*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1058),
660*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1158),
661*1c12ee1eSDan Willemsen			}),
662*1c12ee1eSDan Willemsen			protopack.Tag{58, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
663*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2058),
664*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(2158),
665*1c12ee1eSDan Willemsen			}),
666*1c12ee1eSDan Willemsen			protopack.Tag{59, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
667*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1059),
668*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1159),
669*1c12ee1eSDan Willemsen			}),
670*1c12ee1eSDan Willemsen			protopack.Tag{59, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
671*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2059),
672*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(2159),
673*1c12ee1eSDan Willemsen			}),
674*1c12ee1eSDan Willemsen			protopack.Tag{60, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
675*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Svarint(1060),
676*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Svarint(1160),
677*1c12ee1eSDan Willemsen			}),
678*1c12ee1eSDan Willemsen			protopack.Tag{60, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
679*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Svarint(2060),
680*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Svarint(2160),
681*1c12ee1eSDan Willemsen			}),
682*1c12ee1eSDan Willemsen			protopack.Tag{61, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
683*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Svarint(1061),
684*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Svarint(1161),
685*1c12ee1eSDan Willemsen			}),
686*1c12ee1eSDan Willemsen			protopack.Tag{61, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
687*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Svarint(2061),
688*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Svarint(2161),
689*1c12ee1eSDan Willemsen			}),
690*1c12ee1eSDan Willemsen			protopack.Tag{62, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
691*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(1062),
692*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed32Type}, protopack.Int32(1162),
693*1c12ee1eSDan Willemsen			}),
694*1c12ee1eSDan Willemsen			protopack.Tag{62, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
695*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(2062),
696*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed32Type}, protopack.Int32(2162),
697*1c12ee1eSDan Willemsen			}),
698*1c12ee1eSDan Willemsen			protopack.Tag{63, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
699*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed64Type}, protopack.Int64(1063),
700*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed64Type}, protopack.Int64(1163),
701*1c12ee1eSDan Willemsen			}),
702*1c12ee1eSDan Willemsen			protopack.Tag{63, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
703*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed64Type}, protopack.Int64(2063),
704*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed64Type}, protopack.Int64(2163),
705*1c12ee1eSDan Willemsen			}),
706*1c12ee1eSDan Willemsen			protopack.Tag{64, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
707*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(1064),
708*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed32Type}, protopack.Int32(1164),
709*1c12ee1eSDan Willemsen			}),
710*1c12ee1eSDan Willemsen			protopack.Tag{64, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
711*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(2064),
712*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed32Type}, protopack.Int32(2164),
713*1c12ee1eSDan Willemsen			}),
714*1c12ee1eSDan Willemsen			protopack.Tag{65, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
715*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed64Type}, protopack.Int64(1065),
716*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed64Type}, protopack.Int64(1165),
717*1c12ee1eSDan Willemsen			}),
718*1c12ee1eSDan Willemsen			protopack.Tag{65, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
719*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed64Type}, protopack.Int64(2065),
720*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed64Type}, protopack.Int64(2165),
721*1c12ee1eSDan Willemsen			}),
722*1c12ee1eSDan Willemsen			protopack.Tag{66, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
723*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1066),
724*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed32Type}, protopack.Float32(1166.5),
725*1c12ee1eSDan Willemsen			}),
726*1c12ee1eSDan Willemsen			protopack.Tag{66, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
727*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2066),
728*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed32Type}, protopack.Float32(2166.5),
729*1c12ee1eSDan Willemsen			}),
730*1c12ee1eSDan Willemsen			protopack.Tag{67, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
731*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1067),
732*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed64Type}, protopack.Float64(1167.5),
733*1c12ee1eSDan Willemsen			}),
734*1c12ee1eSDan Willemsen			protopack.Tag{67, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
735*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2067),
736*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.Fixed64Type}, protopack.Float64(2167.5),
737*1c12ee1eSDan Willemsen			}),
738*1c12ee1eSDan Willemsen			protopack.Tag{68, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
739*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Bool(true),
740*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Bool(false),
741*1c12ee1eSDan Willemsen			}),
742*1c12ee1eSDan Willemsen			protopack.Tag{68, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
743*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Bool(false),
744*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Bool(true),
745*1c12ee1eSDan Willemsen			}),
746*1c12ee1eSDan Willemsen			protopack.Tag{69, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
747*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("69.1.key"),
748*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("69.1.val"),
749*1c12ee1eSDan Willemsen			}),
750*1c12ee1eSDan Willemsen			protopack.Tag{69, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
751*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("69.2.key"),
752*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("69.2.val"),
753*1c12ee1eSDan Willemsen			}),
754*1c12ee1eSDan Willemsen			protopack.Tag{70, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
755*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("70.1.key"),
756*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("70.1.val"),
757*1c12ee1eSDan Willemsen			}),
758*1c12ee1eSDan Willemsen			protopack.Tag{70, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
759*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("70.2.key"),
760*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("70.2.val"),
761*1c12ee1eSDan Willemsen			}),
762*1c12ee1eSDan Willemsen			protopack.Tag{71, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
763*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("71.1.key"),
764*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
765*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1171),
766*1c12ee1eSDan Willemsen				}),
767*1c12ee1eSDan Willemsen			}),
768*1c12ee1eSDan Willemsen			protopack.Tag{71, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
769*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("71.2.key"),
770*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
771*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(2171),
772*1c12ee1eSDan Willemsen				}),
773*1c12ee1eSDan Willemsen			}),
774*1c12ee1eSDan Willemsen			protopack.Tag{73, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
775*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("73.1.key"),
776*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(int(testpb.TestAllTypes_FOO)),
777*1c12ee1eSDan Willemsen			}),
778*1c12ee1eSDan Willemsen			protopack.Tag{73, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
779*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("73.2.key"),
780*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(int(testpb.TestAllTypes_BAR)),
781*1c12ee1eSDan Willemsen			}),
782*1c12ee1eSDan Willemsen		}.Marshal(),
783*1c12ee1eSDan Willemsen	},
784*1c12ee1eSDan Willemsen	{
785*1c12ee1eSDan Willemsen		desc: "map with value before key",
786*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
787*1c12ee1eSDan Willemsen			"map_int32_int32": map[int32]int32{1056: 1156},
788*1c12ee1eSDan Willemsen			"map_string_nested_message": map[string]protobuild.Message{
789*1c12ee1eSDan Willemsen				"71.1.key": {"a": 1171},
790*1c12ee1eSDan Willemsen			},
791*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
792*1c12ee1eSDan Willemsen		wire: protopack.Message{
793*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
794*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1156),
795*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1056),
796*1c12ee1eSDan Willemsen			}),
797*1c12ee1eSDan Willemsen			protopack.Tag{71, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
798*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
799*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1171),
800*1c12ee1eSDan Willemsen				}),
801*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("71.1.key"),
802*1c12ee1eSDan Willemsen			}),
803*1c12ee1eSDan Willemsen		}.Marshal(),
804*1c12ee1eSDan Willemsen	},
805*1c12ee1eSDan Willemsen	{
806*1c12ee1eSDan Willemsen		desc: "map with repeated key and value",
807*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
808*1c12ee1eSDan Willemsen			"map_int32_int32": map[int32]int32{1056: 1156},
809*1c12ee1eSDan Willemsen			"map_string_nested_message": map[string]protobuild.Message{
810*1c12ee1eSDan Willemsen				"71.1.key": {"a": 1171},
811*1c12ee1eSDan Willemsen			},
812*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
813*1c12ee1eSDan Willemsen		wire: protopack.Message{
814*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
815*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(0),
816*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(0),
817*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1056),
818*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1156),
819*1c12ee1eSDan Willemsen			}),
820*1c12ee1eSDan Willemsen			protopack.Tag{71, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
821*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String(""),
822*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
823*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("71.1.key"),
824*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
825*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1171),
826*1c12ee1eSDan Willemsen				}),
827*1c12ee1eSDan Willemsen			}),
828*1c12ee1eSDan Willemsen		}.Marshal(),
829*1c12ee1eSDan Willemsen	},
830*1c12ee1eSDan Willemsen	{
831*1c12ee1eSDan Willemsen		desc: "oneof (uint32)",
832*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
833*1c12ee1eSDan Willemsen			"oneof_uint32": 1111,
834*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
835*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{111, protopack.VarintType}, protopack.Varint(1111)}.Marshal(),
836*1c12ee1eSDan Willemsen	},
837*1c12ee1eSDan Willemsen	{
838*1c12ee1eSDan Willemsen		desc: "oneof (message)",
839*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
840*1c12ee1eSDan Willemsen			"oneof_nested_message": protobuild.Message{
841*1c12ee1eSDan Willemsen				"a": 1112,
842*1c12ee1eSDan Willemsen			},
843*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
844*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{112, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
845*1c12ee1eSDan Willemsen			protopack.Message{protopack.Tag{1, protopack.VarintType}, protopack.Varint(1112)},
846*1c12ee1eSDan Willemsen		})}.Marshal(),
847*1c12ee1eSDan Willemsen	},
848*1c12ee1eSDan Willemsen	{
849*1c12ee1eSDan Willemsen		desc: "oneof (empty message)",
850*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
851*1c12ee1eSDan Willemsen			"oneof_nested_message": protobuild.Message{},
852*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
853*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{112, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{})}.Marshal(),
854*1c12ee1eSDan Willemsen	},
855*1c12ee1eSDan Willemsen	{
856*1c12ee1eSDan Willemsen		desc: "oneof (merged message)",
857*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
858*1c12ee1eSDan Willemsen			"oneof_nested_message": protobuild.Message{
859*1c12ee1eSDan Willemsen				"a": 1,
860*1c12ee1eSDan Willemsen				"corecursive": protobuild.Message{
861*1c12ee1eSDan Willemsen					"optional_int32": 43,
862*1c12ee1eSDan Willemsen				},
863*1c12ee1eSDan Willemsen			},
864*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
865*1c12ee1eSDan Willemsen		wire: protopack.Message{
866*1c12ee1eSDan Willemsen			protopack.Tag{112, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
867*1c12ee1eSDan Willemsen				protopack.Message{protopack.Tag{1, protopack.VarintType}, protopack.Varint(1)},
868*1c12ee1eSDan Willemsen			}),
869*1c12ee1eSDan Willemsen			protopack.Tag{112, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
870*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
871*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(43),
872*1c12ee1eSDan Willemsen				}),
873*1c12ee1eSDan Willemsen			}),
874*1c12ee1eSDan Willemsen		}.Marshal(),
875*1c12ee1eSDan Willemsen	},
876*1c12ee1eSDan Willemsen	{
877*1c12ee1eSDan Willemsen		desc: "oneof (group)",
878*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
879*1c12ee1eSDan Willemsen			"oneofgroup": protobuild.Message{
880*1c12ee1eSDan Willemsen				"a": 1,
881*1c12ee1eSDan Willemsen			},
882*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}),
883*1c12ee1eSDan Willemsen		wire: protopack.Message{
884*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.StartGroupType},
885*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
886*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.EndGroupType},
887*1c12ee1eSDan Willemsen		}.Marshal(),
888*1c12ee1eSDan Willemsen	},
889*1c12ee1eSDan Willemsen	{
890*1c12ee1eSDan Willemsen		desc: "oneof (empty group)",
891*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
892*1c12ee1eSDan Willemsen			"oneofgroup": protobuild.Message{},
893*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}),
894*1c12ee1eSDan Willemsen		wire: protopack.Message{
895*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.StartGroupType},
896*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.EndGroupType},
897*1c12ee1eSDan Willemsen		}.Marshal(),
898*1c12ee1eSDan Willemsen	},
899*1c12ee1eSDan Willemsen	{
900*1c12ee1eSDan Willemsen		desc: "oneof (merged group)",
901*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
902*1c12ee1eSDan Willemsen			"oneofgroup": protobuild.Message{
903*1c12ee1eSDan Willemsen				"a": 1,
904*1c12ee1eSDan Willemsen				"b": 2,
905*1c12ee1eSDan Willemsen			},
906*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}),
907*1c12ee1eSDan Willemsen		wire: protopack.Message{
908*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.StartGroupType},
909*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
910*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.EndGroupType},
911*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.StartGroupType},
912*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(2),
913*1c12ee1eSDan Willemsen			protopack.Tag{121, protopack.EndGroupType},
914*1c12ee1eSDan Willemsen		}.Marshal(),
915*1c12ee1eSDan Willemsen	},
916*1c12ee1eSDan Willemsen	{
917*1c12ee1eSDan Willemsen		desc: "oneof (string)",
918*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
919*1c12ee1eSDan Willemsen			"oneof_string": "1113",
920*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
921*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{113, protopack.BytesType}, protopack.String("1113")}.Marshal(),
922*1c12ee1eSDan Willemsen	},
923*1c12ee1eSDan Willemsen	{
924*1c12ee1eSDan Willemsen		desc: "oneof (bytes)",
925*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
926*1c12ee1eSDan Willemsen			"oneof_bytes": "1114",
927*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
928*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{114, protopack.BytesType}, protopack.String("1114")}.Marshal(),
929*1c12ee1eSDan Willemsen	},
930*1c12ee1eSDan Willemsen	{
931*1c12ee1eSDan Willemsen		desc: "oneof (bool)",
932*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
933*1c12ee1eSDan Willemsen			"oneof_bool": true,
934*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
935*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{115, protopack.VarintType}, protopack.Bool(true)}.Marshal(),
936*1c12ee1eSDan Willemsen	},
937*1c12ee1eSDan Willemsen	{
938*1c12ee1eSDan Willemsen		desc: "oneof (uint64)",
939*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
940*1c12ee1eSDan Willemsen			"oneof_uint64": 116,
941*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
942*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{116, protopack.VarintType}, protopack.Varint(116)}.Marshal(),
943*1c12ee1eSDan Willemsen	},
944*1c12ee1eSDan Willemsen	{
945*1c12ee1eSDan Willemsen		desc: "oneof (float)",
946*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
947*1c12ee1eSDan Willemsen			"oneof_float": 117.5,
948*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
949*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{117, protopack.Fixed32Type}, protopack.Float32(117.5)}.Marshal(),
950*1c12ee1eSDan Willemsen	},
951*1c12ee1eSDan Willemsen	{
952*1c12ee1eSDan Willemsen		desc: "oneof (double)",
953*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
954*1c12ee1eSDan Willemsen			"oneof_double": 118.5,
955*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
956*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{118, protopack.Fixed64Type}, protopack.Float64(118.5)}.Marshal(),
957*1c12ee1eSDan Willemsen	},
958*1c12ee1eSDan Willemsen	{
959*1c12ee1eSDan Willemsen		desc: "oneof (enum)",
960*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
961*1c12ee1eSDan Willemsen			"oneof_enum": "BAR",
962*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
963*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{119, protopack.VarintType}, protopack.Varint(int(testpb.TestAllTypes_BAR))}.Marshal(),
964*1c12ee1eSDan Willemsen	},
965*1c12ee1eSDan Willemsen	{
966*1c12ee1eSDan Willemsen		desc: "oneof (zero)",
967*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
968*1c12ee1eSDan Willemsen			"oneof_uint64": 0,
969*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
970*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{116, protopack.VarintType}, protopack.Varint(0)}.Marshal(),
971*1c12ee1eSDan Willemsen	},
972*1c12ee1eSDan Willemsen	{
973*1c12ee1eSDan Willemsen		desc: "oneof (overridden value)",
974*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
975*1c12ee1eSDan Willemsen			"oneof_uint64": 2,
976*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
977*1c12ee1eSDan Willemsen		wire: protopack.Message{
978*1c12ee1eSDan Willemsen			protopack.Tag{111, protopack.VarintType}, protopack.Varint(1),
979*1c12ee1eSDan Willemsen			protopack.Tag{116, protopack.VarintType}, protopack.Varint(2),
980*1c12ee1eSDan Willemsen		}.Marshal(),
981*1c12ee1eSDan Willemsen	},
982*1c12ee1eSDan Willemsen	// TODO: More unknown field tests for ordering, repeated fields, etc.
983*1c12ee1eSDan Willemsen	//
984*1c12ee1eSDan Willemsen	// It is currently impossible to produce results that the v1 Equal
985*1c12ee1eSDan Willemsen	// considers equivalent to those of the v1 decoder. Figure out if
986*1c12ee1eSDan Willemsen	// that's a problem or not.
987*1c12ee1eSDan Willemsen	{
988*1c12ee1eSDan Willemsen		desc:          "unknown fields",
989*1c12ee1eSDan Willemsen		checkFastInit: true,
990*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
991*1c12ee1eSDan Willemsen			protobuild.Unknown: protopack.Message{
992*1c12ee1eSDan Willemsen				protopack.Tag{100000, protopack.VarintType}, protopack.Varint(1),
993*1c12ee1eSDan Willemsen			}.Marshal(),
994*1c12ee1eSDan Willemsen		}),
995*1c12ee1eSDan Willemsen		wire: protopack.Message{
996*1c12ee1eSDan Willemsen			protopack.Tag{100000, protopack.VarintType}, protopack.Varint(1),
997*1c12ee1eSDan Willemsen		}.Marshal(),
998*1c12ee1eSDan Willemsen	},
999*1c12ee1eSDan Willemsen	{
1000*1c12ee1eSDan Willemsen		desc: "discarded unknown fields",
1001*1c12ee1eSDan Willemsen		unmarshalOptions: proto.UnmarshalOptions{
1002*1c12ee1eSDan Willemsen			DiscardUnknown: true,
1003*1c12ee1eSDan Willemsen		},
1004*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{}),
1005*1c12ee1eSDan Willemsen		wire: protopack.Message{
1006*1c12ee1eSDan Willemsen			protopack.Tag{100000, protopack.VarintType}, protopack.Varint(1),
1007*1c12ee1eSDan Willemsen		}.Marshal(),
1008*1c12ee1eSDan Willemsen	},
1009*1c12ee1eSDan Willemsen	{
1010*1c12ee1eSDan Willemsen		desc: "field type mismatch",
1011*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1012*1c12ee1eSDan Willemsen			protobuild.Unknown: protopack.Message{
1013*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("string"),
1014*1c12ee1eSDan Willemsen			}.Marshal(),
1015*1c12ee1eSDan Willemsen		}),
1016*1c12ee1eSDan Willemsen		wire: protopack.Message{
1017*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.String("string"),
1018*1c12ee1eSDan Willemsen		}.Marshal(),
1019*1c12ee1eSDan Willemsen	},
1020*1c12ee1eSDan Willemsen	{
1021*1c12ee1eSDan Willemsen		desc: "map field element mismatch",
1022*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1023*1c12ee1eSDan Willemsen			"map_int32_int32": map[int32]int32{1: 0},
1024*1c12ee1eSDan Willemsen		}, &testpb.TestAllTypes{}, &test3pb.TestAllTypes{}),
1025*1c12ee1eSDan Willemsen		wire: protopack.Message{
1026*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1027*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1028*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("string"),
1029*1c12ee1eSDan Willemsen			}),
1030*1c12ee1eSDan Willemsen		}.Marshal(),
1031*1c12ee1eSDan Willemsen	},
1032*1c12ee1eSDan Willemsen	{
1033*1c12ee1eSDan Willemsen		desc:          "required field in nil message unset",
1034*1c12ee1eSDan Willemsen		checkFastInit: true,
1035*1c12ee1eSDan Willemsen		partial:       true,
1036*1c12ee1eSDan Willemsen		decodeTo:      []proto.Message{(*testpb.TestRequired)(nil)},
1037*1c12ee1eSDan Willemsen	},
1038*1c12ee1eSDan Willemsen	{
1039*1c12ee1eSDan Willemsen		desc:          "required int32 unset",
1040*1c12ee1eSDan Willemsen		checkFastInit: true,
1041*1c12ee1eSDan Willemsen		partial:       true,
1042*1c12ee1eSDan Willemsen		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Int32{}),
1043*1c12ee1eSDan Willemsen	},
1044*1c12ee1eSDan Willemsen	{
1045*1c12ee1eSDan Willemsen		desc:          "required int32 set",
1046*1c12ee1eSDan Willemsen		checkFastInit: true,
1047*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1048*1c12ee1eSDan Willemsen			"v": 1,
1049*1c12ee1eSDan Willemsen		}, &requiredpb.Int32{}),
1050*1c12ee1eSDan Willemsen		wire: protopack.Message{
1051*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1052*1c12ee1eSDan Willemsen		}.Marshal(),
1053*1c12ee1eSDan Willemsen	},
1054*1c12ee1eSDan Willemsen	{
1055*1c12ee1eSDan Willemsen		desc:          "required fixed32 unset",
1056*1c12ee1eSDan Willemsen		checkFastInit: true,
1057*1c12ee1eSDan Willemsen		partial:       true,
1058*1c12ee1eSDan Willemsen		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Fixed32{}),
1059*1c12ee1eSDan Willemsen	},
1060*1c12ee1eSDan Willemsen	{
1061*1c12ee1eSDan Willemsen		desc:          "required fixed32 set",
1062*1c12ee1eSDan Willemsen		checkFastInit: true,
1063*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1064*1c12ee1eSDan Willemsen			"v": 1,
1065*1c12ee1eSDan Willemsen		}, &requiredpb.Fixed32{}),
1066*1c12ee1eSDan Willemsen		wire: protopack.Message{
1067*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(1),
1068*1c12ee1eSDan Willemsen		}.Marshal(),
1069*1c12ee1eSDan Willemsen	},
1070*1c12ee1eSDan Willemsen	{
1071*1c12ee1eSDan Willemsen		desc:          "required fixed64 unset",
1072*1c12ee1eSDan Willemsen		checkFastInit: true,
1073*1c12ee1eSDan Willemsen		partial:       true,
1074*1c12ee1eSDan Willemsen		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Fixed64{}),
1075*1c12ee1eSDan Willemsen	},
1076*1c12ee1eSDan Willemsen	{
1077*1c12ee1eSDan Willemsen		desc:          "required fixed64 set",
1078*1c12ee1eSDan Willemsen		checkFastInit: true,
1079*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1080*1c12ee1eSDan Willemsen			"v": 1,
1081*1c12ee1eSDan Willemsen		}, &requiredpb.Fixed64{}),
1082*1c12ee1eSDan Willemsen		wire: protopack.Message{
1083*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.Fixed64Type}, protopack.Int64(1),
1084*1c12ee1eSDan Willemsen		}.Marshal(),
1085*1c12ee1eSDan Willemsen	},
1086*1c12ee1eSDan Willemsen	{
1087*1c12ee1eSDan Willemsen		desc:          "required bytes unset",
1088*1c12ee1eSDan Willemsen		checkFastInit: true,
1089*1c12ee1eSDan Willemsen		partial:       true,
1090*1c12ee1eSDan Willemsen		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Bytes{}),
1091*1c12ee1eSDan Willemsen	},
1092*1c12ee1eSDan Willemsen	{
1093*1c12ee1eSDan Willemsen		desc:          "required bytes set",
1094*1c12ee1eSDan Willemsen		checkFastInit: true,
1095*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1096*1c12ee1eSDan Willemsen			"v": "",
1097*1c12ee1eSDan Willemsen		}, &requiredpb.Bytes{}),
1098*1c12ee1eSDan Willemsen		wire: protopack.Message{
1099*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.Bytes(nil),
1100*1c12ee1eSDan Willemsen		}.Marshal(),
1101*1c12ee1eSDan Willemsen	},
1102*1c12ee1eSDan Willemsen	{
1103*1c12ee1eSDan Willemsen		desc:          "required message unset",
1104*1c12ee1eSDan Willemsen		checkFastInit: true,
1105*1c12ee1eSDan Willemsen		partial:       true,
1106*1c12ee1eSDan Willemsen		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Message{}),
1107*1c12ee1eSDan Willemsen	},
1108*1c12ee1eSDan Willemsen	{
1109*1c12ee1eSDan Willemsen		desc:          "required message set",
1110*1c12ee1eSDan Willemsen		checkFastInit: true,
1111*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1112*1c12ee1eSDan Willemsen			"v": protobuild.Message{},
1113*1c12ee1eSDan Willemsen		}, &requiredpb.Message{}),
1114*1c12ee1eSDan Willemsen		wire: protopack.Message{
1115*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1116*1c12ee1eSDan Willemsen		}.Marshal(),
1117*1c12ee1eSDan Willemsen	},
1118*1c12ee1eSDan Willemsen	{
1119*1c12ee1eSDan Willemsen		desc:          "required group unset",
1120*1c12ee1eSDan Willemsen		checkFastInit: true,
1121*1c12ee1eSDan Willemsen		partial:       true,
1122*1c12ee1eSDan Willemsen		decodeTo:      makeMessages(protobuild.Message{}, &requiredpb.Group{}),
1123*1c12ee1eSDan Willemsen	},
1124*1c12ee1eSDan Willemsen	{
1125*1c12ee1eSDan Willemsen		desc:          "required group set",
1126*1c12ee1eSDan Willemsen		checkFastInit: true,
1127*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1128*1c12ee1eSDan Willemsen			"group": protobuild.Message{},
1129*1c12ee1eSDan Willemsen		}, &requiredpb.Group{}),
1130*1c12ee1eSDan Willemsen		wire: protopack.Message{
1131*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
1132*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
1133*1c12ee1eSDan Willemsen		}.Marshal(),
1134*1c12ee1eSDan Willemsen	},
1135*1c12ee1eSDan Willemsen	{
1136*1c12ee1eSDan Willemsen		desc:          "required field with incompatible wire type",
1137*1c12ee1eSDan Willemsen		checkFastInit: true,
1138*1c12ee1eSDan Willemsen		partial:       true,
1139*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
1140*1c12ee1eSDan Willemsen			&testpb.TestRequired{},
1141*1c12ee1eSDan Willemsen			unknown(protopack.Message{
1142*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(2),
1143*1c12ee1eSDan Willemsen			}.Marshal()),
1144*1c12ee1eSDan Willemsen		)},
1145*1c12ee1eSDan Willemsen		wire: protopack.Message{
1146*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.Fixed32Type}, protopack.Int32(2),
1147*1c12ee1eSDan Willemsen		}.Marshal(),
1148*1c12ee1eSDan Willemsen	},
1149*1c12ee1eSDan Willemsen	{
1150*1c12ee1eSDan Willemsen		desc:          "required field in optional message unset",
1151*1c12ee1eSDan Willemsen		checkFastInit: true,
1152*1c12ee1eSDan Willemsen		partial:       true,
1153*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1154*1c12ee1eSDan Willemsen			"optional_message": protobuild.Message{},
1155*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1156*1c12ee1eSDan Willemsen		wire: protopack.Message{
1157*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1158*1c12ee1eSDan Willemsen		}.Marshal(),
1159*1c12ee1eSDan Willemsen	},
1160*1c12ee1eSDan Willemsen	{
1161*1c12ee1eSDan Willemsen		desc:          "required field in optional message set",
1162*1c12ee1eSDan Willemsen		checkFastInit: true,
1163*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1164*1c12ee1eSDan Willemsen			"optional_message": protobuild.Message{
1165*1c12ee1eSDan Willemsen				"required_field": 1,
1166*1c12ee1eSDan Willemsen			},
1167*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1168*1c12ee1eSDan Willemsen		wire: protopack.Message{
1169*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1170*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1171*1c12ee1eSDan Willemsen			}),
1172*1c12ee1eSDan Willemsen		}.Marshal(),
1173*1c12ee1eSDan Willemsen	},
1174*1c12ee1eSDan Willemsen	{
1175*1c12ee1eSDan Willemsen		desc:             "required field in optional message set (split across multiple tags)",
1176*1c12ee1eSDan Willemsen		checkFastInit:    false, // fast init checks don't handle split messages
1177*1c12ee1eSDan Willemsen		nocheckValidInit: true,  // validation doesn't either
1178*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1179*1c12ee1eSDan Willemsen			"optional_message": protobuild.Message{
1180*1c12ee1eSDan Willemsen				"required_field": 1,
1181*1c12ee1eSDan Willemsen			},
1182*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1183*1c12ee1eSDan Willemsen		wire: protopack.Message{
1184*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1185*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1186*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1187*1c12ee1eSDan Willemsen			}),
1188*1c12ee1eSDan Willemsen		}.Marshal(),
1189*1c12ee1eSDan Willemsen	},
1190*1c12ee1eSDan Willemsen	{
1191*1c12ee1eSDan Willemsen		desc:          "required field in repeated message unset",
1192*1c12ee1eSDan Willemsen		checkFastInit: true,
1193*1c12ee1eSDan Willemsen		partial:       true,
1194*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1195*1c12ee1eSDan Willemsen			"repeated_message": []protobuild.Message{
1196*1c12ee1eSDan Willemsen				{"required_field": 1},
1197*1c12ee1eSDan Willemsen				{},
1198*1c12ee1eSDan Willemsen			},
1199*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1200*1c12ee1eSDan Willemsen		wire: protopack.Message{
1201*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1202*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1203*1c12ee1eSDan Willemsen			}),
1204*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1205*1c12ee1eSDan Willemsen		}.Marshal(),
1206*1c12ee1eSDan Willemsen	},
1207*1c12ee1eSDan Willemsen	{
1208*1c12ee1eSDan Willemsen		desc:          "required field in repeated message set",
1209*1c12ee1eSDan Willemsen		checkFastInit: true,
1210*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1211*1c12ee1eSDan Willemsen			"repeated_message": []protobuild.Message{
1212*1c12ee1eSDan Willemsen				{"required_field": 1},
1213*1c12ee1eSDan Willemsen				{"required_field": 2},
1214*1c12ee1eSDan Willemsen			},
1215*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1216*1c12ee1eSDan Willemsen		wire: protopack.Message{
1217*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1218*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1219*1c12ee1eSDan Willemsen			}),
1220*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1221*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
1222*1c12ee1eSDan Willemsen			}),
1223*1c12ee1eSDan Willemsen		}.Marshal(),
1224*1c12ee1eSDan Willemsen	},
1225*1c12ee1eSDan Willemsen	{
1226*1c12ee1eSDan Willemsen		desc:          "required field in map message unset",
1227*1c12ee1eSDan Willemsen		checkFastInit: true,
1228*1c12ee1eSDan Willemsen		partial:       true,
1229*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1230*1c12ee1eSDan Willemsen			"map_message": map[int32]protobuild.Message{
1231*1c12ee1eSDan Willemsen				1: {"required_field": 1},
1232*1c12ee1eSDan Willemsen				2: {},
1233*1c12ee1eSDan Willemsen			},
1234*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1235*1c12ee1eSDan Willemsen		wire: protopack.Message{
1236*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1237*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1238*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1239*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1240*1c12ee1eSDan Willemsen				}),
1241*1c12ee1eSDan Willemsen			}),
1242*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1243*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
1244*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1245*1c12ee1eSDan Willemsen			}),
1246*1c12ee1eSDan Willemsen		}.Marshal(),
1247*1c12ee1eSDan Willemsen	},
1248*1c12ee1eSDan Willemsen	{
1249*1c12ee1eSDan Willemsen		desc:          "required field in absent map message value",
1250*1c12ee1eSDan Willemsen		checkFastInit: true,
1251*1c12ee1eSDan Willemsen		partial:       true,
1252*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1253*1c12ee1eSDan Willemsen			"map_message": map[int32]protobuild.Message{
1254*1c12ee1eSDan Willemsen				2: {},
1255*1c12ee1eSDan Willemsen			},
1256*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1257*1c12ee1eSDan Willemsen		wire: protopack.Message{
1258*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1259*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
1260*1c12ee1eSDan Willemsen			}),
1261*1c12ee1eSDan Willemsen		}.Marshal(),
1262*1c12ee1eSDan Willemsen	},
1263*1c12ee1eSDan Willemsen	{
1264*1c12ee1eSDan Willemsen		desc:          "required field in map message set",
1265*1c12ee1eSDan Willemsen		checkFastInit: true,
1266*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1267*1c12ee1eSDan Willemsen			"map_message": map[int32]protobuild.Message{
1268*1c12ee1eSDan Willemsen				1: {"required_field": 1},
1269*1c12ee1eSDan Willemsen				2: {"required_field": 2},
1270*1c12ee1eSDan Willemsen			},
1271*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1272*1c12ee1eSDan Willemsen		wire: protopack.Message{
1273*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1274*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1275*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1276*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1277*1c12ee1eSDan Willemsen				}),
1278*1c12ee1eSDan Willemsen			}),
1279*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1280*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
1281*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1282*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
1283*1c12ee1eSDan Willemsen				}),
1284*1c12ee1eSDan Willemsen			}),
1285*1c12ee1eSDan Willemsen		}.Marshal(),
1286*1c12ee1eSDan Willemsen	},
1287*1c12ee1eSDan Willemsen	{
1288*1c12ee1eSDan Willemsen		desc:          "required field in optional group unset",
1289*1c12ee1eSDan Willemsen		checkFastInit: true,
1290*1c12ee1eSDan Willemsen		partial:       true,
1291*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1292*1c12ee1eSDan Willemsen			"optionalgroup": protobuild.Message{},
1293*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredGroupFields{}),
1294*1c12ee1eSDan Willemsen		wire: protopack.Message{
1295*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
1296*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
1297*1c12ee1eSDan Willemsen		}.Marshal(),
1298*1c12ee1eSDan Willemsen	},
1299*1c12ee1eSDan Willemsen	{
1300*1c12ee1eSDan Willemsen		desc:          "required field in optional group set",
1301*1c12ee1eSDan Willemsen		checkFastInit: true,
1302*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1303*1c12ee1eSDan Willemsen			"optionalgroup": protobuild.Message{
1304*1c12ee1eSDan Willemsen				"a": 1,
1305*1c12ee1eSDan Willemsen			},
1306*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredGroupFields{}),
1307*1c12ee1eSDan Willemsen		wire: protopack.Message{
1308*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
1309*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1),
1310*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
1311*1c12ee1eSDan Willemsen		}.Marshal(),
1312*1c12ee1eSDan Willemsen	},
1313*1c12ee1eSDan Willemsen	{
1314*1c12ee1eSDan Willemsen		desc:          "required field in repeated group unset",
1315*1c12ee1eSDan Willemsen		checkFastInit: true,
1316*1c12ee1eSDan Willemsen		partial:       true,
1317*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1318*1c12ee1eSDan Willemsen			"repeatedgroup": []protobuild.Message{
1319*1c12ee1eSDan Willemsen				{"a": 1},
1320*1c12ee1eSDan Willemsen				{},
1321*1c12ee1eSDan Willemsen			},
1322*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredGroupFields{}),
1323*1c12ee1eSDan Willemsen		wire: protopack.Message{
1324*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.StartGroupType},
1325*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.VarintType}, protopack.Varint(1),
1326*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.EndGroupType},
1327*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.StartGroupType},
1328*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.EndGroupType},
1329*1c12ee1eSDan Willemsen		}.Marshal(),
1330*1c12ee1eSDan Willemsen	},
1331*1c12ee1eSDan Willemsen	{
1332*1c12ee1eSDan Willemsen		desc:          "required field in repeated group set",
1333*1c12ee1eSDan Willemsen		checkFastInit: true,
1334*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1335*1c12ee1eSDan Willemsen			"repeatedgroup": []protobuild.Message{
1336*1c12ee1eSDan Willemsen				{"a": 1},
1337*1c12ee1eSDan Willemsen				{"a": 2},
1338*1c12ee1eSDan Willemsen			},
1339*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredGroupFields{}),
1340*1c12ee1eSDan Willemsen		wire: protopack.Message{
1341*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.StartGroupType},
1342*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.VarintType}, protopack.Varint(1),
1343*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.EndGroupType},
1344*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.StartGroupType},
1345*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.VarintType}, protopack.Varint(2),
1346*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.EndGroupType},
1347*1c12ee1eSDan Willemsen		}.Marshal(),
1348*1c12ee1eSDan Willemsen	},
1349*1c12ee1eSDan Willemsen	{
1350*1c12ee1eSDan Willemsen		desc:          "required field in oneof message unset",
1351*1c12ee1eSDan Willemsen		checkFastInit: true,
1352*1c12ee1eSDan Willemsen		partial:       true,
1353*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1354*1c12ee1eSDan Willemsen			"oneof_message": protobuild.Message{},
1355*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1356*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{4, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{})}.Marshal(),
1357*1c12ee1eSDan Willemsen	},
1358*1c12ee1eSDan Willemsen	{
1359*1c12ee1eSDan Willemsen		desc:          "required field in oneof message set",
1360*1c12ee1eSDan Willemsen		checkFastInit: true,
1361*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1362*1c12ee1eSDan Willemsen			"oneof_message": protobuild.Message{
1363*1c12ee1eSDan Willemsen				"required_field": 1,
1364*1c12ee1eSDan Willemsen			},
1365*1c12ee1eSDan Willemsen		}, &testpb.TestRequiredForeign{}),
1366*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{4, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1367*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1368*1c12ee1eSDan Willemsen		})}.Marshal(),
1369*1c12ee1eSDan Willemsen	},
1370*1c12ee1eSDan Willemsen	{
1371*1c12ee1eSDan Willemsen		desc:          "required field in extension message unset",
1372*1c12ee1eSDan Willemsen		checkFastInit: true,
1373*1c12ee1eSDan Willemsen		partial:       true,
1374*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1375*1c12ee1eSDan Willemsen			"single": protobuild.Message{},
1376*1c12ee1eSDan Willemsen		}, &testpb.TestAllExtensions{}),
1377*1c12ee1eSDan Willemsen		wire: protopack.Message{
1378*1c12ee1eSDan Willemsen			protopack.Tag{1000, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1379*1c12ee1eSDan Willemsen		}.Marshal(),
1380*1c12ee1eSDan Willemsen	},
1381*1c12ee1eSDan Willemsen	{
1382*1c12ee1eSDan Willemsen		desc:          "required field in extension message set",
1383*1c12ee1eSDan Willemsen		checkFastInit: true,
1384*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1385*1c12ee1eSDan Willemsen			"single": protobuild.Message{
1386*1c12ee1eSDan Willemsen				"required_field": 1,
1387*1c12ee1eSDan Willemsen			},
1388*1c12ee1eSDan Willemsen		}, &testpb.TestAllExtensions{}),
1389*1c12ee1eSDan Willemsen		wire: protopack.Message{
1390*1c12ee1eSDan Willemsen			protopack.Tag{1000, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1391*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1392*1c12ee1eSDan Willemsen			}),
1393*1c12ee1eSDan Willemsen		}.Marshal(),
1394*1c12ee1eSDan Willemsen	},
1395*1c12ee1eSDan Willemsen	{
1396*1c12ee1eSDan Willemsen		desc:          "required field in repeated extension message unset",
1397*1c12ee1eSDan Willemsen		checkFastInit: true,
1398*1c12ee1eSDan Willemsen		partial:       true,
1399*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1400*1c12ee1eSDan Willemsen			"multi": []protobuild.Message{
1401*1c12ee1eSDan Willemsen				{"required_field": 1},
1402*1c12ee1eSDan Willemsen				{},
1403*1c12ee1eSDan Willemsen			},
1404*1c12ee1eSDan Willemsen		}, &testpb.TestAllExtensions{}),
1405*1c12ee1eSDan Willemsen		wire: protopack.Message{
1406*1c12ee1eSDan Willemsen			protopack.Tag{1001, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1407*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1408*1c12ee1eSDan Willemsen			}),
1409*1c12ee1eSDan Willemsen			protopack.Tag{1001, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
1410*1c12ee1eSDan Willemsen		}.Marshal(),
1411*1c12ee1eSDan Willemsen	},
1412*1c12ee1eSDan Willemsen	{
1413*1c12ee1eSDan Willemsen		desc:          "required field in repeated extension message set",
1414*1c12ee1eSDan Willemsen		checkFastInit: true,
1415*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1416*1c12ee1eSDan Willemsen			"multi": []protobuild.Message{
1417*1c12ee1eSDan Willemsen				{"required_field": 1},
1418*1c12ee1eSDan Willemsen				{"required_field": 2},
1419*1c12ee1eSDan Willemsen			},
1420*1c12ee1eSDan Willemsen		}, &testpb.TestAllExtensions{}),
1421*1c12ee1eSDan Willemsen		wire: protopack.Message{
1422*1c12ee1eSDan Willemsen			protopack.Tag{1001, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1423*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1424*1c12ee1eSDan Willemsen			}),
1425*1c12ee1eSDan Willemsen			protopack.Tag{1001, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1426*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(2),
1427*1c12ee1eSDan Willemsen			}),
1428*1c12ee1eSDan Willemsen		}.Marshal(),
1429*1c12ee1eSDan Willemsen	},
1430*1c12ee1eSDan Willemsen	{
1431*1c12ee1eSDan Willemsen		desc: "nil messages",
1432*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1433*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1434*1c12ee1eSDan Willemsen			(*test3pb.TestAllTypes)(nil),
1435*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1436*1c12ee1eSDan Willemsen		},
1437*1c12ee1eSDan Willemsen	},
1438*1c12ee1eSDan Willemsen	{
1439*1c12ee1eSDan Willemsen		desc:    "legacy",
1440*1c12ee1eSDan Willemsen		partial: true,
1441*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1442*1c12ee1eSDan Willemsen			"f1": protobuild.Message{
1443*1c12ee1eSDan Willemsen				"optional_int32":      1,
1444*1c12ee1eSDan Willemsen				"optional_child_enum": "ALPHA",
1445*1c12ee1eSDan Willemsen				"optional_child_message": protobuild.Message{
1446*1c12ee1eSDan Willemsen					"f1": "x",
1447*1c12ee1eSDan Willemsen				},
1448*1c12ee1eSDan Willemsen				"optionalgroup": protobuild.Message{
1449*1c12ee1eSDan Willemsen					"f1": "x",
1450*1c12ee1eSDan Willemsen				},
1451*1c12ee1eSDan Willemsen				"repeated_child_message": []protobuild.Message{
1452*1c12ee1eSDan Willemsen					{"f1": "x"},
1453*1c12ee1eSDan Willemsen				},
1454*1c12ee1eSDan Willemsen				"repeatedgroup": []protobuild.Message{
1455*1c12ee1eSDan Willemsen					{"f1": "x"},
1456*1c12ee1eSDan Willemsen				},
1457*1c12ee1eSDan Willemsen				"map_bool_child_message": map[bool]protobuild.Message{
1458*1c12ee1eSDan Willemsen					true: {"f1": "x"},
1459*1c12ee1eSDan Willemsen				},
1460*1c12ee1eSDan Willemsen				"oneof_child_message": protobuild.Message{
1461*1c12ee1eSDan Willemsen					"f1": "x",
1462*1c12ee1eSDan Willemsen				},
1463*1c12ee1eSDan Willemsen			},
1464*1c12ee1eSDan Willemsen		}, &legacypb.Legacy{}),
1465*1c12ee1eSDan Willemsen		wire: protopack.Message{
1466*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1467*1c12ee1eSDan Willemsen				protopack.Tag{101, protopack.VarintType}, protopack.Varint(1),
1468*1c12ee1eSDan Willemsen				protopack.Tag{115, protopack.VarintType}, protopack.Varint(0),
1469*1c12ee1eSDan Willemsen				protopack.Tag{116, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1470*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.BytesType}, protopack.String("x"),
1471*1c12ee1eSDan Willemsen				}),
1472*1c12ee1eSDan Willemsen				protopack.Tag{120, protopack.StartGroupType},
1473*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("x"),
1474*1c12ee1eSDan Willemsen				protopack.Tag{120, protopack.EndGroupType},
1475*1c12ee1eSDan Willemsen				protopack.Tag{516, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1476*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.BytesType}, protopack.String("x"),
1477*1c12ee1eSDan Willemsen				}),
1478*1c12ee1eSDan Willemsen				protopack.Tag{520, protopack.StartGroupType},
1479*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("x"),
1480*1c12ee1eSDan Willemsen				protopack.Tag{520, protopack.EndGroupType},
1481*1c12ee1eSDan Willemsen				protopack.Tag{616, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1482*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
1483*1c12ee1eSDan Willemsen					protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1484*1c12ee1eSDan Willemsen						protopack.Tag{1, protopack.BytesType}, protopack.String("x"),
1485*1c12ee1eSDan Willemsen					}),
1486*1c12ee1eSDan Willemsen				}),
1487*1c12ee1eSDan Willemsen				protopack.Tag{716, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1488*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.BytesType}, protopack.String("x"),
1489*1c12ee1eSDan Willemsen				}),
1490*1c12ee1eSDan Willemsen			}),
1491*1c12ee1eSDan Willemsen		}.Marshal(),
1492*1c12ee1eSDan Willemsen		validationStatus: impl.ValidationUnknown,
1493*1c12ee1eSDan Willemsen	},
1494*1c12ee1eSDan Willemsen	{
1495*1c12ee1eSDan Willemsen		desc: "first reserved field number",
1496*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1497*1c12ee1eSDan Willemsen			protobuild.Unknown: protopack.Message{
1498*1c12ee1eSDan Willemsen				protopack.Tag{protopack.FirstReservedNumber, protopack.VarintType}, protopack.Varint(1004),
1499*1c12ee1eSDan Willemsen			}.Marshal(),
1500*1c12ee1eSDan Willemsen		}),
1501*1c12ee1eSDan Willemsen		wire: protopack.Message{
1502*1c12ee1eSDan Willemsen			protopack.Tag{protopack.FirstReservedNumber, protopack.VarintType}, protopack.Varint(1004),
1503*1c12ee1eSDan Willemsen		}.Marshal(),
1504*1c12ee1eSDan Willemsen	},
1505*1c12ee1eSDan Willemsen	{
1506*1c12ee1eSDan Willemsen		desc: "last reserved field number",
1507*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1508*1c12ee1eSDan Willemsen			protobuild.Unknown: protopack.Message{
1509*1c12ee1eSDan Willemsen				protopack.Tag{protopack.LastReservedNumber, protopack.VarintType}, protopack.Varint(1005),
1510*1c12ee1eSDan Willemsen			}.Marshal(),
1511*1c12ee1eSDan Willemsen		}),
1512*1c12ee1eSDan Willemsen		wire: protopack.Message{
1513*1c12ee1eSDan Willemsen			protopack.Tag{protopack.LastReservedNumber, protopack.VarintType}, protopack.Varint(1005),
1514*1c12ee1eSDan Willemsen		}.Marshal(),
1515*1c12ee1eSDan Willemsen	},
1516*1c12ee1eSDan Willemsen	{
1517*1c12ee1eSDan Willemsen		desc: "nested unknown extension",
1518*1c12ee1eSDan Willemsen		unmarshalOptions: proto.UnmarshalOptions{
1519*1c12ee1eSDan Willemsen			DiscardUnknown: true,
1520*1c12ee1eSDan Willemsen			Resolver: filterResolver{
1521*1c12ee1eSDan Willemsen				filter: func(name protoreflect.FullName) bool {
1522*1c12ee1eSDan Willemsen					switch name.Name() {
1523*1c12ee1eSDan Willemsen					case "optional_nested_message",
1524*1c12ee1eSDan Willemsen						"optional_int32":
1525*1c12ee1eSDan Willemsen						return true
1526*1c12ee1eSDan Willemsen					}
1527*1c12ee1eSDan Willemsen					return false
1528*1c12ee1eSDan Willemsen				},
1529*1c12ee1eSDan Willemsen				resolver: protoregistry.GlobalTypes,
1530*1c12ee1eSDan Willemsen			},
1531*1c12ee1eSDan Willemsen		},
1532*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1533*1c12ee1eSDan Willemsen			"optional_nested_message": protobuild.Message{
1534*1c12ee1eSDan Willemsen				"corecursive": protobuild.Message{
1535*1c12ee1eSDan Willemsen					"optional_nested_message": protobuild.Message{
1536*1c12ee1eSDan Willemsen						"corecursive": protobuild.Message{
1537*1c12ee1eSDan Willemsen							"optional_int32": 42,
1538*1c12ee1eSDan Willemsen						},
1539*1c12ee1eSDan Willemsen					},
1540*1c12ee1eSDan Willemsen				},
1541*1c12ee1eSDan Willemsen			},
1542*1c12ee1eSDan Willemsen		}, &testpb.TestAllExtensions{}),
1543*1c12ee1eSDan Willemsen		wire: protopack.Message{
1544*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1545*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1546*1c12ee1eSDan Willemsen					protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1547*1c12ee1eSDan Willemsen						protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1548*1c12ee1eSDan Willemsen							protopack.Tag{1, protopack.VarintType}, protopack.Varint(42),
1549*1c12ee1eSDan Willemsen							protopack.Tag{2, protopack.VarintType}, protopack.Varint(43),
1550*1c12ee1eSDan Willemsen						}),
1551*1c12ee1eSDan Willemsen					}),
1552*1c12ee1eSDan Willemsen				}),
1553*1c12ee1eSDan Willemsen			}),
1554*1c12ee1eSDan Willemsen		}.Marshal(),
1555*1c12ee1eSDan Willemsen	},
1556*1c12ee1eSDan Willemsen}
1557*1c12ee1eSDan Willemsen
1558*1c12ee1eSDan Willemsenvar testInvalidMessages = []testProto{
1559*1c12ee1eSDan Willemsen	{
1560*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in optional string field",
1561*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1562*1c12ee1eSDan Willemsen			"optional_string": "abc\xff",
1563*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1564*1c12ee1eSDan Willemsen		wire: protopack.Message{
1565*1c12ee1eSDan Willemsen			protopack.Tag{14, protopack.BytesType}, protopack.String("abc\xff"),
1566*1c12ee1eSDan Willemsen		}.Marshal(),
1567*1c12ee1eSDan Willemsen	},
1568*1c12ee1eSDan Willemsen	{
1569*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in singular string field",
1570*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1571*1c12ee1eSDan Willemsen			"singular_string": "abc\xff",
1572*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1573*1c12ee1eSDan Willemsen		wire: protopack.Message{
1574*1c12ee1eSDan Willemsen			protopack.Tag{94, protopack.BytesType}, protopack.String("abc\xff"),
1575*1c12ee1eSDan Willemsen		}.Marshal(),
1576*1c12ee1eSDan Willemsen	},
1577*1c12ee1eSDan Willemsen	{
1578*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in repeated string field",
1579*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1580*1c12ee1eSDan Willemsen			"repeated_string": []string{"foo", "abc\xff"},
1581*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1582*1c12ee1eSDan Willemsen		wire: protopack.Message{
1583*1c12ee1eSDan Willemsen			protopack.Tag{44, protopack.BytesType}, protopack.String("foo"),
1584*1c12ee1eSDan Willemsen			protopack.Tag{44, protopack.BytesType}, protopack.String("abc\xff"),
1585*1c12ee1eSDan Willemsen		}.Marshal(),
1586*1c12ee1eSDan Willemsen	},
1587*1c12ee1eSDan Willemsen	{
1588*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in nested message",
1589*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1590*1c12ee1eSDan Willemsen			"optional_nested_message": protobuild.Message{
1591*1c12ee1eSDan Willemsen				"corecursive": protobuild.Message{
1592*1c12ee1eSDan Willemsen					"singular_string": "abc\xff",
1593*1c12ee1eSDan Willemsen				},
1594*1c12ee1eSDan Willemsen			},
1595*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1596*1c12ee1eSDan Willemsen		wire: protopack.Message{
1597*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1598*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1599*1c12ee1eSDan Willemsen					protopack.Tag{94, protopack.BytesType}, protopack.String("abc\xff"),
1600*1c12ee1eSDan Willemsen				}),
1601*1c12ee1eSDan Willemsen			}),
1602*1c12ee1eSDan Willemsen		}.Marshal(),
1603*1c12ee1eSDan Willemsen	},
1604*1c12ee1eSDan Willemsen	{
1605*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in oneof field",
1606*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1607*1c12ee1eSDan Willemsen			"oneof_string": "abc\xff",
1608*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1609*1c12ee1eSDan Willemsen		wire: protopack.Message{protopack.Tag{113, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(),
1610*1c12ee1eSDan Willemsen	},
1611*1c12ee1eSDan Willemsen	{
1612*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in map key",
1613*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1614*1c12ee1eSDan Willemsen			"map_string_string": map[string]string{"key\xff": "val"},
1615*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1616*1c12ee1eSDan Willemsen		wire: protopack.Message{
1617*1c12ee1eSDan Willemsen			protopack.Tag{69, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1618*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("key\xff"),
1619*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("val"),
1620*1c12ee1eSDan Willemsen			}),
1621*1c12ee1eSDan Willemsen		}.Marshal(),
1622*1c12ee1eSDan Willemsen	},
1623*1c12ee1eSDan Willemsen	{
1624*1c12ee1eSDan Willemsen		desc: "invalid UTF-8 in map value",
1625*1c12ee1eSDan Willemsen		decodeTo: makeMessages(protobuild.Message{
1626*1c12ee1eSDan Willemsen			"map_string_string": map[string]string{"key": "val\xff"},
1627*1c12ee1eSDan Willemsen		}, &test3pb.TestAllTypes{}),
1628*1c12ee1eSDan Willemsen		wire: protopack.Message{
1629*1c12ee1eSDan Willemsen			protopack.Tag{69, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1630*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.BytesType}, protopack.String("key"),
1631*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.String("val\xff"),
1632*1c12ee1eSDan Willemsen			}),
1633*1c12ee1eSDan Willemsen		}.Marshal(),
1634*1c12ee1eSDan Willemsen	},
1635*1c12ee1eSDan Willemsen	{
1636*1c12ee1eSDan Willemsen		desc: "invalid field number zero",
1637*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1638*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1639*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1640*1c12ee1eSDan Willemsen		},
1641*1c12ee1eSDan Willemsen		wire: protopack.Message{
1642*1c12ee1eSDan Willemsen			protopack.Tag{protopack.MinValidNumber - 1, protopack.VarintType}, protopack.Varint(1001),
1643*1c12ee1eSDan Willemsen		}.Marshal(),
1644*1c12ee1eSDan Willemsen	},
1645*1c12ee1eSDan Willemsen	{
1646*1c12ee1eSDan Willemsen		desc: "invalid field numbers zero and one",
1647*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1648*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1649*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1650*1c12ee1eSDan Willemsen		},
1651*1c12ee1eSDan Willemsen		wire: protopack.Message{
1652*1c12ee1eSDan Willemsen			protopack.Tag{protopack.MinValidNumber - 1, protopack.VarintType}, protopack.Varint(1002),
1653*1c12ee1eSDan Willemsen			protopack.Tag{protopack.MinValidNumber, protopack.VarintType}, protopack.Varint(1003),
1654*1c12ee1eSDan Willemsen		}.Marshal(),
1655*1c12ee1eSDan Willemsen	},
1656*1c12ee1eSDan Willemsen	{
1657*1c12ee1eSDan Willemsen		desc: "invalid field numbers max and max+1",
1658*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1659*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1660*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1661*1c12ee1eSDan Willemsen		},
1662*1c12ee1eSDan Willemsen		wire: protopack.Message{
1663*1c12ee1eSDan Willemsen			protopack.Tag{protopack.MaxValidNumber, protopack.VarintType}, protopack.Varint(1006),
1664*1c12ee1eSDan Willemsen			protopack.Tag{protopack.MaxValidNumber + 1, protopack.VarintType}, protopack.Varint(1007),
1665*1c12ee1eSDan Willemsen		}.Marshal(),
1666*1c12ee1eSDan Willemsen	},
1667*1c12ee1eSDan Willemsen	{
1668*1c12ee1eSDan Willemsen		desc: "invalid field number max+1",
1669*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1670*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1671*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1672*1c12ee1eSDan Willemsen		},
1673*1c12ee1eSDan Willemsen		wire: protopack.Message{
1674*1c12ee1eSDan Willemsen			protopack.Tag{protopack.MaxValidNumber + 1, protopack.VarintType}, protopack.Varint(1008),
1675*1c12ee1eSDan Willemsen		}.Marshal(),
1676*1c12ee1eSDan Willemsen	},
1677*1c12ee1eSDan Willemsen	{
1678*1c12ee1eSDan Willemsen		desc: "invalid field number wraps int32",
1679*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1680*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1681*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1682*1c12ee1eSDan Willemsen		},
1683*1c12ee1eSDan Willemsen		wire: protopack.Message{
1684*1c12ee1eSDan Willemsen			protopack.Varint(2234993595104), protopack.Varint(0),
1685*1c12ee1eSDan Willemsen		}.Marshal(),
1686*1c12ee1eSDan Willemsen	},
1687*1c12ee1eSDan Willemsen	{
1688*1c12ee1eSDan Willemsen		desc:     "invalid field number in map",
1689*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{(*testpb.TestAllTypes)(nil)},
1690*1c12ee1eSDan Willemsen		wire: protopack.Message{
1691*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1692*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(1056),
1693*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1156),
1694*1c12ee1eSDan Willemsen				protopack.Tag{protopack.MaxValidNumber + 1, protopack.VarintType}, protopack.Varint(0),
1695*1c12ee1eSDan Willemsen			}),
1696*1c12ee1eSDan Willemsen		}.Marshal(),
1697*1c12ee1eSDan Willemsen	},
1698*1c12ee1eSDan Willemsen	{
1699*1c12ee1eSDan Willemsen		desc: "invalid tag varint",
1700*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1701*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1702*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1703*1c12ee1eSDan Willemsen		},
1704*1c12ee1eSDan Willemsen		wire: []byte{0xff},
1705*1c12ee1eSDan Willemsen	},
1706*1c12ee1eSDan Willemsen	{
1707*1c12ee1eSDan Willemsen		desc: "field number too small",
1708*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1709*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1710*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1711*1c12ee1eSDan Willemsen		},
1712*1c12ee1eSDan Willemsen		wire: protopack.Message{
1713*1c12ee1eSDan Willemsen			protopack.Tag{0, protopack.VarintType}, protopack.Varint(0),
1714*1c12ee1eSDan Willemsen		}.Marshal(),
1715*1c12ee1eSDan Willemsen	},
1716*1c12ee1eSDan Willemsen	{
1717*1c12ee1eSDan Willemsen		desc: "field number too large",
1718*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1719*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1720*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1721*1c12ee1eSDan Willemsen		},
1722*1c12ee1eSDan Willemsen		wire: protopack.Message{
1723*1c12ee1eSDan Willemsen			protopack.Tag{protowire.MaxValidNumber + 1, protopack.VarintType}, protopack.Varint(0),
1724*1c12ee1eSDan Willemsen		}.Marshal(),
1725*1c12ee1eSDan Willemsen	},
1726*1c12ee1eSDan Willemsen	{
1727*1c12ee1eSDan Willemsen		desc: "invalid tag varint in message field",
1728*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1729*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1730*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1731*1c12ee1eSDan Willemsen		},
1732*1c12ee1eSDan Willemsen		wire: protopack.Message{
1733*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1734*1c12ee1eSDan Willemsen				protopack.Raw{0xff},
1735*1c12ee1eSDan Willemsen			}),
1736*1c12ee1eSDan Willemsen		}.Marshal(),
1737*1c12ee1eSDan Willemsen	},
1738*1c12ee1eSDan Willemsen	{
1739*1c12ee1eSDan Willemsen		desc: "invalid tag varint in repeated message field",
1740*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1741*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1742*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1743*1c12ee1eSDan Willemsen		},
1744*1c12ee1eSDan Willemsen		wire: protopack.Message{
1745*1c12ee1eSDan Willemsen			protopack.Tag{48, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1746*1c12ee1eSDan Willemsen				protopack.Raw{0xff},
1747*1c12ee1eSDan Willemsen			}),
1748*1c12ee1eSDan Willemsen		}.Marshal(),
1749*1c12ee1eSDan Willemsen	},
1750*1c12ee1eSDan Willemsen	{
1751*1c12ee1eSDan Willemsen		desc: "invalid varint in group field",
1752*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1753*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1754*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1755*1c12ee1eSDan Willemsen		},
1756*1c12ee1eSDan Willemsen		wire: protopack.Message{
1757*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.StartGroupType},
1758*1c12ee1eSDan Willemsen			protopack.Tag{1000, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1759*1c12ee1eSDan Willemsen				protopack.Raw{0xff},
1760*1c12ee1eSDan Willemsen			}),
1761*1c12ee1eSDan Willemsen			protopack.Tag{16, protopack.EndGroupType},
1762*1c12ee1eSDan Willemsen		}.Marshal(),
1763*1c12ee1eSDan Willemsen	},
1764*1c12ee1eSDan Willemsen	{
1765*1c12ee1eSDan Willemsen		desc: "invalid varint in repeated group field",
1766*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1767*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1768*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1769*1c12ee1eSDan Willemsen		},
1770*1c12ee1eSDan Willemsen		wire: protopack.Message{
1771*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
1772*1c12ee1eSDan Willemsen			protopack.Tag{1001, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1773*1c12ee1eSDan Willemsen				protopack.Raw{0xff},
1774*1c12ee1eSDan Willemsen			}),
1775*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.EndGroupType},
1776*1c12ee1eSDan Willemsen		}.Marshal(),
1777*1c12ee1eSDan Willemsen	},
1778*1c12ee1eSDan Willemsen	{
1779*1c12ee1eSDan Willemsen		desc: "unterminated repeated group field",
1780*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1781*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1782*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1783*1c12ee1eSDan Willemsen		},
1784*1c12ee1eSDan Willemsen		wire: protopack.Message{
1785*1c12ee1eSDan Willemsen			protopack.Tag{46, protopack.StartGroupType},
1786*1c12ee1eSDan Willemsen		}.Marshal(),
1787*1c12ee1eSDan Willemsen	},
1788*1c12ee1eSDan Willemsen	{
1789*1c12ee1eSDan Willemsen		desc: "invalid tag varint in map item",
1790*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1791*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1792*1c12ee1eSDan Willemsen		},
1793*1c12ee1eSDan Willemsen		wire: protopack.Message{
1794*1c12ee1eSDan Willemsen			protopack.Tag{56, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1795*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(0),
1796*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(0),
1797*1c12ee1eSDan Willemsen				protopack.Raw{0xff},
1798*1c12ee1eSDan Willemsen			}),
1799*1c12ee1eSDan Willemsen		}.Marshal(),
1800*1c12ee1eSDan Willemsen	},
1801*1c12ee1eSDan Willemsen	{
1802*1c12ee1eSDan Willemsen		desc: "invalid tag varint in map message value",
1803*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1804*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1805*1c12ee1eSDan Willemsen		},
1806*1c12ee1eSDan Willemsen		wire: protopack.Message{
1807*1c12ee1eSDan Willemsen			protopack.Tag{71, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1808*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(0),
1809*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
1810*1c12ee1eSDan Willemsen					protopack.Raw{0xff},
1811*1c12ee1eSDan Willemsen				}),
1812*1c12ee1eSDan Willemsen			}),
1813*1c12ee1eSDan Willemsen		}.Marshal(),
1814*1c12ee1eSDan Willemsen	},
1815*1c12ee1eSDan Willemsen	{
1816*1c12ee1eSDan Willemsen		desc: "invalid packed int32 field",
1817*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1818*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1819*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1820*1c12ee1eSDan Willemsen		},
1821*1c12ee1eSDan Willemsen		wire: protopack.Message{
1822*1c12ee1eSDan Willemsen			protopack.Tag{31, protopack.BytesType}, protopack.Bytes{0xff},
1823*1c12ee1eSDan Willemsen		}.Marshal(),
1824*1c12ee1eSDan Willemsen	},
1825*1c12ee1eSDan Willemsen	{
1826*1c12ee1eSDan Willemsen		desc: "invalid packed int64 field",
1827*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1828*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1829*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1830*1c12ee1eSDan Willemsen		},
1831*1c12ee1eSDan Willemsen		wire: protopack.Message{
1832*1c12ee1eSDan Willemsen			protopack.Tag{32, protopack.BytesType}, protopack.Bytes{0xff},
1833*1c12ee1eSDan Willemsen		}.Marshal(),
1834*1c12ee1eSDan Willemsen	},
1835*1c12ee1eSDan Willemsen	{
1836*1c12ee1eSDan Willemsen		desc: "invalid packed uint32 field",
1837*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1838*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1839*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1840*1c12ee1eSDan Willemsen		},
1841*1c12ee1eSDan Willemsen		wire: protopack.Message{
1842*1c12ee1eSDan Willemsen			protopack.Tag{33, protopack.BytesType}, protopack.Bytes{0xff},
1843*1c12ee1eSDan Willemsen		}.Marshal(),
1844*1c12ee1eSDan Willemsen	},
1845*1c12ee1eSDan Willemsen	{
1846*1c12ee1eSDan Willemsen		desc: "invalid packed uint64 field",
1847*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1848*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1849*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1850*1c12ee1eSDan Willemsen		},
1851*1c12ee1eSDan Willemsen		wire: protopack.Message{
1852*1c12ee1eSDan Willemsen			protopack.Tag{34, protopack.BytesType}, protopack.Bytes{0xff},
1853*1c12ee1eSDan Willemsen		}.Marshal(),
1854*1c12ee1eSDan Willemsen	},
1855*1c12ee1eSDan Willemsen	{
1856*1c12ee1eSDan Willemsen		desc: "invalid packed sint32 field",
1857*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1858*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1859*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1860*1c12ee1eSDan Willemsen		},
1861*1c12ee1eSDan Willemsen		wire: protopack.Message{
1862*1c12ee1eSDan Willemsen			protopack.Tag{35, protopack.BytesType}, protopack.Bytes{0xff},
1863*1c12ee1eSDan Willemsen		}.Marshal(),
1864*1c12ee1eSDan Willemsen	},
1865*1c12ee1eSDan Willemsen	{
1866*1c12ee1eSDan Willemsen		desc: "invalid packed sint64 field",
1867*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1868*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1869*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1870*1c12ee1eSDan Willemsen		},
1871*1c12ee1eSDan Willemsen		wire: protopack.Message{
1872*1c12ee1eSDan Willemsen			protopack.Tag{36, protopack.BytesType}, protopack.Bytes{0xff},
1873*1c12ee1eSDan Willemsen		}.Marshal(),
1874*1c12ee1eSDan Willemsen	},
1875*1c12ee1eSDan Willemsen	{
1876*1c12ee1eSDan Willemsen		desc: "invalid packed fixed32 field",
1877*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1878*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1879*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1880*1c12ee1eSDan Willemsen		},
1881*1c12ee1eSDan Willemsen		wire: protopack.Message{
1882*1c12ee1eSDan Willemsen			protopack.Tag{37, protopack.BytesType}, protopack.Bytes{0x00},
1883*1c12ee1eSDan Willemsen		}.Marshal(),
1884*1c12ee1eSDan Willemsen	},
1885*1c12ee1eSDan Willemsen	{
1886*1c12ee1eSDan Willemsen		desc: "invalid packed fixed64 field",
1887*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1888*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1889*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1890*1c12ee1eSDan Willemsen		},
1891*1c12ee1eSDan Willemsen		wire: protopack.Message{
1892*1c12ee1eSDan Willemsen			protopack.Tag{38, protopack.BytesType}, protopack.Bytes{0x00},
1893*1c12ee1eSDan Willemsen		}.Marshal(),
1894*1c12ee1eSDan Willemsen	},
1895*1c12ee1eSDan Willemsen	{
1896*1c12ee1eSDan Willemsen		desc: "invalid packed sfixed32 field",
1897*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1898*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1899*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1900*1c12ee1eSDan Willemsen		},
1901*1c12ee1eSDan Willemsen		wire: protopack.Message{
1902*1c12ee1eSDan Willemsen			protopack.Tag{39, protopack.BytesType}, protopack.Bytes{0x00},
1903*1c12ee1eSDan Willemsen		}.Marshal(),
1904*1c12ee1eSDan Willemsen	},
1905*1c12ee1eSDan Willemsen	{
1906*1c12ee1eSDan Willemsen		desc: "invalid packed sfixed64 field",
1907*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1908*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1909*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1910*1c12ee1eSDan Willemsen		},
1911*1c12ee1eSDan Willemsen		wire: protopack.Message{
1912*1c12ee1eSDan Willemsen			protopack.Tag{40, protopack.BytesType}, protopack.Bytes{0x00},
1913*1c12ee1eSDan Willemsen		}.Marshal(),
1914*1c12ee1eSDan Willemsen	},
1915*1c12ee1eSDan Willemsen	{
1916*1c12ee1eSDan Willemsen		desc: "invalid packed float field",
1917*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1918*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1919*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1920*1c12ee1eSDan Willemsen		},
1921*1c12ee1eSDan Willemsen		wire: protopack.Message{
1922*1c12ee1eSDan Willemsen			protopack.Tag{41, protopack.BytesType}, protopack.Bytes{0x00},
1923*1c12ee1eSDan Willemsen		}.Marshal(),
1924*1c12ee1eSDan Willemsen	},
1925*1c12ee1eSDan Willemsen	{
1926*1c12ee1eSDan Willemsen		desc: "invalid packed double field",
1927*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1928*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1929*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1930*1c12ee1eSDan Willemsen		},
1931*1c12ee1eSDan Willemsen		wire: protopack.Message{
1932*1c12ee1eSDan Willemsen			protopack.Tag{42, protopack.BytesType}, protopack.Bytes{0x00},
1933*1c12ee1eSDan Willemsen		}.Marshal(),
1934*1c12ee1eSDan Willemsen	},
1935*1c12ee1eSDan Willemsen	{
1936*1c12ee1eSDan Willemsen		desc: "invalid packed bool field",
1937*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1938*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1939*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1940*1c12ee1eSDan Willemsen		},
1941*1c12ee1eSDan Willemsen		wire: protopack.Message{
1942*1c12ee1eSDan Willemsen			protopack.Tag{43, protopack.BytesType}, protopack.Bytes{0xff},
1943*1c12ee1eSDan Willemsen		}.Marshal(),
1944*1c12ee1eSDan Willemsen	},
1945*1c12ee1eSDan Willemsen	{
1946*1c12ee1eSDan Willemsen		desc: "bytes field overruns message",
1947*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1948*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1949*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1950*1c12ee1eSDan Willemsen		},
1951*1c12ee1eSDan Willemsen		wire: protopack.Message{
1952*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix{protopack.Message{
1953*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix{protopack.Message{
1954*1c12ee1eSDan Willemsen					protopack.Tag{15, protopack.BytesType}, protopack.Varint(2),
1955*1c12ee1eSDan Willemsen				}},
1956*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(0),
1957*1c12ee1eSDan Willemsen			}},
1958*1c12ee1eSDan Willemsen		}.Marshal(),
1959*1c12ee1eSDan Willemsen	},
1960*1c12ee1eSDan Willemsen	{
1961*1c12ee1eSDan Willemsen		desc: "varint field overruns message",
1962*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1963*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1964*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1965*1c12ee1eSDan Willemsen		},
1966*1c12ee1eSDan Willemsen		wire: protopack.Message{
1967*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType},
1968*1c12ee1eSDan Willemsen		}.Marshal(),
1969*1c12ee1eSDan Willemsen	},
1970*1c12ee1eSDan Willemsen	{
1971*1c12ee1eSDan Willemsen		desc: "bytes field lacks size",
1972*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1973*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1974*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1975*1c12ee1eSDan Willemsen		},
1976*1c12ee1eSDan Willemsen		wire: protopack.Message{
1977*1c12ee1eSDan Willemsen			protopack.Tag{18, protopack.BytesType},
1978*1c12ee1eSDan Willemsen		}.Marshal(),
1979*1c12ee1eSDan Willemsen	},
1980*1c12ee1eSDan Willemsen	{
1981*1c12ee1eSDan Willemsen		desc: "varint overflow",
1982*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1983*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1984*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1985*1c12ee1eSDan Willemsen		},
1986*1c12ee1eSDan Willemsen		wire: protopack.Message{
1987*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType},
1988*1c12ee1eSDan Willemsen			protopack.Raw("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02"),
1989*1c12ee1eSDan Willemsen		}.Marshal(),
1990*1c12ee1eSDan Willemsen	},
1991*1c12ee1eSDan Willemsen	{
1992*1c12ee1eSDan Willemsen		desc: "varint length overrun",
1993*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
1994*1c12ee1eSDan Willemsen			(*testpb.TestAllTypes)(nil),
1995*1c12ee1eSDan Willemsen			(*testpb.TestAllExtensions)(nil),
1996*1c12ee1eSDan Willemsen		},
1997*1c12ee1eSDan Willemsen		wire: protopack.Message{
1998*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.VarintType},
1999*1c12ee1eSDan Willemsen			protopack.Raw("\xff\xff\xff\xff\xff\xff\xff\xff\xff"),
2000*1c12ee1eSDan Willemsen		}.Marshal(),
2001*1c12ee1eSDan Willemsen	},
2002*1c12ee1eSDan Willemsen}
2003*1c12ee1eSDan Willemsen
2004*1c12ee1eSDan Willemsentype filterResolver struct {
2005*1c12ee1eSDan Willemsen	filter   func(name protoreflect.FullName) bool
2006*1c12ee1eSDan Willemsen	resolver protoregistry.ExtensionTypeResolver
2007*1c12ee1eSDan Willemsen}
2008*1c12ee1eSDan Willemsen
2009*1c12ee1eSDan Willemsenfunc (f filterResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
2010*1c12ee1eSDan Willemsen	if !f.filter(field) {
2011*1c12ee1eSDan Willemsen		return nil, protoregistry.NotFound
2012*1c12ee1eSDan Willemsen	}
2013*1c12ee1eSDan Willemsen	return f.resolver.FindExtensionByName(field)
2014*1c12ee1eSDan Willemsen}
2015*1c12ee1eSDan Willemsen
2016*1c12ee1eSDan Willemsenfunc (f filterResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
2017*1c12ee1eSDan Willemsen	xt, err := f.resolver.FindExtensionByNumber(message, field)
2018*1c12ee1eSDan Willemsen	if err != nil {
2019*1c12ee1eSDan Willemsen		return nil, err
2020*1c12ee1eSDan Willemsen	}
2021*1c12ee1eSDan Willemsen	if !f.filter(xt.TypeDescriptor().FullName()) {
2022*1c12ee1eSDan Willemsen		return nil, protoregistry.NotFound
2023*1c12ee1eSDan Willemsen	}
2024*1c12ee1eSDan Willemsen	return xt, nil
2025*1c12ee1eSDan Willemsen}
2026