1
15
16 package proto
17
18 import (
19 "os"
20 "path/filepath"
21 "reflect"
22 "testing"
23 )
24
25 func TestProtoRegexpGroupNames(t *testing.T) {
26 names := protoRe.SubexpNames()
27 nameMap := map[string]int{
28 "import": importSubexpIndex,
29 "package": packageSubexpIndex,
30 "optkey": optkeySubexpIndex,
31 "optval": optvalSubexpIndex,
32 "service": serviceSubexpIndex,
33 }
34 for name, index := range nameMap {
35 if names[index] != name {
36 t.Errorf("proto regexp subexp %d is %s ; want %s", index, names[index], name)
37 }
38 }
39 if len(names)-1 != len(nameMap) {
40 t.Errorf("proto regexp has %d groups ; want %d", len(names), len(nameMap))
41 }
42 }
43
44 func TestProtoFileInfo(t *testing.T) {
45 for _, tc := range []struct {
46 desc, name, proto string
47 want FileInfo
48 }{
49 {
50 desc: "empty",
51 name: "empty^file.proto",
52 proto: "",
53 want: FileInfo{},
54 }, {
55 desc: "simple package",
56 name: "package.proto",
57 proto: "package foo;",
58 want: FileInfo{
59 PackageName: "foo",
60 },
61 }, {
62 desc: "full package",
63 name: "full.proto",
64 proto: "package foo.bar.baz;",
65 want: FileInfo{
66 PackageName: "foo.bar.baz",
67 },
68 }, {
69 desc: "import simple",
70 name: "imp.proto",
71 proto: `import 'single.proto';
72 import "double.proto";`,
73 want: FileInfo{
74 Imports: []string{"double.proto", "single.proto"},
75 },
76 }, {
77 desc: "import quote",
78 name: "quote.proto",
79 proto: `import '""\".proto"';
80 import "'.proto";`,
81 want: FileInfo{
82 Imports: []string{"\"\"\".proto\"", "'.proto"},
83 },
84 }, {
85 desc: "import escape",
86 name: "escape.proto",
87 proto: `import '\n\012\x0a.proto';`,
88 want: FileInfo{
89 Imports: []string{"\n\n\n.proto"},
90 },
91 }, {
92 desc: "import two",
93 name: "two.proto",
94 proto: `import "first.proto";
95 import "second.proto";`,
96 want: FileInfo{
97 Imports: []string{"first.proto", "second.proto"},
98 },
99 }, {
100 desc: "go_package",
101 name: "gopkg.proto",
102 proto: `option go_package = "github.com/example/project;projectpb";`,
103 want: FileInfo{
104 Options: []Option{{Key: "go_package", Value: "github.com/example/project;projectpb"}},
105 },
106 }, {
107 desc: "service def",
108 name: "service.proto",
109 proto: `service ChatService {}`,
110 want: FileInfo{
111 HasServices: true,
112 },
113 }, {
114 desc: "service as name",
115 name: "service.proto",
116 proto: `message ServiceAccount { string service = 1; }`,
117 want: FileInfo{
118 HasServices: false,
119 },
120 },
121 } {
122 t.Run(tc.desc, func(t *testing.T) {
123 dir, err := os.MkdirTemp(os.Getenv("TEST_TEMPDIR"), "TestProtoFileinfo")
124 if err != nil {
125 t.Fatal(err)
126 }
127 defer os.RemoveAll(dir)
128 if err := os.WriteFile(filepath.Join(dir, tc.name), []byte(tc.proto), 0o600); err != nil {
129 t.Fatal(err)
130 }
131
132 got := protoFileInfo(dir, tc.name)
133
134
135 got = FileInfo{
136 PackageName: got.PackageName,
137 Imports: got.Imports,
138 Options: got.Options,
139 HasServices: got.HasServices,
140 }
141 if !reflect.DeepEqual(got, tc.want) {
142 t.Errorf("got %#v; want %#v", got, tc.want)
143 }
144 })
145 }
146 }
147
View as plain text