diff --git a/lua/neotest-golang/query.lua b/lua/neotest-golang/query.lua index 565b055e..0e5b48cf 100644 --- a/lua/neotest-golang/query.lua +++ b/lua/neotest-golang/query.lua @@ -90,6 +90,42 @@ M.table_tests = [[ operand: (identifier) field: (field_identifier) @test.field.name1) (#eq? @test.field.name @test.field.name1)))))) + ;; Query for table tests with inline structs (not keyed) + (function_declaration + name: (identifier) + parameters: (parameter_list + (parameter_declaration + name: (identifier) + type: (pointer_type + (qualified_type + package: (package_identifier) + name: (type_identifier)))))) + body: (block + (for_statement + (range_clause + left: (expression_list + (identifier) + (identifier)) + right: (composite_literal + type: (slice_type + element: (struct_type + (field_declaration_list + (field_declaration + name: (field_identifier) ; unkeyed field for test name + type: (type_identifier) @field.type (#eq? @field.type "string") )))))))) + body: (literal_value + (literal_element + (literal_value + (literal_element + (interpreted_string_literal) @test.name) + (literal_element)) @test.definition)) + body: (block + (expression_statement + (call_expression + function: (selector_expression + operand: (identifier) + field: (field_identifier) @test.method (#match? @test.method "^Run$"))))) + ;; query for map table tests (block (short_var_declaration diff --git a/tests/go/positions_spec.lua b/tests/go/positions_spec.lua index d526feae..58f63849 100644 --- a/tests/go/positions_spec.lua +++ b/tests/go/positions_spec.lua @@ -197,6 +197,58 @@ describe("Discovery of test positions", function() }, }, }, + { + { + id = test_filepath .. "::TestTableTestInlineStructLoopNotKeyed", + name = "TestTableTestInlineStructLoopNotKeyed", + path = test_filepath, + type = "test", + }, + { + { + id = test_filepath + .. '::TestTableTestInlineStructLoopNotKeyed::"TableTest1"', + name = '"TableTest1"', + path = test_filepath, + type = "test", + }, + }, + { + { + id = test_filepath + .. '::TestTableTestInlineStructLoopNotKeyed::"TableTest2"', + name = '"TableTest2"', + path = test_filepath, + type = "test", + }, + }, + }, + { + { + id = test_filepath .. "::TestTableTestInlineStructLoopNotKeyed2", + name = "TestTableTestInlineStructLoopNotKeyed2", + path = test_filepath, + type = "test", + }, + { + { + id = test_filepath + .. '::TestTableTestInlineStructLoopNotKeyed2::"TableTest1"', + name = '"TableTest1"', + path = test_filepath, + type = "test", + }, + }, + { + { + id = test_filepath + .. '::TestTableTestInlineStructLoopNotKeyed2::"TableTest2"', + name = '"TableTest2"', + path = test_filepath, + type = "test", + }, + }, + }, { { id = test_filepath .. "::TestSubTestTableTestInlineStructLoop", diff --git a/tests/go/positions_test.go b/tests/go/positions_test.go index d67463c5..a20835ff 100644 --- a/tests/go/positions_test.go +++ b/tests/go/positions_test.go @@ -138,6 +138,44 @@ func TestTableTestInlineStructLoop(t *testing.T) { } } +// Table test defined as anonymous struct in loop without named fields. +func TestTableTestInlineStructLoopNotKeyed(t *testing.T) { + for _, tc := range []struct { + name string + x int + y int + expected int + }{ + {"TableTest1", 1, 2, 3}, // no `name:` to match on + {"TableTest2", 3, 4, 7}, + } { + t.Run(tc.name, func(t *testing.T) { + if Add(tc.x, tc.y) != tc.expected { + t.Fail() + } + }) + } +} + +func TestTableTestInlineStructLoopNotKeyed2(t *testing.T) { + testcases := []struct { + name string + x int + y int + expected int + }{ + {"TableTest1", 1, 2, 3}, // no `name:` to match on + {"TableTest2", 3, 4, 7}, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + if Add(tc.x, tc.y) != tc.expected { + t.Fail() + } + }) + } +} + // Table test defined as anonymous struct in loop (in sub-test). func TestSubTestTableTestInlineStructLoop(t *testing.T) { t.Run("SubTest", func(t *testing.T) {