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 impl_test 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "fmt" 9*1c12ee1eSDan Willemsen "math" 10*1c12ee1eSDan Willemsen "reflect" 11*1c12ee1eSDan Willemsen "runtime" 12*1c12ee1eSDan Willemsen "strings" 13*1c12ee1eSDan Willemsen "sync" 14*1c12ee1eSDan Willemsen "testing" 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsen "github.com/google/go-cmp/cmp" 17*1c12ee1eSDan Willemsen "github.com/google/go-cmp/cmp/cmpopts" 18*1c12ee1eSDan Willemsen 19*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/prototext" 20*1c12ee1eSDan Willemsen pimpl "google.golang.org/protobuf/internal/impl" 21*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 22*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protodesc" 23*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 24*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoregistry" 25*1c12ee1eSDan Willemsen "google.golang.org/protobuf/testing/protopack" 26*1c12ee1eSDan Willemsen 27*1c12ee1eSDan Willemsen proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2_20180125_92554152" 28*1c12ee1eSDan Willemsen testpb "google.golang.org/protobuf/internal/testprotos/test" 29*1c12ee1eSDan Willemsen "google.golang.org/protobuf/types/descriptorpb" 30*1c12ee1eSDan Willemsen) 31*1c12ee1eSDan Willemsen 32*1c12ee1eSDan Willemsen// List of test operations to perform on messages, lists, or maps. 33*1c12ee1eSDan Willemsentype ( 34*1c12ee1eSDan Willemsen messageOp interface{ isMessageOp() } 35*1c12ee1eSDan Willemsen messageOps []messageOp 36*1c12ee1eSDan Willemsen 37*1c12ee1eSDan Willemsen listOp interface{ isListOp() } 38*1c12ee1eSDan Willemsen listOps []listOp 39*1c12ee1eSDan Willemsen 40*1c12ee1eSDan Willemsen mapOp interface{ isMapOp() } 41*1c12ee1eSDan Willemsen mapOps []mapOp 42*1c12ee1eSDan Willemsen) 43*1c12ee1eSDan Willemsen 44*1c12ee1eSDan Willemsen// Test operations performed on a message. 45*1c12ee1eSDan Willemsentype ( 46*1c12ee1eSDan Willemsen // check that the message contents match 47*1c12ee1eSDan Willemsen equalMessage struct{ protoreflect.Message } 48*1c12ee1eSDan Willemsen // check presence for specific fields in the message 49*1c12ee1eSDan Willemsen hasFields map[protoreflect.FieldNumber]bool 50*1c12ee1eSDan Willemsen // check that specific message fields match 51*1c12ee1eSDan Willemsen getFields map[protoreflect.FieldNumber]protoreflect.Value 52*1c12ee1eSDan Willemsen // set specific message fields 53*1c12ee1eSDan Willemsen setFields map[protoreflect.FieldNumber]protoreflect.Value 54*1c12ee1eSDan Willemsen // clear specific fields in the message 55*1c12ee1eSDan Willemsen clearFields []protoreflect.FieldNumber 56*1c12ee1eSDan Willemsen // check for the presence of specific oneof member fields. 57*1c12ee1eSDan Willemsen whichOneofs map[protoreflect.Name]protoreflect.FieldNumber 58*1c12ee1eSDan Willemsen // apply messageOps on each specified message field 59*1c12ee1eSDan Willemsen messageFields map[protoreflect.FieldNumber]messageOps 60*1c12ee1eSDan Willemsen messageFieldsMutable map[protoreflect.FieldNumber]messageOps 61*1c12ee1eSDan Willemsen // apply listOps on each specified list field 62*1c12ee1eSDan Willemsen listFields map[protoreflect.FieldNumber]listOps 63*1c12ee1eSDan Willemsen listFieldsMutable map[protoreflect.FieldNumber]listOps 64*1c12ee1eSDan Willemsen // apply mapOps on each specified map fields 65*1c12ee1eSDan Willemsen mapFields map[protoreflect.FieldNumber]mapOps 66*1c12ee1eSDan Willemsen mapFieldsMutable map[protoreflect.FieldNumber]mapOps 67*1c12ee1eSDan Willemsen // range through all fields and check that they match 68*1c12ee1eSDan Willemsen rangeFields map[protoreflect.FieldNumber]protoreflect.Value 69*1c12ee1eSDan Willemsen) 70*1c12ee1eSDan Willemsen 71*1c12ee1eSDan Willemsenfunc (equalMessage) isMessageOp() {} 72*1c12ee1eSDan Willemsenfunc (hasFields) isMessageOp() {} 73*1c12ee1eSDan Willemsenfunc (getFields) isMessageOp() {} 74*1c12ee1eSDan Willemsenfunc (setFields) isMessageOp() {} 75*1c12ee1eSDan Willemsenfunc (clearFields) isMessageOp() {} 76*1c12ee1eSDan Willemsenfunc (whichOneofs) isMessageOp() {} 77*1c12ee1eSDan Willemsenfunc (messageFields) isMessageOp() {} 78*1c12ee1eSDan Willemsenfunc (messageFieldsMutable) isMessageOp() {} 79*1c12ee1eSDan Willemsenfunc (listFields) isMessageOp() {} 80*1c12ee1eSDan Willemsenfunc (listFieldsMutable) isMessageOp() {} 81*1c12ee1eSDan Willemsenfunc (mapFields) isMessageOp() {} 82*1c12ee1eSDan Willemsenfunc (mapFieldsMutable) isMessageOp() {} 83*1c12ee1eSDan Willemsenfunc (rangeFields) isMessageOp() {} 84*1c12ee1eSDan Willemsen 85*1c12ee1eSDan Willemsen// Test operations performed on a list. 86*1c12ee1eSDan Willemsentype ( 87*1c12ee1eSDan Willemsen // check that the list contents match 88*1c12ee1eSDan Willemsen equalList struct{ protoreflect.List } 89*1c12ee1eSDan Willemsen // check that list length matches 90*1c12ee1eSDan Willemsen lenList int 91*1c12ee1eSDan Willemsen // check that specific list entries match 92*1c12ee1eSDan Willemsen getList map[int]protoreflect.Value 93*1c12ee1eSDan Willemsen // set specific list entries 94*1c12ee1eSDan Willemsen setList map[int]protoreflect.Value 95*1c12ee1eSDan Willemsen // append entries to the list 96*1c12ee1eSDan Willemsen appendList []protoreflect.Value 97*1c12ee1eSDan Willemsen // apply messageOps on a newly appended message 98*1c12ee1eSDan Willemsen appendMessageList messageOps 99*1c12ee1eSDan Willemsen // truncate the list to the specified length 100*1c12ee1eSDan Willemsen truncList int 101*1c12ee1eSDan Willemsen) 102*1c12ee1eSDan Willemsen 103*1c12ee1eSDan Willemsenfunc (equalList) isListOp() {} 104*1c12ee1eSDan Willemsenfunc (lenList) isListOp() {} 105*1c12ee1eSDan Willemsenfunc (getList) isListOp() {} 106*1c12ee1eSDan Willemsenfunc (setList) isListOp() {} 107*1c12ee1eSDan Willemsenfunc (appendList) isListOp() {} 108*1c12ee1eSDan Willemsenfunc (appendMessageList) isListOp() {} 109*1c12ee1eSDan Willemsenfunc (truncList) isListOp() {} 110*1c12ee1eSDan Willemsen 111*1c12ee1eSDan Willemsen// Test operations performed on a map. 112*1c12ee1eSDan Willemsentype ( 113*1c12ee1eSDan Willemsen // check that the map contents match 114*1c12ee1eSDan Willemsen equalMap struct{ protoreflect.Map } 115*1c12ee1eSDan Willemsen // check that map length matches 116*1c12ee1eSDan Willemsen lenMap int 117*1c12ee1eSDan Willemsen // check presence for specific entries in the map 118*1c12ee1eSDan Willemsen hasMap map[interface{}]bool 119*1c12ee1eSDan Willemsen // check that specific map entries match 120*1c12ee1eSDan Willemsen getMap map[interface{}]protoreflect.Value 121*1c12ee1eSDan Willemsen // set specific map entries 122*1c12ee1eSDan Willemsen setMap map[interface{}]protoreflect.Value 123*1c12ee1eSDan Willemsen // clear specific entries in the map 124*1c12ee1eSDan Willemsen clearMap []interface{} 125*1c12ee1eSDan Willemsen // apply messageOps on each specified message entry 126*1c12ee1eSDan Willemsen messageMap map[interface{}]messageOps 127*1c12ee1eSDan Willemsen // range through all entries and check that they match 128*1c12ee1eSDan Willemsen rangeMap map[interface{}]protoreflect.Value 129*1c12ee1eSDan Willemsen) 130*1c12ee1eSDan Willemsen 131*1c12ee1eSDan Willemsenfunc (equalMap) isMapOp() {} 132*1c12ee1eSDan Willemsenfunc (lenMap) isMapOp() {} 133*1c12ee1eSDan Willemsenfunc (hasMap) isMapOp() {} 134*1c12ee1eSDan Willemsenfunc (getMap) isMapOp() {} 135*1c12ee1eSDan Willemsenfunc (setMap) isMapOp() {} 136*1c12ee1eSDan Willemsenfunc (clearMap) isMapOp() {} 137*1c12ee1eSDan Willemsenfunc (messageMap) isMapOp() {} 138*1c12ee1eSDan Willemsenfunc (rangeMap) isMapOp() {} 139*1c12ee1eSDan Willemsen 140*1c12ee1eSDan Willemsentype ScalarProto2 struct { 141*1c12ee1eSDan Willemsen Bool *bool `protobuf:"1"` 142*1c12ee1eSDan Willemsen Int32 *int32 `protobuf:"2"` 143*1c12ee1eSDan Willemsen Int64 *int64 `protobuf:"3"` 144*1c12ee1eSDan Willemsen Uint32 *uint32 `protobuf:"4"` 145*1c12ee1eSDan Willemsen Uint64 *uint64 `protobuf:"5"` 146*1c12ee1eSDan Willemsen Float32 *float32 `protobuf:"6"` 147*1c12ee1eSDan Willemsen Float64 *float64 `protobuf:"7"` 148*1c12ee1eSDan Willemsen String *string `protobuf:"8"` 149*1c12ee1eSDan Willemsen StringA []byte `protobuf:"9"` 150*1c12ee1eSDan Willemsen Bytes []byte `protobuf:"10"` 151*1c12ee1eSDan Willemsen BytesA *string `protobuf:"11"` 152*1c12ee1eSDan Willemsen 153*1c12ee1eSDan Willemsen MyBool *MyBool `protobuf:"12"` 154*1c12ee1eSDan Willemsen MyInt32 *MyInt32 `protobuf:"13"` 155*1c12ee1eSDan Willemsen MyInt64 *MyInt64 `protobuf:"14"` 156*1c12ee1eSDan Willemsen MyUint32 *MyUint32 `protobuf:"15"` 157*1c12ee1eSDan Willemsen MyUint64 *MyUint64 `protobuf:"16"` 158*1c12ee1eSDan Willemsen MyFloat32 *MyFloat32 `protobuf:"17"` 159*1c12ee1eSDan Willemsen MyFloat64 *MyFloat64 `protobuf:"18"` 160*1c12ee1eSDan Willemsen MyString *MyString `protobuf:"19"` 161*1c12ee1eSDan Willemsen MyStringA MyBytes `protobuf:"20"` 162*1c12ee1eSDan Willemsen MyBytes MyBytes `protobuf:"21"` 163*1c12ee1eSDan Willemsen MyBytesA *MyString `protobuf:"22"` 164*1c12ee1eSDan Willemsen} 165*1c12ee1eSDan Willemsen 166*1c12ee1eSDan Willemsenfunc mustMakeEnumDesc(path string, syntax protoreflect.Syntax, enumDesc string) protoreflect.EnumDescriptor { 167*1c12ee1eSDan Willemsen s := fmt.Sprintf(`name:%q syntax:%q enum_type:[{%s}]`, path, syntax, enumDesc) 168*1c12ee1eSDan Willemsen pb := new(descriptorpb.FileDescriptorProto) 169*1c12ee1eSDan Willemsen if err := prototext.Unmarshal([]byte(s), pb); err != nil { 170*1c12ee1eSDan Willemsen panic(err) 171*1c12ee1eSDan Willemsen } 172*1c12ee1eSDan Willemsen fd, err := protodesc.NewFile(pb, nil) 173*1c12ee1eSDan Willemsen if err != nil { 174*1c12ee1eSDan Willemsen panic(err) 175*1c12ee1eSDan Willemsen } 176*1c12ee1eSDan Willemsen return fd.Enums().Get(0) 177*1c12ee1eSDan Willemsen} 178*1c12ee1eSDan Willemsen 179*1c12ee1eSDan Willemsenfunc mustMakeMessageDesc(path string, syntax protoreflect.Syntax, fileDesc, msgDesc string, r protodesc.Resolver) protoreflect.MessageDescriptor { 180*1c12ee1eSDan Willemsen s := fmt.Sprintf(`name:%q syntax:%q %s message_type:[{%s}]`, path, syntax, fileDesc, msgDesc) 181*1c12ee1eSDan Willemsen pb := new(descriptorpb.FileDescriptorProto) 182*1c12ee1eSDan Willemsen if err := prototext.Unmarshal([]byte(s), pb); err != nil { 183*1c12ee1eSDan Willemsen panic(err) 184*1c12ee1eSDan Willemsen } 185*1c12ee1eSDan Willemsen fd, err := protodesc.NewFile(pb, r) 186*1c12ee1eSDan Willemsen if err != nil { 187*1c12ee1eSDan Willemsen panic(err) 188*1c12ee1eSDan Willemsen } 189*1c12ee1eSDan Willemsen return fd.Messages().Get(0) 190*1c12ee1eSDan Willemsen} 191*1c12ee1eSDan Willemsen 192*1c12ee1eSDan Willemsenvar V = protoreflect.ValueOf 193*1c12ee1eSDan Willemsenvar VE = func(n protoreflect.EnumNumber) protoreflect.Value { return V(n) } 194*1c12ee1eSDan Willemsen 195*1c12ee1eSDan Willemsentype ( 196*1c12ee1eSDan Willemsen MyBool bool 197*1c12ee1eSDan Willemsen MyInt32 int32 198*1c12ee1eSDan Willemsen MyInt64 int64 199*1c12ee1eSDan Willemsen MyUint32 uint32 200*1c12ee1eSDan Willemsen MyUint64 uint64 201*1c12ee1eSDan Willemsen MyFloat32 float32 202*1c12ee1eSDan Willemsen MyFloat64 float64 203*1c12ee1eSDan Willemsen MyString string 204*1c12ee1eSDan Willemsen MyBytes []byte 205*1c12ee1eSDan Willemsen 206*1c12ee1eSDan Willemsen ListStrings []MyString 207*1c12ee1eSDan Willemsen ListBytes []MyBytes 208*1c12ee1eSDan Willemsen 209*1c12ee1eSDan Willemsen MapStrings map[MyString]MyString 210*1c12ee1eSDan Willemsen MapBytes map[MyString]MyBytes 211*1c12ee1eSDan Willemsen) 212*1c12ee1eSDan Willemsen 213*1c12ee1eSDan Willemsenvar scalarProto2Type = pimpl.MessageInfo{GoReflectType: reflect.TypeOf(new(ScalarProto2)), Desc: mustMakeMessageDesc("scalar2.proto", protoreflect.Proto2, "", ` 214*1c12ee1eSDan Willemsen name: "ScalarProto2" 215*1c12ee1eSDan Willemsen field: [ 216*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL default_value:"true"}, 217*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 default_value:"2"}, 218*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_OPTIONAL type:TYPE_INT64 default_value:"3"}, 219*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"4"}, 220*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"5"}, 221*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_OPTIONAL type:TYPE_FLOAT default_value:"6"}, 222*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"7"}, 223*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"8"}, 224*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"9"}, 225*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"10"}, 226*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"11"}, 227*1c12ee1eSDan Willemsen 228*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BOOL default_value:"true"}, 229*1c12ee1eSDan Willemsen {name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_INT32 default_value:"13"}, 230*1c12ee1eSDan Willemsen {name:"f14" number:14 label:LABEL_OPTIONAL type:TYPE_INT64 default_value:"14"}, 231*1c12ee1eSDan Willemsen {name:"f15" number:15 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"15"}, 232*1c12ee1eSDan Willemsen {name:"f16" number:16 label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"16"}, 233*1c12ee1eSDan Willemsen {name:"f17" number:17 label:LABEL_OPTIONAL type:TYPE_FLOAT default_value:"17"}, 234*1c12ee1eSDan Willemsen {name:"f18" number:18 label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"18"}, 235*1c12ee1eSDan Willemsen {name:"f19" number:19 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"19"}, 236*1c12ee1eSDan Willemsen {name:"f20" number:20 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"20"}, 237*1c12ee1eSDan Willemsen {name:"f21" number:21 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"21"}, 238*1c12ee1eSDan Willemsen {name:"f22" number:22 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"22"} 239*1c12ee1eSDan Willemsen ] 240*1c12ee1eSDan Willemsen `, nil), 241*1c12ee1eSDan Willemsen} 242*1c12ee1eSDan Willemsen 243*1c12ee1eSDan Willemsenfunc (m *ScalarProto2) ProtoReflect() protoreflect.Message { return scalarProto2Type.MessageOf(m) } 244*1c12ee1eSDan Willemsen 245*1c12ee1eSDan Willemsenfunc TestScalarProto2(t *testing.T) { 246*1c12ee1eSDan Willemsen testMessage(t, nil, new(ScalarProto2).ProtoReflect(), messageOps{ 247*1c12ee1eSDan Willemsen hasFields{ 248*1c12ee1eSDan Willemsen 1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 249*1c12ee1eSDan Willemsen 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 250*1c12ee1eSDan Willemsen }, 251*1c12ee1eSDan Willemsen getFields{ 252*1c12ee1eSDan Willemsen 1: V(bool(true)), 2: V(int32(2)), 3: V(int64(3)), 4: V(uint32(4)), 5: V(uint64(5)), 6: V(float32(6)), 7: V(float64(7)), 8: V(string("8")), 9: V(string("9")), 10: V([]byte("10")), 11: V([]byte("11")), 253*1c12ee1eSDan Willemsen 12: V(bool(true)), 13: V(int32(13)), 14: V(int64(14)), 15: V(uint32(15)), 16: V(uint64(16)), 17: V(float32(17)), 18: V(float64(18)), 19: V(string("19")), 20: V(string("20")), 21: V([]byte("21")), 22: V([]byte("22")), 254*1c12ee1eSDan Willemsen }, 255*1c12ee1eSDan Willemsen setFields{ 256*1c12ee1eSDan Willemsen 1: V(bool(false)), 2: V(int32(0)), 3: V(int64(0)), 4: V(uint32(0)), 5: V(uint64(0)), 6: V(float32(0)), 7: V(float64(0)), 8: V(string("")), 9: V(string("")), 10: V([]byte(nil)), 11: V([]byte(nil)), 257*1c12ee1eSDan Willemsen 12: V(bool(false)), 13: V(int32(0)), 14: V(int64(0)), 15: V(uint32(0)), 16: V(uint64(0)), 17: V(float32(0)), 18: V(float64(0)), 19: V(string("")), 20: V(string("")), 21: V([]byte(nil)), 22: V([]byte(nil)), 258*1c12ee1eSDan Willemsen }, 259*1c12ee1eSDan Willemsen hasFields{ 260*1c12ee1eSDan Willemsen 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true, 9: true, 10: true, 11: true, 261*1c12ee1eSDan Willemsen 12: true, 13: true, 14: true, 15: true, 16: true, 17: true, 18: true, 19: true, 20: true, 21: true, 22: true, 262*1c12ee1eSDan Willemsen }, 263*1c12ee1eSDan Willemsen equalMessage{(&ScalarProto2{ 264*1c12ee1eSDan Willemsen new(bool), new(int32), new(int64), new(uint32), new(uint64), new(float32), new(float64), new(string), []byte{}, []byte{}, new(string), 265*1c12ee1eSDan Willemsen new(MyBool), new(MyInt32), new(MyInt64), new(MyUint32), new(MyUint64), new(MyFloat32), new(MyFloat64), new(MyString), MyBytes{}, MyBytes{}, new(MyString), 266*1c12ee1eSDan Willemsen }).ProtoReflect()}, 267*1c12ee1eSDan Willemsen clearFields{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}, 268*1c12ee1eSDan Willemsen equalMessage{new(ScalarProto2).ProtoReflect()}, 269*1c12ee1eSDan Willemsen 270*1c12ee1eSDan Willemsen // Setting a bytes field nil empty bytes should preserve presence. 271*1c12ee1eSDan Willemsen setFields{10: V([]byte(nil)), 11: V([]byte(nil)), 21: V([]byte(nil)), 22: V([]byte(nil))}, 272*1c12ee1eSDan Willemsen getFields{10: V([]byte{}), 11: V([]byte(nil)), 21: V([]byte{}), 22: V([]byte(nil))}, 273*1c12ee1eSDan Willemsen hasFields{10: true, 11: true, 21: true, 22: true}, 274*1c12ee1eSDan Willemsen }) 275*1c12ee1eSDan Willemsen 276*1c12ee1eSDan Willemsen // Test read-only operations on nil message. 277*1c12ee1eSDan Willemsen testMessage(t, nil, (*ScalarProto2)(nil).ProtoReflect(), messageOps{ 278*1c12ee1eSDan Willemsen hasFields{ 279*1c12ee1eSDan Willemsen 1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 280*1c12ee1eSDan Willemsen 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 281*1c12ee1eSDan Willemsen }, 282*1c12ee1eSDan Willemsen getFields{ 283*1c12ee1eSDan Willemsen 1: V(bool(true)), 2: V(int32(2)), 3: V(int64(3)), 4: V(uint32(4)), 5: V(uint64(5)), 6: V(float32(6)), 7: V(float64(7)), 8: V(string("8")), 9: V(string("9")), 10: V([]byte("10")), 11: V([]byte("11")), 284*1c12ee1eSDan Willemsen 12: V(bool(true)), 13: V(int32(13)), 14: V(int64(14)), 15: V(uint32(15)), 16: V(uint64(16)), 17: V(float32(17)), 18: V(float64(18)), 19: V(string("19")), 20: V(string("20")), 21: V([]byte("21")), 22: V([]byte("22")), 285*1c12ee1eSDan Willemsen }, 286*1c12ee1eSDan Willemsen }) 287*1c12ee1eSDan Willemsen} 288*1c12ee1eSDan Willemsen 289*1c12ee1eSDan Willemsentype ScalarProto3 struct { 290*1c12ee1eSDan Willemsen Bool bool `protobuf:"1"` 291*1c12ee1eSDan Willemsen Int32 int32 `protobuf:"2"` 292*1c12ee1eSDan Willemsen Int64 int64 `protobuf:"3"` 293*1c12ee1eSDan Willemsen Uint32 uint32 `protobuf:"4"` 294*1c12ee1eSDan Willemsen Uint64 uint64 `protobuf:"5"` 295*1c12ee1eSDan Willemsen Float32 float32 `protobuf:"6"` 296*1c12ee1eSDan Willemsen Float64 float64 `protobuf:"7"` 297*1c12ee1eSDan Willemsen String string `protobuf:"8"` 298*1c12ee1eSDan Willemsen StringA []byte `protobuf:"9"` 299*1c12ee1eSDan Willemsen Bytes []byte `protobuf:"10"` 300*1c12ee1eSDan Willemsen BytesA string `protobuf:"11"` 301*1c12ee1eSDan Willemsen 302*1c12ee1eSDan Willemsen MyBool MyBool `protobuf:"12"` 303*1c12ee1eSDan Willemsen MyInt32 MyInt32 `protobuf:"13"` 304*1c12ee1eSDan Willemsen MyInt64 MyInt64 `protobuf:"14"` 305*1c12ee1eSDan Willemsen MyUint32 MyUint32 `protobuf:"15"` 306*1c12ee1eSDan Willemsen MyUint64 MyUint64 `protobuf:"16"` 307*1c12ee1eSDan Willemsen MyFloat32 MyFloat32 `protobuf:"17"` 308*1c12ee1eSDan Willemsen MyFloat64 MyFloat64 `protobuf:"18"` 309*1c12ee1eSDan Willemsen MyString MyString `protobuf:"19"` 310*1c12ee1eSDan Willemsen MyStringA MyBytes `protobuf:"20"` 311*1c12ee1eSDan Willemsen MyBytes MyBytes `protobuf:"21"` 312*1c12ee1eSDan Willemsen MyBytesA MyString `protobuf:"22"` 313*1c12ee1eSDan Willemsen} 314*1c12ee1eSDan Willemsen 315*1c12ee1eSDan Willemsenvar scalarProto3Type = pimpl.MessageInfo{GoReflectType: reflect.TypeOf(new(ScalarProto3)), Desc: mustMakeMessageDesc("scalar3.proto", protoreflect.Proto3, "", ` 316*1c12ee1eSDan Willemsen name: "ScalarProto3" 317*1c12ee1eSDan Willemsen field: [ 318*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL}, 319*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_OPTIONAL type:TYPE_INT32}, 320*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_OPTIONAL type:TYPE_INT64}, 321*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_OPTIONAL type:TYPE_UINT32}, 322*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_OPTIONAL type:TYPE_UINT64}, 323*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_OPTIONAL type:TYPE_FLOAT}, 324*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_OPTIONAL type:TYPE_DOUBLE}, 325*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_OPTIONAL type:TYPE_STRING}, 326*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_OPTIONAL type:TYPE_STRING}, 327*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_BYTES}, 328*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_BYTES}, 329*1c12ee1eSDan Willemsen 330*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BOOL}, 331*1c12ee1eSDan Willemsen {name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_INT32}, 332*1c12ee1eSDan Willemsen {name:"f14" number:14 label:LABEL_OPTIONAL type:TYPE_INT64}, 333*1c12ee1eSDan Willemsen {name:"f15" number:15 label:LABEL_OPTIONAL type:TYPE_UINT32}, 334*1c12ee1eSDan Willemsen {name:"f16" number:16 label:LABEL_OPTIONAL type:TYPE_UINT64}, 335*1c12ee1eSDan Willemsen {name:"f17" number:17 label:LABEL_OPTIONAL type:TYPE_FLOAT}, 336*1c12ee1eSDan Willemsen {name:"f18" number:18 label:LABEL_OPTIONAL type:TYPE_DOUBLE}, 337*1c12ee1eSDan Willemsen {name:"f19" number:19 label:LABEL_OPTIONAL type:TYPE_STRING}, 338*1c12ee1eSDan Willemsen {name:"f20" number:20 label:LABEL_OPTIONAL type:TYPE_STRING}, 339*1c12ee1eSDan Willemsen {name:"f21" number:21 label:LABEL_OPTIONAL type:TYPE_BYTES}, 340*1c12ee1eSDan Willemsen {name:"f22" number:22 label:LABEL_OPTIONAL type:TYPE_BYTES} 341*1c12ee1eSDan Willemsen ] 342*1c12ee1eSDan Willemsen `, nil), 343*1c12ee1eSDan Willemsen} 344*1c12ee1eSDan Willemsen 345*1c12ee1eSDan Willemsenfunc (m *ScalarProto3) ProtoReflect() protoreflect.Message { return scalarProto3Type.MessageOf(m) } 346*1c12ee1eSDan Willemsen 347*1c12ee1eSDan Willemsenfunc TestScalarProto3(t *testing.T) { 348*1c12ee1eSDan Willemsen testMessage(t, nil, new(ScalarProto3).ProtoReflect(), messageOps{ 349*1c12ee1eSDan Willemsen hasFields{ 350*1c12ee1eSDan Willemsen 1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 351*1c12ee1eSDan Willemsen 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 352*1c12ee1eSDan Willemsen }, 353*1c12ee1eSDan Willemsen getFields{ 354*1c12ee1eSDan Willemsen 1: V(bool(false)), 2: V(int32(0)), 3: V(int64(0)), 4: V(uint32(0)), 5: V(uint64(0)), 6: V(float32(0)), 7: V(float64(0)), 8: V(string("")), 9: V(string("")), 10: V([]byte(nil)), 11: V([]byte(nil)), 355*1c12ee1eSDan Willemsen 12: V(bool(false)), 13: V(int32(0)), 14: V(int64(0)), 15: V(uint32(0)), 16: V(uint64(0)), 17: V(float32(0)), 18: V(float64(0)), 19: V(string("")), 20: V(string("")), 21: V([]byte(nil)), 22: V([]byte(nil)), 356*1c12ee1eSDan Willemsen }, 357*1c12ee1eSDan Willemsen setFields{ 358*1c12ee1eSDan Willemsen 1: V(bool(false)), 2: V(int32(0)), 3: V(int64(0)), 4: V(uint32(0)), 5: V(uint64(0)), 6: V(float32(0)), 7: V(float64(0)), 8: V(string("")), 9: V(string("")), 10: V([]byte(nil)), 11: V([]byte(nil)), 359*1c12ee1eSDan Willemsen 12: V(bool(false)), 13: V(int32(0)), 14: V(int64(0)), 15: V(uint32(0)), 16: V(uint64(0)), 17: V(float32(0)), 18: V(float64(0)), 19: V(string("")), 20: V(string("")), 21: V([]byte(nil)), 22: V([]byte(nil)), 360*1c12ee1eSDan Willemsen }, 361*1c12ee1eSDan Willemsen hasFields{ 362*1c12ee1eSDan Willemsen 1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 363*1c12ee1eSDan Willemsen 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 364*1c12ee1eSDan Willemsen }, 365*1c12ee1eSDan Willemsen equalMessage{new(ScalarProto3).ProtoReflect()}, 366*1c12ee1eSDan Willemsen setFields{ 367*1c12ee1eSDan Willemsen 1: V(bool(true)), 2: V(int32(2)), 3: V(int64(3)), 4: V(uint32(4)), 5: V(uint64(5)), 6: V(float32(6)), 7: V(float64(7)), 8: V(string("8")), 9: V(string("9")), 10: V([]byte("10")), 11: V([]byte("11")), 368*1c12ee1eSDan Willemsen 12: V(bool(true)), 13: V(int32(13)), 14: V(int64(14)), 15: V(uint32(15)), 16: V(uint64(16)), 17: V(float32(17)), 18: V(float64(18)), 19: V(string("19")), 20: V(string("20")), 21: V([]byte("21")), 22: V([]byte("22")), 369*1c12ee1eSDan Willemsen }, 370*1c12ee1eSDan Willemsen hasFields{ 371*1c12ee1eSDan Willemsen 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true, 9: true, 10: true, 11: true, 372*1c12ee1eSDan Willemsen 12: true, 13: true, 14: true, 15: true, 16: true, 17: true, 18: true, 19: true, 20: true, 21: true, 22: true, 373*1c12ee1eSDan Willemsen }, 374*1c12ee1eSDan Willemsen equalMessage{(&ScalarProto3{ 375*1c12ee1eSDan Willemsen true, 2, 3, 4, 5, 6, 7, "8", []byte("9"), []byte("10"), "11", 376*1c12ee1eSDan Willemsen true, 13, 14, 15, 16, 17, 18, "19", []byte("20"), []byte("21"), "22", 377*1c12ee1eSDan Willemsen }).ProtoReflect()}, 378*1c12ee1eSDan Willemsen setFields{ 379*1c12ee1eSDan Willemsen 2: V(int32(-2)), 3: V(int64(-3)), 6: V(float32(math.Inf(-1))), 7: V(float64(math.NaN())), 380*1c12ee1eSDan Willemsen }, 381*1c12ee1eSDan Willemsen hasFields{ 382*1c12ee1eSDan Willemsen 2: true, 3: true, 6: true, 7: true, 383*1c12ee1eSDan Willemsen }, 384*1c12ee1eSDan Willemsen clearFields{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}, 385*1c12ee1eSDan Willemsen equalMessage{new(ScalarProto3).ProtoReflect()}, 386*1c12ee1eSDan Willemsen 387*1c12ee1eSDan Willemsen // Verify that -0 triggers proper Has behavior. 388*1c12ee1eSDan Willemsen hasFields{6: false, 7: false}, 389*1c12ee1eSDan Willemsen setFields{6: V(float32(math.Copysign(0, -1))), 7: V(float64(math.Copysign(0, -1)))}, 390*1c12ee1eSDan Willemsen hasFields{6: true, 7: true}, 391*1c12ee1eSDan Willemsen 392*1c12ee1eSDan Willemsen // Setting a bytes field to non-nil empty bytes should not preserve presence. 393*1c12ee1eSDan Willemsen setFields{10: V([]byte{}), 11: V([]byte{}), 21: V([]byte{}), 22: V([]byte{})}, 394*1c12ee1eSDan Willemsen getFields{10: V([]byte(nil)), 11: V([]byte(nil)), 21: V([]byte(nil)), 22: V([]byte(nil))}, 395*1c12ee1eSDan Willemsen hasFields{10: false, 11: false, 21: false, 22: false}, 396*1c12ee1eSDan Willemsen }) 397*1c12ee1eSDan Willemsen 398*1c12ee1eSDan Willemsen // Test read-only operations on nil message. 399*1c12ee1eSDan Willemsen testMessage(t, nil, (*ScalarProto3)(nil).ProtoReflect(), messageOps{ 400*1c12ee1eSDan Willemsen hasFields{ 401*1c12ee1eSDan Willemsen 1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 402*1c12ee1eSDan Willemsen 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 403*1c12ee1eSDan Willemsen }, 404*1c12ee1eSDan Willemsen getFields{ 405*1c12ee1eSDan Willemsen 1: V(bool(false)), 2: V(int32(0)), 3: V(int64(0)), 4: V(uint32(0)), 5: V(uint64(0)), 6: V(float32(0)), 7: V(float64(0)), 8: V(string("")), 9: V(string("")), 10: V([]byte(nil)), 11: V([]byte(nil)), 406*1c12ee1eSDan Willemsen 12: V(bool(false)), 13: V(int32(0)), 14: V(int64(0)), 15: V(uint32(0)), 16: V(uint64(0)), 17: V(float32(0)), 18: V(float64(0)), 19: V(string("")), 20: V(string("")), 21: V([]byte(nil)), 22: V([]byte(nil)), 407*1c12ee1eSDan Willemsen }, 408*1c12ee1eSDan Willemsen }) 409*1c12ee1eSDan Willemsen} 410*1c12ee1eSDan Willemsen 411*1c12ee1eSDan Willemsentype ListScalars struct { 412*1c12ee1eSDan Willemsen Bools []bool `protobuf:"1"` 413*1c12ee1eSDan Willemsen Int32s []int32 `protobuf:"2"` 414*1c12ee1eSDan Willemsen Int64s []int64 `protobuf:"3"` 415*1c12ee1eSDan Willemsen Uint32s []uint32 `protobuf:"4"` 416*1c12ee1eSDan Willemsen Uint64s []uint64 `protobuf:"5"` 417*1c12ee1eSDan Willemsen Float32s []float32 `protobuf:"6"` 418*1c12ee1eSDan Willemsen Float64s []float64 `protobuf:"7"` 419*1c12ee1eSDan Willemsen Strings []string `protobuf:"8"` 420*1c12ee1eSDan Willemsen StringsA [][]byte `protobuf:"9"` 421*1c12ee1eSDan Willemsen Bytes [][]byte `protobuf:"10"` 422*1c12ee1eSDan Willemsen BytesA []string `protobuf:"11"` 423*1c12ee1eSDan Willemsen 424*1c12ee1eSDan Willemsen MyStrings1 []MyString `protobuf:"12"` 425*1c12ee1eSDan Willemsen MyStrings2 []MyBytes `protobuf:"13"` 426*1c12ee1eSDan Willemsen MyBytes1 []MyBytes `protobuf:"14"` 427*1c12ee1eSDan Willemsen MyBytes2 []MyString `protobuf:"15"` 428*1c12ee1eSDan Willemsen 429*1c12ee1eSDan Willemsen MyStrings3 ListStrings `protobuf:"16"` 430*1c12ee1eSDan Willemsen MyStrings4 ListBytes `protobuf:"17"` 431*1c12ee1eSDan Willemsen MyBytes3 ListBytes `protobuf:"18"` 432*1c12ee1eSDan Willemsen MyBytes4 ListStrings `protobuf:"19"` 433*1c12ee1eSDan Willemsen} 434*1c12ee1eSDan Willemsen 435*1c12ee1eSDan Willemsenvar listScalarsType = pimpl.MessageInfo{GoReflectType: reflect.TypeOf(new(ListScalars)), Desc: mustMakeMessageDesc("list-scalars.proto", protoreflect.Proto2, "", ` 436*1c12ee1eSDan Willemsen name: "ListScalars" 437*1c12ee1eSDan Willemsen field: [ 438*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_REPEATED type:TYPE_BOOL}, 439*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_REPEATED type:TYPE_INT32}, 440*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_REPEATED type:TYPE_INT64}, 441*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_REPEATED type:TYPE_UINT32}, 442*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_REPEATED type:TYPE_UINT64}, 443*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_REPEATED type:TYPE_FLOAT}, 444*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_REPEATED type:TYPE_DOUBLE}, 445*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_REPEATED type:TYPE_STRING}, 446*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_REPEATED type:TYPE_STRING}, 447*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_REPEATED type:TYPE_BYTES}, 448*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_REPEATED type:TYPE_BYTES}, 449*1c12ee1eSDan Willemsen 450*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_REPEATED type:TYPE_STRING}, 451*1c12ee1eSDan Willemsen {name:"f13" number:13 label:LABEL_REPEATED type:TYPE_STRING}, 452*1c12ee1eSDan Willemsen {name:"f14" number:14 label:LABEL_REPEATED type:TYPE_BYTES}, 453*1c12ee1eSDan Willemsen {name:"f15" number:15 label:LABEL_REPEATED type:TYPE_BYTES}, 454*1c12ee1eSDan Willemsen 455*1c12ee1eSDan Willemsen {name:"f16" number:16 label:LABEL_REPEATED type:TYPE_STRING}, 456*1c12ee1eSDan Willemsen {name:"f17" number:17 label:LABEL_REPEATED type:TYPE_STRING}, 457*1c12ee1eSDan Willemsen {name:"f18" number:18 label:LABEL_REPEATED type:TYPE_BYTES}, 458*1c12ee1eSDan Willemsen {name:"f19" number:19 label:LABEL_REPEATED type:TYPE_BYTES} 459*1c12ee1eSDan Willemsen ] 460*1c12ee1eSDan Willemsen `, nil), 461*1c12ee1eSDan Willemsen} 462*1c12ee1eSDan Willemsen 463*1c12ee1eSDan Willemsenfunc (m *ListScalars) ProtoReflect() protoreflect.Message { return listScalarsType.MessageOf(m) } 464*1c12ee1eSDan Willemsen 465*1c12ee1eSDan Willemsenfunc TestListScalars(t *testing.T) { 466*1c12ee1eSDan Willemsen empty := new(ListScalars).ProtoReflect() 467*1c12ee1eSDan Willemsen want := (&ListScalars{ 468*1c12ee1eSDan Willemsen Bools: []bool{true, false, true}, 469*1c12ee1eSDan Willemsen Int32s: []int32{2, math.MinInt32, math.MaxInt32}, 470*1c12ee1eSDan Willemsen Int64s: []int64{3, math.MinInt64, math.MaxInt64}, 471*1c12ee1eSDan Willemsen Uint32s: []uint32{4, math.MaxUint32 / 2, math.MaxUint32}, 472*1c12ee1eSDan Willemsen Uint64s: []uint64{5, math.MaxUint64 / 2, math.MaxUint64}, 473*1c12ee1eSDan Willemsen Float32s: []float32{6, math.SmallestNonzeroFloat32, float32(math.NaN()), math.MaxFloat32}, 474*1c12ee1eSDan Willemsen Float64s: []float64{7, math.SmallestNonzeroFloat64, float64(math.NaN()), math.MaxFloat64}, 475*1c12ee1eSDan Willemsen Strings: []string{"8", "", "eight"}, 476*1c12ee1eSDan Willemsen StringsA: [][]byte{[]byte("9"), nil, []byte("nine")}, 477*1c12ee1eSDan Willemsen Bytes: [][]byte{[]byte("10"), nil, []byte("ten")}, 478*1c12ee1eSDan Willemsen BytesA: []string{"11", "", "eleven"}, 479*1c12ee1eSDan Willemsen 480*1c12ee1eSDan Willemsen MyStrings1: []MyString{"12", "", "twelve"}, 481*1c12ee1eSDan Willemsen MyStrings2: []MyBytes{[]byte("13"), nil, []byte("thirteen")}, 482*1c12ee1eSDan Willemsen MyBytes1: []MyBytes{[]byte("14"), nil, []byte("fourteen")}, 483*1c12ee1eSDan Willemsen MyBytes2: []MyString{"15", "", "fifteen"}, 484*1c12ee1eSDan Willemsen 485*1c12ee1eSDan Willemsen MyStrings3: ListStrings{"16", "", "sixteen"}, 486*1c12ee1eSDan Willemsen MyStrings4: ListBytes{[]byte("17"), nil, []byte("seventeen")}, 487*1c12ee1eSDan Willemsen MyBytes3: ListBytes{[]byte("18"), nil, []byte("eighteen")}, 488*1c12ee1eSDan Willemsen MyBytes4: ListStrings{"19", "", "nineteen"}, 489*1c12ee1eSDan Willemsen }).ProtoReflect() 490*1c12ee1eSDan Willemsen 491*1c12ee1eSDan Willemsen testMessage(t, nil, new(ListScalars).ProtoReflect(), messageOps{ 492*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}, 493*1c12ee1eSDan Willemsen getFields{1: getField(empty, 1), 3: getField(empty, 3), 5: getField(empty, 5), 7: getField(empty, 7), 9: getField(empty, 9), 11: getField(empty, 11), 13: getField(empty, 13), 15: getField(empty, 15), 17: getField(empty, 17), 19: getField(empty, 19)}, 494*1c12ee1eSDan Willemsen setFields{1: getField(want, 1), 3: getField(want, 3), 5: getField(want, 5), 7: getField(want, 7), 9: getField(want, 9), 11: getField(want, 11), 13: getField(want, 13), 15: getField(want, 15), 17: getField(want, 17), 19: getField(want, 19)}, 495*1c12ee1eSDan Willemsen listFieldsMutable{ 496*1c12ee1eSDan Willemsen 2: { 497*1c12ee1eSDan Willemsen lenList(0), 498*1c12ee1eSDan Willemsen appendList{V(int32(2)), V(int32(math.MinInt32)), V(int32(math.MaxInt32))}, 499*1c12ee1eSDan Willemsen getList{0: V(int32(2)), 1: V(int32(math.MinInt32)), 2: V(int32(math.MaxInt32))}, 500*1c12ee1eSDan Willemsen equalList{getField(want, 2).List()}, 501*1c12ee1eSDan Willemsen }, 502*1c12ee1eSDan Willemsen 4: { 503*1c12ee1eSDan Willemsen appendList{V(uint32(0)), V(uint32(0)), V(uint32(0))}, 504*1c12ee1eSDan Willemsen setList{0: V(uint32(4)), 1: V(uint32(math.MaxUint32 / 2)), 2: V(uint32(math.MaxUint32))}, 505*1c12ee1eSDan Willemsen lenList(3), 506*1c12ee1eSDan Willemsen }, 507*1c12ee1eSDan Willemsen 6: { 508*1c12ee1eSDan Willemsen appendList{V(float32(6)), V(float32(math.SmallestNonzeroFloat32)), V(float32(math.NaN())), V(float32(math.MaxFloat32))}, 509*1c12ee1eSDan Willemsen equalList{getField(want, 6).List()}, 510*1c12ee1eSDan Willemsen }, 511*1c12ee1eSDan Willemsen 8: { 512*1c12ee1eSDan Willemsen appendList{V(""), V(""), V(""), V(""), V(""), V("")}, 513*1c12ee1eSDan Willemsen lenList(6), 514*1c12ee1eSDan Willemsen setList{0: V("8"), 2: V("eight")}, 515*1c12ee1eSDan Willemsen truncList(3), 516*1c12ee1eSDan Willemsen equalList{getField(want, 8).List()}, 517*1c12ee1eSDan Willemsen }, 518*1c12ee1eSDan Willemsen 10: { 519*1c12ee1eSDan Willemsen appendList{V([]byte(nil)), V([]byte(nil))}, 520*1c12ee1eSDan Willemsen setList{0: V([]byte("10"))}, 521*1c12ee1eSDan Willemsen appendList{V([]byte("wrong"))}, 522*1c12ee1eSDan Willemsen setList{2: V([]byte("ten"))}, 523*1c12ee1eSDan Willemsen equalList{getField(want, 10).List()}, 524*1c12ee1eSDan Willemsen }, 525*1c12ee1eSDan Willemsen 12: { 526*1c12ee1eSDan Willemsen appendList{V("12"), V("wrong"), V("twelve")}, 527*1c12ee1eSDan Willemsen setList{1: V("")}, 528*1c12ee1eSDan Willemsen equalList{getField(want, 12).List()}, 529*1c12ee1eSDan Willemsen }, 530*1c12ee1eSDan Willemsen 14: { 531*1c12ee1eSDan Willemsen appendList{V([]byte("14")), V([]byte(nil)), V([]byte("fourteen"))}, 532*1c12ee1eSDan Willemsen equalList{getField(want, 14).List()}, 533*1c12ee1eSDan Willemsen }, 534*1c12ee1eSDan Willemsen 16: { 535*1c12ee1eSDan Willemsen appendList{V("16"), V(""), V("sixteen"), V("extra")}, 536*1c12ee1eSDan Willemsen truncList(3), 537*1c12ee1eSDan Willemsen equalList{getField(want, 16).List()}, 538*1c12ee1eSDan Willemsen }, 539*1c12ee1eSDan Willemsen 18: { 540*1c12ee1eSDan Willemsen appendList{V([]byte("18")), V([]byte(nil)), V([]byte("eighteen"))}, 541*1c12ee1eSDan Willemsen equalList{getField(want, 18).List()}, 542*1c12ee1eSDan Willemsen }, 543*1c12ee1eSDan Willemsen }, 544*1c12ee1eSDan Willemsen hasFields{1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true, 9: true, 10: true, 11: true, 12: true, 13: true, 14: true, 15: true, 16: true, 17: true, 18: true, 19: true}, 545*1c12ee1eSDan Willemsen equalMessage{want}, 546*1c12ee1eSDan Willemsen clearFields{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, 547*1c12ee1eSDan Willemsen equalMessage{empty}, 548*1c12ee1eSDan Willemsen }) 549*1c12ee1eSDan Willemsen 550*1c12ee1eSDan Willemsen // Test read-only operations on nil message. 551*1c12ee1eSDan Willemsen testMessage(t, nil, (*ListScalars)(nil).ProtoReflect(), messageOps{ 552*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}, 553*1c12ee1eSDan Willemsen listFields{2: {lenList(0)}, 4: {lenList(0)}, 6: {lenList(0)}, 8: {lenList(0)}, 10: {lenList(0)}, 12: {lenList(0)}, 14: {lenList(0)}, 16: {lenList(0)}, 18: {lenList(0)}}, 554*1c12ee1eSDan Willemsen }) 555*1c12ee1eSDan Willemsen} 556*1c12ee1eSDan Willemsen 557*1c12ee1eSDan Willemsentype MapScalars struct { 558*1c12ee1eSDan Willemsen KeyBools map[bool]string `protobuf:"1"` 559*1c12ee1eSDan Willemsen KeyInt32s map[int32]string `protobuf:"2"` 560*1c12ee1eSDan Willemsen KeyInt64s map[int64]string `protobuf:"3"` 561*1c12ee1eSDan Willemsen KeyUint32s map[uint32]string `protobuf:"4"` 562*1c12ee1eSDan Willemsen KeyUint64s map[uint64]string `protobuf:"5"` 563*1c12ee1eSDan Willemsen KeyStrings map[string]string `protobuf:"6"` 564*1c12ee1eSDan Willemsen 565*1c12ee1eSDan Willemsen ValBools map[string]bool `protobuf:"7"` 566*1c12ee1eSDan Willemsen ValInt32s map[string]int32 `protobuf:"8"` 567*1c12ee1eSDan Willemsen ValInt64s map[string]int64 `protobuf:"9"` 568*1c12ee1eSDan Willemsen ValUint32s map[string]uint32 `protobuf:"10"` 569*1c12ee1eSDan Willemsen ValUint64s map[string]uint64 `protobuf:"11"` 570*1c12ee1eSDan Willemsen ValFloat32s map[string]float32 `protobuf:"12"` 571*1c12ee1eSDan Willemsen ValFloat64s map[string]float64 `protobuf:"13"` 572*1c12ee1eSDan Willemsen ValStrings map[string]string `protobuf:"14"` 573*1c12ee1eSDan Willemsen ValStringsA map[string][]byte `protobuf:"15"` 574*1c12ee1eSDan Willemsen ValBytes map[string][]byte `protobuf:"16"` 575*1c12ee1eSDan Willemsen ValBytesA map[string]string `protobuf:"17"` 576*1c12ee1eSDan Willemsen 577*1c12ee1eSDan Willemsen MyStrings1 map[MyString]MyString `protobuf:"18"` 578*1c12ee1eSDan Willemsen MyStrings2 map[MyString]MyBytes `protobuf:"19"` 579*1c12ee1eSDan Willemsen MyBytes1 map[MyString]MyBytes `protobuf:"20"` 580*1c12ee1eSDan Willemsen MyBytes2 map[MyString]MyString `protobuf:"21"` 581*1c12ee1eSDan Willemsen 582*1c12ee1eSDan Willemsen MyStrings3 MapStrings `protobuf:"22"` 583*1c12ee1eSDan Willemsen MyStrings4 MapBytes `protobuf:"23"` 584*1c12ee1eSDan Willemsen MyBytes3 MapBytes `protobuf:"24"` 585*1c12ee1eSDan Willemsen MyBytes4 MapStrings `protobuf:"25"` 586*1c12ee1eSDan Willemsen} 587*1c12ee1eSDan Willemsen 588*1c12ee1eSDan Willemsenvar mapScalarsType = pimpl.MessageInfo{GoReflectType: reflect.TypeOf(new(MapScalars)), Desc: mustMakeMessageDesc("map-scalars.proto", protoreflect.Proto2, "", ` 589*1c12ee1eSDan Willemsen name: "MapScalars" 590*1c12ee1eSDan Willemsen field: [ 591*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F1Entry"}, 592*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F2Entry"}, 593*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F3Entry"}, 594*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F4Entry"}, 595*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F5Entry"}, 596*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F6Entry"}, 597*1c12ee1eSDan Willemsen 598*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F7Entry"}, 599*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F8Entry"}, 600*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F9Entry"}, 601*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F10Entry"}, 602*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F11Entry"}, 603*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F12Entry"}, 604*1c12ee1eSDan Willemsen {name:"f13" number:13 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F13Entry"}, 605*1c12ee1eSDan Willemsen {name:"f14" number:14 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F14Entry"}, 606*1c12ee1eSDan Willemsen {name:"f15" number:15 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F15Entry"}, 607*1c12ee1eSDan Willemsen {name:"f16" number:16 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F16Entry"}, 608*1c12ee1eSDan Willemsen {name:"f17" number:17 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F17Entry"}, 609*1c12ee1eSDan Willemsen 610*1c12ee1eSDan Willemsen {name:"f18" number:18 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F18Entry"}, 611*1c12ee1eSDan Willemsen {name:"f19" number:19 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F19Entry"}, 612*1c12ee1eSDan Willemsen {name:"f20" number:20 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F20Entry"}, 613*1c12ee1eSDan Willemsen {name:"f21" number:21 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F21Entry"}, 614*1c12ee1eSDan Willemsen 615*1c12ee1eSDan Willemsen {name:"f22" number:22 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F22Entry"}, 616*1c12ee1eSDan Willemsen {name:"f23" number:23 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F23Entry"}, 617*1c12ee1eSDan Willemsen {name:"f24" number:24 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F24Entry"}, 618*1c12ee1eSDan Willemsen {name:"f25" number:25 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".MapScalars.F25Entry"} 619*1c12ee1eSDan Willemsen ] 620*1c12ee1eSDan Willemsen nested_type: [ 621*1c12ee1eSDan Willemsen {name:"F1Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 622*1c12ee1eSDan Willemsen {name:"F2Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_INT32}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 623*1c12ee1eSDan Willemsen {name:"F3Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_INT64}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 624*1c12ee1eSDan Willemsen {name:"F4Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 625*1c12ee1eSDan Willemsen {name:"F5Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_UINT64}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 626*1c12ee1eSDan Willemsen {name:"F6Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 627*1c12ee1eSDan Willemsen 628*1c12ee1eSDan Willemsen {name:"F7Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BOOL}] options:{map_entry:true}}, 629*1c12ee1eSDan Willemsen {name:"F8Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_INT32}] options:{map_entry:true}}, 630*1c12ee1eSDan Willemsen {name:"F9Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_INT64}] options:{map_entry:true}}, 631*1c12ee1eSDan Willemsen {name:"F10Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_UINT32}] options:{map_entry:true}}, 632*1c12ee1eSDan Willemsen {name:"F11Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_UINT64}] options:{map_entry:true}}, 633*1c12ee1eSDan Willemsen {name:"F12Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_FLOAT}] options:{map_entry:true}}, 634*1c12ee1eSDan Willemsen {name:"F13Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_DOUBLE}] options:{map_entry:true}}, 635*1c12ee1eSDan Willemsen {name:"F14Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 636*1c12ee1eSDan Willemsen {name:"F15Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 637*1c12ee1eSDan Willemsen {name:"F16Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}] options:{map_entry:true}}, 638*1c12ee1eSDan Willemsen {name:"F17Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}] options:{map_entry:true}}, 639*1c12ee1eSDan Willemsen 640*1c12ee1eSDan Willemsen {name:"F18Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 641*1c12ee1eSDan Willemsen {name:"F19Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 642*1c12ee1eSDan Willemsen {name:"F20Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}] options:{map_entry:true}}, 643*1c12ee1eSDan Willemsen {name:"F21Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}] options:{map_entry:true}}, 644*1c12ee1eSDan Willemsen 645*1c12ee1eSDan Willemsen {name:"F22Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 646*1c12ee1eSDan Willemsen {name:"F23Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}] options:{map_entry:true}}, 647*1c12ee1eSDan Willemsen {name:"F24Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}] options:{map_entry:true}}, 648*1c12ee1eSDan Willemsen {name:"F25Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}] options:{map_entry:true}} 649*1c12ee1eSDan Willemsen ] 650*1c12ee1eSDan Willemsen `, nil), 651*1c12ee1eSDan Willemsen} 652*1c12ee1eSDan Willemsen 653*1c12ee1eSDan Willemsenfunc (m *MapScalars) ProtoReflect() protoreflect.Message { return mapScalarsType.MessageOf(m) } 654*1c12ee1eSDan Willemsen 655*1c12ee1eSDan Willemsenfunc TestMapScalars(t *testing.T) { 656*1c12ee1eSDan Willemsen empty := new(MapScalars).ProtoReflect() 657*1c12ee1eSDan Willemsen want := (&MapScalars{ 658*1c12ee1eSDan Willemsen KeyBools: map[bool]string{true: "true", false: "false"}, 659*1c12ee1eSDan Willemsen KeyInt32s: map[int32]string{0: "zero", -1: "one", 2: "two"}, 660*1c12ee1eSDan Willemsen KeyInt64s: map[int64]string{0: "zero", -10: "ten", 20: "twenty"}, 661*1c12ee1eSDan Willemsen KeyUint32s: map[uint32]string{0: "zero", 1: "one", 2: "two"}, 662*1c12ee1eSDan Willemsen KeyUint64s: map[uint64]string{0: "zero", 10: "ten", 20: "twenty"}, 663*1c12ee1eSDan Willemsen KeyStrings: map[string]string{"": "", "foo": "bar"}, 664*1c12ee1eSDan Willemsen 665*1c12ee1eSDan Willemsen ValBools: map[string]bool{"true": true, "false": false}, 666*1c12ee1eSDan Willemsen ValInt32s: map[string]int32{"one": 1, "two": 2, "three": 3}, 667*1c12ee1eSDan Willemsen ValInt64s: map[string]int64{"ten": 10, "twenty": -20, "thirty": 30}, 668*1c12ee1eSDan Willemsen ValUint32s: map[string]uint32{"0x00": 0x00, "0xff": 0xff, "0xdead": 0xdead}, 669*1c12ee1eSDan Willemsen ValUint64s: map[string]uint64{"0x00": 0x00, "0xff": 0xff, "0xdead": 0xdead}, 670*1c12ee1eSDan Willemsen ValFloat32s: map[string]float32{"nan": float32(math.NaN()), "pi": float32(math.Pi)}, 671*1c12ee1eSDan Willemsen ValFloat64s: map[string]float64{"nan": float64(math.NaN()), "pi": float64(math.Pi)}, 672*1c12ee1eSDan Willemsen ValStrings: map[string]string{"s1": "s1", "s2": "s2"}, 673*1c12ee1eSDan Willemsen ValStringsA: map[string][]byte{"s1": []byte("s1"), "s2": []byte("s2")}, 674*1c12ee1eSDan Willemsen ValBytes: map[string][]byte{"s1": []byte("s1"), "s2": []byte("s2")}, 675*1c12ee1eSDan Willemsen ValBytesA: map[string]string{"s1": "s1", "s2": "s2"}, 676*1c12ee1eSDan Willemsen 677*1c12ee1eSDan Willemsen MyStrings1: map[MyString]MyString{"s1": "s1", "s2": "s2"}, 678*1c12ee1eSDan Willemsen MyStrings2: map[MyString]MyBytes{"s1": []byte("s1"), "s2": []byte("s2")}, 679*1c12ee1eSDan Willemsen MyBytes1: map[MyString]MyBytes{"s1": []byte("s1"), "s2": []byte("s2")}, 680*1c12ee1eSDan Willemsen MyBytes2: map[MyString]MyString{"s1": "s1", "s2": "s2"}, 681*1c12ee1eSDan Willemsen 682*1c12ee1eSDan Willemsen MyStrings3: MapStrings{"s1": "s1", "s2": "s2"}, 683*1c12ee1eSDan Willemsen MyStrings4: MapBytes{"s1": []byte("s1"), "s2": []byte("s2")}, 684*1c12ee1eSDan Willemsen MyBytes3: MapBytes{"s1": []byte("s1"), "s2": []byte("s2")}, 685*1c12ee1eSDan Willemsen MyBytes4: MapStrings{"s1": "s1", "s2": "s2"}, 686*1c12ee1eSDan Willemsen }).ProtoReflect() 687*1c12ee1eSDan Willemsen 688*1c12ee1eSDan Willemsen testMessage(t, nil, new(MapScalars).ProtoReflect(), messageOps{ 689*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 23: false, 24: false, 25: false}, 690*1c12ee1eSDan Willemsen getFields{1: getField(empty, 1), 3: getField(empty, 3), 5: getField(empty, 5), 7: getField(empty, 7), 9: getField(empty, 9), 11: getField(empty, 11), 13: getField(empty, 13), 15: getField(empty, 15), 17: getField(empty, 17), 19: getField(empty, 19), 21: getField(empty, 21), 23: getField(empty, 23), 25: getField(empty, 25)}, 691*1c12ee1eSDan Willemsen setFields{1: getField(want, 1), 3: getField(want, 3), 5: getField(want, 5), 7: getField(want, 7), 9: getField(want, 9), 11: getField(want, 11), 13: getField(want, 13), 15: getField(want, 15), 17: getField(want, 17), 19: getField(want, 19), 21: getField(want, 21), 23: getField(want, 23), 25: getField(want, 25)}, 692*1c12ee1eSDan Willemsen mapFieldsMutable{ 693*1c12ee1eSDan Willemsen 2: { 694*1c12ee1eSDan Willemsen lenMap(0), 695*1c12ee1eSDan Willemsen hasMap{int32(0): false, int32(-1): false, int32(2): false}, 696*1c12ee1eSDan Willemsen setMap{int32(0): V("zero")}, 697*1c12ee1eSDan Willemsen lenMap(1), 698*1c12ee1eSDan Willemsen hasMap{int32(0): true, int32(-1): false, int32(2): false}, 699*1c12ee1eSDan Willemsen setMap{int32(-1): V("one")}, 700*1c12ee1eSDan Willemsen lenMap(2), 701*1c12ee1eSDan Willemsen hasMap{int32(0): true, int32(-1): true, int32(2): false}, 702*1c12ee1eSDan Willemsen setMap{int32(2): V("two")}, 703*1c12ee1eSDan Willemsen lenMap(3), 704*1c12ee1eSDan Willemsen hasMap{int32(0): true, int32(-1): true, int32(2): true}, 705*1c12ee1eSDan Willemsen }, 706*1c12ee1eSDan Willemsen 4: { 707*1c12ee1eSDan Willemsen setMap{uint32(0): V("zero"), uint32(1): V("one"), uint32(2): V("two")}, 708*1c12ee1eSDan Willemsen equalMap{getField(want, 4).Map()}, 709*1c12ee1eSDan Willemsen }, 710*1c12ee1eSDan Willemsen 6: { 711*1c12ee1eSDan Willemsen clearMap{"noexist"}, 712*1c12ee1eSDan Willemsen setMap{"foo": V("bar")}, 713*1c12ee1eSDan Willemsen setMap{"": V("empty")}, 714*1c12ee1eSDan Willemsen getMap{"": V("empty"), "foo": V("bar"), "noexist": V(nil)}, 715*1c12ee1eSDan Willemsen setMap{"": V(""), "extra": V("extra")}, 716*1c12ee1eSDan Willemsen clearMap{"extra", "noexist"}, 717*1c12ee1eSDan Willemsen }, 718*1c12ee1eSDan Willemsen 8: { 719*1c12ee1eSDan Willemsen equalMap{getField(empty, 8).Map()}, 720*1c12ee1eSDan Willemsen setMap{"one": V(int32(1)), "two": V(int32(2)), "three": V(int32(3))}, 721*1c12ee1eSDan Willemsen }, 722*1c12ee1eSDan Willemsen 10: { 723*1c12ee1eSDan Willemsen setMap{"0x00": V(uint32(0x00)), "0xff": V(uint32(0xff)), "0xdead": V(uint32(0xdead))}, 724*1c12ee1eSDan Willemsen lenMap(3), 725*1c12ee1eSDan Willemsen equalMap{getField(want, 10).Map()}, 726*1c12ee1eSDan Willemsen getMap{"0x00": V(uint32(0x00)), "0xff": V(uint32(0xff)), "0xdead": V(uint32(0xdead)), "0xdeadbeef": V(nil)}, 727*1c12ee1eSDan Willemsen }, 728*1c12ee1eSDan Willemsen 12: { 729*1c12ee1eSDan Willemsen setMap{"nan": V(float32(math.NaN())), "pi": V(float32(math.Pi)), "e": V(float32(math.E))}, 730*1c12ee1eSDan Willemsen clearMap{"e", "phi"}, 731*1c12ee1eSDan Willemsen rangeMap{"nan": V(float32(math.NaN())), "pi": V(float32(math.Pi))}, 732*1c12ee1eSDan Willemsen }, 733*1c12ee1eSDan Willemsen 14: { 734*1c12ee1eSDan Willemsen equalMap{getField(empty, 14).Map()}, 735*1c12ee1eSDan Willemsen setMap{"s1": V("s1"), "s2": V("s2")}, 736*1c12ee1eSDan Willemsen }, 737*1c12ee1eSDan Willemsen 16: { 738*1c12ee1eSDan Willemsen setMap{"s1": V([]byte("s1")), "s2": V([]byte("s2"))}, 739*1c12ee1eSDan Willemsen equalMap{getField(want, 16).Map()}, 740*1c12ee1eSDan Willemsen }, 741*1c12ee1eSDan Willemsen 18: { 742*1c12ee1eSDan Willemsen hasMap{"s1": false, "s2": false, "s3": false}, 743*1c12ee1eSDan Willemsen setMap{"s1": V("s1"), "s2": V("s2")}, 744*1c12ee1eSDan Willemsen hasMap{"s1": true, "s2": true, "s3": false}, 745*1c12ee1eSDan Willemsen }, 746*1c12ee1eSDan Willemsen 20: { 747*1c12ee1eSDan Willemsen equalMap{getField(empty, 20).Map()}, 748*1c12ee1eSDan Willemsen setMap{"s1": V([]byte("s1")), "s2": V([]byte("s2"))}, 749*1c12ee1eSDan Willemsen }, 750*1c12ee1eSDan Willemsen 22: { 751*1c12ee1eSDan Willemsen rangeMap{}, 752*1c12ee1eSDan Willemsen setMap{"s1": V("s1"), "s2": V("s2")}, 753*1c12ee1eSDan Willemsen rangeMap{"s1": V("s1"), "s2": V("s2")}, 754*1c12ee1eSDan Willemsen lenMap(2), 755*1c12ee1eSDan Willemsen }, 756*1c12ee1eSDan Willemsen 24: { 757*1c12ee1eSDan Willemsen setMap{"s1": V([]byte("s1")), "s2": V([]byte("s2"))}, 758*1c12ee1eSDan Willemsen equalMap{getField(want, 24).Map()}, 759*1c12ee1eSDan Willemsen }, 760*1c12ee1eSDan Willemsen }, 761*1c12ee1eSDan Willemsen hasFields{1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true, 9: true, 10: true, 11: true, 12: true, 13: true, 14: true, 15: true, 16: true, 17: true, 18: true, 19: true, 20: true, 21: true, 22: true, 23: true, 24: true, 25: true}, 762*1c12ee1eSDan Willemsen equalMessage{want}, 763*1c12ee1eSDan Willemsen clearFields{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}, 764*1c12ee1eSDan Willemsen equalMessage{empty}, 765*1c12ee1eSDan Willemsen }) 766*1c12ee1eSDan Willemsen 767*1c12ee1eSDan Willemsen // Test read-only operations on nil message. 768*1c12ee1eSDan Willemsen testMessage(t, nil, (*MapScalars)(nil).ProtoReflect(), messageOps{ 769*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false, 20: false, 21: false, 22: false, 23: false, 24: false, 25: false}, 770*1c12ee1eSDan Willemsen mapFields{2: {lenMap(0)}, 4: {lenMap(0)}, 6: {lenMap(0)}, 8: {lenMap(0)}, 10: {lenMap(0)}, 12: {lenMap(0)}, 14: {lenMap(0)}, 16: {lenMap(0)}, 18: {lenMap(0)}, 20: {lenMap(0)}, 22: {lenMap(0)}, 24: {lenMap(0)}}, 771*1c12ee1eSDan Willemsen }) 772*1c12ee1eSDan Willemsen} 773*1c12ee1eSDan Willemsen 774*1c12ee1eSDan Willemsentype OneofScalars struct { 775*1c12ee1eSDan Willemsen Union isOneofScalars_Union `protobuf_oneof:"union"` 776*1c12ee1eSDan Willemsen} 777*1c12ee1eSDan Willemsen 778*1c12ee1eSDan Willemsenvar oneofScalarsType = pimpl.MessageInfo{GoReflectType: reflect.TypeOf(new(OneofScalars)), Desc: mustMakeMessageDesc("oneof-scalars.proto", protoreflect.Proto2, "", ` 779*1c12ee1eSDan Willemsen name: "OneofScalars" 780*1c12ee1eSDan Willemsen field: [ 781*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL default_value:"true" oneof_index:0}, 782*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 default_value:"2" oneof_index:0}, 783*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_OPTIONAL type:TYPE_INT64 default_value:"3" oneof_index:0}, 784*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"4" oneof_index:0}, 785*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"5" oneof_index:0}, 786*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_OPTIONAL type:TYPE_FLOAT default_value:"6" oneof_index:0}, 787*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"7" oneof_index:0}, 788*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"8" oneof_index:0}, 789*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"9" oneof_index:0}, 790*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"10" oneof_index:0}, 791*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"11" oneof_index:0}, 792*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"12" oneof_index:0}, 793*1c12ee1eSDan Willemsen {name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"13" oneof_index:0} 794*1c12ee1eSDan Willemsen ] 795*1c12ee1eSDan Willemsen oneof_decl: [{name:"union"}] 796*1c12ee1eSDan Willemsen `, nil), 797*1c12ee1eSDan Willemsen} 798*1c12ee1eSDan Willemsen 799*1c12ee1eSDan Willemsenfunc (m *OneofScalars) ProtoReflect() protoreflect.Message { return oneofScalarsType.MessageOf(m) } 800*1c12ee1eSDan Willemsen 801*1c12ee1eSDan Willemsenfunc (*OneofScalars) XXX_OneofWrappers() []interface{} { 802*1c12ee1eSDan Willemsen return []interface{}{ 803*1c12ee1eSDan Willemsen (*OneofScalars_Bool)(nil), 804*1c12ee1eSDan Willemsen (*OneofScalars_Int32)(nil), 805*1c12ee1eSDan Willemsen (*OneofScalars_Int64)(nil), 806*1c12ee1eSDan Willemsen (*OneofScalars_Uint32)(nil), 807*1c12ee1eSDan Willemsen (*OneofScalars_Uint64)(nil), 808*1c12ee1eSDan Willemsen (*OneofScalars_Float32)(nil), 809*1c12ee1eSDan Willemsen (*OneofScalars_Float64)(nil), 810*1c12ee1eSDan Willemsen (*OneofScalars_String)(nil), 811*1c12ee1eSDan Willemsen (*OneofScalars_StringA)(nil), 812*1c12ee1eSDan Willemsen (*OneofScalars_StringB)(nil), 813*1c12ee1eSDan Willemsen (*OneofScalars_Bytes)(nil), 814*1c12ee1eSDan Willemsen (*OneofScalars_BytesA)(nil), 815*1c12ee1eSDan Willemsen (*OneofScalars_BytesB)(nil), 816*1c12ee1eSDan Willemsen } 817*1c12ee1eSDan Willemsen} 818*1c12ee1eSDan Willemsen 819*1c12ee1eSDan Willemsentype ( 820*1c12ee1eSDan Willemsen isOneofScalars_Union interface { 821*1c12ee1eSDan Willemsen isOneofScalars_Union() 822*1c12ee1eSDan Willemsen } 823*1c12ee1eSDan Willemsen OneofScalars_Bool struct { 824*1c12ee1eSDan Willemsen Bool bool `protobuf:"1"` 825*1c12ee1eSDan Willemsen } 826*1c12ee1eSDan Willemsen OneofScalars_Int32 struct { 827*1c12ee1eSDan Willemsen Int32 MyInt32 `protobuf:"2"` 828*1c12ee1eSDan Willemsen } 829*1c12ee1eSDan Willemsen OneofScalars_Int64 struct { 830*1c12ee1eSDan Willemsen Int64 int64 `protobuf:"3"` 831*1c12ee1eSDan Willemsen } 832*1c12ee1eSDan Willemsen OneofScalars_Uint32 struct { 833*1c12ee1eSDan Willemsen Uint32 MyUint32 `protobuf:"4"` 834*1c12ee1eSDan Willemsen } 835*1c12ee1eSDan Willemsen OneofScalars_Uint64 struct { 836*1c12ee1eSDan Willemsen Uint64 uint64 `protobuf:"5"` 837*1c12ee1eSDan Willemsen } 838*1c12ee1eSDan Willemsen OneofScalars_Float32 struct { 839*1c12ee1eSDan Willemsen Float32 MyFloat32 `protobuf:"6"` 840*1c12ee1eSDan Willemsen } 841*1c12ee1eSDan Willemsen OneofScalars_Float64 struct { 842*1c12ee1eSDan Willemsen Float64 float64 `protobuf:"7"` 843*1c12ee1eSDan Willemsen } 844*1c12ee1eSDan Willemsen OneofScalars_String struct { 845*1c12ee1eSDan Willemsen String string `protobuf:"8"` 846*1c12ee1eSDan Willemsen } 847*1c12ee1eSDan Willemsen OneofScalars_StringA struct { 848*1c12ee1eSDan Willemsen StringA []byte `protobuf:"9"` 849*1c12ee1eSDan Willemsen } 850*1c12ee1eSDan Willemsen OneofScalars_StringB struct { 851*1c12ee1eSDan Willemsen StringB MyString `protobuf:"10"` 852*1c12ee1eSDan Willemsen } 853*1c12ee1eSDan Willemsen OneofScalars_Bytes struct { 854*1c12ee1eSDan Willemsen Bytes []byte `protobuf:"11"` 855*1c12ee1eSDan Willemsen } 856*1c12ee1eSDan Willemsen OneofScalars_BytesA struct { 857*1c12ee1eSDan Willemsen BytesA string `protobuf:"12"` 858*1c12ee1eSDan Willemsen } 859*1c12ee1eSDan Willemsen OneofScalars_BytesB struct { 860*1c12ee1eSDan Willemsen BytesB MyBytes `protobuf:"13"` 861*1c12ee1eSDan Willemsen } 862*1c12ee1eSDan Willemsen) 863*1c12ee1eSDan Willemsen 864*1c12ee1eSDan Willemsenfunc (*OneofScalars_Bool) isOneofScalars_Union() {} 865*1c12ee1eSDan Willemsenfunc (*OneofScalars_Int32) isOneofScalars_Union() {} 866*1c12ee1eSDan Willemsenfunc (*OneofScalars_Int64) isOneofScalars_Union() {} 867*1c12ee1eSDan Willemsenfunc (*OneofScalars_Uint32) isOneofScalars_Union() {} 868*1c12ee1eSDan Willemsenfunc (*OneofScalars_Uint64) isOneofScalars_Union() {} 869*1c12ee1eSDan Willemsenfunc (*OneofScalars_Float32) isOneofScalars_Union() {} 870*1c12ee1eSDan Willemsenfunc (*OneofScalars_Float64) isOneofScalars_Union() {} 871*1c12ee1eSDan Willemsenfunc (*OneofScalars_String) isOneofScalars_Union() {} 872*1c12ee1eSDan Willemsenfunc (*OneofScalars_StringA) isOneofScalars_Union() {} 873*1c12ee1eSDan Willemsenfunc (*OneofScalars_StringB) isOneofScalars_Union() {} 874*1c12ee1eSDan Willemsenfunc (*OneofScalars_Bytes) isOneofScalars_Union() {} 875*1c12ee1eSDan Willemsenfunc (*OneofScalars_BytesA) isOneofScalars_Union() {} 876*1c12ee1eSDan Willemsenfunc (*OneofScalars_BytesB) isOneofScalars_Union() {} 877*1c12ee1eSDan Willemsen 878*1c12ee1eSDan Willemsenfunc TestOneofs(t *testing.T) { 879*1c12ee1eSDan Willemsen empty := &OneofScalars{} 880*1c12ee1eSDan Willemsen want1 := &OneofScalars{Union: &OneofScalars_Bool{true}} 881*1c12ee1eSDan Willemsen want2 := &OneofScalars{Union: &OneofScalars_Int32{20}} 882*1c12ee1eSDan Willemsen want3 := &OneofScalars{Union: &OneofScalars_Int64{30}} 883*1c12ee1eSDan Willemsen want4 := &OneofScalars{Union: &OneofScalars_Uint32{40}} 884*1c12ee1eSDan Willemsen want5 := &OneofScalars{Union: &OneofScalars_Uint64{50}} 885*1c12ee1eSDan Willemsen want6 := &OneofScalars{Union: &OneofScalars_Float32{60}} 886*1c12ee1eSDan Willemsen want7 := &OneofScalars{Union: &OneofScalars_Float64{70}} 887*1c12ee1eSDan Willemsen want8 := &OneofScalars{Union: &OneofScalars_String{string("80")}} 888*1c12ee1eSDan Willemsen want9 := &OneofScalars{Union: &OneofScalars_StringA{[]byte("90")}} 889*1c12ee1eSDan Willemsen want10 := &OneofScalars{Union: &OneofScalars_StringB{MyString("100")}} 890*1c12ee1eSDan Willemsen want11 := &OneofScalars{Union: &OneofScalars_Bytes{[]byte("110")}} 891*1c12ee1eSDan Willemsen want12 := &OneofScalars{Union: &OneofScalars_BytesA{string("120")}} 892*1c12ee1eSDan Willemsen want13 := &OneofScalars{Union: &OneofScalars_BytesB{MyBytes("130")}} 893*1c12ee1eSDan Willemsen 894*1c12ee1eSDan Willemsen testMessage(t, nil, new(OneofScalars).ProtoReflect(), messageOps{ 895*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false}, 896*1c12ee1eSDan Willemsen getFields{1: V(bool(true)), 2: V(int32(2)), 3: V(int64(3)), 4: V(uint32(4)), 5: V(uint64(5)), 6: V(float32(6)), 7: V(float64(7)), 8: V(string("8")), 9: V(string("9")), 10: V(string("10")), 11: V([]byte("11")), 12: V([]byte("12")), 13: V([]byte("13"))}, 897*1c12ee1eSDan Willemsen whichOneofs{"union": 0}, 898*1c12ee1eSDan Willemsen 899*1c12ee1eSDan Willemsen setFields{1: V(bool(true))}, hasFields{1: true}, equalMessage{want1.ProtoReflect()}, 900*1c12ee1eSDan Willemsen setFields{2: V(int32(20))}, hasFields{2: true}, equalMessage{want2.ProtoReflect()}, 901*1c12ee1eSDan Willemsen setFields{3: V(int64(30))}, hasFields{3: true}, equalMessage{want3.ProtoReflect()}, 902*1c12ee1eSDan Willemsen setFields{4: V(uint32(40))}, hasFields{4: true}, equalMessage{want4.ProtoReflect()}, 903*1c12ee1eSDan Willemsen setFields{5: V(uint64(50))}, hasFields{5: true}, equalMessage{want5.ProtoReflect()}, 904*1c12ee1eSDan Willemsen setFields{6: V(float32(60))}, hasFields{6: true}, equalMessage{want6.ProtoReflect()}, 905*1c12ee1eSDan Willemsen setFields{7: V(float64(70))}, hasFields{7: true}, equalMessage{want7.ProtoReflect()}, 906*1c12ee1eSDan Willemsen 907*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: true, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false}, 908*1c12ee1eSDan Willemsen whichOneofs{"union": 7}, 909*1c12ee1eSDan Willemsen 910*1c12ee1eSDan Willemsen setFields{8: V(string("80"))}, hasFields{8: true}, equalMessage{want8.ProtoReflect()}, 911*1c12ee1eSDan Willemsen setFields{9: V(string("90"))}, hasFields{9: true}, equalMessage{want9.ProtoReflect()}, 912*1c12ee1eSDan Willemsen setFields{10: V(string("100"))}, hasFields{10: true}, equalMessage{want10.ProtoReflect()}, 913*1c12ee1eSDan Willemsen setFields{11: V([]byte("110"))}, hasFields{11: true}, equalMessage{want11.ProtoReflect()}, 914*1c12ee1eSDan Willemsen setFields{12: V([]byte("120"))}, hasFields{12: true}, equalMessage{want12.ProtoReflect()}, 915*1c12ee1eSDan Willemsen setFields{13: V([]byte("130"))}, hasFields{13: true}, equalMessage{want13.ProtoReflect()}, 916*1c12ee1eSDan Willemsen 917*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: true}, 918*1c12ee1eSDan Willemsen getFields{1: V(bool(true)), 2: V(int32(2)), 3: V(int64(3)), 4: V(uint32(4)), 5: V(uint64(5)), 6: V(float32(6)), 7: V(float64(7)), 8: V(string("8")), 9: V(string("9")), 10: V(string("10")), 11: V([]byte("11")), 12: V([]byte("12")), 13: V([]byte("130"))}, 919*1c12ee1eSDan Willemsen clearFields{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, 920*1c12ee1eSDan Willemsen whichOneofs{"union": 13}, 921*1c12ee1eSDan Willemsen equalMessage{want13.ProtoReflect()}, 922*1c12ee1eSDan Willemsen clearFields{13}, 923*1c12ee1eSDan Willemsen whichOneofs{"union": 0}, 924*1c12ee1eSDan Willemsen equalMessage{empty.ProtoReflect()}, 925*1c12ee1eSDan Willemsen }) 926*1c12ee1eSDan Willemsen 927*1c12ee1eSDan Willemsen // Test read-only operations on nil message. 928*1c12ee1eSDan Willemsen testMessage(t, nil, (*OneofScalars)(nil).ProtoReflect(), messageOps{ 929*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false, 13: false}, 930*1c12ee1eSDan Willemsen getFields{1: V(bool(true)), 2: V(int32(2)), 3: V(int64(3)), 4: V(uint32(4)), 5: V(uint64(5)), 6: V(float32(6)), 7: V(float64(7)), 8: V(string("8")), 9: V(string("9")), 10: V(string("10")), 11: V([]byte("11")), 12: V([]byte("12")), 13: V([]byte("13"))}, 931*1c12ee1eSDan Willemsen }) 932*1c12ee1eSDan Willemsen} 933*1c12ee1eSDan Willemsen 934*1c12ee1eSDan Willemsentype EnumProto2 int32 935*1c12ee1eSDan Willemsen 936*1c12ee1eSDan Willemsenvar enumProto2Desc = mustMakeEnumDesc("enum2.proto", protoreflect.Proto2, ` 937*1c12ee1eSDan Willemsen name: "EnumProto2" 938*1c12ee1eSDan Willemsen value: [{name:"DEAD" number:0xdead}, {name:"BEEF" number:0xbeef}] 939*1c12ee1eSDan Willemsen`) 940*1c12ee1eSDan Willemsen 941*1c12ee1eSDan Willemsenfunc (e EnumProto2) Descriptor() protoreflect.EnumDescriptor { return enumProto2Desc } 942*1c12ee1eSDan Willemsenfunc (e EnumProto2) Type() protoreflect.EnumType { return e } 943*1c12ee1eSDan Willemsenfunc (e EnumProto2) Enum() *EnumProto2 { return &e } 944*1c12ee1eSDan Willemsenfunc (e EnumProto2) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(e) } 945*1c12ee1eSDan Willemsenfunc (t EnumProto2) New(n protoreflect.EnumNumber) protoreflect.Enum { return EnumProto2(n) } 946*1c12ee1eSDan Willemsen 947*1c12ee1eSDan Willemsentype EnumProto3 int32 948*1c12ee1eSDan Willemsen 949*1c12ee1eSDan Willemsenvar enumProto3Desc = mustMakeEnumDesc("enum3.proto", protoreflect.Proto3, ` 950*1c12ee1eSDan Willemsen name: "EnumProto3", 951*1c12ee1eSDan Willemsen value: [{name:"ALPHA" number:0}, {name:"BRAVO" number:1}] 952*1c12ee1eSDan Willemsen`) 953*1c12ee1eSDan Willemsen 954*1c12ee1eSDan Willemsenfunc (e EnumProto3) Descriptor() protoreflect.EnumDescriptor { return enumProto3Desc } 955*1c12ee1eSDan Willemsenfunc (e EnumProto3) Type() protoreflect.EnumType { return e } 956*1c12ee1eSDan Willemsenfunc (e EnumProto3) Enum() *EnumProto3 { return &e } 957*1c12ee1eSDan Willemsenfunc (e EnumProto3) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(e) } 958*1c12ee1eSDan Willemsenfunc (t EnumProto3) New(n protoreflect.EnumNumber) protoreflect.Enum { return EnumProto3(n) } 959*1c12ee1eSDan Willemsen 960*1c12ee1eSDan Willemsentype EnumMessages struct { 961*1c12ee1eSDan Willemsen EnumP2 *EnumProto2 `protobuf:"1"` 962*1c12ee1eSDan Willemsen EnumP3 *EnumProto3 `protobuf:"2"` 963*1c12ee1eSDan Willemsen MessageLegacy *proto2_20180125.Message `protobuf:"3"` 964*1c12ee1eSDan Willemsen MessageCycle *EnumMessages `protobuf:"4"` 965*1c12ee1eSDan Willemsen EnumList []EnumProto2 `protobuf:"5"` 966*1c12ee1eSDan Willemsen MessageList []*ScalarProto2 `protobuf:"6"` 967*1c12ee1eSDan Willemsen EnumMap map[string]EnumProto3 `protobuf:"7"` 968*1c12ee1eSDan Willemsen MessageMap map[string]*ScalarProto3 `protobuf:"8"` 969*1c12ee1eSDan Willemsen Union isEnumMessages_Union `protobuf_oneof:"union"` 970*1c12ee1eSDan Willemsen} 971*1c12ee1eSDan Willemsen 972*1c12ee1eSDan Willemsenvar enumMessagesType = pimpl.MessageInfo{GoReflectType: reflect.TypeOf(new(EnumMessages)), Desc: mustMakeMessageDesc("enum-messages.proto", protoreflect.Proto2, ` 973*1c12ee1eSDan Willemsen dependency: ["enum2.proto", "enum3.proto", "scalar2.proto", "scalar3.proto", "proto2_20180125_92554152/test.proto"] 974*1c12ee1eSDan Willemsen `, ` 975*1c12ee1eSDan Willemsen name: "EnumMessages" 976*1c12ee1eSDan Willemsen field: [ 977*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto2" default_value:"BEEF"}, 978*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto3" default_value:"BRAVO"}, 979*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".google.golang.org.proto2_20180125.Message"}, 980*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".EnumMessages"}, 981*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_REPEATED type:TYPE_ENUM type_name:".EnumProto2"}, 982*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".ScalarProto2"}, 983*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".EnumMessages.F7Entry"}, 984*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".EnumMessages.F8Entry"}, 985*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto2" oneof_index:0 default_value:"BEEF"}, 986*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto3" oneof_index:0 default_value:"BRAVO"}, 987*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".ScalarProto2" oneof_index:0}, 988*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".ScalarProto3" oneof_index:0} 989*1c12ee1eSDan Willemsen ] 990*1c12ee1eSDan Willemsen oneof_decl: [{name:"union"}] 991*1c12ee1eSDan Willemsen nested_type: [ 992*1c12ee1eSDan Willemsen {name:"F7Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto3"}] options:{map_entry:true}}, 993*1c12ee1eSDan Willemsen {name:"F8Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".ScalarProto3"}] options:{map_entry:true}} 994*1c12ee1eSDan Willemsen ] 995*1c12ee1eSDan Willemsen `, newFileRegistry( 996*1c12ee1eSDan Willemsen EnumProto2(0).Descriptor().ParentFile(), 997*1c12ee1eSDan Willemsen EnumProto3(0).Descriptor().ParentFile(), 998*1c12ee1eSDan Willemsen ((*ScalarProto2)(nil)).ProtoReflect().Descriptor().ParentFile(), 999*1c12ee1eSDan Willemsen ((*ScalarProto3)(nil)).ProtoReflect().Descriptor().ParentFile(), 1000*1c12ee1eSDan Willemsen pimpl.Export{}.MessageDescriptorOf((*proto2_20180125.Message)(nil)).ParentFile(), 1001*1c12ee1eSDan Willemsen)), 1002*1c12ee1eSDan Willemsen} 1003*1c12ee1eSDan Willemsen 1004*1c12ee1eSDan Willemsenfunc newFileRegistry(files ...protoreflect.FileDescriptor) *protoregistry.Files { 1005*1c12ee1eSDan Willemsen r := new(protoregistry.Files) 1006*1c12ee1eSDan Willemsen for _, file := range files { 1007*1c12ee1eSDan Willemsen r.RegisterFile(file) 1008*1c12ee1eSDan Willemsen } 1009*1c12ee1eSDan Willemsen return r 1010*1c12ee1eSDan Willemsen} 1011*1c12ee1eSDan Willemsen 1012*1c12ee1eSDan Willemsenfunc (m *EnumMessages) ProtoReflect() protoreflect.Message { return enumMessagesType.MessageOf(m) } 1013*1c12ee1eSDan Willemsen 1014*1c12ee1eSDan Willemsenfunc (*EnumMessages) XXX_OneofWrappers() []interface{} { 1015*1c12ee1eSDan Willemsen return []interface{}{ 1016*1c12ee1eSDan Willemsen (*EnumMessages_OneofE2)(nil), 1017*1c12ee1eSDan Willemsen (*EnumMessages_OneofE3)(nil), 1018*1c12ee1eSDan Willemsen (*EnumMessages_OneofM2)(nil), 1019*1c12ee1eSDan Willemsen (*EnumMessages_OneofM3)(nil), 1020*1c12ee1eSDan Willemsen } 1021*1c12ee1eSDan Willemsen} 1022*1c12ee1eSDan Willemsen 1023*1c12ee1eSDan Willemsentype ( 1024*1c12ee1eSDan Willemsen isEnumMessages_Union interface { 1025*1c12ee1eSDan Willemsen isEnumMessages_Union() 1026*1c12ee1eSDan Willemsen } 1027*1c12ee1eSDan Willemsen EnumMessages_OneofE2 struct { 1028*1c12ee1eSDan Willemsen OneofE2 EnumProto2 `protobuf:"9"` 1029*1c12ee1eSDan Willemsen } 1030*1c12ee1eSDan Willemsen EnumMessages_OneofE3 struct { 1031*1c12ee1eSDan Willemsen OneofE3 EnumProto3 `protobuf:"10"` 1032*1c12ee1eSDan Willemsen } 1033*1c12ee1eSDan Willemsen EnumMessages_OneofM2 struct { 1034*1c12ee1eSDan Willemsen OneofM2 *ScalarProto2 `protobuf:"11"` 1035*1c12ee1eSDan Willemsen } 1036*1c12ee1eSDan Willemsen EnumMessages_OneofM3 struct { 1037*1c12ee1eSDan Willemsen OneofM3 *ScalarProto3 `protobuf:"12"` 1038*1c12ee1eSDan Willemsen } 1039*1c12ee1eSDan Willemsen) 1040*1c12ee1eSDan Willemsen 1041*1c12ee1eSDan Willemsenfunc (*EnumMessages_OneofE2) isEnumMessages_Union() {} 1042*1c12ee1eSDan Willemsenfunc (*EnumMessages_OneofE3) isEnumMessages_Union() {} 1043*1c12ee1eSDan Willemsenfunc (*EnumMessages_OneofM2) isEnumMessages_Union() {} 1044*1c12ee1eSDan Willemsenfunc (*EnumMessages_OneofM3) isEnumMessages_Union() {} 1045*1c12ee1eSDan Willemsen 1046*1c12ee1eSDan Willemsenfunc TestEnumMessages(t *testing.T) { 1047*1c12ee1eSDan Willemsen emptyL := pimpl.Export{}.MessageOf(new(proto2_20180125.Message)) 1048*1c12ee1eSDan Willemsen emptyM := new(EnumMessages).ProtoReflect() 1049*1c12ee1eSDan Willemsen emptyM2 := new(ScalarProto2).ProtoReflect() 1050*1c12ee1eSDan Willemsen emptyM3 := new(ScalarProto3).ProtoReflect() 1051*1c12ee1eSDan Willemsen 1052*1c12ee1eSDan Willemsen wantL := pimpl.Export{}.MessageOf(&proto2_20180125.Message{OptionalFloat: proto.Float32(math.E)}) 1053*1c12ee1eSDan Willemsen wantM := (&EnumMessages{EnumP2: EnumProto2(1234).Enum()}).ProtoReflect() 1054*1c12ee1eSDan Willemsen wantM2a := &ScalarProto2{Float32: proto.Float32(math.Pi)} 1055*1c12ee1eSDan Willemsen wantM2b := &ScalarProto2{Float32: proto.Float32(math.Phi)} 1056*1c12ee1eSDan Willemsen wantM3a := &ScalarProto3{Float32: math.Pi} 1057*1c12ee1eSDan Willemsen wantM3b := &ScalarProto3{Float32: math.Ln2} 1058*1c12ee1eSDan Willemsen 1059*1c12ee1eSDan Willemsen wantList5 := getField((&EnumMessages{EnumList: []EnumProto2{333, 222}}).ProtoReflect(), 5) 1060*1c12ee1eSDan Willemsen wantList6 := getField((&EnumMessages{MessageList: []*ScalarProto2{wantM2a, wantM2b}}).ProtoReflect(), 6) 1061*1c12ee1eSDan Willemsen 1062*1c12ee1eSDan Willemsen wantMap7 := getField((&EnumMessages{EnumMap: map[string]EnumProto3{"one": 1, "two": 2}}).ProtoReflect(), 7) 1063*1c12ee1eSDan Willemsen wantMap8 := getField((&EnumMessages{MessageMap: map[string]*ScalarProto3{"pi": wantM3a, "ln2": wantM3b}}).ProtoReflect(), 8) 1064*1c12ee1eSDan Willemsen 1065*1c12ee1eSDan Willemsen testMessage(t, nil, new(EnumMessages).ProtoReflect(), messageOps{ 1066*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false}, 1067*1c12ee1eSDan Willemsen getFields{1: VE(0xbeef), 2: VE(1), 3: V(emptyL), 4: V(emptyM), 9: VE(0xbeef), 10: VE(1)}, 1068*1c12ee1eSDan Willemsen 1069*1c12ee1eSDan Willemsen // Test singular enums. 1070*1c12ee1eSDan Willemsen setFields{1: VE(0xdead), 2: VE(0)}, 1071*1c12ee1eSDan Willemsen getFields{1: VE(0xdead), 2: VE(0)}, 1072*1c12ee1eSDan Willemsen hasFields{1: true, 2: true}, 1073*1c12ee1eSDan Willemsen 1074*1c12ee1eSDan Willemsen // Test singular messages. 1075*1c12ee1eSDan Willemsen messageFieldsMutable{3: messageOps{setFields{109: V(float32(math.E))}}}, 1076*1c12ee1eSDan Willemsen messageFieldsMutable{4: messageOps{setFields{1: VE(1234)}}}, 1077*1c12ee1eSDan Willemsen getFields{3: V(wantL), 4: V(wantM)}, 1078*1c12ee1eSDan Willemsen clearFields{3, 4}, 1079*1c12ee1eSDan Willemsen hasFields{3: false, 4: false}, 1080*1c12ee1eSDan Willemsen setFields{3: V(wantL), 4: V(wantM)}, 1081*1c12ee1eSDan Willemsen hasFields{3: true, 4: true}, 1082*1c12ee1eSDan Willemsen 1083*1c12ee1eSDan Willemsen // Test list of enums and messages. 1084*1c12ee1eSDan Willemsen listFieldsMutable{ 1085*1c12ee1eSDan Willemsen 5: listOps{ 1086*1c12ee1eSDan Willemsen appendList{VE(111), VE(222)}, 1087*1c12ee1eSDan Willemsen setList{0: VE(333)}, 1088*1c12ee1eSDan Willemsen getList{0: VE(333), 1: VE(222)}, 1089*1c12ee1eSDan Willemsen lenList(2), 1090*1c12ee1eSDan Willemsen }, 1091*1c12ee1eSDan Willemsen 6: listOps{ 1092*1c12ee1eSDan Willemsen appendMessageList{setFields{4: V(uint32(1e6))}}, 1093*1c12ee1eSDan Willemsen appendMessageList{setFields{6: V(float32(math.Phi))}}, 1094*1c12ee1eSDan Willemsen setList{0: V(wantM2a.ProtoReflect())}, 1095*1c12ee1eSDan Willemsen getList{0: V(wantM2a.ProtoReflect()), 1: V(wantM2b.ProtoReflect())}, 1096*1c12ee1eSDan Willemsen }, 1097*1c12ee1eSDan Willemsen }, 1098*1c12ee1eSDan Willemsen getFields{5: wantList5, 6: wantList6}, 1099*1c12ee1eSDan Willemsen hasFields{5: true, 6: true}, 1100*1c12ee1eSDan Willemsen listFields{5: listOps{truncList(0)}}, 1101*1c12ee1eSDan Willemsen hasFields{5: false, 6: true}, 1102*1c12ee1eSDan Willemsen 1103*1c12ee1eSDan Willemsen // Test maps of enums and messages. 1104*1c12ee1eSDan Willemsen mapFieldsMutable{ 1105*1c12ee1eSDan Willemsen 7: mapOps{ 1106*1c12ee1eSDan Willemsen setMap{"one": VE(1), "two": VE(2)}, 1107*1c12ee1eSDan Willemsen hasMap{"one": true, "two": true, "three": false}, 1108*1c12ee1eSDan Willemsen lenMap(2), 1109*1c12ee1eSDan Willemsen }, 1110*1c12ee1eSDan Willemsen 8: mapOps{ 1111*1c12ee1eSDan Willemsen messageMap{"pi": messageOps{setFields{6: V(float32(math.Pi))}}}, 1112*1c12ee1eSDan Willemsen setMap{"ln2": V(wantM3b.ProtoReflect())}, 1113*1c12ee1eSDan Willemsen getMap{"pi": V(wantM3a.ProtoReflect()), "ln2": V(wantM3b.ProtoReflect()), "none": V(nil)}, 1114*1c12ee1eSDan Willemsen lenMap(2), 1115*1c12ee1eSDan Willemsen }, 1116*1c12ee1eSDan Willemsen }, 1117*1c12ee1eSDan Willemsen getFields{7: wantMap7, 8: wantMap8}, 1118*1c12ee1eSDan Willemsen hasFields{7: true, 8: true}, 1119*1c12ee1eSDan Willemsen mapFields{8: mapOps{clearMap{"pi", "ln2", "none"}}}, 1120*1c12ee1eSDan Willemsen hasFields{7: true, 8: false}, 1121*1c12ee1eSDan Willemsen 1122*1c12ee1eSDan Willemsen // Test oneofs of enums and messages. 1123*1c12ee1eSDan Willemsen setFields{9: VE(0xdead)}, 1124*1c12ee1eSDan Willemsen hasFields{1: true, 2: true, 9: true, 10: false, 11: false, 12: false}, 1125*1c12ee1eSDan Willemsen setFields{10: VE(0)}, 1126*1c12ee1eSDan Willemsen hasFields{1: true, 2: true, 9: false, 10: true, 11: false, 12: false}, 1127*1c12ee1eSDan Willemsen messageFieldsMutable{11: messageOps{setFields{6: V(float32(math.Pi))}}}, 1128*1c12ee1eSDan Willemsen getFields{11: V(wantM2a.ProtoReflect())}, 1129*1c12ee1eSDan Willemsen hasFields{1: true, 2: true, 9: false, 10: false, 11: true, 12: false}, 1130*1c12ee1eSDan Willemsen messageFieldsMutable{12: messageOps{setFields{6: V(float32(math.Pi))}}}, 1131*1c12ee1eSDan Willemsen getFields{12: V(wantM3a.ProtoReflect())}, 1132*1c12ee1eSDan Willemsen hasFields{1: true, 2: true, 9: false, 10: false, 11: false, 12: true}, 1133*1c12ee1eSDan Willemsen 1134*1c12ee1eSDan Willemsen // Check entire message. 1135*1c12ee1eSDan Willemsen rangeFields{1: VE(0xdead), 2: VE(0), 3: V(wantL), 4: V(wantM), 6: wantList6, 7: wantMap7, 12: V(wantM3a.ProtoReflect())}, 1136*1c12ee1eSDan Willemsen equalMessage{(&EnumMessages{ 1137*1c12ee1eSDan Willemsen EnumP2: EnumProto2(0xdead).Enum(), 1138*1c12ee1eSDan Willemsen EnumP3: EnumProto3(0).Enum(), 1139*1c12ee1eSDan Willemsen MessageLegacy: &proto2_20180125.Message{OptionalFloat: proto.Float32(math.E)}, 1140*1c12ee1eSDan Willemsen MessageCycle: wantM.Interface().(*EnumMessages), 1141*1c12ee1eSDan Willemsen MessageList: []*ScalarProto2{wantM2a, wantM2b}, 1142*1c12ee1eSDan Willemsen EnumMap: map[string]EnumProto3{"one": 1, "two": 2}, 1143*1c12ee1eSDan Willemsen Union: &EnumMessages_OneofM3{wantM3a}, 1144*1c12ee1eSDan Willemsen }).ProtoReflect()}, 1145*1c12ee1eSDan Willemsen clearFields{1, 2, 3, 4, 6, 7, 12}, 1146*1c12ee1eSDan Willemsen equalMessage{new(EnumMessages).ProtoReflect()}, 1147*1c12ee1eSDan Willemsen }) 1148*1c12ee1eSDan Willemsen 1149*1c12ee1eSDan Willemsen // Test read-only operations on nil message. 1150*1c12ee1eSDan Willemsen testMessage(t, nil, (*EnumMessages)(nil).ProtoReflect(), messageOps{ 1151*1c12ee1eSDan Willemsen hasFields{1: false, 2: false, 3: false, 4: false, 5: false, 6: false, 7: false, 8: false, 9: false, 10: false, 11: false, 12: false}, 1152*1c12ee1eSDan Willemsen getFields{1: VE(0xbeef), 2: VE(1), 3: V(emptyL), 4: V(emptyM), 9: VE(0xbeef), 10: VE(1), 11: V(emptyM2), 12: V(emptyM3)}, 1153*1c12ee1eSDan Willemsen listFields{5: {lenList(0)}, 6: {lenList(0)}}, 1154*1c12ee1eSDan Willemsen mapFields{7: {lenMap(0)}, 8: {lenMap(0)}}, 1155*1c12ee1eSDan Willemsen }) 1156*1c12ee1eSDan Willemsen} 1157*1c12ee1eSDan Willemsen 1158*1c12ee1eSDan Willemsenvar cmpOpts = cmp.Options{ 1159*1c12ee1eSDan Willemsen cmp.Comparer(func(x, y *proto2_20180125.Message) bool { 1160*1c12ee1eSDan Willemsen mx := pimpl.Export{}.MessageOf(x).Interface() 1161*1c12ee1eSDan Willemsen my := pimpl.Export{}.MessageOf(y).Interface() 1162*1c12ee1eSDan Willemsen return proto.Equal(mx, my) 1163*1c12ee1eSDan Willemsen }), 1164*1c12ee1eSDan Willemsen cmp.Transformer("UnwrapValue", func(pv protoreflect.Value) interface{} { 1165*1c12ee1eSDan Willemsen switch v := pv.Interface().(type) { 1166*1c12ee1eSDan Willemsen case protoreflect.Message: 1167*1c12ee1eSDan Willemsen out := make(map[protoreflect.FieldNumber]protoreflect.Value) 1168*1c12ee1eSDan Willemsen v.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { 1169*1c12ee1eSDan Willemsen out[fd.Number()] = v 1170*1c12ee1eSDan Willemsen return true 1171*1c12ee1eSDan Willemsen }) 1172*1c12ee1eSDan Willemsen return out 1173*1c12ee1eSDan Willemsen case protoreflect.List: 1174*1c12ee1eSDan Willemsen var out []protoreflect.Value 1175*1c12ee1eSDan Willemsen for i := 0; i < v.Len(); i++ { 1176*1c12ee1eSDan Willemsen out = append(out, v.Get(i)) 1177*1c12ee1eSDan Willemsen } 1178*1c12ee1eSDan Willemsen return out 1179*1c12ee1eSDan Willemsen case protoreflect.Map: 1180*1c12ee1eSDan Willemsen out := make(map[interface{}]protoreflect.Value) 1181*1c12ee1eSDan Willemsen v.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { 1182*1c12ee1eSDan Willemsen out[k.Interface()] = v 1183*1c12ee1eSDan Willemsen return true 1184*1c12ee1eSDan Willemsen }) 1185*1c12ee1eSDan Willemsen return out 1186*1c12ee1eSDan Willemsen default: 1187*1c12ee1eSDan Willemsen return v 1188*1c12ee1eSDan Willemsen } 1189*1c12ee1eSDan Willemsen }), 1190*1c12ee1eSDan Willemsen cmpopts.EquateNaNs(), 1191*1c12ee1eSDan Willemsen} 1192*1c12ee1eSDan Willemsen 1193*1c12ee1eSDan Willemsenfunc testMessage(t *testing.T, p path, m protoreflect.Message, tt messageOps) { 1194*1c12ee1eSDan Willemsen fieldDescs := m.Descriptor().Fields() 1195*1c12ee1eSDan Willemsen oneofDescs := m.Descriptor().Oneofs() 1196*1c12ee1eSDan Willemsen for i, op := range tt { 1197*1c12ee1eSDan Willemsen p.Push(i) 1198*1c12ee1eSDan Willemsen switch op := op.(type) { 1199*1c12ee1eSDan Willemsen case equalMessage: 1200*1c12ee1eSDan Willemsen if diff := cmp.Diff(V(op.Message), V(m), cmpOpts); diff != "" { 1201*1c12ee1eSDan Willemsen t.Errorf("operation %v, message mismatch (-want, +got):\n%s", p, diff) 1202*1c12ee1eSDan Willemsen } 1203*1c12ee1eSDan Willemsen case hasFields: 1204*1c12ee1eSDan Willemsen got := map[protoreflect.FieldNumber]bool{} 1205*1c12ee1eSDan Willemsen want := map[protoreflect.FieldNumber]bool(op) 1206*1c12ee1eSDan Willemsen for n := range want { 1207*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1208*1c12ee1eSDan Willemsen got[n] = m.Has(fd) 1209*1c12ee1eSDan Willemsen } 1210*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got); diff != "" { 1211*1c12ee1eSDan Willemsen t.Errorf("operation %v, Message.Has mismatch (-want, +got):\n%s", p, diff) 1212*1c12ee1eSDan Willemsen } 1213*1c12ee1eSDan Willemsen case getFields: 1214*1c12ee1eSDan Willemsen got := map[protoreflect.FieldNumber]protoreflect.Value{} 1215*1c12ee1eSDan Willemsen want := map[protoreflect.FieldNumber]protoreflect.Value(op) 1216*1c12ee1eSDan Willemsen for n := range want { 1217*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1218*1c12ee1eSDan Willemsen got[n] = m.Get(fd) 1219*1c12ee1eSDan Willemsen } 1220*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpOpts); diff != "" { 1221*1c12ee1eSDan Willemsen t.Errorf("operation %v, Message.Get mismatch (-want, +got):\n%s", p, diff) 1222*1c12ee1eSDan Willemsen } 1223*1c12ee1eSDan Willemsen case setFields: 1224*1c12ee1eSDan Willemsen for n, v := range op { 1225*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1226*1c12ee1eSDan Willemsen m.Set(fd, v) 1227*1c12ee1eSDan Willemsen } 1228*1c12ee1eSDan Willemsen case clearFields: 1229*1c12ee1eSDan Willemsen for _, n := range op { 1230*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1231*1c12ee1eSDan Willemsen m.Clear(fd) 1232*1c12ee1eSDan Willemsen } 1233*1c12ee1eSDan Willemsen case whichOneofs: 1234*1c12ee1eSDan Willemsen got := map[protoreflect.Name]protoreflect.FieldNumber{} 1235*1c12ee1eSDan Willemsen want := map[protoreflect.Name]protoreflect.FieldNumber(op) 1236*1c12ee1eSDan Willemsen for s := range want { 1237*1c12ee1eSDan Willemsen od := oneofDescs.ByName(s) 1238*1c12ee1eSDan Willemsen fd := m.WhichOneof(od) 1239*1c12ee1eSDan Willemsen if fd == nil { 1240*1c12ee1eSDan Willemsen got[s] = 0 1241*1c12ee1eSDan Willemsen } else { 1242*1c12ee1eSDan Willemsen got[s] = fd.Number() 1243*1c12ee1eSDan Willemsen } 1244*1c12ee1eSDan Willemsen } 1245*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got); diff != "" { 1246*1c12ee1eSDan Willemsen t.Errorf("operation %v, Message.WhichOneof mismatch (-want, +got):\n%s", p, diff) 1247*1c12ee1eSDan Willemsen } 1248*1c12ee1eSDan Willemsen case messageFields: 1249*1c12ee1eSDan Willemsen for n, tt := range op { 1250*1c12ee1eSDan Willemsen p.Push(int(n)) 1251*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1252*1c12ee1eSDan Willemsen testMessage(t, p, m.Get(fd).Message(), tt) 1253*1c12ee1eSDan Willemsen p.Pop() 1254*1c12ee1eSDan Willemsen } 1255*1c12ee1eSDan Willemsen case messageFieldsMutable: 1256*1c12ee1eSDan Willemsen for n, tt := range op { 1257*1c12ee1eSDan Willemsen p.Push(int(n)) 1258*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1259*1c12ee1eSDan Willemsen testMessage(t, p, m.Mutable(fd).Message(), tt) 1260*1c12ee1eSDan Willemsen p.Pop() 1261*1c12ee1eSDan Willemsen } 1262*1c12ee1eSDan Willemsen case listFields: 1263*1c12ee1eSDan Willemsen for n, tt := range op { 1264*1c12ee1eSDan Willemsen p.Push(int(n)) 1265*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1266*1c12ee1eSDan Willemsen testLists(t, p, m.Get(fd).List(), tt) 1267*1c12ee1eSDan Willemsen p.Pop() 1268*1c12ee1eSDan Willemsen } 1269*1c12ee1eSDan Willemsen case listFieldsMutable: 1270*1c12ee1eSDan Willemsen for n, tt := range op { 1271*1c12ee1eSDan Willemsen p.Push(int(n)) 1272*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1273*1c12ee1eSDan Willemsen testLists(t, p, m.Mutable(fd).List(), tt) 1274*1c12ee1eSDan Willemsen p.Pop() 1275*1c12ee1eSDan Willemsen } 1276*1c12ee1eSDan Willemsen case mapFields: 1277*1c12ee1eSDan Willemsen for n, tt := range op { 1278*1c12ee1eSDan Willemsen p.Push(int(n)) 1279*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1280*1c12ee1eSDan Willemsen testMaps(t, p, m.Get(fd).Map(), tt) 1281*1c12ee1eSDan Willemsen p.Pop() 1282*1c12ee1eSDan Willemsen } 1283*1c12ee1eSDan Willemsen case mapFieldsMutable: 1284*1c12ee1eSDan Willemsen for n, tt := range op { 1285*1c12ee1eSDan Willemsen p.Push(int(n)) 1286*1c12ee1eSDan Willemsen fd := fieldDescs.ByNumber(n) 1287*1c12ee1eSDan Willemsen testMaps(t, p, m.Mutable(fd).Map(), tt) 1288*1c12ee1eSDan Willemsen p.Pop() 1289*1c12ee1eSDan Willemsen } 1290*1c12ee1eSDan Willemsen case rangeFields: 1291*1c12ee1eSDan Willemsen got := map[protoreflect.FieldNumber]protoreflect.Value{} 1292*1c12ee1eSDan Willemsen want := map[protoreflect.FieldNumber]protoreflect.Value(op) 1293*1c12ee1eSDan Willemsen m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { 1294*1c12ee1eSDan Willemsen got[fd.Number()] = v 1295*1c12ee1eSDan Willemsen return true 1296*1c12ee1eSDan Willemsen }) 1297*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpOpts); diff != "" { 1298*1c12ee1eSDan Willemsen t.Errorf("operation %v, Message.Range mismatch (-want, +got):\n%s", p, diff) 1299*1c12ee1eSDan Willemsen } 1300*1c12ee1eSDan Willemsen default: 1301*1c12ee1eSDan Willemsen t.Fatalf("operation %v, invalid operation: %T", p, op) 1302*1c12ee1eSDan Willemsen } 1303*1c12ee1eSDan Willemsen p.Pop() 1304*1c12ee1eSDan Willemsen } 1305*1c12ee1eSDan Willemsen} 1306*1c12ee1eSDan Willemsen 1307*1c12ee1eSDan Willemsenfunc testLists(t *testing.T, p path, v protoreflect.List, tt listOps) { 1308*1c12ee1eSDan Willemsen for i, op := range tt { 1309*1c12ee1eSDan Willemsen p.Push(i) 1310*1c12ee1eSDan Willemsen switch op := op.(type) { 1311*1c12ee1eSDan Willemsen case equalList: 1312*1c12ee1eSDan Willemsen if diff := cmp.Diff(V(op.List), V(v), cmpOpts); diff != "" { 1313*1c12ee1eSDan Willemsen t.Errorf("operation %v, list mismatch (-want, +got):\n%s", p, diff) 1314*1c12ee1eSDan Willemsen } 1315*1c12ee1eSDan Willemsen case lenList: 1316*1c12ee1eSDan Willemsen if got, want := v.Len(), int(op); got != want { 1317*1c12ee1eSDan Willemsen t.Errorf("operation %v, List.Len = %d, want %d", p, got, want) 1318*1c12ee1eSDan Willemsen } 1319*1c12ee1eSDan Willemsen case getList: 1320*1c12ee1eSDan Willemsen got := map[int]protoreflect.Value{} 1321*1c12ee1eSDan Willemsen want := map[int]protoreflect.Value(op) 1322*1c12ee1eSDan Willemsen for n := range want { 1323*1c12ee1eSDan Willemsen got[n] = v.Get(n) 1324*1c12ee1eSDan Willemsen } 1325*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpOpts); diff != "" { 1326*1c12ee1eSDan Willemsen t.Errorf("operation %v, List.Get mismatch (-want, +got):\n%s", p, diff) 1327*1c12ee1eSDan Willemsen } 1328*1c12ee1eSDan Willemsen case setList: 1329*1c12ee1eSDan Willemsen for n, e := range op { 1330*1c12ee1eSDan Willemsen v.Set(n, e) 1331*1c12ee1eSDan Willemsen } 1332*1c12ee1eSDan Willemsen case appendList: 1333*1c12ee1eSDan Willemsen for _, e := range op { 1334*1c12ee1eSDan Willemsen v.Append(e) 1335*1c12ee1eSDan Willemsen } 1336*1c12ee1eSDan Willemsen case appendMessageList: 1337*1c12ee1eSDan Willemsen e := v.NewElement() 1338*1c12ee1eSDan Willemsen v.Append(e) 1339*1c12ee1eSDan Willemsen testMessage(t, p, e.Message(), messageOps(op)) 1340*1c12ee1eSDan Willemsen case truncList: 1341*1c12ee1eSDan Willemsen v.Truncate(int(op)) 1342*1c12ee1eSDan Willemsen default: 1343*1c12ee1eSDan Willemsen t.Fatalf("operation %v, invalid operation: %T", p, op) 1344*1c12ee1eSDan Willemsen } 1345*1c12ee1eSDan Willemsen p.Pop() 1346*1c12ee1eSDan Willemsen } 1347*1c12ee1eSDan Willemsen} 1348*1c12ee1eSDan Willemsen 1349*1c12ee1eSDan Willemsenfunc testMaps(t *testing.T, p path, m protoreflect.Map, tt mapOps) { 1350*1c12ee1eSDan Willemsen for i, op := range tt { 1351*1c12ee1eSDan Willemsen p.Push(i) 1352*1c12ee1eSDan Willemsen switch op := op.(type) { 1353*1c12ee1eSDan Willemsen case equalMap: 1354*1c12ee1eSDan Willemsen if diff := cmp.Diff(V(op.Map), V(m), cmpOpts); diff != "" { 1355*1c12ee1eSDan Willemsen t.Errorf("operation %v, map mismatch (-want, +got):\n%s", p, diff) 1356*1c12ee1eSDan Willemsen } 1357*1c12ee1eSDan Willemsen case lenMap: 1358*1c12ee1eSDan Willemsen if got, want := m.Len(), int(op); got != want { 1359*1c12ee1eSDan Willemsen t.Errorf("operation %v, Map.Len = %d, want %d", p, got, want) 1360*1c12ee1eSDan Willemsen } 1361*1c12ee1eSDan Willemsen case hasMap: 1362*1c12ee1eSDan Willemsen got := map[interface{}]bool{} 1363*1c12ee1eSDan Willemsen want := map[interface{}]bool(op) 1364*1c12ee1eSDan Willemsen for k := range want { 1365*1c12ee1eSDan Willemsen got[k] = m.Has(V(k).MapKey()) 1366*1c12ee1eSDan Willemsen } 1367*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpOpts); diff != "" { 1368*1c12ee1eSDan Willemsen t.Errorf("operation %v, Map.Has mismatch (-want, +got):\n%s", p, diff) 1369*1c12ee1eSDan Willemsen } 1370*1c12ee1eSDan Willemsen case getMap: 1371*1c12ee1eSDan Willemsen got := map[interface{}]protoreflect.Value{} 1372*1c12ee1eSDan Willemsen want := map[interface{}]protoreflect.Value(op) 1373*1c12ee1eSDan Willemsen for k := range want { 1374*1c12ee1eSDan Willemsen got[k] = m.Get(V(k).MapKey()) 1375*1c12ee1eSDan Willemsen } 1376*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpOpts); diff != "" { 1377*1c12ee1eSDan Willemsen t.Errorf("operation %v, Map.Get mismatch (-want, +got):\n%s", p, diff) 1378*1c12ee1eSDan Willemsen } 1379*1c12ee1eSDan Willemsen case setMap: 1380*1c12ee1eSDan Willemsen for k, v := range op { 1381*1c12ee1eSDan Willemsen m.Set(V(k).MapKey(), v) 1382*1c12ee1eSDan Willemsen } 1383*1c12ee1eSDan Willemsen case clearMap: 1384*1c12ee1eSDan Willemsen for _, k := range op { 1385*1c12ee1eSDan Willemsen m.Clear(V(k).MapKey()) 1386*1c12ee1eSDan Willemsen } 1387*1c12ee1eSDan Willemsen case messageMap: 1388*1c12ee1eSDan Willemsen for k, tt := range op { 1389*1c12ee1eSDan Willemsen mk := V(k).MapKey() 1390*1c12ee1eSDan Willemsen if !m.Has(mk) { 1391*1c12ee1eSDan Willemsen m.Set(mk, m.NewValue()) 1392*1c12ee1eSDan Willemsen } 1393*1c12ee1eSDan Willemsen testMessage(t, p, m.Get(mk).Message(), tt) 1394*1c12ee1eSDan Willemsen } 1395*1c12ee1eSDan Willemsen case rangeMap: 1396*1c12ee1eSDan Willemsen got := map[interface{}]protoreflect.Value{} 1397*1c12ee1eSDan Willemsen want := map[interface{}]protoreflect.Value(op) 1398*1c12ee1eSDan Willemsen m.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { 1399*1c12ee1eSDan Willemsen got[k.Interface()] = v 1400*1c12ee1eSDan Willemsen return true 1401*1c12ee1eSDan Willemsen }) 1402*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got, cmpOpts); diff != "" { 1403*1c12ee1eSDan Willemsen t.Errorf("operation %v, Map.Range mismatch (-want, +got):\n%s", p, diff) 1404*1c12ee1eSDan Willemsen } 1405*1c12ee1eSDan Willemsen default: 1406*1c12ee1eSDan Willemsen t.Fatalf("operation %v, invalid operation: %T", p, op) 1407*1c12ee1eSDan Willemsen } 1408*1c12ee1eSDan Willemsen p.Pop() 1409*1c12ee1eSDan Willemsen } 1410*1c12ee1eSDan Willemsen} 1411*1c12ee1eSDan Willemsen 1412*1c12ee1eSDan Willemsenfunc getField(m protoreflect.Message, n protoreflect.FieldNumber) protoreflect.Value { 1413*1c12ee1eSDan Willemsen fd := m.Descriptor().Fields().ByNumber(n) 1414*1c12ee1eSDan Willemsen return m.Get(fd) 1415*1c12ee1eSDan Willemsen} 1416*1c12ee1eSDan Willemsen 1417*1c12ee1eSDan Willemsentype path []int 1418*1c12ee1eSDan Willemsen 1419*1c12ee1eSDan Willemsenfunc (p *path) Push(i int) { *p = append(*p, i) } 1420*1c12ee1eSDan Willemsenfunc (p *path) Pop() { *p = (*p)[:len(*p)-1] } 1421*1c12ee1eSDan Willemsenfunc (p path) String() string { 1422*1c12ee1eSDan Willemsen var ss []string 1423*1c12ee1eSDan Willemsen for _, i := range p { 1424*1c12ee1eSDan Willemsen ss = append(ss, fmt.Sprint(i)) 1425*1c12ee1eSDan Willemsen } 1426*1c12ee1eSDan Willemsen return strings.Join(ss, ".") 1427*1c12ee1eSDan Willemsen} 1428*1c12ee1eSDan Willemsen 1429*1c12ee1eSDan Willemsentype UnknownFieldsA struct { 1430*1c12ee1eSDan Willemsen XXX_unrecognized []byte 1431*1c12ee1eSDan Willemsen} 1432*1c12ee1eSDan Willemsen 1433*1c12ee1eSDan Willemsenvar unknownFieldsAType = pimpl.MessageInfo{ 1434*1c12ee1eSDan Willemsen GoReflectType: reflect.TypeOf(new(UnknownFieldsA)), 1435*1c12ee1eSDan Willemsen Desc: mustMakeMessageDesc("unknown.proto", protoreflect.Proto2, "", `name: "UnknownFieldsA"`, nil), 1436*1c12ee1eSDan Willemsen} 1437*1c12ee1eSDan Willemsen 1438*1c12ee1eSDan Willemsenfunc (m *UnknownFieldsA) ProtoReflect() protoreflect.Message { return unknownFieldsAType.MessageOf(m) } 1439*1c12ee1eSDan Willemsen 1440*1c12ee1eSDan Willemsentype UnknownFieldsB struct { 1441*1c12ee1eSDan Willemsen XXX_unrecognized *[]byte 1442*1c12ee1eSDan Willemsen} 1443*1c12ee1eSDan Willemsen 1444*1c12ee1eSDan Willemsenvar unknownFieldsBType = pimpl.MessageInfo{ 1445*1c12ee1eSDan Willemsen GoReflectType: reflect.TypeOf(new(UnknownFieldsB)), 1446*1c12ee1eSDan Willemsen Desc: mustMakeMessageDesc("unknown.proto", protoreflect.Proto2, "", `name: "UnknownFieldsB"`, nil), 1447*1c12ee1eSDan Willemsen} 1448*1c12ee1eSDan Willemsen 1449*1c12ee1eSDan Willemsenfunc (m *UnknownFieldsB) ProtoReflect() protoreflect.Message { return unknownFieldsBType.MessageOf(m) } 1450*1c12ee1eSDan Willemsen 1451*1c12ee1eSDan Willemsenfunc TestUnknownFields(t *testing.T) { 1452*1c12ee1eSDan Willemsen for _, m := range []proto.Message{new(UnknownFieldsA), new(UnknownFieldsB)} { 1453*1c12ee1eSDan Willemsen t.Run(reflect.TypeOf(m).Elem().Name(), func(t *testing.T) { 1454*1c12ee1eSDan Willemsen want := protopack.Message{ 1455*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.BytesType}, protopack.String("Hello, world!"), 1456*1c12ee1eSDan Willemsen }.Marshal() 1457*1c12ee1eSDan Willemsen m.ProtoReflect().SetUnknown(want) 1458*1c12ee1eSDan Willemsen got := []byte(m.ProtoReflect().GetUnknown()) 1459*1c12ee1eSDan Willemsen if diff := cmp.Diff(want, got); diff != "" { 1460*1c12ee1eSDan Willemsen t.Errorf("UnknownFields mismatch (-want +got):\n%s", diff) 1461*1c12ee1eSDan Willemsen } 1462*1c12ee1eSDan Willemsen }) 1463*1c12ee1eSDan Willemsen } 1464*1c12ee1eSDan Willemsen} 1465*1c12ee1eSDan Willemsen 1466*1c12ee1eSDan Willemsenfunc TestReset(t *testing.T) { 1467*1c12ee1eSDan Willemsen mi := new(testpb.TestAllTypes) 1468*1c12ee1eSDan Willemsen 1469*1c12ee1eSDan Willemsen // ProtoReflect is implemented using a messageState cache. 1470*1c12ee1eSDan Willemsen m := mi.ProtoReflect() 1471*1c12ee1eSDan Willemsen 1472*1c12ee1eSDan Willemsen // Reset must not clear the messageState cache. 1473*1c12ee1eSDan Willemsen mi.Reset() 1474*1c12ee1eSDan Willemsen 1475*1c12ee1eSDan Willemsen // If Reset accidentally cleared the messageState cache, this panics. 1476*1c12ee1eSDan Willemsen m.Descriptor() 1477*1c12ee1eSDan Willemsen} 1478*1c12ee1eSDan Willemsen 1479*1c12ee1eSDan Willemsenfunc TestIsValid(t *testing.T) { 1480*1c12ee1eSDan Willemsen var m *testpb.TestAllTypes 1481*1c12ee1eSDan Willemsen if got, want := m.ProtoReflect().IsValid(), false; got != want { 1482*1c12ee1eSDan Willemsen t.Errorf("((*M)(nil)).ProtoReflect().IsValid() = %v, want %v", got, want) 1483*1c12ee1eSDan Willemsen } 1484*1c12ee1eSDan Willemsen m = &testpb.TestAllTypes{} 1485*1c12ee1eSDan Willemsen if got, want := m.ProtoReflect().IsValid(), true; got != want { 1486*1c12ee1eSDan Willemsen t.Errorf("(&M{}).ProtoReflect().IsValid() = %v, want %v", got, want) 1487*1c12ee1eSDan Willemsen } 1488*1c12ee1eSDan Willemsen} 1489*1c12ee1eSDan Willemsen 1490*1c12ee1eSDan Willemsen// The MessageState implementation makes the assumption that when a 1491*1c12ee1eSDan Willemsen// concrete message is unsafe casted as a *MessageState, the Go GC does 1492*1c12ee1eSDan Willemsen// not reclaim the memory for the remainder of the concrete message. 1493*1c12ee1eSDan Willemsenfunc TestUnsafeAssumptions(t *testing.T) { 1494*1c12ee1eSDan Willemsen if !pimpl.UnsafeEnabled { 1495*1c12ee1eSDan Willemsen t.Skip() 1496*1c12ee1eSDan Willemsen } 1497*1c12ee1eSDan Willemsen 1498*1c12ee1eSDan Willemsen var wg sync.WaitGroup 1499*1c12ee1eSDan Willemsen for i := 0; i < 10; i++ { 1500*1c12ee1eSDan Willemsen wg.Add(1) 1501*1c12ee1eSDan Willemsen go func() { 1502*1c12ee1eSDan Willemsen var ms [10]protoreflect.Message 1503*1c12ee1eSDan Willemsen 1504*1c12ee1eSDan Willemsen // Store the message only in its reflective form. 1505*1c12ee1eSDan Willemsen // Trigger the GC after each iteration. 1506*1c12ee1eSDan Willemsen for j := 0; j < 10; j++ { 1507*1c12ee1eSDan Willemsen ms[j] = (&testpb.TestAllTypes{ 1508*1c12ee1eSDan Willemsen OptionalInt32: proto.Int32(int32(j)), 1509*1c12ee1eSDan Willemsen OptionalFloat: proto.Float32(float32(j)), 1510*1c12ee1eSDan Willemsen RepeatedInt32: []int32{int32(j)}, 1511*1c12ee1eSDan Willemsen RepeatedFloat: []float32{float32(j)}, 1512*1c12ee1eSDan Willemsen DefaultInt32: proto.Int32(int32(j)), 1513*1c12ee1eSDan Willemsen DefaultFloat: proto.Float32(float32(j)), 1514*1c12ee1eSDan Willemsen }).ProtoReflect() 1515*1c12ee1eSDan Willemsen runtime.GC() 1516*1c12ee1eSDan Willemsen } 1517*1c12ee1eSDan Willemsen 1518*1c12ee1eSDan Willemsen // Convert the reflective form back into a concrete form. 1519*1c12ee1eSDan Willemsen // Verify that the values written previously are still the same. 1520*1c12ee1eSDan Willemsen for j := 0; j < 10; j++ { 1521*1c12ee1eSDan Willemsen switch m := ms[j].Interface().(*testpb.TestAllTypes); { 1522*1c12ee1eSDan Willemsen case m.GetOptionalInt32() != int32(j): 1523*1c12ee1eSDan Willemsen case m.GetOptionalFloat() != float32(j): 1524*1c12ee1eSDan Willemsen case m.GetRepeatedInt32()[0] != int32(j): 1525*1c12ee1eSDan Willemsen case m.GetRepeatedFloat()[0] != float32(j): 1526*1c12ee1eSDan Willemsen case m.GetDefaultInt32() != int32(j): 1527*1c12ee1eSDan Willemsen case m.GetDefaultFloat() != float32(j): 1528*1c12ee1eSDan Willemsen default: 1529*1c12ee1eSDan Willemsen continue 1530*1c12ee1eSDan Willemsen } 1531*1c12ee1eSDan Willemsen t.Error("memory corrupted detected") 1532*1c12ee1eSDan Willemsen } 1533*1c12ee1eSDan Willemsen defer wg.Done() 1534*1c12ee1eSDan Willemsen }() 1535*1c12ee1eSDan Willemsen } 1536*1c12ee1eSDan Willemsen wg.Wait() 1537*1c12ee1eSDan Willemsen} 1538*1c12ee1eSDan Willemsen 1539*1c12ee1eSDan Willemsenfunc BenchmarkName(b *testing.B) { 1540*1c12ee1eSDan Willemsen var sink protoreflect.FullName 1541*1c12ee1eSDan Willemsen b.Run("Value", func(b *testing.B) { 1542*1c12ee1eSDan Willemsen b.ReportAllocs() 1543*1c12ee1eSDan Willemsen m := new(descriptorpb.FileDescriptorProto) 1544*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1545*1c12ee1eSDan Willemsen sink = m.ProtoReflect().Descriptor().FullName() 1546*1c12ee1eSDan Willemsen } 1547*1c12ee1eSDan Willemsen }) 1548*1c12ee1eSDan Willemsen b.Run("Nil", func(b *testing.B) { 1549*1c12ee1eSDan Willemsen b.ReportAllocs() 1550*1c12ee1eSDan Willemsen m := (*descriptorpb.FileDescriptorProto)(nil) 1551*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1552*1c12ee1eSDan Willemsen sink = m.ProtoReflect().Descriptor().FullName() 1553*1c12ee1eSDan Willemsen } 1554*1c12ee1eSDan Willemsen }) 1555*1c12ee1eSDan Willemsen runtime.KeepAlive(sink) 1556*1c12ee1eSDan Willemsen} 1557*1c12ee1eSDan Willemsen 1558*1c12ee1eSDan Willemsenfunc BenchmarkReflect(b *testing.B) { 1559*1c12ee1eSDan Willemsen m := new(testpb.TestAllTypes).ProtoReflect() 1560*1c12ee1eSDan Willemsen fds := m.Descriptor().Fields() 1561*1c12ee1eSDan Willemsen vs := make([]protoreflect.Value, fds.Len()) 1562*1c12ee1eSDan Willemsen for i := range vs { 1563*1c12ee1eSDan Willemsen vs[i] = m.NewField(fds.Get(i)) 1564*1c12ee1eSDan Willemsen } 1565*1c12ee1eSDan Willemsen 1566*1c12ee1eSDan Willemsen b.Run("Has", func(b *testing.B) { 1567*1c12ee1eSDan Willemsen b.ReportAllocs() 1568*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1569*1c12ee1eSDan Willemsen for j := 0; j < fds.Len(); j++ { 1570*1c12ee1eSDan Willemsen m.Has(fds.Get(j)) 1571*1c12ee1eSDan Willemsen } 1572*1c12ee1eSDan Willemsen } 1573*1c12ee1eSDan Willemsen }) 1574*1c12ee1eSDan Willemsen b.Run("Get", func(b *testing.B) { 1575*1c12ee1eSDan Willemsen b.ReportAllocs() 1576*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1577*1c12ee1eSDan Willemsen for j := 0; j < fds.Len(); j++ { 1578*1c12ee1eSDan Willemsen m.Get(fds.Get(j)) 1579*1c12ee1eSDan Willemsen } 1580*1c12ee1eSDan Willemsen } 1581*1c12ee1eSDan Willemsen }) 1582*1c12ee1eSDan Willemsen b.Run("Set", func(b *testing.B) { 1583*1c12ee1eSDan Willemsen b.ReportAllocs() 1584*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1585*1c12ee1eSDan Willemsen for j := 0; j < fds.Len(); j++ { 1586*1c12ee1eSDan Willemsen m.Set(fds.Get(j), vs[j]) 1587*1c12ee1eSDan Willemsen } 1588*1c12ee1eSDan Willemsen } 1589*1c12ee1eSDan Willemsen }) 1590*1c12ee1eSDan Willemsen b.Run("Clear", func(b *testing.B) { 1591*1c12ee1eSDan Willemsen b.ReportAllocs() 1592*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1593*1c12ee1eSDan Willemsen for j := 0; j < fds.Len(); j++ { 1594*1c12ee1eSDan Willemsen m.Clear(fds.Get(j)) 1595*1c12ee1eSDan Willemsen } 1596*1c12ee1eSDan Willemsen } 1597*1c12ee1eSDan Willemsen }) 1598*1c12ee1eSDan Willemsen b.Run("Range", func(b *testing.B) { 1599*1c12ee1eSDan Willemsen b.ReportAllocs() 1600*1c12ee1eSDan Willemsen for i := 0; i < b.N; i++ { 1601*1c12ee1eSDan Willemsen m.Range(func(protoreflect.FieldDescriptor, protoreflect.Value) bool { 1602*1c12ee1eSDan Willemsen return true 1603*1c12ee1eSDan Willemsen }) 1604*1c12ee1eSDan Willemsen } 1605*1c12ee1eSDan Willemsen }) 1606*1c12ee1eSDan Willemsen} 1607