summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkylo252 <[email protected]>2022-01-02 14:53:01 +0100
committerGitHub <[email protected]>2022-01-02 14:53:01 +0100
commitb3cfd165fbca4c8b595ed577027a5171e33a00e9 (patch)
treebfc6526edf613b294733d46ff823d69d6e9a58df
parent73bf039c6333ba9cb3af93437b26c41e14566c47 (diff)
refactor(test): cleanup test utilities (#2132)
-rw-r--r--lua/lvim/utils.lua107
-rw-r--r--lua/lvim/utils/init.lua211
-rw-r--r--tests/helpers.lua51
-rw-r--r--tests/minimal_init.lua9
-rw-r--r--tests/minimal_lsp.lua7
-rw-r--r--tests/specs/bootstrap_spec.lua (renamed from tests/bootstrap_spec.lua)0
-rw-r--r--tests/specs/config_loader_spec.lua (renamed from tests/config_loader_spec.lua)0
-rw-r--r--tests/specs/lsp_spec.lua (renamed from tests/lsp_spec.lua)8
-rw-r--r--tests/specs/plugins_load_spec.lua (renamed from tests/plugins_load_spec.lua)0
-rw-r--r--utils/bin/test_runner.sh2
10 files changed, 173 insertions, 222 deletions
diff --git a/lua/lvim/utils.lua b/lua/lvim/utils.lua
new file mode 100644
index 00000000..74bac43f
--- /dev/null
+++ b/lua/lvim/utils.lua
@@ -0,0 +1,107 @@
+local M = {}
+local uv = vim.loop
+
+-- recursive Print (structure, limit, separator)
+local function r_inspect_settings(structure, limit, separator)
+ limit = limit or 100 -- default item limit
+ separator = separator or "." -- indent string
+ if limit < 1 then
+ print "ERROR: Item limit reached."
+ return limit - 1
+ end
+ if structure == nil then
+ io.write("-- O", separator:sub(2), " = nil\n")
+ return limit - 1
+ end
+ local ts = type(structure)
+
+ if ts == "table" then
+ for k, v in pairs(structure) do
+ -- replace non alpha keys with ["key"]
+ if tostring(k):match "[^%a_]" then
+ k = '["' .. tostring(k) .. '"]'
+ end
+ limit = r_inspect_settings(v, limit, separator .. "." .. tostring(k))
+ if limit < 0 then
+ break
+ end
+ end
+ return limit
+ end
+
+ if ts == "string" then
+ -- escape sequences
+ structure = string.format("%q", structure)
+ end
+ separator = separator:gsub("%.%[", "%[")
+ if type(structure) == "function" then
+ -- don't print functions
+ io.write("-- lvim", separator:sub(2), " = function ()\n")
+ else
+ io.write("lvim", separator:sub(2), " = ", tostring(structure), "\n")
+ end
+ return limit - 1
+end
+
+function M.generate_settings()
+ -- Opens a file in append mode
+ local file = io.open("lv-settings.lua", "w")
+
+ -- sets the default output file as test.lua
+ io.output(file)
+
+ -- write all `lvim` related settings to `lv-settings.lua` file
+ r_inspect_settings(lvim, 10000, ".")
+
+ -- closes the open file
+ io.close(file)
+end
+
+--- Returns a table with the default values that are missing.
+--- either paramter can be empty.
+--@param config (table) table containing entries that take priority over defaults
+--@param default_config (table) table contatining default values if found
+function M.apply_defaults(config, default_config)
+ config = config or {}
+ default_config = default_config or {}
+ local new_config = vim.tbl_deep_extend("keep", vim.empty_dict(), config)
+ new_config = vim.tbl_deep_extend("keep", new_config, default_config)
+ return new_config
+end
+
+--- Checks whether a given path exists and is a file.
+--@param path (string) path to check
+--@returns (bool)
+function M.is_file(path)
+ local stat = uv.fs_stat(path)
+ return stat and stat.type == "file" or false
+end
+
+--- Checks whether a given path exists and is a directory
+--@param path (string) path to check
+--@returns (bool)
+function M.is_directory(path)
+ local stat = uv.fs_stat(path)
+ return stat and stat.type == "directory" or false
+end
+
+M.join_paths = _G.join_paths
+
+---Write data to a file
+---@param path string can be full or relative to `cwd`
+---@param txt string|table text to be written, uses `vim.inspect` internally for tables
+---@param flag string used to determine access mode, common flags: "w" for `overwrite` or "a" for `append`
+function M.write_file(path, txt, flag)
+ local data = type(txt) == "string" and txt or vim.inspect(txt)
+ uv.fs_open(path, flag, 438, function(open_err, fd)
+ assert(not open_err, open_err)
+ uv.fs_write(fd, data, -1, function(write_err)
+ assert(not write_err, write_err)
+ uv.fs_close(fd, function(close_err)
+ assert(not close_err, close_err)
+ end)
+ end)
+ end)
+end
+
+return M
diff --git a/lua/lvim/utils/init.lua b/lua/lvim/utils/init.lua
deleted file mode 100644
index cafcf506..00000000
--- a/lua/lvim/utils/init.lua
+++ /dev/null
@@ -1,211 +0,0 @@
-local utils = {}
-local uv = vim.loop
-
--- recursive Print (structure, limit, separator)
-local function r_inspect_settings(structure, limit, separator)
- limit = limit or 100 -- default item limit
- separator = separator or "." -- indent string
- if limit < 1 then
- print "ERROR: Item limit reached."
- return limit - 1
- end
- if structure == nil then
- io.write("-- O", separator:sub(2), " = nil\n")
- return limit - 1
- end
- local ts = type(structure)
-
- if ts == "table" then
- for k, v in pairs(structure) do
- -- replace non alpha keys with ["key"]
- if tostring(k):match "[^%a_]" then
- k = '["' .. tostring(k) .. '"]'
- end
- limit = r_inspect_settings(v, limit, separator .. "." .. tostring(k))
- if limit < 0 then
- break
- end
- end
- return limit
- end
-
- if ts == "string" then
- -- escape sequences
- structure = string.format("%q", structure)
- end
- separator = separator:gsub("%.%[", "%[")
- if type(structure) == "function" then
- -- don't print functions
- io.write("-- lvim", separator:sub(2), " = function ()\n")
- else
- io.write("lvim", separator:sub(2), " = ", tostring(structure), "\n")
- end
- return limit - 1
-end
-
-function utils.generate_settings()
- -- Opens a file in append mode
- local file = io.open("lv-settings.lua", "w")
-
- -- sets the default output file as test.lua
- io.output(file)
-
- -- write all `lvim` related settings to `lv-settings.lua` file
- r_inspect_settings(lvim, 10000, ".")
-
- -- closes the open file
- io.close(file)
-end
-
-function utils.unrequire(m)
- package.loaded[m] = nil
- _G[m] = nil
-end
-
-function utils.gsub_args(args)
- if args == nil or type(args) ~= "table" then
- return args
- end
- local buffer_filepath = vim.fn.fnameescape(vim.api.nvim_buf_get_name(0))
- for i = 1, #args do
- args[i] = string.gsub(args[i], "${FILEPATH}", buffer_filepath)
- end
- return args
-end
-
---- Returns a table with the default values that are missing.
---- either paramter can be empty.
---@param config (table) table containing entries that take priority over defaults
---@param default_config (table) table contatining default values if found
-function utils.apply_defaults(config, default_config)
- config = config or {}
- default_config = default_config or {}
- local new_config = vim.tbl_deep_extend("keep", vim.empty_dict(), config)
- new_config = vim.tbl_deep_extend("keep", new_config, default_config)
- return new_config
-end
-
---- Checks whether a given path exists and is a file.
---@param path (string) path to check
---@returns (bool)
-function utils.is_file(path)
- local stat = uv.fs_stat(path)
- return stat and stat.type == "file" or false
-end
-
---- Checks whether a given path exists and is a directory
---@param path (string) path to check
---@returns (bool)
-function utils.is_directory(path)
- local stat = uv.fs_stat(path)
- return stat and stat.type == "directory" or false
-end
-
-utils.join_paths = _G.join_paths
-
-function utils.write_file(path, txt, flag)
- uv.fs_open(path, flag, 438, function(open_err, fd)
- assert(not open_err, open_err)
- uv.fs_write(fd, txt, -1, function(write_err)
- assert(not write_err, write_err)
- uv.fs_close(fd, function(close_err)
- assert(not close_err, close_err)
- end)
- end)
- end)
-end
-
-function utils.debounce(ms, fn)
- local timer = vim.loop.new_timer()
- return function(...)
- local argv = { ... }
- timer:start(ms, 0, function()
- timer:stop()
- vim.schedule_wrap(fn)(unpack(argv))
- end)
- end
-end
-
-function utils.search_file(file, args)
- local Job = require "plenary.job"
- local stderr = {}
- local stdout, ret = Job
- :new({
- command = "grep",
- args = { args, file },
- cwd = get_cache_dir(),
- on_stderr = function(_, data)
- table.insert(stderr, data)
- end,
- })
- :sync()
- return stdout, ret, stderr
-end
-
-function utils.file_contains(file, query)
- local stdout, ret, stderr = utils.search_file(file, query)
- if ret == 0 then
- return true
- end
- if not vim.tbl_isempty(stderr) then
- error(vim.inspect(stderr))
- end
- if not vim.tbl_isempty(stdout) then
- error(vim.inspect(stdout))
- end
- return false
-end
-
-function utils.log_contains(query)
- local logfile = require("lvim.core.log"):get_path()
- local stdout, ret, stderr = utils.search_file(logfile, query)
- if ret == 0 then
- return true
- end
- if not vim.tbl_isempty(stderr) then
- error(vim.inspect(stderr))
- end
- if not vim.tbl_isempty(stdout) then
- error(vim.inspect(stdout))
- end
- if not vim.tbl_isempty(stderr) then
- error(vim.inspect(stderr))
- end
- return false
-end
-
-function utils.generate_plugins_sha(output)
- local list = {}
- output = output or "commits.lua"
-
- local function git_cmd(args)
- local Job = require "plenary.job"
- local stderr = {}
- local stdout, ret = Job
- :new({
- command = "git",
- args = args,
- on_stderr = function(_, data)
- table.insert(stderr, data)
- end,
- })
- :sync()
- return ret, stdout
- end
-
- local core_plugins = require "lvim.plugins"
- for _, plugin in pairs(core_plugins) do
- local name = plugin[1]:match "/(%S*)"
- local url = "https://github.com/" .. plugin[1]
- print("checking: " .. name .. ", at: " .. url)
- local retval, latest_sha = git_cmd { "ls-remote", url, "origin", "HEAD" }
- if retval == 0 then
- -- replace dashes, remove postfixes and use lowercase
- local normalize_name = (name:gsub("-", "_"):gsub("%.%S+", "")):lower()
- list[normalize_name] = latest_sha[1]:gsub("\tHEAD", "")
- end
- end
- utils.write_file(output, "local commit = " .. vim.inspect(list), "w")
-end
-
-return utils
diff --git a/tests/helpers.lua b/tests/helpers.lua
new file mode 100644
index 00000000..ada83267
--- /dev/null
+++ b/tests/helpers.lua
@@ -0,0 +1,51 @@
+local M = {}
+
+function M.search_file(file, args)
+ local Job = require "plenary.job"
+ local stderr = {}
+ local stdout, ret = Job
+ :new({
+ command = "grep",
+ args = { args, file },
+ cwd = get_cache_dir(),
+ on_stderr = function(_, data)
+ table.insert(stderr, data)
+ end,
+ })
+ :sync()
+ return stdout, ret, stderr
+end
+
+function M.file_contains(file, query)
+ local stdout, ret, stderr = M.search_file(file, query)
+ if ret == 0 then
+ return true
+ end
+ if not vim.tbl_isempty(stderr) then
+ error(vim.inspect(stderr))
+ end
+ if not vim.tbl_isempty(stdout) then
+ error(vim.inspect(stdout))
+ end
+ return false
+end
+
+function M.log_contains(query)
+ local logfile = require("lvim.core.log"):get_path()
+ local stdout, ret, stderr = M.search_file(logfile, query)
+ if ret == 0 then
+ return true
+ end
+ if not vim.tbl_isempty(stderr) then
+ error(vim.inspect(stderr))
+ end
+ if not vim.tbl_isempty(stdout) then
+ error(vim.inspect(stdout))
+ end
+ if not vim.tbl_isempty(stderr) then
+ error(vim.inspect(stderr))
+ end
+ return false
+end
+
+return M
diff --git a/tests/minimal_init.lua b/tests/minimal_init.lua
index 126f8e6e..0178514b 100644
--- a/tests/minimal_init.lua
+++ b/tests/minimal_init.lua
@@ -1,5 +1,12 @@
local path_sep = vim.loop.os_uname().version:match "Windows" and "\\" or "/"
+local base_dir = os.getenv "LUNARVIM_RUNTIME_DIR" .. path_sep .. "lvim"
+local tests_dir = base_dir .. path_sep .. "tests"
-vim.opt.rtp:append(os.getenv "LUNARVIM_RUNTIME_DIR" .. path_sep .. "lvim")
+vim.opt.rtp = { base_dir, tests_dir, os.getenv "VIMRUNTIME" }
+
+vim.opt.swapfile = false
+
+-- load helper functions before any other plugin to avoid name-collisions
+pcall(require, "tests.helpers")
require("lvim.bootstrap"):init()
diff --git a/tests/minimal_lsp.lua b/tests/minimal_lsp.lua
index 12a4a6a9..a4ecd4fb 100644
--- a/tests/minimal_lsp.lua
+++ b/tests/minimal_lsp.lua
@@ -8,12 +8,7 @@ end
vim.cmd [[set runtimepath=$VIMRUNTIME]]
-local temp_dir
-if on_windows then
- temp_dir = vim.loop.os_getenv "TEMP"
-else
- temp_dir = "/tmp"
-end
+local temp_dir = vim.loop.os_getenv "TEMP" or "/tmp"
vim.cmd("set packpath=" .. join_paths(temp_dir, "nvim", "site"))
diff --git a/tests/bootstrap_spec.lua b/tests/specs/bootstrap_spec.lua
index c86d22d4..c86d22d4 100644
--- a/tests/bootstrap_spec.lua
+++ b/tests/specs/bootstrap_spec.lua
diff --git a/tests/config_loader_spec.lua b/tests/specs/config_loader_spec.lua
index 1aef0974..1aef0974 100644
--- a/tests/config_loader_spec.lua
+++ b/tests/specs/config_loader_spec.lua
diff --git a/tests/lsp_spec.lua b/tests/specs/lsp_spec.lua
index 17e72577..633aa17c 100644
--- a/tests/lsp_spec.lua
+++ b/tests/specs/lsp_spec.lua
@@ -1,6 +1,8 @@
local a = require "plenary.async_lib.tests"
local utils = require "lvim.utils"
-lvim.lsp.templates_dir = join_paths(get_runtime_dir(), "lvim", "tests", "artifacts")
+local helpers = require "tests.helpers"
+local temp_dir = vim.loop.os_getenv "TEMP" or "/tmp"
+lvim.lsp.templates_dir = join_paths(temp_dir, "lvim", "tests", "artifacts")
a.describe("lsp workflow", function()
local Log = require "lvim.core.log"
@@ -40,7 +42,7 @@ a.describe("lsp workflow", function()
-- we need to delay this check until the log gets populated
vim.schedule(function()
- assert.False(utils.log_contains "templates")
+ assert.False(helpers.log_contains "templates")
end)
end)
@@ -50,7 +52,7 @@ a.describe("lsp workflow", function()
for _, file in ipairs(vim.fn.glob(lvim.lsp.templates_dir .. "/*.lua", 1, 1)) do
for _, server in ipairs(lvim.lsp.override) do
- assert.False(utils.file_contains(file, server))
+ assert.False(helpers.file_contains(file, server))
end
end
end)
diff --git a/tests/plugins_load_spec.lua b/tests/specs/plugins_load_spec.lua
index 08c96c12..08c96c12 100644
--- a/tests/plugins_load_spec.lua
+++ b/tests/specs/plugins_load_spec.lua
diff --git a/utils/bin/test_runner.sh b/utils/bin/test_runner.sh
index 6fc6858b..5b7f81ac 100644
--- a/utils/bin/test_runner.sh
+++ b/utils/bin/test_runner.sh
@@ -18,7 +18,7 @@ lvim() {
if [ -n "$1" ]; then
lvim --headless -c "lua require('plenary.busted').run('$1')"
else
- lvim --headless -c "PlenaryBustedDirectory tests/ { minimal_init = './tests/minimal_init.lua' }"
+ lvim --headless -c "PlenaryBustedDirectory tests/specs { minimal_init = './tests/minimal_init.lua' }"
fi
rm -rf "$TEST_BASE_DIR"