Forráskód Böngészése

refactor(test): cleanup test utilities (#2132)

kylo252 3 éve
szülő
commit
b3cfd165fb

+ 107 - 0
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

+ 0 - 211
lua/lvim/utils/init.lua

@@ -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

+ 51 - 0
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

+ 8 - 1
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()

+ 1 - 6
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"))
 

+ 0 - 0
tests/bootstrap_spec.lua → tests/specs/bootstrap_spec.lua


+ 0 - 0
tests/config_loader_spec.lua → tests/specs/config_loader_spec.lua


+ 5 - 3
tests/lsp_spec.lua → 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)

+ 0 - 0
tests/plugins_load_spec.lua → tests/specs/plugins_load_spec.lua


+ 1 - 1
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"