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