1; Functions names start with `Test`
2(((function_declaration
3 name: (_) @run
4 (#match? @run "^Test.*")
5 (#not-match? @run "^TestMain$"))) @_
6 (#set! tag go-test))
7
8; Suite test methods (testify/suite)
9((method_declaration
10 receiver: (parameter_list
11 (parameter_declaration
12 type: [
13 (pointer_type
14 (type_identifier) @_suite_name)
15 (type_identifier) @_suite_name
16 ]))
17 name: (field_identifier) @run @_subtest_name
18 (#match? @_subtest_name "^Test.*")
19 (#match? @_suite_name ".*Suite")) @_
20 (#set! tag go-testify-suite))
21
22; `go:generate` comments
23(((comment) @_comment @run
24 (#match? @_comment "^//go:generate"))
25 (#set! tag go-generate))
26
27; `t.Run`
28(((call_expression
29 function: (selector_expression
30 field: _ @run @_name
31 (#eq? @_name "Run"))
32 arguments: (argument_list
33 .
34 [
35 (interpreted_string_literal)
36 (raw_string_literal)
37 ] @_subtest_name
38 .
39 (func_literal
40 parameters: (parameter_list
41 (parameter_declaration
42 name: (identifier) @_param_name
43 type: (pointer_type
44 (qualified_type
45 package: (package_identifier) @_pkg
46 name: (type_identifier) @_type
47 (#eq? @_pkg "testing")
48 (#eq? @_type "T")))))) @_second_argument))) @_
49 (#set! tag go-subtest))
50
51; Functions names start with `Example`
52(((function_declaration
53 name: (_) @run @_name
54 (#match? @_name "^Example.*"))) @_
55 (#set! tag go-example))
56
57; Functions names start with `Benchmark`
58(((function_declaration
59 name: (_) @run @_name
60 (#match? @_name "^Benchmark.*"))) @_
61 (#set! tag go-benchmark))
62
63; Functions names start with `Fuzz`
64(((function_declaration
65 name: (_) @run @_name
66 (#match? @_name "^Fuzz"))) @_
67 (#set! tag go-fuzz))
68
69; go run
70(((function_declaration
71 name: (_) @run
72 (#eq? @run "main"))) @_
73 (#set! tag go-main))
74
75; Table test cases - slice and map with explicit variable
76((short_var_declaration
77 left: (expression_list
78 (identifier) @_collection_var)
79 right: (expression_list
80 (composite_literal
81 type: [
82 (slice_type)
83 (map_type
84 key: (type_identifier) @_key_type
85 (#eq? @_key_type "string"))
86 ]
87 body: (literal_value
88 [
89 (literal_element
90 (literal_value
91 (keyed_element
92 (literal_element
93 (identifier) @_field_name)
94 (literal_element
95 [
96 (interpreted_string_literal) @run @_table_test_case_name
97 (raw_string_literal) @run @_table_test_case_name
98 ]))))
99 (keyed_element
100 (literal_element
101 [
102 (interpreted_string_literal) @run @_table_test_case_name
103 (raw_string_literal) @run @_table_test_case_name
104 ]))
105 ]))))
106 (for_statement
107 (range_clause
108 left: (expression_list
109 [
110 ((identifier)
111 (identifier) @_loop_var_inner)
112 (identifier) @_loop_var_outer
113 ])
114 right: (identifier) @_range_var
115 (#eq? @_range_var @_collection_var))
116 body: (block
117 (statement_list
118 (expression_statement
119 (call_expression
120 function: (selector_expression
121 operand: (identifier)
122 field: (field_identifier) @_run_method
123 (#eq? @_run_method "Run"))
124 arguments: (argument_list
125 .
126 [
127 (selector_expression
128 operand: (identifier) @_tc_var
129 (#eq? @_tc_var @_loop_var_inner)
130 field: (field_identifier) @_field_check
131 (#eq? @_field_check @_field_name))
132 (identifier) @_arg_var
133 (#eq? @_arg_var @_loop_var_outer)
134 ]
135 .
136 (func_literal
137 parameters: (parameter_list
138 (parameter_declaration
139 type: (pointer_type
140 (qualified_type
141 package: (package_identifier) @_pkg
142 name: (type_identifier) @_type
143 (#eq? @_pkg "testing")
144 (#eq? @_type "T")))))))))))) @_
145 (#set! tag go-table-test-case))
146
147; Table test cases - slice and map declared right inside the loop without
148; explicit variable
149((for_statement
150 (range_clause
151 left: (expression_list
152 [
153 ((identifier)
154 (identifier) @_loop_var_inner)
155 (identifier) @_loop_var_outer
156 ])
157 right: (composite_literal
158 type: [
159 (slice_type)
160 (map_type
161 key: (type_identifier) @_key_type
162 (#eq? @_key_type "string"))
163 ]
164 body: (literal_value
165 [
166 (literal_element
167 (literal_value
168 (keyed_element
169 (literal_element
170 (identifier) @_field_name)
171 (literal_element
172 [
173 (interpreted_string_literal) @run @_table_test_case_name
174 (raw_string_literal) @run @_table_test_case_name
175 ]))))
176 (keyed_element
177 (literal_element
178 [
179 (interpreted_string_literal) @run @_table_test_case_name
180 (raw_string_literal) @run @_table_test_case_name
181 ]))
182 ])))
183 body: (block
184 (statement_list
185 (expression_statement
186 (call_expression
187 function: (selector_expression
188 operand: (identifier)
189 field: (field_identifier) @_run_method
190 (#eq? @_run_method "Run"))
191 arguments: (argument_list
192 .
193 [
194 (selector_expression
195 operand: (identifier) @_tc_var
196 (#eq? @_tc_var @_loop_var_inner)
197 field: (field_identifier) @_field_check
198 (#eq? @_field_check @_field_name))
199 (identifier) @_arg_var
200 (#eq? @_arg_var @_loop_var_outer)
201 ]
202 .
203 (func_literal
204 parameters: (parameter_list
205 (parameter_declaration
206 type: (pointer_type
207 (qualified_type
208 package: (package_identifier) @_pkg
209 name: (type_identifier) @_type
210 (#eq? @_pkg "testing")
211 (#eq? @_type "T")))))))))))) @_
212 (#set! tag go-table-test-case-without-explicit-variable))