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 main 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "fmt" 9*1c12ee1eSDan Willemsen "strings" 10*1c12ee1eSDan Willemsen "testing" 11*1c12ee1eSDan Willemsen 12*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/prototext" 13*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 14*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsen "google.golang.org/protobuf/types/descriptorpb" 17*1c12ee1eSDan Willemsen) 18*1c12ee1eSDan Willemsen 19*1c12ee1eSDan Willemsenfunc mustMakeMessage(s string) *descriptorpb.DescriptorProto { 20*1c12ee1eSDan Willemsen s = fmt.Sprintf(`name:"test.proto" syntax:"proto2" message_type:[{%s}]`, s) 21*1c12ee1eSDan Willemsen pb := new(descriptorpb.FileDescriptorProto) 22*1c12ee1eSDan Willemsen if err := prototext.Unmarshal([]byte(s), pb); err != nil { 23*1c12ee1eSDan Willemsen panic(err) 24*1c12ee1eSDan Willemsen } 25*1c12ee1eSDan Willemsen return pb.MessageType[0] 26*1c12ee1eSDan Willemsen} 27*1c12ee1eSDan Willemsen 28*1c12ee1eSDan Willemsenfunc TestFields(t *testing.T) { 29*1c12ee1eSDan Willemsen type fieldsKind struct { 30*1c12ee1eSDan Willemsen kind protoreflect.Kind 31*1c12ee1eSDan Willemsen fields string 32*1c12ee1eSDan Willemsen } 33*1c12ee1eSDan Willemsen tests := []struct { 34*1c12ee1eSDan Willemsen inFields []fieldsKind 35*1c12ee1eSDan Willemsen wantMsg *descriptorpb.DescriptorProto 36*1c12ee1eSDan Willemsen wantErr string 37*1c12ee1eSDan Willemsen }{{ 38*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.MessageKind, ""}}, 39*1c12ee1eSDan Willemsen wantMsg: mustMakeMessage(`name:"X"`), 40*1c12ee1eSDan Willemsen }, { 41*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.MessageKind, "987654321"}}, 42*1c12ee1eSDan Willemsen wantErr: "invalid field: 987654321", 43*1c12ee1eSDan Willemsen }, { 44*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.MessageKind, "-1"}}, 45*1c12ee1eSDan Willemsen wantErr: "invalid field: -1", 46*1c12ee1eSDan Willemsen }, { 47*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.MessageKind, "k"}}, 48*1c12ee1eSDan Willemsen wantErr: "invalid field: k", 49*1c12ee1eSDan Willemsen }, { 50*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.MessageKind, "1.2"}, {protoreflect.Int32Kind, "1"}}, 51*1c12ee1eSDan Willemsen wantErr: "field 1 of int32 type cannot have sub-fields", 52*1c12ee1eSDan Willemsen }, { 53*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.Int32Kind, "1"}, {protoreflect.MessageKind, "1.2"}}, 54*1c12ee1eSDan Willemsen wantErr: "field 1 of int32 type cannot have sub-fields", 55*1c12ee1eSDan Willemsen }, { 56*1c12ee1eSDan Willemsen inFields: []fieldsKind{{protoreflect.Int32Kind, "30"}, {protoreflect.Int32Kind, "30"}}, 57*1c12ee1eSDan Willemsen wantErr: "field 30 already set as int32 type", 58*1c12ee1eSDan Willemsen }, { 59*1c12ee1eSDan Willemsen inFields: []fieldsKind{ 60*1c12ee1eSDan Willemsen {protoreflect.Int32Kind, "10.20.31"}, 61*1c12ee1eSDan Willemsen {protoreflect.MessageKind, " 10.20.30, 10.21 "}, 62*1c12ee1eSDan Willemsen {protoreflect.GroupKind, "10"}, 63*1c12ee1eSDan Willemsen }, 64*1c12ee1eSDan Willemsen wantMsg: mustMakeMessage(` 65*1c12ee1eSDan Willemsen name: "X" 66*1c12ee1eSDan Willemsen field: [ 67*1c12ee1eSDan Willemsen {name:"x10" number:10 label:LABEL_OPTIONAL type:TYPE_GROUP type_name:".X.X10"} 68*1c12ee1eSDan Willemsen ] 69*1c12ee1eSDan Willemsen nested_type: [{ 70*1c12ee1eSDan Willemsen name: "X10" 71*1c12ee1eSDan Willemsen field: [ 72*1c12ee1eSDan Willemsen {name:"x20" number:20 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".X.X10.X20"}, 73*1c12ee1eSDan Willemsen {name:"x21" number:21 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".X.X10.X21"} 74*1c12ee1eSDan Willemsen ] 75*1c12ee1eSDan Willemsen nested_type: [{ 76*1c12ee1eSDan Willemsen name: "X20" 77*1c12ee1eSDan Willemsen field:[ 78*1c12ee1eSDan Willemsen {name:"x30" number:30 label:LABEL_OPTIONAL type:TYPE_MESSAGE, type_name:".X.X10.X20.X30"}, 79*1c12ee1eSDan Willemsen {name:"x31" number:31 label:LABEL_REPEATED type:TYPE_INT32 options:{packed:true}} 80*1c12ee1eSDan Willemsen ] 81*1c12ee1eSDan Willemsen nested_type: [{ 82*1c12ee1eSDan Willemsen name: "X30" 83*1c12ee1eSDan Willemsen }] 84*1c12ee1eSDan Willemsen }, { 85*1c12ee1eSDan Willemsen name: "X21" 86*1c12ee1eSDan Willemsen }] 87*1c12ee1eSDan Willemsen }] 88*1c12ee1eSDan Willemsen `), 89*1c12ee1eSDan Willemsen }} 90*1c12ee1eSDan Willemsen 91*1c12ee1eSDan Willemsen for _, tt := range tests { 92*1c12ee1eSDan Willemsen t.Run("", func(t *testing.T) { 93*1c12ee1eSDan Willemsen var fields fields 94*1c12ee1eSDan Willemsen for i, tc := range tt.inFields { 95*1c12ee1eSDan Willemsen gotErr := fields.Set(tc.fields, tc.kind) 96*1c12ee1eSDan Willemsen if gotErr != nil { 97*1c12ee1eSDan Willemsen if tt.wantErr == "" || !strings.Contains(fmt.Sprint(gotErr), tt.wantErr) { 98*1c12ee1eSDan Willemsen t.Fatalf("fields %d, Set(%q, %v) = %v, want %v", i, tc.fields, tc.kind, gotErr, tt.wantErr) 99*1c12ee1eSDan Willemsen } 100*1c12ee1eSDan Willemsen return 101*1c12ee1eSDan Willemsen } 102*1c12ee1eSDan Willemsen } 103*1c12ee1eSDan Willemsen if tt.wantErr != "" { 104*1c12ee1eSDan Willemsen t.Errorf("all Set calls succeeded, want %v error", tt.wantErr) 105*1c12ee1eSDan Willemsen } 106*1c12ee1eSDan Willemsen gotMsg := fields.messageDescriptor("X") 107*1c12ee1eSDan Willemsen if !proto.Equal(gotMsg, tt.wantMsg) { 108*1c12ee1eSDan Willemsen t.Errorf("messageDescriptor() mismatch:\ngot %v\nwant %v", gotMsg, tt.wantMsg) 109*1c12ee1eSDan Willemsen } 110*1c12ee1eSDan Willemsen if _, err := fields.Descriptor(); err != nil { 111*1c12ee1eSDan Willemsen t.Errorf("Descriptor() = %v, want nil error", err) 112*1c12ee1eSDan Willemsen } 113*1c12ee1eSDan Willemsen }) 114*1c12ee1eSDan Willemsen } 115*1c12ee1eSDan Willemsen} 116