summaryrefslogtreecommitdiffstatshomepage
path: root/test/testutil.lua
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2026-03-25 13:33:17 +0000
committerLewis Russell <lewis6991@gmail.com>2026-04-15 12:09:25 +0100
commit55f9c2136e52d8719495b6021ce7e8d64c5141fe (patch)
tree0f2b934f30af2b232453b3e676fd9cd7f32e7957 /test/testutil.lua
parente289f9579c73b4f6da105dfad87bd90e0dc6d973 (diff)
test: replace busted with local harness
Replace the busted-based Lua test runner with a repo-local harness. The new harness runs spec files directly under `nvim -ll`, ships its own reporter and lightweight `luassert` shim, and keeps the helper/preload flow used by the functional and unit test suites. Keep the file boundary model shallow and busted-like by restoring `_G`, `package.loaded`, `package.preload`, `arg`, and the process environment between files, without carrying extra reset APIs or custom assertion machinery. Update the build and test entrypoints to use the new runner, add black-box coverage for the harness itself, and drop the bundled busted/luacheck dependency path. AI-assisted: Codex
Diffstat (limited to 'test/testutil.lua')
-rw-r--r--test/testutil.lua51
1 files changed, 11 insertions, 40 deletions
diff --git a/test/testutil.lua b/test/testutil.lua
index b605318074..ac072e6bb8 100644
--- a/test/testutil.lua
+++ b/test/testutil.lua
@@ -1,10 +1,9 @@
-local luaassert = require('luassert')
-local busted = require('busted')
+local test_assert = require('test.assert')
+---@type test.harness
+local harness = require('test.harness')
local uv = vim.uv
local Paths = require('test.cmakeconfig.paths')
-luaassert:set_parameter('TableFormatLevel', 100)
-
--- Functions executing in the context of the test runner (not the current nvim test session).
--- @class test.testutil
local M = {
@@ -86,7 +85,7 @@ function M.retry(max, max_ms, fn)
end
uv.update_time() -- Update cached value of luv.now() (libuv: uv_now()).
if (max and tries >= max) or (uv.now() - start_time > timeout) then
- busted.fail(string.format('retry() attempts: %d\n%s', tries, tostring(result)), 2)
+ error(string.format('retry() attempts: %d\n%s', tries, tostring(result)), 2)
end
tries = tries + 1
uv.sleep(20) -- Avoid hot loop...
@@ -100,10 +99,10 @@ local check_logs_useless_lines = {
}
function M.eq(expected, actual, context)
- return luaassert.are.same(expected, actual, context)
+ return test_assert.eq(expected, actual, context)
end
function M.neq(expected, actual, context)
- return luaassert.are_not.same(expected, actual, context)
+ return test_assert.neq(expected, actual, context)
end
--- Compare paths after resolving symlinks with realpath.
@@ -125,15 +124,6 @@ function M.ok(cond, expected, actual)
return assert(cond, msg)
end
-local function epicfail(state, arguments, _)
- state.failure_message = arguments[1]
- return false
-end
-luaassert:register('assertion', 'epicfail', epicfail)
-function M.fail(msg)
- return luaassert.epicfail(msg)
-end
-
--- @param pat string
--- @param actual string
--- @return boolean
@@ -365,7 +355,7 @@ function M.check_logs()
end
end
end
- luaassert(
+ test_assert(
0 == #runtime_errors,
string.format('Found runtime errors in logfile(s): %s', table.concat(runtime_errors, ', '))
)
@@ -789,34 +779,15 @@ end
--- @param name? 'cirrus'|'github'
--- @return boolean
function M.is_ci(name)
- local any = (name == nil)
- assert(any or name == 'github' or name == 'cirrus')
- local gh = ((any or name == 'github') and nil ~= os.getenv('GITHUB_ACTIONS'))
- local cirrus = ((any or name == 'cirrus') and nil ~= os.getenv('CIRRUS_CI'))
- return gh or cirrus
+ return harness.is_ci(name)
end
-- Gets the (tail) contents of `logfile`.
-- Also moves the file to "${NVIM_LOG_FILE}.displayed" on CI environments.
function M.read_nvim_log(logfile, ci_rename)
logfile = logfile or os.getenv('NVIM_LOG_FILE') or 'nvim.log'
- assert(uv.fs_stat(logfile), ('logfile not found: %q'):format(logfile))
- local is_ci = M.is_ci()
- local keep = is_ci and 100 or 10
- local lines = M.read_file_list(logfile, -keep) or {}
- local log = (
- ('-'):rep(78)
- .. '\n'
- .. string.format('$NVIM_LOG_FILE: %s\n', logfile)
- .. (#lines > 0 and '(last ' .. tostring(keep) .. ' lines)\n' or '(empty)\n')
- )
- for _, line in ipairs(lines) do
- log = log .. line .. '\n'
- end
- log = log .. ('-'):rep(78) .. '\n'
- if is_ci and ci_rename then
- os.rename(logfile, logfile .. '.displayed')
- end
+ local log = harness.read_nvim_log(logfile, ci_rename)
+ assert(log, ('logfile not found: %q'):format(logfile))
return log
end
@@ -843,7 +814,7 @@ function M.expect_events(expected, received, kind)
for _, e in ipairs(expected) do
msg = msg .. ' ' .. vim.inspect(e) .. ';\n'
end
- M.fail(msg)
+ error(msg, 2)
end
return received
end