blob: 524a3a2711c0135a628fc70ea6653df40a23e360 [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
12 "github.com/google/go-cmp/cmp"
13 "github.com/google/go-cmp/cmp/cmpopts"
14
15 pref "google.golang.org/proto/reflect/protoreflect"
16 ptype "google.golang.org/proto/reflect/prototype"
17)
18
19func TestFields(t *testing.T) {
20 type fieldsKind struct {
21 kind pref.Kind
22 fields string
23 }
24 tests := []struct {
25 inFields []fieldsKind
26 wantMsg ptype.Message
27 wantErr string
28 }{{
29 inFields: []fieldsKind{{pref.MessageKind, ""}},
30 wantMsg: ptype.Message{Name: "M"},
31 }, {
32 inFields: []fieldsKind{{pref.MessageKind, "987654321"}},
33 wantErr: "invalid field: 987654321",
34 }, {
35 inFields: []fieldsKind{{pref.MessageKind, "-1"}},
36 wantErr: "invalid field: -1",
37 }, {
38 inFields: []fieldsKind{{pref.MessageKind, "k"}},
39 wantErr: "invalid field: k",
40 }, {
41 inFields: []fieldsKind{{pref.MessageKind, "1.2"}, {pref.Int32Kind, "1"}},
42 wantErr: "field 1 of int32 type cannot have sub-fields",
43 }, {
44 inFields: []fieldsKind{{pref.Int32Kind, "1"}, {pref.MessageKind, "1.2"}},
45 wantErr: "field 1 of int32 type cannot have sub-fields",
46 }, {
47 inFields: []fieldsKind{{pref.Int32Kind, "30"}, {pref.Int32Kind, "30"}},
48 wantErr: "field 30 already set as int32 type",
49 }, {
50 inFields: []fieldsKind{
51 {pref.Int32Kind, "10.20.31"},
52 {pref.MessageKind, " 10.20.30, 10.21 "},
53 {pref.GroupKind, "10"},
54 },
55 wantMsg: ptype.Message{
56 Name: "M",
57 Fields: []ptype.Field{
58 {Name: "f10", Number: 10, Cardinality: pref.Optional, Kind: pref.GroupKind, MessageType: ptype.PlaceholderMessage("M.M10")},
59 },
60 Messages: []ptype.Message{{
61 Name: "M10",
62 Fields: []ptype.Field{
63 {Name: "f20", Number: 20, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20")},
64 {Name: "f21", Number: 21, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M21")},
65 },
66 Messages: []ptype.Message{{
67 Name: "M20",
68 Fields: []ptype.Field{
69 {Name: "f30", Number: 30, Cardinality: pref.Optional, Kind: pref.MessageKind, MessageType: ptype.PlaceholderMessage("M.M10.M20.M30")},
70 {Name: "f31", Number: 31, Cardinality: pref.Repeated, IsPacked: true, Kind: pref.Int32Kind},
71 },
72 Messages: []ptype.Message{{
73 Name: "M30",
74 }},
75 }, {
76 Name: "M21",
77 }},
78 }},
79 },
80 }}
81
82 opts := cmp.Options{
83 cmp.Comparer(func(x, y pref.Descriptor) bool {
84 if x == nil || y == nil {
85 return x == nil && y == nil
86 }
87 return x.FullName() == y.FullName()
88 }),
89 cmpopts.IgnoreFields(ptype.Field{}, "Default"),
90 cmpopts.IgnoreUnexported(ptype.Message{}, ptype.Field{}),
91 }
92 for _, tt := range tests {
93 t.Run("", func(t *testing.T) {
94 var fields fields
95 for i, tc := range tt.inFields {
96 gotErr := fields.Set(tc.fields, tc.kind)
97 if gotErr != nil {
98 if tt.wantErr == "" || !strings.Contains(fmt.Sprint(gotErr), tt.wantErr) {
99 t.Fatalf("fields %d, Set(%q, %v) = %v, want %v", i, tc.fields, tc.kind, gotErr, tt.wantErr)
100 }
101 return
102 }
103 }
104 if tt.wantErr != "" {
105 t.Errorf("all Set calls succeeded, want %v error", tt.wantErr)
106 }
107 gotMsg := fields.messageDescriptor("M")
108 if diff := cmp.Diff(tt.wantMsg, gotMsg, opts); diff != "" {
109 t.Errorf("messageDescriptor() mismatch (-want +got):\n%v", diff)
110 }
111 if _, err := fields.Descriptor(); err != nil {
112 t.Errorf("Descriptor() = %v, want nil error", err)
113 }
114 })
115 }
116}