108 lines
2.6 KiB
Lua
108 lines
2.6 KiB
Lua
local base_dir = vim.env.GOPHER_DIR or vim.fn.expand "%:p:h"
|
|
|
|
---@class gopher.TestUtils
|
|
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 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 = {
|
|
post_once = child.stop,
|
|
pre_case = function()
|
|
child.restart { "-u", testutils.mininit_path }
|
|
end,
|
|
},
|
|
}
|
|
|
|
T[mod] = MiniTest.new_set {}
|
|
return child, T, T[mod]
|
|
end
|
|
|
|
---@generic T
|
|
---@param a T
|
|
---@param b T
|
|
---@return boolean
|
|
function testutils.eq(a, b)
|
|
return MiniTest.expect.equality(a, b)
|
|
end
|
|
|
|
---@return string
|
|
function testutils.tmpfile()
|
|
return vim.fn.tempname() .. ".go"
|
|
end
|
|
|
|
---@param path string
|
|
---@return string
|
|
function testutils.readfile(path)
|
|
return vim.fn.join(vim.fn.readfile(path), "\n")
|
|
end
|
|
|
|
---@param fpath string
|
|
---@param contents string
|
|
function testutils.writefile(fpath, contents)
|
|
vim.fn.writefile(vim.split(contents, "\n"), fpath)
|
|
end
|
|
|
|
---@param fpath string
|
|
function testutils.deletefile(fpath)
|
|
vim.fn.delete(fpath)
|
|
end
|
|
|
|
---@class gopher.TestUtilsFixtures
|
|
---@field input string
|
|
---@field output string
|
|
|
|
---@param fixture string
|
|
---@return gopher.TestUtilsFixtures
|
|
function testutils.get_fixtures(fixture)
|
|
return {
|
|
input = testutils.readfile(vim.fs.joinpath(testutils.fixtures_dir, fixture) .. "_input.go"),
|
|
output = testutils.readfile(vim.fs.joinpath(testutils.fixtures_dir, fixture) .. "_output.go"),
|
|
}
|
|
end
|
|
|
|
---@class gopher.TestUtilsSetup
|
|
---@field tmp string
|
|
---@field fixtures gopher.TestUtilsFixtures
|
|
---@field bufnr number
|
|
|
|
---@param fixture string
|
|
---@param child MiniTest.child
|
|
---@param pos? number[]
|
|
---@return gopher.TestUtilsSetup
|
|
function testutils.setup_test(fixture, child, pos)
|
|
vim.validate("pos", pos, "table", true)
|
|
|
|
local tmp = testutils.tmpfile()
|
|
local fixtures = testutils.get_fixtures(fixture)
|
|
|
|
testutils.writefile(tmp, fixtures.input)
|
|
child.cmd("silent edit " .. tmp)
|
|
|
|
local bufnr = child.fn.bufnr(tmp)
|
|
if pos then
|
|
assert(#pos == 2, "invalid cursor position")
|
|
|
|
child.fn.setpos(".", { bufnr, unpack(pos) })
|
|
end
|
|
|
|
return {
|
|
tmp = tmp,
|
|
bufnr = bufnr,
|
|
fixtures = fixtures,
|
|
}
|
|
end
|
|
|
|
---@param inp gopher.TestUtilsSetup
|
|
function testutils.cleanup(inp)
|
|
testutils.deletefile(inp.tmp)
|
|
end
|
|
|
|
return testutils
|