diff options
-rw-r--r-- | lua/lvim/utils.lua | 107 | ||||
-rw-r--r-- | lua/lvim/utils/init.lua | 211 | ||||
-rw-r--r-- | tests/helpers.lua | 51 | ||||
-rw-r--r-- | tests/minimal_init.lua | 9 | ||||
-rw-r--r-- | tests/minimal_lsp.lua | 7 | ||||
-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.sh | 2 |
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" |