runnables.scm

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