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