From e90f766ea3a5c0a76ff5b132deda6fe75f6970ad Mon Sep 17 00:00:00 2001 From: Olexandr Smirnov Date: Wed, 27 Aug 2025 21:45:05 +0300 Subject: [PATCH] refactor(test): make helper test function more ergonomic In my opinion, requiring user to access tests via `T["module_name"]` was too fragile and typos prone. --- spec/integration/comment_test.lua | 14 +++++++------- spec/integration/gotests_test.lua | 6 +++--- spec/integration/iferr_test.lua | 6 +++--- spec/integration/impl_test.lua | 8 ++++---- spec/integration/struct_tags_test.lua | 16 ++++++++-------- spec/testutils.lua | 12 +++++++----- spec/unit/config_test.lua | 8 ++++---- spec/unit/utils_test.lua | 8 ++++---- 8 files changed, 40 insertions(+), 38 deletions(-) diff --git a/spec/integration/comment_test.lua b/spec/integration/comment_test.lua index 38e7909..fdf39fe 100644 --- a/spec/integration/comment_test.lua +++ b/spec/integration/comment_test.lua @@ -1,5 +1,5 @@ local t = require "spec.testutils" -local child, T = t.setup "comment" +local child, T, comment = t.setup "comment" local function do_the_test(fixture, pos) local rs = t.setup_test("comment/" .. fixture, child, pos) @@ -10,27 +10,27 @@ local function do_the_test(fixture, pos) t.cleanup(rs) end -T["comment"]["should add comment to package"] = function() +comment["should add comment to package"] = function() do_the_test("package", { 1, 1 }) end -T["comment"]["should add comment to struct"] = function() +comment["should add comment to struct"] = function() do_the_test("struct", { 4, 1 }) end -T["comment"]["should add comment to function"] = function() +comment["should add comment to function"] = function() do_the_test("func", { 3, 1 }) end -T["comment"]["should add comment to method"] = function() +comment["should add comment to method"] = function() do_the_test("method", { 5, 1 }) end -T["comment"]["should add comment to interface"] = function() +comment["should add comment to interface"] = function() do_the_test("interface", { 3, 6 }) end -T["comment"]["otherwise should add // above cursor"] = function() +comment["otherwise should add // above cursor"] = function() do_the_test("empty", { 1, 1 }) end diff --git a/spec/integration/gotests_test.lua b/spec/integration/gotests_test.lua index fcba8a7..2f2ceb3 100644 --- a/spec/integration/gotests_test.lua +++ b/spec/integration/gotests_test.lua @@ -1,5 +1,5 @@ local t = require "spec.testutils" -local child, T = t.setup "gotests" +local child, T, gotests = t.setup "gotests" --- NOTE: :GoTestAdd is the only place that has actual logic --- All other parts are handled `gotests` itself. @@ -10,7 +10,7 @@ local function read_testfile(fpath) return t.readfile(fpath:gsub(".go", "_test.go")) end -T["gotests"]["should add test for function under cursor"] = function() +gotests["should add test for function under cursor"] = function() local rs = t.setup_test("tests/function", child, { 3, 5 }) child.cmd "GoTestAdd" @@ -18,7 +18,7 @@ T["gotests"]["should add test for function under cursor"] = function() t.cleanup(rs) end -T["gotests"]["should add test for method under cursor"] = function() +gotests["should add test for method under cursor"] = function() local rs = t.setup_test("tests/method", child, { 5, 19 }) child.cmd "GoTestAdd" diff --git a/spec/integration/iferr_test.lua b/spec/integration/iferr_test.lua index fff53ba..cc36404 100644 --- a/spec/integration/iferr_test.lua +++ b/spec/integration/iferr_test.lua @@ -1,7 +1,7 @@ local t = require "spec.testutils" -local child, T = t.setup "iferr" +local child, T, iferr = t.setup "iferr" -T["iferr"]["should add if != nil {"] = function() +iferr["should add if != nil {"] = function() local rs = t.setup_test("iferr/iferr", child, { 8, 2 }) child.cmd "GoIfErr" child.cmd "write" @@ -10,7 +10,7 @@ T["iferr"]["should add if != nil {"] = function() t.cleanup(rs) end -T["iferr"]["should add if err with custom message"] = function() +iferr["should add if err with custom message"] = function() child.lua [[ require("gopher").setup { iferr = { message = 'fmt.Errorf("failed to %w", err)' } diff --git a/spec/integration/impl_test.lua b/spec/integration/impl_test.lua index 602d2b1..8cfa11b 100644 --- a/spec/integration/impl_test.lua +++ b/spec/integration/impl_test.lua @@ -1,7 +1,7 @@ local t = require "spec.testutils" -local child, T = t.setup "impl" +local child, T, impl = t.setup "impl" -T["impl"]["should do impl with 'w io.Writer'"] = function() +impl["should do impl with 'w io.Writer'"] = function() local rs = t.setup_test("impl/writer", child, { 3, 0 }) child.cmd "GoImpl w io.Writer" child.cmd "write" @@ -12,7 +12,7 @@ T["impl"]["should do impl with 'w io.Writer'"] = function() t.cleanup(rs) end -T["impl"]["should work with full input, 'r Read io.Reader'"] = function() +impl["should work with full input, 'r Read io.Reader'"] = function() local rs = t.setup_test("impl/reader", child) child.cmd "GoImpl r Read io.Reader" child.cmd "write" @@ -22,7 +22,7 @@ T["impl"]["should work with full input, 'r Read io.Reader'"] = function() t.cleanup(rs) end -T["impl"]["should work with minimal input 'io.Closer'"] = function() +impl["should work with minimal input 'io.Closer'"] = function() local rs = t.setup_test("impl/closer", child, { 3, 6 }) child.cmd "GoImpl io.Closer" child.cmd "write" diff --git a/spec/integration/struct_tags_test.lua b/spec/integration/struct_tags_test.lua index 1c97001..2f99ea1 100644 --- a/spec/integration/struct_tags_test.lua +++ b/spec/integration/struct_tags_test.lua @@ -1,7 +1,7 @@ local t = require "spec.testutils" -local child, T = t.setup "struct_tags" +local child, T, struct_tags = t.setup "struct_tags" -T["struct_tags"]["should add tag"] = function() +struct_tags["should add tag"] = function() local rs = t.setup_test("tags/add", child, { 3, 6 }) child.cmd "GoTagAdd json" child.cmd "write" @@ -10,7 +10,7 @@ T["struct_tags"]["should add tag"] = function() t.cleanup(rs) end -T["struct_tags"]["should remove tag"] = function() +struct_tags["should remove tag"] = function() local rs = t.setup_test("tags/remove", child, { 4, 6 }) child.cmd "GoTagRm json" child.cmd "write" @@ -19,7 +19,7 @@ T["struct_tags"]["should remove tag"] = function() t.cleanup(rs) end -T["struct_tags"]["should be able to handle many structs"] = function() +struct_tags["should be able to handle many structs"] = function() local rs = t.setup_test("tags/many", child, { 10, 3 }) child.cmd "GoTagAdd testing" child.cmd "write" @@ -28,7 +28,7 @@ T["struct_tags"]["should be able to handle many structs"] = function() t.cleanup(rs) end -T["struct_tags"]["should clear struct"] = function() +struct_tags["should clear struct"] = function() local rs = t.setup_test("tags/clear", child, { 3, 1 }) child.cmd "GoTagClear" child.cmd "write" @@ -37,7 +37,7 @@ T["struct_tags"]["should clear struct"] = function() t.cleanup(rs) end -T["struct_tags"]["should add more than one tag"] = function() +struct_tags["should add more than one tag"] = function() local tmp = t.tmpfile() local fixtures = t.get_fixtures "tags/add_many" t.writefile(tmp, fixtures.input) @@ -60,7 +60,7 @@ T["struct_tags"]["should add more than one tag"] = function() t.cleanup { tmp = tmp } end -T["struct_tags"]["should add tags on var"] = function() +struct_tags["should add tags on var"] = function() local rs = t.setup_test("tags/var", child, { 5, 6 }) child.cmd "GoTagAdd yaml" child.cmd "write" @@ -69,7 +69,7 @@ T["struct_tags"]["should add tags on var"] = function() t.cleanup(rs) end -T["struct_tags"]["should add tags on short declr var"] = function() +struct_tags["should add tags on short declr var"] = function() local rs = t.setup_test("tags/svar", child, { 4, 3 }) child.cmd "GoTagAdd xml" child.cmd "write" diff --git a/spec/testutils.lua b/spec/testutils.lua index b359b4b..fe50300 100644 --- a/spec/testutils.lua +++ b/spec/testutils.lua @@ -6,9 +6,11 @@ local testutils = {} testutils.mininit_path = vim.fs.joinpath(base_dir, "scripts", "minimal_init.lua") testutils.fixtures_dir = vim.fs.joinpath(base_dir, "spec/fixtures") ----@param name string ----@return MiniTest.child, table -function testutils.setup(name) +---@param mod string Module name for which to create a nested test set. +---@return MiniTest.child child nvim client. +---@return table T root test set created by `MiniTest.new_set()`. +---@return table mod_name nested set of tests in `T[mod]`. +function testutils.setup(mod) local child = MiniTest.new_child_neovim() local T = MiniTest.new_set { hooks = { @@ -19,8 +21,8 @@ function testutils.setup(name) }, } - T[name] = MiniTest.new_set {} - return child, T + T[mod] = MiniTest.new_set {} + return child, T, T[mod] end ---@generic T diff --git a/spec/unit/config_test.lua b/spec/unit/config_test.lua index cfb844a..ebb4be5 100644 --- a/spec/unit/config_test.lua +++ b/spec/unit/config_test.lua @@ -1,16 +1,16 @@ local t = require "spec.testutils" -local _, T = t.setup "config" +local _, T, config = t.setup "config" -T["config"]["can be called without any arguments passed"] = function() +config["can be called without any arguments passed"] = function() ---@diagnostic disable-next-line: missing-parameter require("gopher").setup() end -T["config"]["can be called with empty table"] = function() +config["can be called with empty table"] = function() require("gopher").setup {} end -T["config"]["should change option"] = function() +config["should change option"] = function() local log_level = 1234567890 require("gopher").setup { log_level = log_level, diff --git a/spec/unit/utils_test.lua b/spec/unit/utils_test.lua index 4be8126..d4898c2 100644 --- a/spec/unit/utils_test.lua +++ b/spec/unit/utils_test.lua @@ -1,14 +1,14 @@ local t = require "spec.testutils" -local _, T = t.setup "utils" +local _, T, utils = t.setup "utils" -T["utils"]["should .remove_empty_lines()"] = function() +utils["should .remove_empty_lines()"] = function() local u = require "gopher._utils" local inp = { "hi", "", "a", "", "", "asdf" } t.eq(u.remove_empty_lines(inp), { "hi", "a", "asdf" }) end -T["utils"]["should .readfile_joined()"] = function() +utils["should .readfile_joined()"] = function() local data = "line1\nline2\nline3" local tmp = t.tmpfile() local u = require "gopher._utils" @@ -17,7 +17,7 @@ T["utils"]["should .readfile_joined()"] = function() t.eq(u.readfile_joined(tmp), data) end -T["utils"]["should .trimend()"] = function() +utils["should .trimend()"] = function() local u = require "gopher._utils" t.eq(u.trimend " hi ", " hi") end