From 049602a2c5f436fd7758fe5dd2fd1fcea696b83b Mon Sep 17 00:00:00 2001 From: TJ DeVries Date: Wed, 23 Dec 2020 13:31:05 -0500 Subject: ci: more tests (#359) * more tests * lint --- lua/telescope/pickers/_test.lua | 157 ++++++++++++++++++++++ lua/telescope/pickers/_test_helpers.lua | 50 +++++++ lua/telescope/pickers/_tests.lua | 167 ------------------------ lua/tests/automated/pickers/find_files_spec.lua | 16 ++- lua/tests/pickers/find_files__readme.lua | 2 +- lua/tests/pickers/find_files__with_ctrl_n.lua | 27 +--- 6 files changed, 229 insertions(+), 190 deletions(-) create mode 100644 lua/telescope/pickers/_test.lua create mode 100644 lua/telescope/pickers/_test_helpers.lua delete mode 100644 lua/telescope/pickers/_tests.lua (limited to 'lua') diff --git a/lua/telescope/pickers/_test.lua b/lua/telescope/pickers/_test.lua new file mode 100644 index 0000000..ddd245a --- /dev/null +++ b/lua/telescope/pickers/_test.lua @@ -0,0 +1,157 @@ +local assert = require('luassert') +local builtin = require('telescope.builtin') + +local Job = require("plenary.job") + +local tester = {} + +local replace_terms = function(input) + return vim.api.nvim_replace_termcodes(input, true, false, true) +end + +local nvim_feed = function(text, feed_opts) + feed_opts = feed_opts or "m" + + vim.api.nvim_feedkeys(text, feed_opts, true) +end + +tester.picker_feed = function(input, test_cases, debug) + input = replace_terms(input) + + return coroutine.wrap(function() + for i = 1, #input do + local char = input:sub(i, i) + nvim_feed(char, "") + + -- TODO: I'm not 100% sure this is a hack or not... + -- it's possible these characters could still have an on_complete... but i'm not sure. + if string.match(char, "%g") then + coroutine.yield() + end + end + + vim.wait(10, function() end) + + local timer = vim.loop.new_timer() + timer:start(20, 0, vim.schedule_wrap(function() + if test_cases.post_close then + for k, v in ipairs(test_cases.post_close) do + io.stderr:write(vim.fn.json_encode({ case = k, expected = v[1], actual = v[2]() })) + io.stderr:write("\n") + end + end + + if debug then + return + end + + vim.defer_fn(function() + vim.cmd [[qa!]] + end, 10) + end)) + + if not debug then + vim.schedule(function() + if test_cases.post_typed then + for k, v in ipairs(test_cases.post_typed) do + io.stderr:write(vim.fn.json_encode({ case = k, expected = v[1], actual = v[2]() })) + io.stderr:write("\n") + end + end + + nvim_feed(replace_terms(""), "") + end) + end + coroutine.yield() + end) +end + +-- local test_cases = { +-- post_typed = { +-- }, +-- post_close = { +-- { "README.md", function() return "README.md" end }, +-- }, +-- } + +local _VALID_KEYS = { + post_typed = true, + post_close = true, +} + +tester.builtin_picker = function(key, input, test_cases, opts) + opts = opts or {} + local debug = opts.debug or false + + for k, _ in pairs(test_cases) do + if not _VALID_KEYS[k] then + -- TODO: Make an error type for the json protocol. + io.stderr:write(vim.fn.json_encode({ case = k, expected = '', actual = k })) + io.stderr:write("\n") + vim.cmd [[qa!]] + end + end + + opts.on_complete = { + tester.picker_feed(input, test_cases, debug) + } + + builtin[key](opts) +end + +local get_results_from_file = function(file) + local j = Job:new { + command = 'nvim', + args = { + '--noplugin', + '-u', + 'scripts/minimal_init.vim', + '-c', + 'luafile ' .. file + }, + } + + j:sync() + + local results = j:stderr_result() + local result_table = {} + for _, v in ipairs(results) do + table.insert(result_table, vim.fn.json_decode(v)) + end + + return result_table +end + +local check_results = function(results) + -- TODO: We should get all the test cases here that fail, not just the first one. + for _, v in ipairs(results) do + assert.are.same(v.expected, v.actual) + end +end + +tester.run_string = function(contents) + local tempname = vim.fn.tempname() + + contents = [[ + local tester = require('telescope.pickers._test') + local helper = require('telescope.pickers._test_helpers') + + helper.make_globals() + ]] .. contents + + vim.fn.writefile(vim.split(contents, "\n"), tempname) + local result_table = get_results_from_file(tempname) + vim.fn.delete(tempname) + + check_results(result_table) + -- assert.are.same(result_table.expected, result_table.actual) +end + +tester.run_file = function(filename) + local file = './lua/tests/pickers/' .. filename .. '.lua' + + local result_table = get_results_from_file(file) + assert.are.same(result_table.expected, result_table.actual) +end + +return tester diff --git a/lua/telescope/pickers/_test_helpers.lua b/lua/telescope/pickers/_test_helpers.lua new file mode 100644 index 0000000..a430fae --- /dev/null +++ b/lua/telescope/pickers/_test_helpers.lua @@ -0,0 +1,50 @@ +local test_helpers = {} + +test_helpers.get_picker = function() + local state = require('telescope.state') + return state.get_status(vim.api.nvim_get_current_buf()).picker +end + +test_helpers.get_results_bufnr = function() + local state = require('telescope.state') + return state.get_status(vim.api.nvim_get_current_buf()).results_bufnr +end + +test_helpers.get_file = function() + return vim.fn.fnamemodify(vim.api.nvim_buf_get_name(0), ":t") +end + +test_helpers.get_prompt = function() + return vim.api.nvim_buf_get_lines(0, 0, -1, false)[1] +end + +test_helpers.get_results = function() + return vim.api.nvim_buf_get_lines(test_helpers.get_results_bufnr(), 0, -1, false) +end + +test_helpers.get_last_result = function() + local results = test_helpers.get_results() + return results[#results] +end + +test_helpers.get_selection = function() + local state = require('telescope.state') + return state.get_global_key('selected_entry') +end + +test_helpers.get_selection_value = function() + return test_helpers.get_selection().value +end + +test_helpers.make_globals = function() + GetFile = test_helpers.get_file -- luacheck: globals GetFile + GetPrompt = test_helpers.get_prompt -- luacheck: globals GetPrompt + + GetResults = test_helpers.get_results -- luacheck: globals GetResults + GetLastResult = test_helpers.get_last_result -- luacheck: globals GetLastResult + + GetSelection = test_helpers.get_selection -- luacheck: globals GetSelection + GetSelectionValue = test_helpers.get_selection_value -- luacheck: globals GetSelectionValue +end + +return test_helpers diff --git a/lua/telescope/pickers/_tests.lua b/lua/telescope/pickers/_tests.lua deleted file mode 100644 index b18b810..0000000 --- a/lua/telescope/pickers/_tests.lua +++ /dev/null @@ -1,167 +0,0 @@ -local assert = require('luassert') -local builtin = require('telescope.builtin') - -local Job = require("plenary.job") - -local tester = {} - -local replace_terms = function(input) - return vim.api.nvim_replace_termcodes(input, true, false, true) -end - -local nvim_feed = function(text, feed_opts) - feed_opts = feed_opts or "m" - - vim.api.nvim_feedkeys(text, feed_opts, true) -end - -tester.picker_feed = function(input, test_cases, debug) - input = replace_terms(input) - - return coroutine.wrap(function() - for i = 1, #input do - local char = input:sub(i, i) - nvim_feed(char, "") - - -- TODO: I'm not 100% sure this is a hack or not... - -- it's possible these characters could still have an on_complete... but i'm not sure. - if string.match(char, "%g") then - coroutine.yield() - end - end - - vim.wait(100, function() end) - - local timer = vim.loop.new_timer() - timer:start(200, 0, vim.schedule_wrap(function() - if test_cases.post_close then - for k, v in ipairs(test_cases.post_close) do - io.stderr:write(vim.fn.json_encode({ case = k, expected = v[1], actual = v[2]() })) - io.stderr:write("\n") - end - end - vim.wait(10) - - if debug then - return - end - - vim.defer_fn(function() - vim.cmd [[qa!]] - end, 15) - end)) - - if not debug then - vim.schedule(function() - if test_cases.post_typed then - for k, v in ipairs(test_cases.post_typed) do - io.stderr:write(vim.fn.json_encode({ case = k, expected = v[1], actual = v[2]() })) - io.stderr:write("\n") - end - end - - nvim_feed(replace_terms(""), "") - end) - end - coroutine.yield() - end) -end - --- local test_cases = { --- post_typed = { --- }, --- post_close = { --- { "README.md", function() return "README.md" end }, --- }, --- } -tester.builtin_picker = function(key, input, test_cases, opts) - opts = opts or {} - local debug = opts.debug or false - - opts.on_complete = { - tester.picker_feed(input, test_cases, debug) - } - - builtin[key](opts) -end - -local get_results_from_file = function(file) - local j = Job:new { - command = 'nvim', - args = { - '--noplugin', - '-u', - 'scripts/minimal_init.vim', - '-c', - 'luafile ' .. file - }, - } - - j:sync() - - local results = j:stderr_result() - local result_table = {} - for _, v in ipairs(results) do - table.insert(result_table, vim.fn.json_decode(v)) - end - - return result_table -end - -local check_results = function(results) - -- TODO: We should get all the test cases here that fail, not just the first one. - for _, v in ipairs(results) do - assert.are.same(v.expected, v.actual) - end -end - -tester.run_string = function(contents) - local tempname = vim.fn.tempname() - - contents = [[ - -- TODO: Add globals! - -- local tester = require('telescope.pickers._tests') - local tester = require('telescope.pickers._tests') - - local get_picker = function() - local state = require('telescope.state') - return state.get_status(vim.api.nvim_get_current_buf()).picker - end - - local get_results_bufnr = function() - local state = require('telescope.state') - return state.get_status(vim.api.nvim_get_current_buf()).results_bufnr - end - - local GetFile = function() return vim.fn.fnamemodify(vim.api.nvim_buf_get_name(0), ":t") end - - local GetPrompt = function() return vim.api.nvim_buf_get_lines(0, 0, -1, false)[1] end - - local GetResults = function() - return vim.api.nvim_buf_get_lines(get_results_bufnr(), 0, -1, false) - end - - local GetLastResult = function() - local results = GetResults() - return results[#results] - end - ]] .. contents - - vim.fn.writefile(vim.split(contents, "\n"), tempname) - local result_table = get_results_from_file(tempname) - vim.fn.delete(tempname) - - check_results(result_table) - -- assert.are.same(result_table.expected, result_table.actual) -end - -tester.run_file = function(filename) - local file = './lua/tests/pickers/' .. filename .. '.lua' - - local result_table = get_results_from_file(file) - assert.are.same(result_table.expected, result_table.actual) -end - - - -return tester diff --git a/lua/tests/automated/pickers/find_files_spec.lua b/lua/tests/automated/pickers/find_files_spec.lua index 6035075..c5cf50e 100644 --- a/lua/tests/automated/pickers/find_files_spec.lua +++ b/lua/tests/automated/pickers/find_files_spec.lua @@ -1,12 +1,16 @@ require('plenary.reload').reload_module('telescope') -local tester = require('telescope.pickers._tests') +local tester = require('telescope.pickers._test') describe('builtin.find_files', function() it('should find the readme', function() tester.run_file('find_files__readme') end) + it('should be able to move selections', function() + tester.run_file('find_files__with_ctrl_n') + end) + it('should not display devicons when disabled', function() tester.run_string [[ tester.builtin_picker('find_files', 'README.md', { @@ -105,4 +109,14 @@ describe('builtin.find_files', function() }) ]] end) + + it('should be able to get the current selection', function() + tester.run_string [[ + tester.builtin_picker('find_files', 'fixtures/file_abc', { + post_typed = { + { 'lua/tests/fixtures/file_abc.txt', GetSelectionValue }, + } + }) + ]] + end) end) diff --git a/lua/tests/pickers/find_files__readme.lua b/lua/tests/pickers/find_files__readme.lua index 6753d5d..620c3be 100644 --- a/lua/tests/pickers/find_files__readme.lua +++ b/lua/tests/pickers/find_files__readme.lua @@ -1,4 +1,4 @@ -local tester = require('telescope.pickers._tests') +local tester = require('telescope.pickers._test') tester.builtin_picker('find_files', 'README.md', { post_close = { diff --git a/lua/tests/pickers/find_files__with_ctrl_n.lua b/lua/tests/pickers/find_files__with_ctrl_n.lua index e6eecdd..78a31fd 100644 --- a/lua/tests/pickers/find_files__with_ctrl_n.lua +++ b/lua/tests/pickers/find_files__with_ctrl_n.lua @@ -1,24 +1,9 @@ -pcall(function() RELOAD('telescope') end) +local tester = require('telescope.pickers._test') +local helper = require('telescope.pickers._test_helpers') -local builtin = require('telescope.builtin') -local tester = require('telescope.pickers._tests') - -local key = 'find_files' -local input = 'fixtures/file' -local expected = 'lua/tests/fixtures/file_2.txt' -local get_actual = function() - return vim.fn.fnamemodify(vim.api.nvim_buf_get_name(0), ":.") -end - --- local on_complete_item = tester.picker_feed(input, expected, get_actual, true) --- --- builtin[key] { --- on_complete = { on_complete_item } --- } - -tester.builtin_picker('find_files', 'fixtures/file', 'lua/tests/fixtures/file_2.txt', function() - return vim.fn.fnamemodify(vim.api.nvim_buf_get_name(0), ":.") -end, { - debug = false, +tester.builtin_picker('find_files', 'fixtures/file', { + post_close = { + { 'lua/tests/fixtures/file_2.txt', helper.get_file } + }, }) -- cgit v1.2.3