xref: /aosp_15_r20/external/golang-protobuf/encoding/prototext/decode_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2018 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsenpackage prototext_test
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"math"
9*1c12ee1eSDan Willemsen	"strings"
10*1c12ee1eSDan Willemsen	"testing"
11*1c12ee1eSDan Willemsen
12*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
13*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/flags"
14*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
15*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoregistry"
16*1c12ee1eSDan Willemsen
17*1c12ee1eSDan Willemsen	testpb "google.golang.org/protobuf/internal/testprotos/test"
18*1c12ee1eSDan Willemsen	weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
19*1c12ee1eSDan Willemsen	pb2 "google.golang.org/protobuf/internal/testprotos/textpb2"
20*1c12ee1eSDan Willemsen	pb3 "google.golang.org/protobuf/internal/testprotos/textpb3"
21*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/types/known/anypb"
22*1c12ee1eSDan Willemsen)
23*1c12ee1eSDan Willemsen
24*1c12ee1eSDan Willemsenfunc TestUnmarshal(t *testing.T) {
25*1c12ee1eSDan Willemsen	tests := []struct {
26*1c12ee1eSDan Willemsen		desc         string
27*1c12ee1eSDan Willemsen		umo          prototext.UnmarshalOptions
28*1c12ee1eSDan Willemsen		inputMessage proto.Message
29*1c12ee1eSDan Willemsen		inputText    string
30*1c12ee1eSDan Willemsen		wantMessage  proto.Message
31*1c12ee1eSDan Willemsen		wantErr      string // Expected error substring.
32*1c12ee1eSDan Willemsen		skip         bool
33*1c12ee1eSDan Willemsen	}{{
34*1c12ee1eSDan Willemsen		desc:         "proto2 empty message",
35*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
36*1c12ee1eSDan Willemsen		wantMessage:  &pb2.Scalars{},
37*1c12ee1eSDan Willemsen	}, {
38*1c12ee1eSDan Willemsen		desc:         "proto2 optional scalars set to zero values",
39*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
40*1c12ee1eSDan Willemsen		inputText: `opt_bool: false
41*1c12ee1eSDan Willemsenopt_int32: 0
42*1c12ee1eSDan Willemsenopt_int64: 0
43*1c12ee1eSDan Willemsenopt_uint32: 0
44*1c12ee1eSDan Willemsenopt_uint64: 0
45*1c12ee1eSDan Willemsenopt_sint32: 0
46*1c12ee1eSDan Willemsenopt_sint64: 0
47*1c12ee1eSDan Willemsenopt_fixed32: 0
48*1c12ee1eSDan Willemsenopt_fixed64: 0
49*1c12ee1eSDan Willemsenopt_sfixed32: 0
50*1c12ee1eSDan Willemsenopt_sfixed64: 0
51*1c12ee1eSDan Willemsenopt_float: 0
52*1c12ee1eSDan Willemsenopt_double: 0
53*1c12ee1eSDan Willemsenopt_bytes: ""
54*1c12ee1eSDan Willemsenopt_string: ""
55*1c12ee1eSDan Willemsen`,
56*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
57*1c12ee1eSDan Willemsen			OptBool:     proto.Bool(false),
58*1c12ee1eSDan Willemsen			OptInt32:    proto.Int32(0),
59*1c12ee1eSDan Willemsen			OptInt64:    proto.Int64(0),
60*1c12ee1eSDan Willemsen			OptUint32:   proto.Uint32(0),
61*1c12ee1eSDan Willemsen			OptUint64:   proto.Uint64(0),
62*1c12ee1eSDan Willemsen			OptSint32:   proto.Int32(0),
63*1c12ee1eSDan Willemsen			OptSint64:   proto.Int64(0),
64*1c12ee1eSDan Willemsen			OptFixed32:  proto.Uint32(0),
65*1c12ee1eSDan Willemsen			OptFixed64:  proto.Uint64(0),
66*1c12ee1eSDan Willemsen			OptSfixed32: proto.Int32(0),
67*1c12ee1eSDan Willemsen			OptSfixed64: proto.Int64(0),
68*1c12ee1eSDan Willemsen			OptFloat:    proto.Float32(0),
69*1c12ee1eSDan Willemsen			OptDouble:   proto.Float64(0),
70*1c12ee1eSDan Willemsen			OptBytes:    []byte{},
71*1c12ee1eSDan Willemsen			OptString:   proto.String(""),
72*1c12ee1eSDan Willemsen		},
73*1c12ee1eSDan Willemsen	}, {
74*1c12ee1eSDan Willemsen		desc:         "proto3 scalars set to zero values",
75*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
76*1c12ee1eSDan Willemsen		inputText: `s_bool: false
77*1c12ee1eSDan Willemsens_int32: 0
78*1c12ee1eSDan Willemsens_int64: 0
79*1c12ee1eSDan Willemsens_uint32: 0
80*1c12ee1eSDan Willemsens_uint64: 0
81*1c12ee1eSDan Willemsens_sint32: 0
82*1c12ee1eSDan Willemsens_sint64: 0
83*1c12ee1eSDan Willemsens_fixed32: 0
84*1c12ee1eSDan Willemsens_fixed64: 0
85*1c12ee1eSDan Willemsens_sfixed32: 0
86*1c12ee1eSDan Willemsens_sfixed64: 0
87*1c12ee1eSDan Willemsens_float: 0
88*1c12ee1eSDan Willemsens_double: 0
89*1c12ee1eSDan Willemsens_bytes: ""
90*1c12ee1eSDan Willemsens_string: ""
91*1c12ee1eSDan Willemsen`,
92*1c12ee1eSDan Willemsen		wantMessage: &pb3.Scalars{},
93*1c12ee1eSDan Willemsen	}, {
94*1c12ee1eSDan Willemsen		desc:         "proto3 optional set to zero values",
95*1c12ee1eSDan Willemsen		inputMessage: &pb3.Proto3Optional{},
96*1c12ee1eSDan Willemsen		inputText: `opt_bool: false
97*1c12ee1eSDan Willemsenopt_int32: 0
98*1c12ee1eSDan Willemsenopt_int64: 0
99*1c12ee1eSDan Willemsenopt_uint32: 0
100*1c12ee1eSDan Willemsenopt_uint64: 0
101*1c12ee1eSDan Willemsenopt_float: 0
102*1c12ee1eSDan Willemsenopt_double: 0
103*1c12ee1eSDan Willemsenopt_string: ""
104*1c12ee1eSDan Willemsenopt_bytes: ""
105*1c12ee1eSDan Willemsenopt_enum: ZERO
106*1c12ee1eSDan Willemsenopt_message: {}
107*1c12ee1eSDan Willemsen`,
108*1c12ee1eSDan Willemsen		wantMessage: &pb3.Proto3Optional{
109*1c12ee1eSDan Willemsen			OptBool:    proto.Bool(false),
110*1c12ee1eSDan Willemsen			OptInt32:   proto.Int32(0),
111*1c12ee1eSDan Willemsen			OptInt64:   proto.Int64(0),
112*1c12ee1eSDan Willemsen			OptUint32:  proto.Uint32(0),
113*1c12ee1eSDan Willemsen			OptUint64:  proto.Uint64(0),
114*1c12ee1eSDan Willemsen			OptFloat:   proto.Float32(0),
115*1c12ee1eSDan Willemsen			OptDouble:  proto.Float64(0),
116*1c12ee1eSDan Willemsen			OptString:  proto.String(""),
117*1c12ee1eSDan Willemsen			OptBytes:   []byte{},
118*1c12ee1eSDan Willemsen			OptEnum:    pb3.Enum_ZERO.Enum(),
119*1c12ee1eSDan Willemsen			OptMessage: &pb3.Nested{},
120*1c12ee1eSDan Willemsen		},
121*1c12ee1eSDan Willemsen	}, {
122*1c12ee1eSDan Willemsen		desc:         "proto2 optional scalars",
123*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
124*1c12ee1eSDan Willemsen		inputText: `opt_bool: true
125*1c12ee1eSDan Willemsenopt_int32: 255
126*1c12ee1eSDan Willemsenopt_int64: 3735928559
127*1c12ee1eSDan Willemsenopt_uint32: 0xff
128*1c12ee1eSDan Willemsenopt_uint64: 0xdeadbeef
129*1c12ee1eSDan Willemsenopt_sint32: -1001
130*1c12ee1eSDan Willemsenopt_sint64: -   0xffff
131*1c12ee1eSDan Willemsenopt_fixed64: 64
132*1c12ee1eSDan Willemsenopt_sfixed32: -		32
133*1c12ee1eSDan Willemsenopt_float: 1.234
134*1c12ee1eSDan Willemsenopt_double: 1.23e+100
135*1c12ee1eSDan Willemsenopt_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
136*1c12ee1eSDan Willemsenopt_string: "谷歌"
137*1c12ee1eSDan Willemsen`,
138*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
139*1c12ee1eSDan Willemsen			OptBool:     proto.Bool(true),
140*1c12ee1eSDan Willemsen			OptInt32:    proto.Int32(0xff),
141*1c12ee1eSDan Willemsen			OptInt64:    proto.Int64(0xdeadbeef),
142*1c12ee1eSDan Willemsen			OptUint32:   proto.Uint32(0xff),
143*1c12ee1eSDan Willemsen			OptUint64:   proto.Uint64(0xdeadbeef),
144*1c12ee1eSDan Willemsen			OptSint32:   proto.Int32(-1001),
145*1c12ee1eSDan Willemsen			OptSint64:   proto.Int64(-0xffff),
146*1c12ee1eSDan Willemsen			OptFixed64:  proto.Uint64(64),
147*1c12ee1eSDan Willemsen			OptSfixed32: proto.Int32(-32),
148*1c12ee1eSDan Willemsen			OptFloat:    proto.Float32(1.234),
149*1c12ee1eSDan Willemsen			OptDouble:   proto.Float64(1.23e100),
150*1c12ee1eSDan Willemsen			OptBytes:    []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
151*1c12ee1eSDan Willemsen			OptString:   proto.String("谷歌"),
152*1c12ee1eSDan Willemsen		},
153*1c12ee1eSDan Willemsen	}, {
154*1c12ee1eSDan Willemsen		desc:         "case sensitive",
155*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
156*1c12ee1eSDan Willemsen		inputText:    `S_BOOL: true`,
157*1c12ee1eSDan Willemsen		wantErr:      "unknown field: S_BOOL",
158*1c12ee1eSDan Willemsen	}, {
159*1c12ee1eSDan Willemsen		desc:         "proto3 scalars",
160*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
161*1c12ee1eSDan Willemsen		inputText: `s_bool: true
162*1c12ee1eSDan Willemsens_int32: 255
163*1c12ee1eSDan Willemsens_int64: 3735928559
164*1c12ee1eSDan Willemsens_uint32: 0xff
165*1c12ee1eSDan Willemsens_uint64: 0xdeadbeef
166*1c12ee1eSDan Willemsens_sint32: -1001
167*1c12ee1eSDan Willemsens_sint64: -  #
168*1c12ee1eSDan Willemsen             0xffff
169*1c12ee1eSDan Willemsens_fixed64: 64
170*1c12ee1eSDan Willemsens_sfixed32: -32
171*1c12ee1eSDan Willemsens_float: 1.234
172*1c12ee1eSDan Willemsens_double: 1.23e+100
173*1c12ee1eSDan Willemsens_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
174*1c12ee1eSDan Willemsens_string: "谷歌"
175*1c12ee1eSDan Willemsen`,
176*1c12ee1eSDan Willemsen		wantMessage: &pb3.Scalars{
177*1c12ee1eSDan Willemsen			SBool:     true,
178*1c12ee1eSDan Willemsen			SInt32:    0xff,
179*1c12ee1eSDan Willemsen			SInt64:    0xdeadbeef,
180*1c12ee1eSDan Willemsen			SUint32:   0xff,
181*1c12ee1eSDan Willemsen			SUint64:   0xdeadbeef,
182*1c12ee1eSDan Willemsen			SSint32:   -1001,
183*1c12ee1eSDan Willemsen			SSint64:   -0xffff,
184*1c12ee1eSDan Willemsen			SFixed64:  64,
185*1c12ee1eSDan Willemsen			SSfixed32: -32,
186*1c12ee1eSDan Willemsen			SFloat:    1.234,
187*1c12ee1eSDan Willemsen			SDouble:   1.23e100,
188*1c12ee1eSDan Willemsen			SBytes:    []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
189*1c12ee1eSDan Willemsen			SString:   "谷歌",
190*1c12ee1eSDan Willemsen		},
191*1c12ee1eSDan Willemsen	}, {
192*1c12ee1eSDan Willemsen		desc:         "proto2 string with invalid UTF-8",
193*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
194*1c12ee1eSDan Willemsen		inputText:    `opt_string: "abc\xff"`,
195*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
196*1c12ee1eSDan Willemsen			OptString: proto.String("abc\xff"),
197*1c12ee1eSDan Willemsen		},
198*1c12ee1eSDan Willemsen	}, {
199*1c12ee1eSDan Willemsen		desc:         "proto3 string with invalid UTF-8",
200*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
201*1c12ee1eSDan Willemsen		inputText:    `s_string: "abc\xff"`,
202*1c12ee1eSDan Willemsen		wantErr:      "(line 1:11): contains invalid UTF-8",
203*1c12ee1eSDan Willemsen	}, {
204*1c12ee1eSDan Willemsen		desc:         "proto2 message contains unknown field",
205*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
206*1c12ee1eSDan Willemsen		inputText:    "unknown_field: 123",
207*1c12ee1eSDan Willemsen		wantErr:      "unknown field",
208*1c12ee1eSDan Willemsen	}, {
209*1c12ee1eSDan Willemsen		desc:         "proto3 message contains unknown field",
210*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
211*1c12ee1eSDan Willemsen		inputText:    "unknown_field: 456",
212*1c12ee1eSDan Willemsen		wantErr:      "unknown field",
213*1c12ee1eSDan Willemsen	}, {
214*1c12ee1eSDan Willemsen		desc:         "proto2 message contains discarded unknown field",
215*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
216*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
217*1c12ee1eSDan Willemsen		inputText:    `unknown_field:123 1000:"hello"`,
218*1c12ee1eSDan Willemsen	}, {
219*1c12ee1eSDan Willemsen		desc:         "proto3 message contains discarded unknown field",
220*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
221*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
222*1c12ee1eSDan Willemsen		inputText:    `unknown_field:456 1000:"goodbye"`,
223*1c12ee1eSDan Willemsen	}, {
224*1c12ee1eSDan Willemsen		desc:         "proto2 message cannot parse field number",
225*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
226*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
227*1c12ee1eSDan Willemsen		inputText:    `13:"hello"`,
228*1c12ee1eSDan Willemsen		wantErr:      "cannot specify field by number",
229*1c12ee1eSDan Willemsen	}, {
230*1c12ee1eSDan Willemsen		desc:         "unknown list field",
231*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
232*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
233*1c12ee1eSDan Willemsen		inputText:    `unknown_field: { strings: [ "" ] }`,
234*1c12ee1eSDan Willemsen	}, {
235*1c12ee1eSDan Willemsen		desc:         "unknown list of list field",
236*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
237*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
238*1c12ee1eSDan Willemsen		inputText:    `unknown_field: { strings: [ [ ] ] }`,
239*1c12ee1eSDan Willemsen		wantErr:      `(line 1:29): invalid scalar value: [`,
240*1c12ee1eSDan Willemsen	}, {
241*1c12ee1eSDan Willemsen		desc:         "proto3 message cannot parse field number",
242*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{DiscardUnknown: true},
243*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
244*1c12ee1eSDan Willemsen		inputText:    `13:"goodbye"`,
245*1c12ee1eSDan Willemsen		wantErr:      "cannot specify field by number",
246*1c12ee1eSDan Willemsen	}, {
247*1c12ee1eSDan Willemsen		desc:         "proto2 numeric key field",
248*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
249*1c12ee1eSDan Willemsen		inputText:    "1: true",
250*1c12ee1eSDan Willemsen		wantErr:      "cannot specify field by number",
251*1c12ee1eSDan Willemsen	}, {
252*1c12ee1eSDan Willemsen		desc:         "proto3 numeric key field",
253*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
254*1c12ee1eSDan Willemsen		inputText:    "1: true",
255*1c12ee1eSDan Willemsen		wantErr:      "cannot specify field by number",
256*1c12ee1eSDan Willemsen	}, {
257*1c12ee1eSDan Willemsen		desc:         "invalid bool value",
258*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
259*1c12ee1eSDan Willemsen		inputText:    "s_bool: 123",
260*1c12ee1eSDan Willemsen		wantErr:      "invalid value for bool",
261*1c12ee1eSDan Willemsen	}, {
262*1c12ee1eSDan Willemsen		desc:         "invalid int32 value",
263*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
264*1c12ee1eSDan Willemsen		inputText:    "s_int32: not_a_num",
265*1c12ee1eSDan Willemsen		wantErr:      "invalid value for int32",
266*1c12ee1eSDan Willemsen	}, {
267*1c12ee1eSDan Willemsen		desc:         "invalid int64 value",
268*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
269*1c12ee1eSDan Willemsen		inputText:    "s_int64: 'not a num either'",
270*1c12ee1eSDan Willemsen		wantErr:      "invalid value for int64",
271*1c12ee1eSDan Willemsen	}, {
272*1c12ee1eSDan Willemsen		desc:         "invalid uint32 value",
273*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
274*1c12ee1eSDan Willemsen		inputText:    "s_fixed32: -42",
275*1c12ee1eSDan Willemsen		wantErr:      "invalid value for fixed32",
276*1c12ee1eSDan Willemsen	}, {
277*1c12ee1eSDan Willemsen		desc:         "invalid uint64 value",
278*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
279*1c12ee1eSDan Willemsen		inputText:    "s_uint64: -47",
280*1c12ee1eSDan Willemsen		wantErr:      "invalid value for uint64",
281*1c12ee1eSDan Willemsen	}, {
282*1c12ee1eSDan Willemsen		desc:         "invalid sint32 value",
283*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
284*1c12ee1eSDan Willemsen		inputText:    "s_sint32: '42'",
285*1c12ee1eSDan Willemsen		wantErr:      "invalid value for sint32",
286*1c12ee1eSDan Willemsen	}, {
287*1c12ee1eSDan Willemsen		desc:         "invalid sint64 value",
288*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
289*1c12ee1eSDan Willemsen		inputText:    "s_sint64: '-47'",
290*1c12ee1eSDan Willemsen		wantErr:      "invalid value for sint64",
291*1c12ee1eSDan Willemsen	}, {
292*1c12ee1eSDan Willemsen		desc:         "invalid fixed32 value",
293*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
294*1c12ee1eSDan Willemsen		inputText:    "s_fixed32: -42",
295*1c12ee1eSDan Willemsen		wantErr:      "invalid value for fixed32",
296*1c12ee1eSDan Willemsen	}, {
297*1c12ee1eSDan Willemsen		desc:         "invalid fixed64 value",
298*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
299*1c12ee1eSDan Willemsen		inputText:    "s_fixed64: -42",
300*1c12ee1eSDan Willemsen		wantErr:      "invalid value for fixed64",
301*1c12ee1eSDan Willemsen	}, {
302*1c12ee1eSDan Willemsen		desc:         "invalid sfixed32 value",
303*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
304*1c12ee1eSDan Willemsen		inputText:    "s_sfixed32: 'not valid'",
305*1c12ee1eSDan Willemsen		wantErr:      "invalid value for sfixed32",
306*1c12ee1eSDan Willemsen	}, {
307*1c12ee1eSDan Willemsen		desc:         "invalid sfixed64 value",
308*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
309*1c12ee1eSDan Willemsen		inputText:    "s_sfixed64: bad",
310*1c12ee1eSDan Willemsen		wantErr:      "invalid value for sfixed64",
311*1c12ee1eSDan Willemsen	}, {
312*1c12ee1eSDan Willemsen		desc:         "incomplete number value",
313*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
314*1c12ee1eSDan Willemsen		inputText:    `s_int32: - `,
315*1c12ee1eSDan Willemsen		wantErr:      "(line 1:10): invalid scalar value: -",
316*1c12ee1eSDan Willemsen	}, {
317*1c12ee1eSDan Willemsen		desc:         "conformance: FloatFieldMaxValue",
318*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
319*1c12ee1eSDan Willemsen		inputText:    `opt_float: 3.4028235e+38`,
320*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
321*1c12ee1eSDan Willemsen			OptFloat: proto.Float32(3.40282347e+38),
322*1c12ee1eSDan Willemsen		},
323*1c12ee1eSDan Willemsen	}, {
324*1c12ee1eSDan Willemsen		desc:         "conformance: FloatFieldLargerThanUint64",
325*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
326*1c12ee1eSDan Willemsen		inputText:    `opt_float: 18446744073709551616`,
327*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
328*1c12ee1eSDan Willemsen			OptFloat: proto.Float32(1.84467441e+19),
329*1c12ee1eSDan Willemsen		},
330*1c12ee1eSDan Willemsen	}, {
331*1c12ee1eSDan Willemsen		desc:         "conformance: FloatFieldTooLarge",
332*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
333*1c12ee1eSDan Willemsen		inputText:    `opt_float: 3.4028235e+39`,
334*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
335*1c12ee1eSDan Willemsen			OptFloat: proto.Float32(float32(math.Inf(1))),
336*1c12ee1eSDan Willemsen		},
337*1c12ee1eSDan Willemsen	}, {
338*1c12ee1eSDan Willemsen		desc:         "invalid string value",
339*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
340*1c12ee1eSDan Willemsen		inputText:    "s_string: invalid_string",
341*1c12ee1eSDan Willemsen		wantErr:      "invalid value for string type",
342*1c12ee1eSDan Willemsen	}, {
343*1c12ee1eSDan Willemsen		desc:         "proto2 bytes set to empty string",
344*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
345*1c12ee1eSDan Willemsen		inputText:    "opt_bytes: ''",
346*1c12ee1eSDan Willemsen		wantMessage: &pb2.Scalars{
347*1c12ee1eSDan Willemsen			OptBytes: []byte(""),
348*1c12ee1eSDan Willemsen		},
349*1c12ee1eSDan Willemsen	}, {
350*1c12ee1eSDan Willemsen		desc:         "proto3 bytes set to empty string",
351*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
352*1c12ee1eSDan Willemsen		inputText:    "s_bytes: ''",
353*1c12ee1eSDan Willemsen		wantMessage:  &pb3.Scalars{},
354*1c12ee1eSDan Willemsen	}, {
355*1c12ee1eSDan Willemsen		desc:         "proto2 duplicate singular field",
356*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
357*1c12ee1eSDan Willemsen		inputText: `
358*1c12ee1eSDan Willemsenopt_bool: true
359*1c12ee1eSDan Willemsenopt_bool: false
360*1c12ee1eSDan Willemsen`,
361*1c12ee1eSDan Willemsen		wantErr: `(line 3:1): non-repeated field "opt_bool" is repeated`,
362*1c12ee1eSDan Willemsen	}, {
363*1c12ee1eSDan Willemsen		desc:         "proto2 more duplicate singular field",
364*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
365*1c12ee1eSDan Willemsen		inputText: `
366*1c12ee1eSDan Willemsenopt_bool: true
367*1c12ee1eSDan Willemsenopt_string: "hello"
368*1c12ee1eSDan Willemsenopt_bool: false
369*1c12ee1eSDan Willemsen`,
370*1c12ee1eSDan Willemsen		wantErr: `(line 4:1): non-repeated field "opt_bool" is repeated`,
371*1c12ee1eSDan Willemsen	}, {
372*1c12ee1eSDan Willemsen		desc:         "proto2 invalid singular field",
373*1c12ee1eSDan Willemsen		inputMessage: &pb2.Scalars{},
374*1c12ee1eSDan Willemsen		inputText: `
375*1c12ee1eSDan Willemsenopt_bool: [true, false]
376*1c12ee1eSDan Willemsen`,
377*1c12ee1eSDan Willemsen		wantErr: "(line 2:11): unexpected token: [",
378*1c12ee1eSDan Willemsen	}, {
379*1c12ee1eSDan Willemsen		desc:         "proto3 duplicate singular field",
380*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
381*1c12ee1eSDan Willemsen		inputText: `
382*1c12ee1eSDan Willemsens_bool: false
383*1c12ee1eSDan Willemsens_bool: true
384*1c12ee1eSDan Willemsen`,
385*1c12ee1eSDan Willemsen		wantErr: `non-repeated field "s_bool" is repeated`,
386*1c12ee1eSDan Willemsen	}, {
387*1c12ee1eSDan Willemsen		desc:         "proto3 more duplicate singular field",
388*1c12ee1eSDan Willemsen		inputMessage: &pb3.Scalars{},
389*1c12ee1eSDan Willemsen		inputText: `
390*1c12ee1eSDan Willemsens_bool: false
391*1c12ee1eSDan Willemsens_string: ""
392*1c12ee1eSDan Willemsens_bool: true
393*1c12ee1eSDan Willemsen`,
394*1c12ee1eSDan Willemsen		wantErr: `non-repeated field "s_bool" is repeated`,
395*1c12ee1eSDan Willemsen	}, {
396*1c12ee1eSDan Willemsen		desc:         "proto2 enum",
397*1c12ee1eSDan Willemsen		inputMessage: &pb2.Enums{},
398*1c12ee1eSDan Willemsen		inputText: `
399*1c12ee1eSDan Willemsenopt_enum: ONE
400*1c12ee1eSDan Willemsenopt_nested_enum: UNO
401*1c12ee1eSDan Willemsen`,
402*1c12ee1eSDan Willemsen		wantMessage: &pb2.Enums{
403*1c12ee1eSDan Willemsen			OptEnum:       pb2.Enum_ONE.Enum(),
404*1c12ee1eSDan Willemsen			OptNestedEnum: pb2.Enums_UNO.Enum(),
405*1c12ee1eSDan Willemsen		},
406*1c12ee1eSDan Willemsen	}, {
407*1c12ee1eSDan Willemsen		desc:         "proto2 enum set to numeric values",
408*1c12ee1eSDan Willemsen		inputMessage: &pb2.Enums{},
409*1c12ee1eSDan Willemsen		inputText: `
410*1c12ee1eSDan Willemsenopt_enum: 2
411*1c12ee1eSDan Willemsenopt_nested_enum: 2
412*1c12ee1eSDan Willemsen`,
413*1c12ee1eSDan Willemsen		wantMessage: &pb2.Enums{
414*1c12ee1eSDan Willemsen			OptEnum:       pb2.Enum_TWO.Enum(),
415*1c12ee1eSDan Willemsen			OptNestedEnum: pb2.Enums_DOS.Enum(),
416*1c12ee1eSDan Willemsen		},
417*1c12ee1eSDan Willemsen	}, {
418*1c12ee1eSDan Willemsen		desc:         "proto2 enum set to unnamed numeric values",
419*1c12ee1eSDan Willemsen		inputMessage: &pb2.Enums{},
420*1c12ee1eSDan Willemsen		inputText: `
421*1c12ee1eSDan Willemsenopt_enum: 101
422*1c12ee1eSDan Willemsenopt_nested_enum: -101
423*1c12ee1eSDan Willemsen`,
424*1c12ee1eSDan Willemsen		wantMessage: &pb2.Enums{
425*1c12ee1eSDan Willemsen			OptEnum:       pb2.Enum(101).Enum(),
426*1c12ee1eSDan Willemsen			OptNestedEnum: pb2.Enums_NestedEnum(-101).Enum(),
427*1c12ee1eSDan Willemsen		},
428*1c12ee1eSDan Willemsen	}, {
429*1c12ee1eSDan Willemsen		desc:         "proto2 enum set to invalid named",
430*1c12ee1eSDan Willemsen		inputMessage: &pb2.Enums{},
431*1c12ee1eSDan Willemsen		inputText: `
432*1c12ee1eSDan Willemsenopt_enum: UNNAMED
433*1c12ee1eSDan Willemsenopt_nested_enum: UNNAMED_TOO
434*1c12ee1eSDan Willemsen`,
435*1c12ee1eSDan Willemsen		wantErr: "invalid value for enum type: UNNAMED",
436*1c12ee1eSDan Willemsen	}, {
437*1c12ee1eSDan Willemsen		desc:         "proto3 enum name value",
438*1c12ee1eSDan Willemsen		inputMessage: &pb3.Enums{},
439*1c12ee1eSDan Willemsen		inputText: `
440*1c12ee1eSDan Willemsens_enum: ONE
441*1c12ee1eSDan Willemsens_nested_enum: DIEZ
442*1c12ee1eSDan Willemsen`,
443*1c12ee1eSDan Willemsen		wantMessage: &pb3.Enums{
444*1c12ee1eSDan Willemsen			SEnum:       pb3.Enum_ONE,
445*1c12ee1eSDan Willemsen			SNestedEnum: pb3.Enums_DIEZ,
446*1c12ee1eSDan Willemsen		},
447*1c12ee1eSDan Willemsen	}, {
448*1c12ee1eSDan Willemsen		desc:         "proto3 enum numeric value",
449*1c12ee1eSDan Willemsen		inputMessage: &pb3.Enums{},
450*1c12ee1eSDan Willemsen		inputText: `
451*1c12ee1eSDan Willemsens_enum: 2
452*1c12ee1eSDan Willemsens_nested_enum: 2
453*1c12ee1eSDan Willemsen`,
454*1c12ee1eSDan Willemsen		wantMessage: &pb3.Enums{
455*1c12ee1eSDan Willemsen			SEnum:       pb3.Enum_TWO,
456*1c12ee1eSDan Willemsen			SNestedEnum: pb3.Enums_DOS,
457*1c12ee1eSDan Willemsen		},
458*1c12ee1eSDan Willemsen	}, {
459*1c12ee1eSDan Willemsen		desc:         "proto3 enum unnamed numeric value",
460*1c12ee1eSDan Willemsen		inputMessage: &pb3.Enums{},
461*1c12ee1eSDan Willemsen		inputText: `
462*1c12ee1eSDan Willemsens_enum: 0x7fffffff
463*1c12ee1eSDan Willemsens_nested_enum: -0x80000000
464*1c12ee1eSDan Willemsen`,
465*1c12ee1eSDan Willemsen		wantMessage: &pb3.Enums{
466*1c12ee1eSDan Willemsen			SEnum:       0x7fffffff,
467*1c12ee1eSDan Willemsen			SNestedEnum: -0x80000000,
468*1c12ee1eSDan Willemsen		},
469*1c12ee1eSDan Willemsen	}, {
470*1c12ee1eSDan Willemsen		desc:         "proto2 nested empty messages",
471*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
472*1c12ee1eSDan Willemsen		inputText: `
473*1c12ee1eSDan Willemsenopt_nested: {}
474*1c12ee1eSDan WillemsenOptGroup: {}
475*1c12ee1eSDan Willemsen`,
476*1c12ee1eSDan Willemsen		wantMessage: &pb2.Nests{
477*1c12ee1eSDan Willemsen			OptNested: &pb2.Nested{},
478*1c12ee1eSDan Willemsen			Optgroup:  &pb2.Nests_OptGroup{},
479*1c12ee1eSDan Willemsen		},
480*1c12ee1eSDan Willemsen	}, {
481*1c12ee1eSDan Willemsen		desc:         "message fields with no field separator",
482*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
483*1c12ee1eSDan Willemsen		inputText: `
484*1c12ee1eSDan Willemsenopt_nested {}
485*1c12ee1eSDan WillemsenOptGroup {}
486*1c12ee1eSDan Willemsen`,
487*1c12ee1eSDan Willemsen		wantMessage: &pb2.Nests{
488*1c12ee1eSDan Willemsen			OptNested: &pb2.Nested{},
489*1c12ee1eSDan Willemsen			Optgroup:  &pb2.Nests_OptGroup{},
490*1c12ee1eSDan Willemsen		},
491*1c12ee1eSDan Willemsen	}, {
492*1c12ee1eSDan Willemsen		desc:         "group field name",
493*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
494*1c12ee1eSDan Willemsen		inputText:    `optgroup: {}`,
495*1c12ee1eSDan Willemsen		wantErr:      "unknown field: optgroup",
496*1c12ee1eSDan Willemsen	}, {
497*1c12ee1eSDan Willemsen		desc:         "proto2 nested messages",
498*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
499*1c12ee1eSDan Willemsen		inputText: `
500*1c12ee1eSDan Willemsenopt_nested: {
501*1c12ee1eSDan Willemsen  opt_string: "nested message"
502*1c12ee1eSDan Willemsen  opt_nested: {
503*1c12ee1eSDan Willemsen    opt_string: "another nested message"
504*1c12ee1eSDan Willemsen  }
505*1c12ee1eSDan Willemsen}
506*1c12ee1eSDan Willemsen`,
507*1c12ee1eSDan Willemsen		wantMessage: &pb2.Nests{
508*1c12ee1eSDan Willemsen			OptNested: &pb2.Nested{
509*1c12ee1eSDan Willemsen				OptString: proto.String("nested message"),
510*1c12ee1eSDan Willemsen				OptNested: &pb2.Nested{
511*1c12ee1eSDan Willemsen					OptString: proto.String("another nested message"),
512*1c12ee1eSDan Willemsen				},
513*1c12ee1eSDan Willemsen			},
514*1c12ee1eSDan Willemsen		},
515*1c12ee1eSDan Willemsen	}, {
516*1c12ee1eSDan Willemsen		desc:         "proto3 nested empty message",
517*1c12ee1eSDan Willemsen		inputMessage: &pb3.Nests{},
518*1c12ee1eSDan Willemsen		inputText:    "s_nested: {}",
519*1c12ee1eSDan Willemsen		wantMessage: &pb3.Nests{
520*1c12ee1eSDan Willemsen			SNested: &pb3.Nested{},
521*1c12ee1eSDan Willemsen		},
522*1c12ee1eSDan Willemsen	}, {
523*1c12ee1eSDan Willemsen		desc:         "proto3 nested message",
524*1c12ee1eSDan Willemsen		inputMessage: &pb3.Nests{},
525*1c12ee1eSDan Willemsen		inputText: `
526*1c12ee1eSDan Willemsens_nested: {
527*1c12ee1eSDan Willemsen  s_string: "nested message"
528*1c12ee1eSDan Willemsen  s_nested: {
529*1c12ee1eSDan Willemsen    s_string: "another nested message"
530*1c12ee1eSDan Willemsen  }
531*1c12ee1eSDan Willemsen}
532*1c12ee1eSDan Willemsen`,
533*1c12ee1eSDan Willemsen		wantMessage: &pb3.Nests{
534*1c12ee1eSDan Willemsen			SNested: &pb3.Nested{
535*1c12ee1eSDan Willemsen				SString: "nested message",
536*1c12ee1eSDan Willemsen				SNested: &pb3.Nested{
537*1c12ee1eSDan Willemsen					SString: "another nested message",
538*1c12ee1eSDan Willemsen				},
539*1c12ee1eSDan Willemsen			},
540*1c12ee1eSDan Willemsen		},
541*1c12ee1eSDan Willemsen	}, {
542*1c12ee1eSDan Willemsen		desc:         "proto3 nested message contains invalid UTF-8",
543*1c12ee1eSDan Willemsen		inputMessage: &pb3.Nests{},
544*1c12ee1eSDan Willemsen		inputText: `s_nested: {
545*1c12ee1eSDan Willemsen  s_string: "abc\xff"
546*1c12ee1eSDan Willemsen}
547*1c12ee1eSDan Willemsen`,
548*1c12ee1eSDan Willemsen		wantErr: "contains invalid UTF-8",
549*1c12ee1eSDan Willemsen	}, {
550*1c12ee1eSDan Willemsen		desc:         "oneof set to empty string",
551*1c12ee1eSDan Willemsen		inputMessage: &pb3.Oneofs{},
552*1c12ee1eSDan Willemsen		inputText:    "oneof_string: ''",
553*1c12ee1eSDan Willemsen		wantMessage: &pb3.Oneofs{
554*1c12ee1eSDan Willemsen			Union: &pb3.Oneofs_OneofString{},
555*1c12ee1eSDan Willemsen		},
556*1c12ee1eSDan Willemsen	}, {
557*1c12ee1eSDan Willemsen		desc:         "oneof set to string",
558*1c12ee1eSDan Willemsen		inputMessage: &pb3.Oneofs{},
559*1c12ee1eSDan Willemsen		inputText:    "oneof_string: 'hello'",
560*1c12ee1eSDan Willemsen		wantMessage: &pb3.Oneofs{
561*1c12ee1eSDan Willemsen			Union: &pb3.Oneofs_OneofString{
562*1c12ee1eSDan Willemsen				OneofString: "hello",
563*1c12ee1eSDan Willemsen			},
564*1c12ee1eSDan Willemsen		},
565*1c12ee1eSDan Willemsen	}, {
566*1c12ee1eSDan Willemsen		desc:         "oneof set to enum",
567*1c12ee1eSDan Willemsen		inputMessage: &pb3.Oneofs{},
568*1c12ee1eSDan Willemsen		inputText:    "oneof_enum: TEN",
569*1c12ee1eSDan Willemsen		wantMessage: &pb3.Oneofs{
570*1c12ee1eSDan Willemsen			Union: &pb3.Oneofs_OneofEnum{
571*1c12ee1eSDan Willemsen				OneofEnum: pb3.Enum_TEN,
572*1c12ee1eSDan Willemsen			},
573*1c12ee1eSDan Willemsen		},
574*1c12ee1eSDan Willemsen	}, {
575*1c12ee1eSDan Willemsen		desc:         "oneof set to empty message",
576*1c12ee1eSDan Willemsen		inputMessage: &pb3.Oneofs{},
577*1c12ee1eSDan Willemsen		inputText:    "oneof_nested: {}",
578*1c12ee1eSDan Willemsen		wantMessage: &pb3.Oneofs{
579*1c12ee1eSDan Willemsen			Union: &pb3.Oneofs_OneofNested{
580*1c12ee1eSDan Willemsen				OneofNested: &pb3.Nested{},
581*1c12ee1eSDan Willemsen			},
582*1c12ee1eSDan Willemsen		},
583*1c12ee1eSDan Willemsen	}, {
584*1c12ee1eSDan Willemsen		desc:         "oneof set to message",
585*1c12ee1eSDan Willemsen		inputMessage: &pb3.Oneofs{},
586*1c12ee1eSDan Willemsen		inputText: `
587*1c12ee1eSDan Willemsenoneof_nested: {
588*1c12ee1eSDan Willemsen  s_string: "nested message"
589*1c12ee1eSDan Willemsen}
590*1c12ee1eSDan Willemsen`,
591*1c12ee1eSDan Willemsen		wantMessage: &pb3.Oneofs{
592*1c12ee1eSDan Willemsen			Union: &pb3.Oneofs_OneofNested{
593*1c12ee1eSDan Willemsen				OneofNested: &pb3.Nested{
594*1c12ee1eSDan Willemsen					SString: "nested message",
595*1c12ee1eSDan Willemsen				},
596*1c12ee1eSDan Willemsen			},
597*1c12ee1eSDan Willemsen		},
598*1c12ee1eSDan Willemsen	}, {
599*1c12ee1eSDan Willemsen		desc:         "oneof set to more than one field",
600*1c12ee1eSDan Willemsen		inputMessage: &pb3.Oneofs{},
601*1c12ee1eSDan Willemsen		inputText: `
602*1c12ee1eSDan Willemsenoneof_enum: ZERO
603*1c12ee1eSDan Willemsenoneof_string: "hello"
604*1c12ee1eSDan Willemsen`,
605*1c12ee1eSDan Willemsen		wantErr: `error parsing "oneof_string", oneof pb3.Oneofs.union is already set`,
606*1c12ee1eSDan Willemsen	}, {
607*1c12ee1eSDan Willemsen		desc:         "repeated scalar using same field name",
608*1c12ee1eSDan Willemsen		inputMessage: &pb2.Repeats{},
609*1c12ee1eSDan Willemsen		inputText: `
610*1c12ee1eSDan Willemsenrpt_string: "a"
611*1c12ee1eSDan Willemsenrpt_string: "b"
612*1c12ee1eSDan Willemsenrpt_int32: 0xff
613*1c12ee1eSDan Willemsenrpt_float: 1.23
614*1c12ee1eSDan Willemsenrpt_bytes: "bytes"
615*1c12ee1eSDan Willemsen`,
616*1c12ee1eSDan Willemsen		wantMessage: &pb2.Repeats{
617*1c12ee1eSDan Willemsen			RptString: []string{"a", "b"},
618*1c12ee1eSDan Willemsen			RptInt32:  []int32{0xff},
619*1c12ee1eSDan Willemsen			RptFloat:  []float32{1.23},
620*1c12ee1eSDan Willemsen			RptBytes:  [][]byte{[]byte("bytes")},
621*1c12ee1eSDan Willemsen		},
622*1c12ee1eSDan Willemsen	}, {
623*1c12ee1eSDan Willemsen		desc:         "repeated using mix of [] and repeated field name",
624*1c12ee1eSDan Willemsen		inputMessage: &pb2.Repeats{},
625*1c12ee1eSDan Willemsen		inputText: `
626*1c12ee1eSDan Willemsenrpt_string: "a"
627*1c12ee1eSDan Willemsenrpt_bool: true
628*1c12ee1eSDan Willemsenrpt_string: ["x", "y"]
629*1c12ee1eSDan Willemsenrpt_bool: [ false, true ]
630*1c12ee1eSDan Willemsenrpt_string: "b"
631*1c12ee1eSDan Willemsen`,
632*1c12ee1eSDan Willemsen		wantMessage: &pb2.Repeats{
633*1c12ee1eSDan Willemsen			RptString: []string{"a", "x", "y", "b"},
634*1c12ee1eSDan Willemsen			RptBool:   []bool{true, false, true},
635*1c12ee1eSDan Willemsen		},
636*1c12ee1eSDan Willemsen	}, {
637*1c12ee1eSDan Willemsen		desc:         "repeated proto2 contains invalid UTF-8",
638*1c12ee1eSDan Willemsen		inputMessage: &pb2.Repeats{},
639*1c12ee1eSDan Willemsen		inputText:    `rpt_string: "abc\xff"`,
640*1c12ee1eSDan Willemsen		wantMessage: &pb2.Repeats{
641*1c12ee1eSDan Willemsen			RptString: []string{"abc\xff"},
642*1c12ee1eSDan Willemsen		},
643*1c12ee1eSDan Willemsen	}, {
644*1c12ee1eSDan Willemsen		desc:         "repeated proto3 contains invalid UTF-8",
645*1c12ee1eSDan Willemsen		inputMessage: &pb3.Repeats{},
646*1c12ee1eSDan Willemsen		inputText:    `rpt_string: "abc\xff"`,
647*1c12ee1eSDan Willemsen		wantErr:      "contains invalid UTF-8",
648*1c12ee1eSDan Willemsen	}, {
649*1c12ee1eSDan Willemsen		desc:         "repeated enums",
650*1c12ee1eSDan Willemsen		inputMessage: &pb2.Enums{},
651*1c12ee1eSDan Willemsen		inputText: `
652*1c12ee1eSDan Willemsenrpt_enum: TEN
653*1c12ee1eSDan Willemsenrpt_enum: 1
654*1c12ee1eSDan Willemsenrpt_nested_enum: [DOS, 2]
655*1c12ee1eSDan Willemsenrpt_enum: 42
656*1c12ee1eSDan Willemsenrpt_nested_enum: -47
657*1c12ee1eSDan Willemsen`,
658*1c12ee1eSDan Willemsen		wantMessage: &pb2.Enums{
659*1c12ee1eSDan Willemsen			RptEnum:       []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
660*1c12ee1eSDan Willemsen			RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
661*1c12ee1eSDan Willemsen		},
662*1c12ee1eSDan Willemsen	}, {
663*1c12ee1eSDan Willemsen		desc:         "repeated nested messages",
664*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
665*1c12ee1eSDan Willemsen		inputText: `
666*1c12ee1eSDan Willemsenrpt_nested: {
667*1c12ee1eSDan Willemsen  opt_string: "repeat nested one"
668*1c12ee1eSDan Willemsen}
669*1c12ee1eSDan Willemsenrpt_nested: {
670*1c12ee1eSDan Willemsen  opt_string: "repeat nested two"
671*1c12ee1eSDan Willemsen  opt_nested: {
672*1c12ee1eSDan Willemsen    opt_string: "inside repeat nested two"
673*1c12ee1eSDan Willemsen  }
674*1c12ee1eSDan Willemsen}
675*1c12ee1eSDan Willemsenrpt_nested: {}
676*1c12ee1eSDan Willemsen`,
677*1c12ee1eSDan Willemsen		wantMessage: &pb2.Nests{
678*1c12ee1eSDan Willemsen			RptNested: []*pb2.Nested{
679*1c12ee1eSDan Willemsen				{
680*1c12ee1eSDan Willemsen					OptString: proto.String("repeat nested one"),
681*1c12ee1eSDan Willemsen				},
682*1c12ee1eSDan Willemsen				{
683*1c12ee1eSDan Willemsen					OptString: proto.String("repeat nested two"),
684*1c12ee1eSDan Willemsen					OptNested: &pb2.Nested{
685*1c12ee1eSDan Willemsen						OptString: proto.String("inside repeat nested two"),
686*1c12ee1eSDan Willemsen					},
687*1c12ee1eSDan Willemsen				},
688*1c12ee1eSDan Willemsen				{},
689*1c12ee1eSDan Willemsen			},
690*1c12ee1eSDan Willemsen		},
691*1c12ee1eSDan Willemsen	}, {
692*1c12ee1eSDan Willemsen		desc:         "repeated group fields",
693*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
694*1c12ee1eSDan Willemsen		inputText: `
695*1c12ee1eSDan WillemsenRptGroup: {
696*1c12ee1eSDan Willemsen  rpt_string: "hello"
697*1c12ee1eSDan Willemsen  rpt_string: "world"
698*1c12ee1eSDan Willemsen}
699*1c12ee1eSDan WillemsenRptGroup: {}
700*1c12ee1eSDan Willemsen`,
701*1c12ee1eSDan Willemsen		wantMessage: &pb2.Nests{
702*1c12ee1eSDan Willemsen			Rptgroup: []*pb2.Nests_RptGroup{
703*1c12ee1eSDan Willemsen				{
704*1c12ee1eSDan Willemsen					RptString: []string{"hello", "world"},
705*1c12ee1eSDan Willemsen				},
706*1c12ee1eSDan Willemsen				{},
707*1c12ee1eSDan Willemsen			},
708*1c12ee1eSDan Willemsen		},
709*1c12ee1eSDan Willemsen	}, {
710*1c12ee1eSDan Willemsen		desc:         "repeated message fields without field separator",
711*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
712*1c12ee1eSDan Willemsen		inputText: `
713*1c12ee1eSDan Willemsenrpt_nested {
714*1c12ee1eSDan Willemsen  opt_string: "repeat nested one"
715*1c12ee1eSDan Willemsen}
716*1c12ee1eSDan Willemsenrpt_nested: [
717*1c12ee1eSDan Willemsen  {
718*1c12ee1eSDan Willemsen    opt_string: "repeat nested two"
719*1c12ee1eSDan Willemsen  },
720*1c12ee1eSDan Willemsen  {}
721*1c12ee1eSDan Willemsen]
722*1c12ee1eSDan Willemsen`,
723*1c12ee1eSDan Willemsen		wantMessage: &pb2.Nests{
724*1c12ee1eSDan Willemsen			RptNested: []*pb2.Nested{
725*1c12ee1eSDan Willemsen				{
726*1c12ee1eSDan Willemsen					OptString: proto.String("repeat nested one"),
727*1c12ee1eSDan Willemsen				},
728*1c12ee1eSDan Willemsen				{
729*1c12ee1eSDan Willemsen					OptString: proto.String("repeat nested two"),
730*1c12ee1eSDan Willemsen				},
731*1c12ee1eSDan Willemsen				{},
732*1c12ee1eSDan Willemsen			},
733*1c12ee1eSDan Willemsen		},
734*1c12ee1eSDan Willemsen	}, {
735*1c12ee1eSDan Willemsen		desc:         "bools",
736*1c12ee1eSDan Willemsen		inputMessage: &pb2.Repeats{},
737*1c12ee1eSDan Willemsen		inputText: `
738*1c12ee1eSDan Willemsenrpt_bool: [ True, true, t, 1, False, false, f, 0 ]
739*1c12ee1eSDan Willemsen`,
740*1c12ee1eSDan Willemsen		wantMessage: &pb2.Repeats{
741*1c12ee1eSDan Willemsen			RptBool: []bool{true, true, true, true, false, false, false, false},
742*1c12ee1eSDan Willemsen		},
743*1c12ee1eSDan Willemsen	}, {
744*1c12ee1eSDan Willemsen		desc:         "special floats and doubles",
745*1c12ee1eSDan Willemsen		inputMessage: &pb2.Repeats{},
746*1c12ee1eSDan Willemsen		inputText: `
747*1c12ee1eSDan Willemsenrpt_float: [ inf, Inf, infinity, InFiniTy, -inf, -inF, -infinitY, -InfinitY, nan, NaN, Nan ],
748*1c12ee1eSDan Willemsenrpt_double: [ inf, Inf, infinity, InFiniTy, -inf, -inF, -infinitY, -InfinitY, nan, NaN, Nan ],
749*1c12ee1eSDan Willemsen`,
750*1c12ee1eSDan Willemsen		wantMessage: &pb2.Repeats{
751*1c12ee1eSDan Willemsen			RptFloat: []float32{
752*1c12ee1eSDan Willemsen				float32(math.Inf(1)),
753*1c12ee1eSDan Willemsen				float32(math.Inf(1)),
754*1c12ee1eSDan Willemsen				float32(math.Inf(1)),
755*1c12ee1eSDan Willemsen				float32(math.Inf(1)),
756*1c12ee1eSDan Willemsen				float32(math.Inf(-1)),
757*1c12ee1eSDan Willemsen				float32(math.Inf(-1)),
758*1c12ee1eSDan Willemsen				float32(math.Inf(-1)),
759*1c12ee1eSDan Willemsen				float32(math.Inf(-1)),
760*1c12ee1eSDan Willemsen				float32(math.NaN()),
761*1c12ee1eSDan Willemsen				float32(math.NaN()),
762*1c12ee1eSDan Willemsen				float32(math.NaN()),
763*1c12ee1eSDan Willemsen			},
764*1c12ee1eSDan Willemsen			RptDouble: []float64{
765*1c12ee1eSDan Willemsen				math.Inf(1),
766*1c12ee1eSDan Willemsen				math.Inf(1),
767*1c12ee1eSDan Willemsen				math.Inf(1),
768*1c12ee1eSDan Willemsen				math.Inf(1),
769*1c12ee1eSDan Willemsen				math.Inf(-1),
770*1c12ee1eSDan Willemsen				math.Inf(-1),
771*1c12ee1eSDan Willemsen				math.Inf(-1),
772*1c12ee1eSDan Willemsen				math.Inf(-1),
773*1c12ee1eSDan Willemsen				math.NaN(),
774*1c12ee1eSDan Willemsen				math.NaN(),
775*1c12ee1eSDan Willemsen				math.NaN(),
776*1c12ee1eSDan Willemsen			},
777*1c12ee1eSDan Willemsen		},
778*1c12ee1eSDan Willemsen	}, {
779*1c12ee1eSDan Willemsen		desc:         "map fields 1",
780*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
781*1c12ee1eSDan Willemsen		inputText: `
782*1c12ee1eSDan Willemsenint32_to_str: {
783*1c12ee1eSDan Willemsen  key: -101
784*1c12ee1eSDan Willemsen  value: "-101"
785*1c12ee1eSDan Willemsen}
786*1c12ee1eSDan Willemsenint32_to_str {
787*1c12ee1eSDan Willemsen  key: 0
788*1c12ee1eSDan Willemsen  value: "zero"
789*1c12ee1eSDan Willemsen}
790*1c12ee1eSDan Willemsenbool_to_uint32: {
791*1c12ee1eSDan Willemsen  key: false
792*1c12ee1eSDan Willemsen  value: 101
793*1c12ee1eSDan Willemsen}
794*1c12ee1eSDan Willemsenint32_to_str: {
795*1c12ee1eSDan Willemsen  key: 255
796*1c12ee1eSDan Willemsen  value: "0xff"
797*1c12ee1eSDan Willemsen}
798*1c12ee1eSDan Willemsenbool_to_uint32 {
799*1c12ee1eSDan Willemsen  key: true
800*1c12ee1eSDan Willemsen  value: 42
801*1c12ee1eSDan Willemsen}
802*1c12ee1eSDan Willemsen`,
803*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
804*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
805*1c12ee1eSDan Willemsen				-101: "-101",
806*1c12ee1eSDan Willemsen				0xff: "0xff",
807*1c12ee1eSDan Willemsen				0:    "zero",
808*1c12ee1eSDan Willemsen			},
809*1c12ee1eSDan Willemsen			BoolToUint32: map[bool]uint32{
810*1c12ee1eSDan Willemsen				true:  42,
811*1c12ee1eSDan Willemsen				false: 101,
812*1c12ee1eSDan Willemsen			},
813*1c12ee1eSDan Willemsen		},
814*1c12ee1eSDan Willemsen	}, {
815*1c12ee1eSDan Willemsen		desc:         "map fields 2",
816*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
817*1c12ee1eSDan Willemsen		inputText: `
818*1c12ee1eSDan Willemsenuint64_to_enum: {
819*1c12ee1eSDan Willemsen  key: 1
820*1c12ee1eSDan Willemsen  value: ONE
821*1c12ee1eSDan Willemsen}
822*1c12ee1eSDan Willemsenuint64_to_enum: {
823*1c12ee1eSDan Willemsen  key: 2
824*1c12ee1eSDan Willemsen  value: 2
825*1c12ee1eSDan Willemsen}
826*1c12ee1eSDan Willemsenuint64_to_enum: {
827*1c12ee1eSDan Willemsen  key: 10
828*1c12ee1eSDan Willemsen  value: 101
829*1c12ee1eSDan Willemsen}
830*1c12ee1eSDan Willemsen`,
831*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
832*1c12ee1eSDan Willemsen			Uint64ToEnum: map[uint64]pb3.Enum{
833*1c12ee1eSDan Willemsen				1:  pb3.Enum_ONE,
834*1c12ee1eSDan Willemsen				2:  pb3.Enum_TWO,
835*1c12ee1eSDan Willemsen				10: 101,
836*1c12ee1eSDan Willemsen			},
837*1c12ee1eSDan Willemsen		},
838*1c12ee1eSDan Willemsen	}, {
839*1c12ee1eSDan Willemsen		desc:         "map fields 3",
840*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
841*1c12ee1eSDan Willemsen		inputText: `
842*1c12ee1eSDan Willemsenstr_to_nested: {
843*1c12ee1eSDan Willemsen  key: "nested_one"
844*1c12ee1eSDan Willemsen  value {
845*1c12ee1eSDan Willemsen    s_string: "nested in a map"
846*1c12ee1eSDan Willemsen  }
847*1c12ee1eSDan Willemsen}
848*1c12ee1eSDan Willemsen`,
849*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
850*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb3.Nested{
851*1c12ee1eSDan Willemsen				"nested_one": &pb3.Nested{
852*1c12ee1eSDan Willemsen					SString: "nested in a map",
853*1c12ee1eSDan Willemsen				},
854*1c12ee1eSDan Willemsen			},
855*1c12ee1eSDan Willemsen		},
856*1c12ee1eSDan Willemsen	}, {
857*1c12ee1eSDan Willemsen		desc:         "map fields 4",
858*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
859*1c12ee1eSDan Willemsen		inputText: `
860*1c12ee1eSDan Willemsenstr_to_oneofs: {
861*1c12ee1eSDan Willemsen  key: "nested"
862*1c12ee1eSDan Willemsen  value: {
863*1c12ee1eSDan Willemsen    oneof_nested: {
864*1c12ee1eSDan Willemsen      s_string: "nested oneof in map field value"
865*1c12ee1eSDan Willemsen    }
866*1c12ee1eSDan Willemsen  }
867*1c12ee1eSDan Willemsen}
868*1c12ee1eSDan Willemsenstr_to_oneofs: {
869*1c12ee1eSDan Willemsen  key: "string"
870*1c12ee1eSDan Willemsen  value: {
871*1c12ee1eSDan Willemsen    oneof_string: "hello"
872*1c12ee1eSDan Willemsen  }
873*1c12ee1eSDan Willemsen}
874*1c12ee1eSDan Willemsen`,
875*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
876*1c12ee1eSDan Willemsen			StrToOneofs: map[string]*pb3.Oneofs{
877*1c12ee1eSDan Willemsen				"string": &pb3.Oneofs{
878*1c12ee1eSDan Willemsen					Union: &pb3.Oneofs_OneofString{
879*1c12ee1eSDan Willemsen						OneofString: "hello",
880*1c12ee1eSDan Willemsen					},
881*1c12ee1eSDan Willemsen				},
882*1c12ee1eSDan Willemsen				"nested": &pb3.Oneofs{
883*1c12ee1eSDan Willemsen					Union: &pb3.Oneofs_OneofNested{
884*1c12ee1eSDan Willemsen						OneofNested: &pb3.Nested{
885*1c12ee1eSDan Willemsen							SString: "nested oneof in map field value",
886*1c12ee1eSDan Willemsen						},
887*1c12ee1eSDan Willemsen					},
888*1c12ee1eSDan Willemsen				},
889*1c12ee1eSDan Willemsen			},
890*1c12ee1eSDan Willemsen		},
891*1c12ee1eSDan Willemsen	}, {
892*1c12ee1eSDan Willemsen		desc:         "map contains duplicate keys",
893*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
894*1c12ee1eSDan Willemsen		inputText: `
895*1c12ee1eSDan Willemsenint32_to_str: {
896*1c12ee1eSDan Willemsen  key: 0
897*1c12ee1eSDan Willemsen  value: "cero"
898*1c12ee1eSDan Willemsen}
899*1c12ee1eSDan Willemsenint32_to_str: {
900*1c12ee1eSDan Willemsen  key: 0
901*1c12ee1eSDan Willemsen  value: "zero"
902*1c12ee1eSDan Willemsen}
903*1c12ee1eSDan Willemsen`,
904*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
905*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
906*1c12ee1eSDan Willemsen				0: "zero",
907*1c12ee1eSDan Willemsen			},
908*1c12ee1eSDan Willemsen		},
909*1c12ee1eSDan Willemsen	}, {
910*1c12ee1eSDan Willemsen		desc:         "map contains duplicate key fields",
911*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
912*1c12ee1eSDan Willemsen		inputText: `
913*1c12ee1eSDan Willemsenint32_to_str: {
914*1c12ee1eSDan Willemsen  key: 0
915*1c12ee1eSDan Willemsen  key: 1
916*1c12ee1eSDan Willemsen  value: "cero"
917*1c12ee1eSDan Willemsen}
918*1c12ee1eSDan Willemsen`,
919*1c12ee1eSDan Willemsen		wantErr: `map entry "key" cannot be repeated`,
920*1c12ee1eSDan Willemsen	}, {
921*1c12ee1eSDan Willemsen		desc:         "map contains duplicate value fields",
922*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
923*1c12ee1eSDan Willemsen		inputText: `
924*1c12ee1eSDan Willemsenint32_to_str: {
925*1c12ee1eSDan Willemsen  key: 1
926*1c12ee1eSDan Willemsen  value: "cero"
927*1c12ee1eSDan Willemsen  value: "uno"
928*1c12ee1eSDan Willemsen}
929*1c12ee1eSDan Willemsen`,
930*1c12ee1eSDan Willemsen		wantErr: `map entry "value" cannot be repeated`,
931*1c12ee1eSDan Willemsen	}, {
932*1c12ee1eSDan Willemsen		desc:         "map contains missing key",
933*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
934*1c12ee1eSDan Willemsen		inputText: `
935*1c12ee1eSDan Willemsenint32_to_str: {
936*1c12ee1eSDan Willemsen  value: "zero"
937*1c12ee1eSDan Willemsen}
938*1c12ee1eSDan Willemsenbool_to_uint32: {
939*1c12ee1eSDan Willemsen  value: 47
940*1c12ee1eSDan Willemsen}
941*1c12ee1eSDan Willemsenstr_to_nested: {
942*1c12ee1eSDan Willemsen  value: {}
943*1c12ee1eSDan Willemsen}
944*1c12ee1eSDan Willemsen`,
945*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
946*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
947*1c12ee1eSDan Willemsen				0: "zero",
948*1c12ee1eSDan Willemsen			},
949*1c12ee1eSDan Willemsen			BoolToUint32: map[bool]uint32{
950*1c12ee1eSDan Willemsen				false: 47,
951*1c12ee1eSDan Willemsen			},
952*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb3.Nested{
953*1c12ee1eSDan Willemsen				"": {},
954*1c12ee1eSDan Willemsen			},
955*1c12ee1eSDan Willemsen		},
956*1c12ee1eSDan Willemsen	}, {
957*1c12ee1eSDan Willemsen		desc:         "map contains missing value",
958*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
959*1c12ee1eSDan Willemsen		inputText: `
960*1c12ee1eSDan Willemsenint32_to_str: {
961*1c12ee1eSDan Willemsen  key: 100
962*1c12ee1eSDan Willemsen}
963*1c12ee1eSDan Willemsenbool_to_uint32: {
964*1c12ee1eSDan Willemsen  key: true
965*1c12ee1eSDan Willemsen}
966*1c12ee1eSDan Willemsenuint64_to_enum: {
967*1c12ee1eSDan Willemsen  key: 101
968*1c12ee1eSDan Willemsen}
969*1c12ee1eSDan Willemsenstr_to_nested: {
970*1c12ee1eSDan Willemsen  key: "hello"
971*1c12ee1eSDan Willemsen}
972*1c12ee1eSDan Willemsen`,
973*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
974*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
975*1c12ee1eSDan Willemsen				100: "",
976*1c12ee1eSDan Willemsen			},
977*1c12ee1eSDan Willemsen			BoolToUint32: map[bool]uint32{
978*1c12ee1eSDan Willemsen				true: 0,
979*1c12ee1eSDan Willemsen			},
980*1c12ee1eSDan Willemsen			Uint64ToEnum: map[uint64]pb3.Enum{
981*1c12ee1eSDan Willemsen				101: pb3.Enum_ZERO,
982*1c12ee1eSDan Willemsen			},
983*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb3.Nested{
984*1c12ee1eSDan Willemsen				"hello": {},
985*1c12ee1eSDan Willemsen			},
986*1c12ee1eSDan Willemsen		},
987*1c12ee1eSDan Willemsen	}, {
988*1c12ee1eSDan Willemsen		desc:         "map contains missing key and value",
989*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
990*1c12ee1eSDan Willemsen		inputText: `
991*1c12ee1eSDan Willemsenint32_to_str: {}
992*1c12ee1eSDan Willemsenbool_to_uint32: {}
993*1c12ee1eSDan Willemsenuint64_to_enum: {}
994*1c12ee1eSDan Willemsenstr_to_nested: {}
995*1c12ee1eSDan Willemsen`,
996*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
997*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
998*1c12ee1eSDan Willemsen				0: "",
999*1c12ee1eSDan Willemsen			},
1000*1c12ee1eSDan Willemsen			BoolToUint32: map[bool]uint32{
1001*1c12ee1eSDan Willemsen				false: 0,
1002*1c12ee1eSDan Willemsen			},
1003*1c12ee1eSDan Willemsen			Uint64ToEnum: map[uint64]pb3.Enum{
1004*1c12ee1eSDan Willemsen				0: pb3.Enum_ZERO,
1005*1c12ee1eSDan Willemsen			},
1006*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb3.Nested{
1007*1c12ee1eSDan Willemsen				"": {},
1008*1c12ee1eSDan Willemsen			},
1009*1c12ee1eSDan Willemsen		},
1010*1c12ee1eSDan Willemsen	}, {
1011*1c12ee1eSDan Willemsen		desc:         "map contains overriding entries",
1012*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1013*1c12ee1eSDan Willemsen		inputText: `
1014*1c12ee1eSDan Willemsenint32_to_str: {
1015*1c12ee1eSDan Willemsen  key: 0
1016*1c12ee1eSDan Willemsen}
1017*1c12ee1eSDan Willemsenint32_to_str: {
1018*1c12ee1eSDan Willemsen  value: "empty"
1019*1c12ee1eSDan Willemsen}
1020*1c12ee1eSDan Willemsenint32_to_str: {}
1021*1c12ee1eSDan Willemsen`,
1022*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
1023*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
1024*1c12ee1eSDan Willemsen				0: "",
1025*1c12ee1eSDan Willemsen			},
1026*1c12ee1eSDan Willemsen		},
1027*1c12ee1eSDan Willemsen	}, {
1028*1c12ee1eSDan Willemsen		desc:         "proto2 map field value contains invalid UTF-8",
1029*1c12ee1eSDan Willemsen		inputMessage: &pb2.Maps{},
1030*1c12ee1eSDan Willemsen		inputText: `int32_to_str: {
1031*1c12ee1eSDan Willemsen  key: 101
1032*1c12ee1eSDan Willemsen  value: "abc\xff"
1033*1c12ee1eSDan Willemsen}
1034*1c12ee1eSDan Willemsen`,
1035*1c12ee1eSDan Willemsen		wantMessage: &pb2.Maps{
1036*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{101: "abc\xff"},
1037*1c12ee1eSDan Willemsen		},
1038*1c12ee1eSDan Willemsen	}, {
1039*1c12ee1eSDan Willemsen		desc:         "proto2 map field key contains invalid UTF-8",
1040*1c12ee1eSDan Willemsen		inputMessage: &pb2.Maps{},
1041*1c12ee1eSDan Willemsen		inputText: `str_to_nested: {
1042*1c12ee1eSDan Willemsen  key: "abc\xff"
1043*1c12ee1eSDan Willemsen  value: {}
1044*1c12ee1eSDan Willemsen}
1045*1c12ee1eSDan Willemsen`,
1046*1c12ee1eSDan Willemsen		wantMessage: &pb2.Maps{
1047*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb2.Nested{"abc\xff": {}},
1048*1c12ee1eSDan Willemsen		},
1049*1c12ee1eSDan Willemsen	}, {
1050*1c12ee1eSDan Willemsen		desc:         "proto3 map field value contains invalid UTF-8",
1051*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1052*1c12ee1eSDan Willemsen		inputText: `int32_to_str: {
1053*1c12ee1eSDan Willemsen  key: 101
1054*1c12ee1eSDan Willemsen  value: "abc\xff"
1055*1c12ee1eSDan Willemsen}
1056*1c12ee1eSDan Willemsen`,
1057*1c12ee1eSDan Willemsen		wantErr: "contains invalid UTF-8",
1058*1c12ee1eSDan Willemsen	}, {
1059*1c12ee1eSDan Willemsen		desc:         "proto3 map field key contains invalid UTF-8",
1060*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1061*1c12ee1eSDan Willemsen		inputText: `str_to_nested: {
1062*1c12ee1eSDan Willemsen  key: "abc\xff"
1063*1c12ee1eSDan Willemsen  value: {}
1064*1c12ee1eSDan Willemsen}
1065*1c12ee1eSDan Willemsen`,
1066*1c12ee1eSDan Willemsen		wantErr: "contains invalid UTF-8",
1067*1c12ee1eSDan Willemsen	}, {
1068*1c12ee1eSDan Willemsen		desc:         "map contains unknown field",
1069*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1070*1c12ee1eSDan Willemsen		inputText: `
1071*1c12ee1eSDan Willemsenint32_to_str: {
1072*1c12ee1eSDan Willemsen  key: 0
1073*1c12ee1eSDan Willemsen  value: "cero"
1074*1c12ee1eSDan Willemsen  unknown: "bad"
1075*1c12ee1eSDan Willemsen}
1076*1c12ee1eSDan Willemsen`,
1077*1c12ee1eSDan Willemsen		wantErr: `(line 5:3): unknown map entry field "unknown"`,
1078*1c12ee1eSDan Willemsen	}, {
1079*1c12ee1eSDan Willemsen		desc:         "map contains extension-like key field",
1080*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1081*1c12ee1eSDan Willemsen		inputText: `
1082*1c12ee1eSDan Willemsenint32_to_str: {
1083*1c12ee1eSDan Willemsen  [key]: 10
1084*1c12ee1eSDan Willemsen  value: "ten"
1085*1c12ee1eSDan Willemsen}
1086*1c12ee1eSDan Willemsen`,
1087*1c12ee1eSDan Willemsen		wantErr: `unknown map entry field "[key]"`,
1088*1c12ee1eSDan Willemsen	}, {
1089*1c12ee1eSDan Willemsen		desc:         "map contains invalid key",
1090*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1091*1c12ee1eSDan Willemsen		inputText: `
1092*1c12ee1eSDan Willemsenint32_to_str: {
1093*1c12ee1eSDan Willemsen  key: "invalid"
1094*1c12ee1eSDan Willemsen  value: "cero"
1095*1c12ee1eSDan Willemsen}
1096*1c12ee1eSDan Willemsen`,
1097*1c12ee1eSDan Willemsen		wantErr: "(line 3:8): invalid value for int32 type",
1098*1c12ee1eSDan Willemsen	}, {
1099*1c12ee1eSDan Willemsen		desc:         "map contains invalid value",
1100*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1101*1c12ee1eSDan Willemsen		inputText: `
1102*1c12ee1eSDan Willemsenint32_to_str: {
1103*1c12ee1eSDan Willemsen  key: 100
1104*1c12ee1eSDan Willemsen  value: 101
1105*1c12ee1eSDan Willemsen}
1106*1c12ee1eSDan Willemsen`,
1107*1c12ee1eSDan Willemsen		wantErr: "(line 4:10): invalid value for string type",
1108*1c12ee1eSDan Willemsen	}, {
1109*1c12ee1eSDan Willemsen		desc:         "map contains invalid message value",
1110*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1111*1c12ee1eSDan Willemsen		inputText: `
1112*1c12ee1eSDan Willemsenstr_to_nested: {
1113*1c12ee1eSDan Willemsen  key: "one"
1114*1c12ee1eSDan Willemsen  value: 1
1115*1c12ee1eSDan Willemsen}
1116*1c12ee1eSDan Willemsen`,
1117*1c12ee1eSDan Willemsen		wantErr: "syntax error (line 4:10): unexpected token: 1",
1118*1c12ee1eSDan Willemsen	}, {
1119*1c12ee1eSDan Willemsen		desc:         "map using mix of [] and repeated",
1120*1c12ee1eSDan Willemsen		inputMessage: &pb3.Maps{},
1121*1c12ee1eSDan Willemsen		inputText: `
1122*1c12ee1eSDan Willemsenint32_to_str: {
1123*1c12ee1eSDan Willemsen  key: 1
1124*1c12ee1eSDan Willemsen  value: "one"
1125*1c12ee1eSDan Willemsen}
1126*1c12ee1eSDan Willemsenint32_to_str: [
1127*1c12ee1eSDan Willemsen  {
1128*1c12ee1eSDan Willemsen    key: 2
1129*1c12ee1eSDan Willemsen    value: "not this"
1130*1c12ee1eSDan Willemsen  },
1131*1c12ee1eSDan Willemsen  {
1132*1c12ee1eSDan Willemsen  },
1133*1c12ee1eSDan Willemsen  {
1134*1c12ee1eSDan Willemsen    key: 3
1135*1c12ee1eSDan Willemsen    value: "three"
1136*1c12ee1eSDan Willemsen  }
1137*1c12ee1eSDan Willemsen]
1138*1c12ee1eSDan Willemsenint32_to_str: {
1139*1c12ee1eSDan Willemsen  key: 2
1140*1c12ee1eSDan Willemsen  value: "two"
1141*1c12ee1eSDan Willemsen}
1142*1c12ee1eSDan Willemsen`,
1143*1c12ee1eSDan Willemsen		wantMessage: &pb3.Maps{
1144*1c12ee1eSDan Willemsen			Int32ToStr: map[int32]string{
1145*1c12ee1eSDan Willemsen				0: "",
1146*1c12ee1eSDan Willemsen				1: "one",
1147*1c12ee1eSDan Willemsen				2: "two",
1148*1c12ee1eSDan Willemsen				3: "three",
1149*1c12ee1eSDan Willemsen			},
1150*1c12ee1eSDan Willemsen		},
1151*1c12ee1eSDan Willemsen	}, {
1152*1c12ee1eSDan Willemsen		desc:         "required fields not set",
1153*1c12ee1eSDan Willemsen		inputMessage: &pb2.Requireds{},
1154*1c12ee1eSDan Willemsen		wantErr:      "required field",
1155*1c12ee1eSDan Willemsen	}, {
1156*1c12ee1eSDan Willemsen		desc:         "required field set",
1157*1c12ee1eSDan Willemsen		inputMessage: &pb2.PartialRequired{},
1158*1c12ee1eSDan Willemsen		inputText:    "req_string: 'this is required'",
1159*1c12ee1eSDan Willemsen		wantMessage: &pb2.PartialRequired{
1160*1c12ee1eSDan Willemsen			ReqString: proto.String("this is required"),
1161*1c12ee1eSDan Willemsen		},
1162*1c12ee1eSDan Willemsen	}, {
1163*1c12ee1eSDan Willemsen		desc:         "required fields partially set",
1164*1c12ee1eSDan Willemsen		inputMessage: &pb2.Requireds{},
1165*1c12ee1eSDan Willemsen		inputText: `
1166*1c12ee1eSDan Willemsenreq_bool: false
1167*1c12ee1eSDan Willemsenreq_sfixed64: 3203386110
1168*1c12ee1eSDan Willemsenreq_string: "hello"
1169*1c12ee1eSDan Willemsenreq_enum: ONE
1170*1c12ee1eSDan Willemsen`,
1171*1c12ee1eSDan Willemsen		wantMessage: &pb2.Requireds{
1172*1c12ee1eSDan Willemsen			ReqBool:     proto.Bool(false),
1173*1c12ee1eSDan Willemsen			ReqSfixed64: proto.Int64(0xbeefcafe),
1174*1c12ee1eSDan Willemsen			ReqString:   proto.String("hello"),
1175*1c12ee1eSDan Willemsen			ReqEnum:     pb2.Enum_ONE.Enum(),
1176*1c12ee1eSDan Willemsen		},
1177*1c12ee1eSDan Willemsen		wantErr: "required field",
1178*1c12ee1eSDan Willemsen	}, {
1179*1c12ee1eSDan Willemsen		desc:         "required fields partially set with AllowPartial",
1180*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{AllowPartial: true},
1181*1c12ee1eSDan Willemsen		inputMessage: &pb2.Requireds{},
1182*1c12ee1eSDan Willemsen		inputText: `
1183*1c12ee1eSDan Willemsenreq_bool: false
1184*1c12ee1eSDan Willemsenreq_sfixed64: 3203386110
1185*1c12ee1eSDan Willemsenreq_string: "hello"
1186*1c12ee1eSDan Willemsenreq_enum: ONE
1187*1c12ee1eSDan Willemsen`,
1188*1c12ee1eSDan Willemsen		wantMessage: &pb2.Requireds{
1189*1c12ee1eSDan Willemsen			ReqBool:     proto.Bool(false),
1190*1c12ee1eSDan Willemsen			ReqSfixed64: proto.Int64(0xbeefcafe),
1191*1c12ee1eSDan Willemsen			ReqString:   proto.String("hello"),
1192*1c12ee1eSDan Willemsen			ReqEnum:     pb2.Enum_ONE.Enum(),
1193*1c12ee1eSDan Willemsen		},
1194*1c12ee1eSDan Willemsen	}, {
1195*1c12ee1eSDan Willemsen		desc:         "required fields all set",
1196*1c12ee1eSDan Willemsen		inputMessage: &pb2.Requireds{},
1197*1c12ee1eSDan Willemsen		inputText: `
1198*1c12ee1eSDan Willemsenreq_bool: false
1199*1c12ee1eSDan Willemsenreq_sfixed64: 0
1200*1c12ee1eSDan Willemsenreq_double: 0
1201*1c12ee1eSDan Willemsenreq_string: ""
1202*1c12ee1eSDan Willemsenreq_enum: ONE
1203*1c12ee1eSDan Willemsenreq_nested: {}
1204*1c12ee1eSDan Willemsen`,
1205*1c12ee1eSDan Willemsen		wantMessage: &pb2.Requireds{
1206*1c12ee1eSDan Willemsen			ReqBool:     proto.Bool(false),
1207*1c12ee1eSDan Willemsen			ReqSfixed64: proto.Int64(0),
1208*1c12ee1eSDan Willemsen			ReqDouble:   proto.Float64(0),
1209*1c12ee1eSDan Willemsen			ReqString:   proto.String(""),
1210*1c12ee1eSDan Willemsen			ReqEnum:     pb2.Enum_ONE.Enum(),
1211*1c12ee1eSDan Willemsen			ReqNested:   &pb2.Nested{},
1212*1c12ee1eSDan Willemsen		},
1213*1c12ee1eSDan Willemsen	}, {
1214*1c12ee1eSDan Willemsen		desc:         "indirect required field",
1215*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1216*1c12ee1eSDan Willemsen		inputText:    "opt_nested: {}",
1217*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1218*1c12ee1eSDan Willemsen			OptNested: &pb2.NestedWithRequired{},
1219*1c12ee1eSDan Willemsen		},
1220*1c12ee1eSDan Willemsen		wantErr: "required field",
1221*1c12ee1eSDan Willemsen	}, {
1222*1c12ee1eSDan Willemsen		desc:         "indirect required field with AllowPartial",
1223*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{AllowPartial: true},
1224*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1225*1c12ee1eSDan Willemsen		inputText:    "opt_nested: {}",
1226*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1227*1c12ee1eSDan Willemsen			OptNested: &pb2.NestedWithRequired{},
1228*1c12ee1eSDan Willemsen		},
1229*1c12ee1eSDan Willemsen	}, {
1230*1c12ee1eSDan Willemsen		desc:         "indirect required field in repeated",
1231*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1232*1c12ee1eSDan Willemsen		inputText: `
1233*1c12ee1eSDan Willemsenrpt_nested: {
1234*1c12ee1eSDan Willemsen  req_string: "one"
1235*1c12ee1eSDan Willemsen}
1236*1c12ee1eSDan Willemsenrpt_nested: {}
1237*1c12ee1eSDan Willemsen`,
1238*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1239*1c12ee1eSDan Willemsen			RptNested: []*pb2.NestedWithRequired{
1240*1c12ee1eSDan Willemsen				{
1241*1c12ee1eSDan Willemsen					ReqString: proto.String("one"),
1242*1c12ee1eSDan Willemsen				},
1243*1c12ee1eSDan Willemsen				{},
1244*1c12ee1eSDan Willemsen			},
1245*1c12ee1eSDan Willemsen		},
1246*1c12ee1eSDan Willemsen		wantErr: "required field",
1247*1c12ee1eSDan Willemsen	}, {
1248*1c12ee1eSDan Willemsen		desc:         "indirect required field in repeated with AllowPartial",
1249*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{AllowPartial: true},
1250*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1251*1c12ee1eSDan Willemsen		inputText: `
1252*1c12ee1eSDan Willemsenrpt_nested: {
1253*1c12ee1eSDan Willemsen  req_string: "one"
1254*1c12ee1eSDan Willemsen}
1255*1c12ee1eSDan Willemsenrpt_nested: {}
1256*1c12ee1eSDan Willemsen`,
1257*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1258*1c12ee1eSDan Willemsen			RptNested: []*pb2.NestedWithRequired{
1259*1c12ee1eSDan Willemsen				{
1260*1c12ee1eSDan Willemsen					ReqString: proto.String("one"),
1261*1c12ee1eSDan Willemsen				},
1262*1c12ee1eSDan Willemsen				{},
1263*1c12ee1eSDan Willemsen			},
1264*1c12ee1eSDan Willemsen		},
1265*1c12ee1eSDan Willemsen	}, {
1266*1c12ee1eSDan Willemsen		desc:         "indirect required field in map",
1267*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1268*1c12ee1eSDan Willemsen		inputText: `
1269*1c12ee1eSDan Willemsenstr_to_nested: {
1270*1c12ee1eSDan Willemsen  key: "missing"
1271*1c12ee1eSDan Willemsen}
1272*1c12ee1eSDan Willemsenstr_to_nested: {
1273*1c12ee1eSDan Willemsen  key: "contains"
1274*1c12ee1eSDan Willemsen  value: {
1275*1c12ee1eSDan Willemsen    req_string: "here"
1276*1c12ee1eSDan Willemsen  }
1277*1c12ee1eSDan Willemsen}
1278*1c12ee1eSDan Willemsen`,
1279*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1280*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb2.NestedWithRequired{
1281*1c12ee1eSDan Willemsen				"missing": &pb2.NestedWithRequired{},
1282*1c12ee1eSDan Willemsen				"contains": &pb2.NestedWithRequired{
1283*1c12ee1eSDan Willemsen					ReqString: proto.String("here"),
1284*1c12ee1eSDan Willemsen				},
1285*1c12ee1eSDan Willemsen			},
1286*1c12ee1eSDan Willemsen		},
1287*1c12ee1eSDan Willemsen		wantErr: "required field",
1288*1c12ee1eSDan Willemsen	}, {
1289*1c12ee1eSDan Willemsen		desc:         "indirect required field in map with AllowPartial",
1290*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{AllowPartial: true},
1291*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1292*1c12ee1eSDan Willemsen		inputText: `
1293*1c12ee1eSDan Willemsenstr_to_nested: {
1294*1c12ee1eSDan Willemsen  key: "missing"
1295*1c12ee1eSDan Willemsen}
1296*1c12ee1eSDan Willemsenstr_to_nested: {
1297*1c12ee1eSDan Willemsen  key: "contains"
1298*1c12ee1eSDan Willemsen  value: {
1299*1c12ee1eSDan Willemsen    req_string: "here"
1300*1c12ee1eSDan Willemsen  }
1301*1c12ee1eSDan Willemsen}
1302*1c12ee1eSDan Willemsen`,
1303*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1304*1c12ee1eSDan Willemsen			StrToNested: map[string]*pb2.NestedWithRequired{
1305*1c12ee1eSDan Willemsen				"missing": &pb2.NestedWithRequired{},
1306*1c12ee1eSDan Willemsen				"contains": &pb2.NestedWithRequired{
1307*1c12ee1eSDan Willemsen					ReqString: proto.String("here"),
1308*1c12ee1eSDan Willemsen				},
1309*1c12ee1eSDan Willemsen			},
1310*1c12ee1eSDan Willemsen		},
1311*1c12ee1eSDan Willemsen	}, {
1312*1c12ee1eSDan Willemsen		desc:         "indirect required field in oneof",
1313*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1314*1c12ee1eSDan Willemsen		inputText: `oneof_nested: {}
1315*1c12ee1eSDan Willemsen`,
1316*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1317*1c12ee1eSDan Willemsen			Union: &pb2.IndirectRequired_OneofNested{
1318*1c12ee1eSDan Willemsen				OneofNested: &pb2.NestedWithRequired{},
1319*1c12ee1eSDan Willemsen			},
1320*1c12ee1eSDan Willemsen		},
1321*1c12ee1eSDan Willemsen		wantErr: "required field",
1322*1c12ee1eSDan Willemsen	}, {
1323*1c12ee1eSDan Willemsen		desc:         "indirect required field in oneof with AllowPartial",
1324*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{AllowPartial: true},
1325*1c12ee1eSDan Willemsen		inputMessage: &pb2.IndirectRequired{},
1326*1c12ee1eSDan Willemsen		inputText: `oneof_nested: {}
1327*1c12ee1eSDan Willemsen`,
1328*1c12ee1eSDan Willemsen		wantMessage: &pb2.IndirectRequired{
1329*1c12ee1eSDan Willemsen			Union: &pb2.IndirectRequired_OneofNested{
1330*1c12ee1eSDan Willemsen				OneofNested: &pb2.NestedWithRequired{},
1331*1c12ee1eSDan Willemsen			},
1332*1c12ee1eSDan Willemsen		},
1333*1c12ee1eSDan Willemsen	}, {
1334*1c12ee1eSDan Willemsen		desc:         "ignore reserved field",
1335*1c12ee1eSDan Willemsen		inputMessage: &pb2.Nests{},
1336*1c12ee1eSDan Willemsen		inputText:    "reserved_field: 'ignore this'",
1337*1c12ee1eSDan Willemsen		wantMessage:  &pb2.Nests{},
1338*1c12ee1eSDan Willemsen	}, {
1339*1c12ee1eSDan Willemsen		desc:         "extensions of non-repeated fields",
1340*1c12ee1eSDan Willemsen		inputMessage: &pb2.Extensions{},
1341*1c12ee1eSDan Willemsen		inputText: `opt_string: "non-extension field"
1342*1c12ee1eSDan Willemsen[pb2.opt_ext_bool]: true
1343*1c12ee1eSDan Willemsenopt_bool: true
1344*1c12ee1eSDan Willemsen[pb2.opt_ext_nested]: {
1345*1c12ee1eSDan Willemsen  opt_string: "nested in an extension"
1346*1c12ee1eSDan Willemsen  opt_nested: {
1347*1c12ee1eSDan Willemsen    opt_string: "another nested in an extension"
1348*1c12ee1eSDan Willemsen  }
1349*1c12ee1eSDan Willemsen}
1350*1c12ee1eSDan Willemsen[pb2.opt_ext_string]: "extension field"
1351*1c12ee1eSDan Willemsenopt_int32: 42
1352*1c12ee1eSDan Willemsen[pb2.opt_ext_enum]: TEN
1353*1c12ee1eSDan Willemsen`,
1354*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1355*1c12ee1eSDan Willemsen			m := &pb2.Extensions{
1356*1c12ee1eSDan Willemsen				OptString: proto.String("non-extension field"),
1357*1c12ee1eSDan Willemsen				OptBool:   proto.Bool(true),
1358*1c12ee1eSDan Willemsen				OptInt32:  proto.Int32(42),
1359*1c12ee1eSDan Willemsen			}
1360*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_OptExtBool, true)
1361*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_OptExtString, "extension field")
1362*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
1363*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_OptExtNested, &pb2.Nested{
1364*1c12ee1eSDan Willemsen				OptString: proto.String("nested in an extension"),
1365*1c12ee1eSDan Willemsen				OptNested: &pb2.Nested{
1366*1c12ee1eSDan Willemsen					OptString: proto.String("another nested in an extension"),
1367*1c12ee1eSDan Willemsen				},
1368*1c12ee1eSDan Willemsen			})
1369*1c12ee1eSDan Willemsen			return m
1370*1c12ee1eSDan Willemsen		}(),
1371*1c12ee1eSDan Willemsen	}, {
1372*1c12ee1eSDan Willemsen		desc:         "extension field contains invalid UTF-8",
1373*1c12ee1eSDan Willemsen		inputMessage: &pb2.Extensions{},
1374*1c12ee1eSDan Willemsen		inputText:    `[pb2.opt_ext_string]: "abc\xff"`,
1375*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1376*1c12ee1eSDan Willemsen			m := &pb2.Extensions{}
1377*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_OptExtString, "abc\xff")
1378*1c12ee1eSDan Willemsen			return m
1379*1c12ee1eSDan Willemsen		}(),
1380*1c12ee1eSDan Willemsen	}, {
1381*1c12ee1eSDan Willemsen		desc:         "extensions of repeated fields",
1382*1c12ee1eSDan Willemsen		inputMessage: &pb2.Extensions{},
1383*1c12ee1eSDan Willemsen		inputText: `[pb2.rpt_ext_enum]: TEN
1384*1c12ee1eSDan Willemsen[pb2.rpt_ext_enum]: 101
1385*1c12ee1eSDan Willemsen[pb2.rpt_ext_fixed32]: 42
1386*1c12ee1eSDan Willemsen[pb2.rpt_ext_enum]: ONE
1387*1c12ee1eSDan Willemsen[pb2.rpt_ext_nested]: {
1388*1c12ee1eSDan Willemsen  opt_string: "one"
1389*1c12ee1eSDan Willemsen}
1390*1c12ee1eSDan Willemsen[pb2.rpt_ext_nested]: {
1391*1c12ee1eSDan Willemsen  opt_string: "two"
1392*1c12ee1eSDan Willemsen}
1393*1c12ee1eSDan Willemsen[pb2.rpt_ext_fixed32]: 47
1394*1c12ee1eSDan Willemsen[pb2.rpt_ext_nested]: {
1395*1c12ee1eSDan Willemsen  opt_string: "three"
1396*1c12ee1eSDan Willemsen}
1397*1c12ee1eSDan Willemsen`,
1398*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1399*1c12ee1eSDan Willemsen			m := &pb2.Extensions{}
1400*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1401*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_RptExtFixed32, []uint32{42, 47})
1402*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_RptExtNested, []*pb2.Nested{
1403*1c12ee1eSDan Willemsen				&pb2.Nested{OptString: proto.String("one")},
1404*1c12ee1eSDan Willemsen				&pb2.Nested{OptString: proto.String("two")},
1405*1c12ee1eSDan Willemsen				&pb2.Nested{OptString: proto.String("three")},
1406*1c12ee1eSDan Willemsen			})
1407*1c12ee1eSDan Willemsen			return m
1408*1c12ee1eSDan Willemsen		}(),
1409*1c12ee1eSDan Willemsen	}, {
1410*1c12ee1eSDan Willemsen		desc:         "extensions of non-repeated fields in another message",
1411*1c12ee1eSDan Willemsen		inputMessage: &pb2.Extensions{},
1412*1c12ee1eSDan Willemsen		inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
1413*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.opt_ext_enum]: TEN
1414*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.opt_ext_nested]: {
1415*1c12ee1eSDan Willemsen  opt_string: "nested in an extension"
1416*1c12ee1eSDan Willemsen  opt_nested: {
1417*1c12ee1eSDan Willemsen    opt_string: "another nested in an extension"
1418*1c12ee1eSDan Willemsen  }
1419*1c12ee1eSDan Willemsen}
1420*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
1421*1c12ee1eSDan Willemsen`,
1422*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1423*1c12ee1eSDan Willemsen			m := &pb2.Extensions{}
1424*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
1425*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
1426*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
1427*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
1428*1c12ee1eSDan Willemsen				OptString: proto.String("nested in an extension"),
1429*1c12ee1eSDan Willemsen				OptNested: &pb2.Nested{
1430*1c12ee1eSDan Willemsen					OptString: proto.String("another nested in an extension"),
1431*1c12ee1eSDan Willemsen				},
1432*1c12ee1eSDan Willemsen			})
1433*1c12ee1eSDan Willemsen			return m
1434*1c12ee1eSDan Willemsen		}(),
1435*1c12ee1eSDan Willemsen	}, {
1436*1c12ee1eSDan Willemsen		desc:         "extensions of repeated fields in another message",
1437*1c12ee1eSDan Willemsen		inputMessage: &pb2.Extensions{},
1438*1c12ee1eSDan Willemsen		inputText: `opt_string: "non-extension field"
1439*1c12ee1eSDan Willemsenopt_bool: true
1440*1c12ee1eSDan Willemsenopt_int32: 42
1441*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_nested]: {
1442*1c12ee1eSDan Willemsen  opt_string: "one"
1443*1c12ee1eSDan Willemsen}
1444*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
1445*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_nested]: {
1446*1c12ee1eSDan Willemsen  opt_string: "two"
1447*1c12ee1eSDan Willemsen}
1448*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_enum]: 101
1449*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
1450*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
1451*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_nested]: {
1452*1c12ee1eSDan Willemsen  opt_string: "three"
1453*1c12ee1eSDan Willemsen}
1454*1c12ee1eSDan Willemsen[pb2.ExtensionsContainer.rpt_ext_string]: "world"
1455*1c12ee1eSDan Willemsen`,
1456*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1457*1c12ee1eSDan Willemsen			m := &pb2.Extensions{
1458*1c12ee1eSDan Willemsen				OptString: proto.String("non-extension field"),
1459*1c12ee1eSDan Willemsen				OptBool:   proto.Bool(true),
1460*1c12ee1eSDan Willemsen				OptInt32:  proto.Int32(42),
1461*1c12ee1eSDan Willemsen			}
1462*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1463*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtString, []string{"hello", "world"})
1464*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtNested, []*pb2.Nested{
1465*1c12ee1eSDan Willemsen				&pb2.Nested{OptString: proto.String("one")},
1466*1c12ee1eSDan Willemsen				&pb2.Nested{OptString: proto.String("two")},
1467*1c12ee1eSDan Willemsen				&pb2.Nested{OptString: proto.String("three")},
1468*1c12ee1eSDan Willemsen			})
1469*1c12ee1eSDan Willemsen			return m
1470*1c12ee1eSDan Willemsen		}(),
1471*1c12ee1eSDan Willemsen	}, {
1472*1c12ee1eSDan Willemsen		desc:         "invalid extension field name",
1473*1c12ee1eSDan Willemsen		inputMessage: &pb2.Extensions{},
1474*1c12ee1eSDan Willemsen		inputText:    "[pb2.invalid_message_field]: true",
1475*1c12ee1eSDan Willemsen		wantErr:      "unknown field",
1476*1c12ee1eSDan Willemsen	}, {
1477*1c12ee1eSDan Willemsen		desc:         "MessageSet",
1478*1c12ee1eSDan Willemsen		inputMessage: &pb2.MessageSet{},
1479*1c12ee1eSDan Willemsen		inputText: `
1480*1c12ee1eSDan Willemsen[pb2.MessageSetExtension]: {
1481*1c12ee1eSDan Willemsen  opt_string: "a messageset extension"
1482*1c12ee1eSDan Willemsen}
1483*1c12ee1eSDan Willemsen[pb2.MessageSetExtension.ext_nested]: {
1484*1c12ee1eSDan Willemsen  opt_string: "just a regular extension"
1485*1c12ee1eSDan Willemsen}
1486*1c12ee1eSDan Willemsen[pb2.MessageSetExtension.not_message_set_extension]: {
1487*1c12ee1eSDan Willemsen  opt_string: "not a messageset extension"
1488*1c12ee1eSDan Willemsen}
1489*1c12ee1eSDan Willemsen`,
1490*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1491*1c12ee1eSDan Willemsen			m := &pb2.MessageSet{}
1492*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
1493*1c12ee1eSDan Willemsen				OptString: proto.String("a messageset extension"),
1494*1c12ee1eSDan Willemsen			})
1495*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
1496*1c12ee1eSDan Willemsen				OptString: proto.String("not a messageset extension"),
1497*1c12ee1eSDan Willemsen			})
1498*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
1499*1c12ee1eSDan Willemsen				OptString: proto.String("just a regular extension"),
1500*1c12ee1eSDan Willemsen			})
1501*1c12ee1eSDan Willemsen			return m
1502*1c12ee1eSDan Willemsen		}(),
1503*1c12ee1eSDan Willemsen		skip: !flags.ProtoLegacy,
1504*1c12ee1eSDan Willemsen	}, {
1505*1c12ee1eSDan Willemsen		desc:         "not real MessageSet 1",
1506*1c12ee1eSDan Willemsen		inputMessage: &pb2.FakeMessageSet{},
1507*1c12ee1eSDan Willemsen		inputText: `
1508*1c12ee1eSDan Willemsen[pb2.FakeMessageSetExtension.message_set_extension]: {
1509*1c12ee1eSDan Willemsen  opt_string: "not a messageset extension"
1510*1c12ee1eSDan Willemsen}
1511*1c12ee1eSDan Willemsen`,
1512*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1513*1c12ee1eSDan Willemsen			m := &pb2.FakeMessageSet{}
1514*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
1515*1c12ee1eSDan Willemsen				OptString: proto.String("not a messageset extension"),
1516*1c12ee1eSDan Willemsen			})
1517*1c12ee1eSDan Willemsen			return m
1518*1c12ee1eSDan Willemsen		}(),
1519*1c12ee1eSDan Willemsen		skip: !flags.ProtoLegacy,
1520*1c12ee1eSDan Willemsen	}, {
1521*1c12ee1eSDan Willemsen		desc:         "not real MessageSet 2",
1522*1c12ee1eSDan Willemsen		inputMessage: &pb2.FakeMessageSet{},
1523*1c12ee1eSDan Willemsen		inputText: `
1524*1c12ee1eSDan Willemsen[pb2.FakeMessageSetExtension]: {
1525*1c12ee1eSDan Willemsen  opt_string: "not a messageset extension"
1526*1c12ee1eSDan Willemsen}
1527*1c12ee1eSDan Willemsen`,
1528*1c12ee1eSDan Willemsen		wantErr: `unable to resolve [[pb2.FakeMessageSetExtension]]: found wrong type`,
1529*1c12ee1eSDan Willemsen		skip:    !flags.ProtoLegacy,
1530*1c12ee1eSDan Willemsen	}, {
1531*1c12ee1eSDan Willemsen		desc:         "not real MessageSet 3",
1532*1c12ee1eSDan Willemsen		inputMessage: &pb2.MessageSet{},
1533*1c12ee1eSDan Willemsen		inputText: `
1534*1c12ee1eSDan Willemsen[pb2.message_set_extension]: {
1535*1c12ee1eSDan Willemsen  opt_string: "another not a messageset extension"
1536*1c12ee1eSDan Willemsen}`,
1537*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1538*1c12ee1eSDan Willemsen			m := &pb2.MessageSet{}
1539*1c12ee1eSDan Willemsen			proto.SetExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
1540*1c12ee1eSDan Willemsen				OptString: proto.String("another not a messageset extension"),
1541*1c12ee1eSDan Willemsen			})
1542*1c12ee1eSDan Willemsen			return m
1543*1c12ee1eSDan Willemsen		}(),
1544*1c12ee1eSDan Willemsen		skip: !flags.ProtoLegacy,
1545*1c12ee1eSDan Willemsen	}, {
1546*1c12ee1eSDan Willemsen		desc:         "Any not expanded",
1547*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1548*1c12ee1eSDan Willemsen		inputText: `
1549*1c12ee1eSDan Willemsentype_url: "pb2.Nested"
1550*1c12ee1eSDan Willemsenvalue: "some bytes"
1551*1c12ee1eSDan Willemsen`,
1552*1c12ee1eSDan Willemsen		wantMessage: &anypb.Any{
1553*1c12ee1eSDan Willemsen			TypeUrl: "pb2.Nested",
1554*1c12ee1eSDan Willemsen			Value:   []byte("some bytes"),
1555*1c12ee1eSDan Willemsen		},
1556*1c12ee1eSDan Willemsen	}, {
1557*1c12ee1eSDan Willemsen		desc:         "Any not expanded missing value",
1558*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1559*1c12ee1eSDan Willemsen		inputText:    `type_url: "pb2.Nested"`,
1560*1c12ee1eSDan Willemsen		wantMessage: &anypb.Any{
1561*1c12ee1eSDan Willemsen			TypeUrl: "pb2.Nested",
1562*1c12ee1eSDan Willemsen		},
1563*1c12ee1eSDan Willemsen	}, {
1564*1c12ee1eSDan Willemsen		desc:         "Any not expanded missing type_url",
1565*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1566*1c12ee1eSDan Willemsen		inputText:    `value: "some bytes"`,
1567*1c12ee1eSDan Willemsen		wantMessage: &anypb.Any{
1568*1c12ee1eSDan Willemsen			Value: []byte("some bytes"),
1569*1c12ee1eSDan Willemsen		},
1570*1c12ee1eSDan Willemsen	}, {
1571*1c12ee1eSDan Willemsen		desc:         "Any expanded",
1572*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1573*1c12ee1eSDan Willemsen		inputText: `
1574*1c12ee1eSDan Willemsen[foobar/pb2.Nested]: {
1575*1c12ee1eSDan Willemsen  opt_string: "embedded inside Any"
1576*1c12ee1eSDan Willemsen  opt_nested: {
1577*1c12ee1eSDan Willemsen    opt_string: "inception"
1578*1c12ee1eSDan Willemsen  }
1579*1c12ee1eSDan Willemsen}
1580*1c12ee1eSDan Willemsen`,
1581*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1582*1c12ee1eSDan Willemsen			m := &pb2.Nested{
1583*1c12ee1eSDan Willemsen				OptString: proto.String("embedded inside Any"),
1584*1c12ee1eSDan Willemsen				OptNested: &pb2.Nested{
1585*1c12ee1eSDan Willemsen					OptString: proto.String("inception"),
1586*1c12ee1eSDan Willemsen				},
1587*1c12ee1eSDan Willemsen			}
1588*1c12ee1eSDan Willemsen			b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
1589*1c12ee1eSDan Willemsen			if err != nil {
1590*1c12ee1eSDan Willemsen				t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1591*1c12ee1eSDan Willemsen			}
1592*1c12ee1eSDan Willemsen			return &anypb.Any{
1593*1c12ee1eSDan Willemsen				TypeUrl: "foobar/pb2.Nested",
1594*1c12ee1eSDan Willemsen				Value:   b,
1595*1c12ee1eSDan Willemsen			}
1596*1c12ee1eSDan Willemsen		}(),
1597*1c12ee1eSDan Willemsen	}, {
1598*1c12ee1eSDan Willemsen		desc:         "Any expanded with empty value",
1599*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1600*1c12ee1eSDan Willemsen		inputText:    `[foo.com/pb2.Nested]: {}`,
1601*1c12ee1eSDan Willemsen		wantMessage: &anypb.Any{
1602*1c12ee1eSDan Willemsen			TypeUrl: "foo.com/pb2.Nested",
1603*1c12ee1eSDan Willemsen		},
1604*1c12ee1eSDan Willemsen	}, {
1605*1c12ee1eSDan Willemsen		desc:         "Any expanded with missing required",
1606*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1607*1c12ee1eSDan Willemsen		inputText: `
1608*1c12ee1eSDan Willemsen[pb2.PartialRequired]: {
1609*1c12ee1eSDan Willemsen  opt_string: "embedded inside Any"
1610*1c12ee1eSDan Willemsen}
1611*1c12ee1eSDan Willemsen`,
1612*1c12ee1eSDan Willemsen		wantMessage: func() proto.Message {
1613*1c12ee1eSDan Willemsen			m := &pb2.PartialRequired{
1614*1c12ee1eSDan Willemsen				OptString: proto.String("embedded inside Any"),
1615*1c12ee1eSDan Willemsen			}
1616*1c12ee1eSDan Willemsen			b, err := proto.MarshalOptions{
1617*1c12ee1eSDan Willemsen				AllowPartial:  true,
1618*1c12ee1eSDan Willemsen				Deterministic: true,
1619*1c12ee1eSDan Willemsen			}.Marshal(m)
1620*1c12ee1eSDan Willemsen			if err != nil {
1621*1c12ee1eSDan Willemsen				t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1622*1c12ee1eSDan Willemsen			}
1623*1c12ee1eSDan Willemsen			return &anypb.Any{
1624*1c12ee1eSDan Willemsen				TypeUrl: "pb2.PartialRequired",
1625*1c12ee1eSDan Willemsen				Value:   b,
1626*1c12ee1eSDan Willemsen			}
1627*1c12ee1eSDan Willemsen		}(),
1628*1c12ee1eSDan Willemsen	}, {
1629*1c12ee1eSDan Willemsen		desc:         "Any with invalid UTF-8",
1630*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1631*1c12ee1eSDan Willemsen		inputText: `
1632*1c12ee1eSDan Willemsen[pb3.Nested]: {
1633*1c12ee1eSDan Willemsen  s_string: "abc\xff"
1634*1c12ee1eSDan Willemsen}
1635*1c12ee1eSDan Willemsen`,
1636*1c12ee1eSDan Willemsen		wantErr: "contains invalid UTF-8",
1637*1c12ee1eSDan Willemsen	}, {
1638*1c12ee1eSDan Willemsen		desc:         "Any expanded with unregistered type",
1639*1c12ee1eSDan Willemsen		umo:          prototext.UnmarshalOptions{Resolver: new(protoregistry.Types)},
1640*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1641*1c12ee1eSDan Willemsen		inputText:    `[SomeMessage]: {}`,
1642*1c12ee1eSDan Willemsen		wantErr:      "unable to resolve message [SomeMessage]",
1643*1c12ee1eSDan Willemsen	}, {
1644*1c12ee1eSDan Willemsen		desc:         "Any expanded with invalid value",
1645*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1646*1c12ee1eSDan Willemsen		inputText:    `[pb2.Nested]: 123`,
1647*1c12ee1eSDan Willemsen		wantErr:      "unexpected token: 123",
1648*1c12ee1eSDan Willemsen	}, {
1649*1c12ee1eSDan Willemsen		desc:         "Any expanded with unknown fields",
1650*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1651*1c12ee1eSDan Willemsen		inputText: `
1652*1c12ee1eSDan Willemsen[pb2.Nested]: {}
1653*1c12ee1eSDan Willemsenunknown: ""
1654*1c12ee1eSDan Willemsen`,
1655*1c12ee1eSDan Willemsen		wantErr: `invalid field name "unknown" in google.protobuf.Any message`,
1656*1c12ee1eSDan Willemsen	}, {
1657*1c12ee1eSDan Willemsen		desc:         "Any contains expanded and unexpanded fields",
1658*1c12ee1eSDan Willemsen		inputMessage: &anypb.Any{},
1659*1c12ee1eSDan Willemsen		inputText: `
1660*1c12ee1eSDan Willemsen[pb2.Nested]: {}
1661*1c12ee1eSDan Willemsentype_url: "pb2.Nested"
1662*1c12ee1eSDan Willemsen`,
1663*1c12ee1eSDan Willemsen		wantErr: "(line 3:1): conflict with [pb2.Nested] field",
1664*1c12ee1eSDan Willemsen	}, {
1665*1c12ee1eSDan Willemsen		desc:         "weak fields",
1666*1c12ee1eSDan Willemsen		inputMessage: &testpb.TestWeak{},
1667*1c12ee1eSDan Willemsen		inputText:    `weak_message1:{a:1}`,
1668*1c12ee1eSDan Willemsen		wantMessage: func() *testpb.TestWeak {
1669*1c12ee1eSDan Willemsen			m := new(testpb.TestWeak)
1670*1c12ee1eSDan Willemsen			m.SetWeakMessage1(&weakpb.WeakImportMessage1{A: proto.Int32(1)})
1671*1c12ee1eSDan Willemsen			return m
1672*1c12ee1eSDan Willemsen		}(),
1673*1c12ee1eSDan Willemsen		skip: !flags.ProtoLegacy,
1674*1c12ee1eSDan Willemsen	}, {
1675*1c12ee1eSDan Willemsen		desc:         "weak fields; unknown field",
1676*1c12ee1eSDan Willemsen		inputMessage: &testpb.TestWeak{},
1677*1c12ee1eSDan Willemsen		inputText:    `weak_message1:{a:1} weak_message2:{a:1}`,
1678*1c12ee1eSDan Willemsen		wantErr:      "unknown field: weak_message2", // weak_message2 is unknown since the package containing it is not imported
1679*1c12ee1eSDan Willemsen		skip:         !flags.ProtoLegacy,
1680*1c12ee1eSDan Willemsen	}}
1681*1c12ee1eSDan Willemsen
1682*1c12ee1eSDan Willemsen	for _, tt := range tests {
1683*1c12ee1eSDan Willemsen		tt := tt
1684*1c12ee1eSDan Willemsen		if tt.skip {
1685*1c12ee1eSDan Willemsen			continue
1686*1c12ee1eSDan Willemsen		}
1687*1c12ee1eSDan Willemsen		t.Run(tt.desc, func(t *testing.T) {
1688*1c12ee1eSDan Willemsen			err := tt.umo.Unmarshal([]byte(tt.inputText), tt.inputMessage)
1689*1c12ee1eSDan Willemsen			if err != nil {
1690*1c12ee1eSDan Willemsen				if tt.wantErr == "" {
1691*1c12ee1eSDan Willemsen					t.Errorf("Unmarshal() got unexpected error: %v", err)
1692*1c12ee1eSDan Willemsen				} else if !strings.Contains(err.Error(), tt.wantErr) {
1693*1c12ee1eSDan Willemsen					t.Errorf("Unmarshal() error got %q, want %q", err, tt.wantErr)
1694*1c12ee1eSDan Willemsen				}
1695*1c12ee1eSDan Willemsen				return
1696*1c12ee1eSDan Willemsen			}
1697*1c12ee1eSDan Willemsen			if tt.wantErr != "" {
1698*1c12ee1eSDan Willemsen				t.Errorf("Unmarshal() got nil error, want error %q", tt.wantErr)
1699*1c12ee1eSDan Willemsen				return
1700*1c12ee1eSDan Willemsen			}
1701*1c12ee1eSDan Willemsen			if tt.wantMessage != nil && !proto.Equal(tt.inputMessage, tt.wantMessage) {
1702*1c12ee1eSDan Willemsen				t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
1703*1c12ee1eSDan Willemsen			}
1704*1c12ee1eSDan Willemsen		})
1705*1c12ee1eSDan Willemsen	}
1706*1c12ee1eSDan Willemsen}
1707