runnables.scm

  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))