blob: 567cea0e27a37f3114ff88ff4ee9ab3c2e979d1f [file] [log] [blame]
Joe Tsaib4e370e2018-08-15 14:59:51 -07001// 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
5package main
6
7import (
8 "fmt"
9 "strings"
10 "testing"
11
Joe Tsaid8881392019-06-06 13:01:53 -070012 "google.golang.org/protobuf/encoding/prototext"
13 "google.golang.org/protobuf/proto"
Damien Neile89e6242019-05-13 23:55:40 -070014 pref "google.golang.org/protobuf/reflect/protoreflect"
Joe Tsaid8881392019-06-06 13:01:53 -070015
16 "google.golang.org/protobuf/types/descriptorpb"
Joe Tsaib4e370e2018-08-15 14:59:51 -070017)
18
Joe Tsaid8881392019-06-06 13:01:53 -070019func 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 Tsaib4e370e2018-08-15 14:59:51 -070028func TestFields(t *testing.T) {
29 type fieldsKind struct {
30 kind pref.Kind
31 fields string
32 }
33 tests := []struct {
34 inFields []fieldsKind
Joe Tsaid8881392019-06-06 13:01:53 -070035 wantMsg *descriptorpb.DescriptorProto
Joe Tsaib4e370e2018-08-15 14:59:51 -070036 wantErr string
37 }{{
38 inFields: []fieldsKind{{pref.MessageKind, ""}},
Joe Tsai15076352019-07-02 15:19:08 -070039 wantMsg: mustMakeMessage(`name:"X"`),
Joe Tsaib4e370e2018-08-15 14:59:51 -070040 }, {
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 Tsaid8881392019-06-06 13:01:53 -070064 wantMsg: mustMakeMessage(`
Joe Tsai15076352019-07-02 15:19:08 -070065 name: "X"
Joe Tsaid8881392019-06-06 13:01:53 -070066 field: [
Joe Tsai15076352019-07-02 15:19:08 -070067 {name:"x10" number:10 label:LABEL_OPTIONAL type:TYPE_GROUP type_name:".X.X10"}
Joe Tsaid8881392019-06-06 13:01:53 -070068 ]
69 nested_type: [{
Joe Tsai15076352019-07-02 15:19:08 -070070 name: "X10"
Joe Tsaid8881392019-06-06 13:01:53 -070071 field: [
Joe Tsai15076352019-07-02 15:19:08 -070072 {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 Tsaid8881392019-06-06 13:01:53 -070074 ]
75 nested_type: [{
Joe Tsai15076352019-07-02 15:19:08 -070076 name: "X20"
Joe Tsaid8881392019-06-06 13:01:53 -070077 field:[
Joe Tsai15076352019-07-02 15:19:08 -070078 {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 Tsaid8881392019-06-06 13:01:53 -070080 ]
81 nested_type: [{
Joe Tsai15076352019-07-02 15:19:08 -070082 name: "X30"
Joe Tsaid8881392019-06-06 13:01:53 -070083 }]
Joe Tsaib4e370e2018-08-15 14:59:51 -070084 }, {
Joe Tsai15076352019-07-02 15:19:08 -070085 name: "X21"
Joe Tsaid8881392019-06-06 13:01:53 -070086 }]
87 }]
88 `),
Joe Tsaib4e370e2018-08-15 14:59:51 -070089 }}
90
Joe Tsaib4e370e2018-08-15 14:59:51 -070091 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 Tsai15076352019-07-02 15:19:08 -0700106 gotMsg := fields.messageDescriptor("X")
Joe Tsaid8881392019-06-06 13:01:53 -0700107 if !proto.Equal(gotMsg, tt.wantMsg) {
108 t.Errorf("messageDescriptor() mismatch:\ngot %v\nwant %v", gotMsg, tt.wantMsg)
Joe Tsaib4e370e2018-08-15 14:59:51 -0700109 }
110 if _, err := fields.Descriptor(); err != nil {
111 t.Errorf("Descriptor() = %v, want nil error", err)
112 }
113 })
114 }
115}