summaryrefslogtreecommitdiff
path: root/lua/telescope/testharness/init.lua
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/testharness/init.lua
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/testharness/init.lua')
-rw-r--r--lua/telescope/testharness/init.lua112
1 files changed, 112 insertions, 0 deletions
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