summaryrefslogtreecommitdiff
path: root/lua/telescope
diff options
context:
space:
mode:
authorTJ DeVries <devries.timothyj@gmail.com>2022-08-04 16:00:30 -0400
committerGitHub <noreply@github.com>2022-08-04 16:00:30 -0400
commit4725867ec66b9a0f5e5ad95a1fd94c2f97fa2d2c (patch)
treef4dcf668bb66469273e630f69eebe123d390f2c0 /lua/telescope
parent75a5e5065376d9103fc4bafc3ae6327304cee6e9 (diff)
fix: restore testing framework to actually work (#2070)
after refactor to some new asynchronous items for finders, the tests stopped actually doing anything. now they do things again.
Diffstat (limited to 'lua/telescope')
-rw-r--r--lua/telescope/builtin/__files.lua4
-rw-r--r--lua/telescope/testharness/helpers.lua (renamed from lua/telescope/pickers/_test_helpers.lua)0
-rw-r--r--lua/telescope/testharness/init.lua112
-rw-r--r--lua/telescope/testharness/runner.lua156
4 files changed, 270 insertions, 2 deletions
diff --git a/lua/telescope/builtin/__files.lua b/lua/telescope/builtin/__files.lua
index ce5527d..33b1c50 100644
--- a/lua/telescope/builtin/__files.lua
+++ b/lua/telescope/builtin/__files.lua
@@ -180,12 +180,12 @@ files.find_files = function(opts)
return opts.find_command(opts)
end
return opts.find_command
+ elseif 1 == vim.fn.executable "rg" then
+ return { "rg", "--files" }
elseif 1 == vim.fn.executable "fd" then
return { "fd", "--type", "f" }
elseif 1 == vim.fn.executable "fdfind" then
return { "fdfind", "--type", "f" }
- elseif 1 == vim.fn.executable "rg" then
- return { "rg", "--files" }
elseif 1 == vim.fn.executable "find" and vim.fn.has "win32" == 0 then
return { "find", ".", "-type", "f" }
elseif 1 == vim.fn.executable "where" then
diff --git a/lua/telescope/pickers/_test_helpers.lua b/lua/telescope/testharness/helpers.lua
index 5296c45..5296c45 100644
--- a/lua/telescope/pickers/_test_helpers.lua
+++ b/lua/telescope/testharness/helpers.lua
diff --git a/lua/telescope/testharness/init.lua b/lua/telescope/testharness/init.lua
new file mode 100644
index 0000000..9a8e707
--- /dev/null
+++ b/lua/telescope/testharness/init.lua
@@ -0,0 +1,112 @@
+local assert = require "luassert"
+
+local Path = require "plenary.path"
+
+local tester = {}
+tester.debug = false
+
+local get_results_from_contents = function(content)
+ local nvim = vim.fn.jobstart(
+ { "nvim", "--noplugin", "-u", "scripts/minimal_init.vim", "--headless", "--embed" },
+ { rpc = true }
+ )
+
+ local result = vim.fn.rpcrequest(nvim, "nvim_exec_lua", content, {})
+ assert.are.same(true, result[1], vim.inspect(result))
+
+ local count = 0
+ while
+ vim.fn.rpcrequest(nvim, "nvim_exec_lua", "return require('telescope.testharness.runner').state.done", {}) ~= true
+ do
+ count = count + 1
+ vim.wait(100)
+
+ -- TODO: Could maybe wait longer, but it's annoying to wait if the test is going to timeout.
+ if count > 100 then
+ break
+ end
+ end
+
+ local state = vim.fn.rpcrequest(nvim, "nvim_exec_lua", "return require('telescope.testharness.runner').state", {})
+ vim.fn.jobstop(nvim)
+
+ assert.are.same(true, state.done, vim.inspect(state))
+
+ local result_table = {}
+ for _, v in ipairs(state.results) do
+ table.insert(result_table, v)
+ end
+
+ return result_table, state
+end
+
+local check_results = function(results, state)
+ assert(state, "Must pass state")
+
+ for _, v in ipairs(results) do
+ local assertion
+ if not v._type or v._type == "are" or v._type == "_default" then
+ assertion = assert.are.same
+ else
+ assertion = assert.are_not.same
+ end
+
+ -- TODO: I think it would be nice to be able to see the state,
+ -- but it clutters up the test output so much here.
+ --
+ -- So we would have to consider how to do that I think.
+ assertion(v.expected, v.actual, string.format("Test Case: %s // %s", v.location, v.case))
+ end
+end
+
+tester.run_string = function(contents)
+ contents = [[
+ return (function()
+ local tester = require('telescope.testharness')
+ local runner = require('telescope.testharness.runner')
+ local helper = require('telescope.testharness.helpers')
+ helper.make_globals()
+ local ok, msg = pcall(function()
+ runner.log("Loading Test")
+ ]] .. contents .. [[
+ end)
+ return {ok, msg or runner.state}
+ end)()
+ ]]
+
+ check_results(get_results_from_contents(contents))
+end
+
+tester.run_file = function(filename)
+ local file = "./lua/tests/pickers/" .. filename .. ".lua"
+ local path = Path:new(file)
+
+ if not path:exists() then
+ assert.are.same("<An existing file>", file)
+ end
+
+ local contents = string.format(
+ [[
+ return (function()
+ local runner = require('telescope.testharness.runner')
+ local helper = require('telescope.testharness.helpers')
+ helper.make_globals()
+ local ok, msg = pcall(function()
+ runner.log("Loading Test")
+ return loadfile("%s")()
+ end)
+ return {ok, msg or runner.state}
+ end)()
+ ]],
+ path:absolute()
+ )
+
+ check_results(get_results_from_contents(contents))
+end
+
+tester.not_ = function(val)
+ val._type = "are_not"
+ return val
+end
+
+return tester
diff --git a/lua/telescope/testharness/runner.lua b/lua/telescope/testharness/runner.lua
new file mode 100644
index 0000000..af1bf30
--- /dev/null
+++ b/lua/telescope/testharness/runner.lua
@@ -0,0 +1,156 @@
+local builtin = require "telescope.builtin"
+
+local DELAY = vim.g.telescope_test_delay or 50
+local runner = {}
+
+-- State is test variable
+runner.state = {
+ done = false,
+ results = {},
+ msgs = {},
+}
+
+local writer = function(val)
+ table.insert(runner.state.results, val)
+end
+
+local invalid_test_case = function(k)
+ error { case = k, expected = "<a valid key>", actual = k }
+end
+
+local _VALID_KEYS = {
+ post_typed = true,
+ post_close = true,
+}
+
+local replace_terms = function(input)
+ return vim.api.nvim_replace_termcodes(input, true, false, true)
+end
+
+runner.nvim_feed = function(text, feed_opts)
+ feed_opts = feed_opts or "m"
+
+ vim.api.nvim_feedkeys(text, feed_opts, true)
+end
+
+local end_test_cases = function()
+ runner.state.done = true
+end
+
+local execute_test_case = function(location, key, spec)
+ local ok, actual = pcall(spec[2])
+
+ if not ok then
+ writer {
+ location = "Error: " .. location,
+ case = key,
+ expected = "To succeed and return: " .. tostring(spec[1]),
+ actual = actual,
+
+ _type = spec._type,
+ }
+
+ end_test_cases()
+ else
+ writer {
+ location = location,
+ case = key,
+ expected = spec[1],
+ actual = actual,
+
+ _type = spec._type,
+ }
+ end
+
+ return ok
+end
+
+runner.log = function(msg)
+ table.insert(runner.state.msgs, msg)
+end
+
+runner.picker = function(picker_name, input, test_cases, opts)
+ opts = opts or {}
+
+ for k, _ in pairs(test_cases) do
+ if not _VALID_KEYS[k] then
+ return invalid_test_case(k)
+ end
+ end
+
+ opts.on_complete = {
+ runner.create_on_complete(input, test_cases),
+ }
+
+ opts._on_error = function(self, msg)
+ runner.state.done = true
+ writer {
+ location = "Error while running on complete",
+ expected = "To Work",
+ actual = msg,
+ }
+ end
+
+ runner.log "Starting picker"
+ builtin[picker_name](opts)
+ runner.log "Called picker"
+end
+
+runner.create_on_complete = function(input, test_cases)
+ input = replace_terms(input)
+
+ local actions = {}
+ for i = 1, #input do
+ local char = input:sub(i, i)
+ table.insert(actions, {
+ cb = function()
+ runner.log("Inserting char: " .. char)
+ runner.nvim_feed(char, "")
+ end,
+ char = char,
+ })
+ end
+
+ return function()
+ local action
+
+ repeat
+ action = table.remove(actions, 1)
+ if action then
+ action.cb()
+ end
+ until not action or string.match(action.char, "%g")
+
+ if #actions > 0 then
+ return
+ end
+
+ vim.defer_fn(function()
+ if test_cases.post_typed then
+ for k, v in ipairs(test_cases.post_typed) do
+ if not execute_test_case("post_typed", k, v) then
+ return
+ end
+ end
+ end
+
+ vim.defer_fn(function()
+ runner.nvim_feed(replace_terms "<CR>", "")
+
+ vim.defer_fn(function()
+ if test_cases.post_close then
+ for k, v in ipairs(test_cases.post_close) do
+ if not execute_test_case("post_close", k, v) then
+ return
+ end
+ end
+ end
+
+ vim.defer_fn(end_test_cases, DELAY)
+ end, DELAY)
+ end, DELAY)
+ end, DELAY)
+ end
+end
+
+return runner