From ad12bf03d12660d04bb9d5fa13cc057e98a2ace4 Mon Sep 17 00:00:00 2001 From: TJ DeVries Date: Thu, 8 Oct 2020 23:48:29 -0400 Subject: feat: Add a test file --- lua/tests/automated/find_and_sort_spec.lua | 114 ---------------------------- lua/tests/automated/telescope_spec.lua | 68 +++++++++++------ lua/tests/helpers.lua | 86 +++++++++++++++++++++ lua/tests/manual/auto_picker.lua | 13 ++-- lua/tests/manual/find_and_sort_spec.lua | 115 +++++++++++++++++++++++++++++ 5 files changed, 254 insertions(+), 142 deletions(-) delete mode 100644 lua/tests/automated/find_and_sort_spec.lua create mode 100644 lua/tests/helpers.lua create mode 100644 lua/tests/manual/find_and_sort_spec.lua (limited to 'lua/tests') diff --git a/lua/tests/automated/find_and_sort_spec.lua b/lua/tests/automated/find_and_sort_spec.lua deleted file mode 100644 index b1271f4..0000000 --- a/lua/tests/automated/find_and_sort_spec.lua +++ /dev/null @@ -1,114 +0,0 @@ -require('plenary.reload').reload_module('plenary') -require('plenary.reload').reload_module('telescope') - ---[[ - -Goals: -1. Easily test a sorter and finder to make sure we get all the results we need. - ---]] - -local finders = require('telescope.finders') -local make_entry = require('telescope.make_entry') -local pickers = require('telescope.pickers') -local sorters = require('telescope.sorters') - -local find_and_sort_test = function(prompt, f, s) - local info = {} - - local start = vim.loop.hrtime() - - info.filtered = 0 - info.added = 0 - info.scoring_time = 0 - info.set_entry = 0 - - local entry_manager = pickers.entry_manager(25, function() - info.set_entry = info.set_entry + 1 - end, info) - - local completed = false - - local process_result = function(entry) - local score_start = vim.loop.hrtime() - local score = s:score(prompt, entry) - info.scoring_time = info.scoring_time + (vim.loop.hrtime() - score_start) / 1e9 - - -- Filter these out here. - if score == -1 then - info.filtered = info.filtered + 1 - return - end - - info.added = info.added + 1 - entry_manager:add_entry( - s:score(prompt, entry), - entry - ) - end - - local process_complete = function() - info.time = (vim.loop.hrtime() - start) / 1e9 - - info.total = info.filtered + info.added - completed = true - end - - f(prompt, process_result, process_complete) - - -- Wait until we're done to return - vim.wait(5000, function() return completed end, 10) - - return entry_manager, info -end - -local info_to_csv = function(info, filename) - local writer = io.open(filename, "a") - - writer:write(string.format("%.8f", info.scoring_time) .. "\t") - writer:write(string.format("%.8f", info.time) .. "\t") - writer:write(info.looped .. "\t") - writer:write(info.filtered .. "\t") - writer:write(info.added .. "\t") - writer:write(info.inserted .. "\t") - writer:write(info.total .. "\t") - writer:write(info.set_entry .. "\t") - writer:write(string.format("%.0f", collectgarbage("count")) .. "\t") - writer:write("\n") - - writer:close() -end - - -local cwd = vim.fn.expand("~/build/neovim") - -collectgarbage("collect") -for _ = 1, 1 do - - -- local s = sorters.get_fuzzy_file() - local s = sorters.get_generic_fuzzy_sorter() - local finder = finders.new_oneshot_job( - {"fdfind"}, - { - cwd = cwd, - entry_maker = make_entry.gen_from_file {cwd = cwd}, - -- disable_devicons = true, - -- maximum_results = 1000, - } - ) - - local res, info = find_and_sort_test( - "pickers.lua", - finder, - s - ) - - -- print(vim.inspect(res:get_entry(1))) - -- print(vim.inspect(info)) - - info_to_csv(info, "/home/tj/tmp/profile.csv") - - collectgarbage("collect") -end --- No skip: 2,206,186 --- Ya skip: 2,133 diff --git a/lua/tests/automated/telescope_spec.lua b/lua/tests/automated/telescope_spec.lua index 5ec3141..bf296f5 100644 --- a/lua/tests/automated/telescope_spec.lua +++ b/lua/tests/automated/telescope_spec.lua @@ -23,7 +23,7 @@ describe('Picker', function() it('works with one entry', function() local manager = EntryManager:new(5, nil) - manager:add_entry(1, "hello") + manager:add_entry(nil, 1, "hello") assert.are.same(1, manager:get_score(1)) end) @@ -31,8 +31,8 @@ describe('Picker', function() it('works with two entries', function() local manager = EntryManager:new(5, nil) - manager:add_entry(1, "hello") - manager:add_entry(2, "later") + manager:add_entry(nil, 1, "hello") + manager:add_entry(nil, 2, "later") assert.are.same("hello", manager:get_entry(1)) assert.are.same("later", manager:get_entry(2)) @@ -43,7 +43,7 @@ describe('Picker', function() local manager = EntryManager:new(5, function() called_count = called_count + 1 end) assert(called_count == 0) - manager:add_entry(1, "hello") + manager:add_entry(nil, 1, "hello") assert(called_count == 1) end) @@ -52,16 +52,16 @@ describe('Picker', function() local manager = EntryManager:new(5, function() called_count = called_count + 1 end) assert(called_count == 0) - manager:add_entry(1, "hello") - manager:add_entry(2, "world") + manager:add_entry(nil, 1, "hello") + manager:add_entry(nil, 2, "world") assert(called_count == 2) end) it('correctly sorts lower scores', function() local called_count = 0 local manager = EntryManager:new(5, function() called_count = called_count + 1 end) - manager:add_entry(5, "worse result") - manager:add_entry(2, "better result") + manager:add_entry(nil, 5, "worse result") + manager:add_entry(nil, 2, "better result") assert.are.same("better result", manager:get_entry(1)) assert.are.same("worse result", manager:get_entry(2)) @@ -75,8 +75,8 @@ describe('Picker', function() it('respects max results', function() local called_count = 0 local manager = EntryManager:new(1, function() called_count = called_count + 1 end) - manager:add_entry(2, "better result") - manager:add_entry(5, "worse result") + manager:add_entry(nil, 2, "better result") + manager:add_entry(nil, 5, "worse result") assert.are.same("better result", manager:get_entry(1)) assert.are.same(1, called_count) @@ -93,7 +93,7 @@ describe('Picker', function() local manager = EntryManager:new(5) local counts_executed = 0 - manager:add_entry(1, setmetatable({}, { + manager:add_entry(nil, 1, setmetatable({}, { __index = function(t, k) local val = nil if k == "ordinal" then @@ -211,9 +211,9 @@ describe('Sorters', function() it('sort matches well', function() local sorter = require('telescope.sorters').get_generic_fuzzy_sorter() - local exact_match = sorter:score('hello', 'hello') - local no_match = sorter:score('abcdef', 'ghijkl') - local ok_match = sorter:score('abcdef', 'ab') + local exact_match = sorter:score('hello', {ordinal = 'hello'}) + local no_match = sorter:score('abcdef', {ordinal = 'ghijkl'}) + local ok_match = sorter:score('abcdef', {ordinal = 'ab'}) assert(exact_match < no_match, "exact match better than no match") assert(exact_match < ok_match, "exact match better than ok match") @@ -234,9 +234,9 @@ describe('Sorters', function() it('sort matches well', function() local sorter = require('telescope.sorters').get_fuzzy_file() - local exact_match = sorter:score('abcdef', 'abcdef') - local no_match = sorter:score('abcdef', 'ghijkl') - local ok_match = sorter:score('abcdef', 'ab') + local exact_match = sorter:score('abcdef', {ordinal = 'abcdef'}) + local no_match = sorter:score('abcdef', {ordinal = 'ghijkl'}) + local ok_match = sorter:score('abcdef', {ordinal = 'ab'}) assert( exact_match < no_match, @@ -252,8 +252,8 @@ describe('Sorters', function() it('sorts matches after last os sep better', function() local sorter = require('telescope.sorters').get_fuzzy_file() - local better_match = sorter:score('aaa', 'bbb/aaa') - local worse_match = sorter:score('aaa', 'aaa/bbb') + local better_match = sorter:score('aaa', {ordinal = 'bbb/aaa'}) + local worse_match = sorter:score('aaa', {ordinal = 'aaa/bbb'}) assert(better_match < worse_match, "Final match should be stronger") end) @@ -261,12 +261,38 @@ describe('Sorters', function() pending('sorts multiple finds better', function() local sorter = require('telescope.sorters').get_fuzzy_file() - local multi_match = sorter:score('generics', 'exercises/generics/generics2.rs') - local one_match = sorter:score('abcdef', 'exercises/generics/README.md') + local multi_match = sorter:score('generics', {ordinal = 'exercises/generics/generics2.rs'}) + local one_match = sorter:score('abcdef', {ordinal = 'exercises/generics/README.md'}) assert(multi_match < one_match) end) end) + + describe('layout_strategies', function() + describe('center', function() + it('should handle large terminals', function() + -- TODO: This could call layout_strategies.center w/ some weird edge case. + -- and then assert stuff about the dimensions. + end) + end) + end) + + -- describe('file_finder', function() + -- COMPLETED = false + -- PASSED = false + + -- require('tests.helpers').auto_find_files { + -- input = 'pickers.lua', + + -- condition = function() + -- print(vim.api.nvim_buf_get_name(0)) + -- return string.find(vim.api.nvim_buf_get_name(0), 'pickers.lua') + -- end, + -- } + + -- print("WAIT:", vim.wait(5000, function() return COMPLETED end)) + -- assert(PASSED) + -- end) end) diff --git a/lua/tests/helpers.lua b/lua/tests/helpers.lua new file mode 100644 index 0000000..728aefb --- /dev/null +++ b/lua/tests/helpers.lua @@ -0,0 +1,86 @@ +local finders = require('telescope.finders') +local make_entry = require('telescope.make_entry') +local previewers = require('telescope.previewers') +local pickers = require('telescope.pickers') +local sorters = require('telescope.sorters') + +local helpers = {} + +-- TODO: We should do something with builtins to get those easily. +helpers.auto_find_files = function(opts) + opts = opts or {} + opts.prompt_prefix = '' + + local find_command = opts.find_command + + if not find_command then + if 1 == vim.fn.executable("fd") then + find_command = { 'fd', '--type', 'f' } + elseif 1 == vim.fn.executable("fdfind") then + find_command = { 'fdfind', '--type', 'f' } + elseif 1 == vim.fn.executable("rg") then + find_command = { 'rg', '--files' } + end + end + + if opts.cwd then + opts.cwd = vim.fn.expand(opts.cwd) + end + + opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts) + + local p = pickers.new(opts, { + prompt = 'Find Files', + finder = finders.new_oneshot_job( + find_command, + opts + ), + previewer = previewers.cat.new(opts), + sorter = sorters.get_fuzzy_file(), + + track = true, + }) + + local count = 0 + p:register_completion_callback(function(s) + print(count, vim.inspect(s.stats, { + process = function(item) + if type(item) == 'string' and item:sub(1, 1) == '_' then + return nil + end + + return item + end, + })) + + count = count + 1 + end) + + local feed = function(text, feed_opts) + feed_opts = feed_opts or 'n' + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), feed_opts, true) + end + + p:register_completion_callback(coroutine.wrap(function() + local input = opts.input + + for i = 1, #input do + feed(input:sub(i, i)) + coroutine.yield() + end + + vim.wait(300, function() end) + feed("", '') + + vim.defer_fn(function() + PASSED = opts.condition() + COMPLETED = true + end, 500) + + coroutine.yield() + end)) + + p:find() +end + +return helpers diff --git a/lua/tests/manual/auto_picker.lua b/lua/tests/manual/auto_picker.lua index 141eee4..e0433f9 100644 --- a/lua/tests/manual/auto_picker.lua +++ b/lua/tests/manual/auto_picker.lua @@ -1,15 +1,14 @@ RELOAD('telescope') -local actions = require('telescope.actions') local finders = require('telescope.finders') local make_entry = require('telescope.make_entry') local previewers = require('telescope.previewers') local pickers = require('telescope.pickers') local sorters = require('telescope.sorters') -local utils = require('telescope.utils') local find_files = function(opts) opts = opts or {} + opts.prompt_prefix = '' local find_command = opts.find_command @@ -56,8 +55,9 @@ local find_files = function(opts) count = count + 1 end) - local feed = function(text) - vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), 'n', true) + local feed = function(text, feed_opts) + feed_opts = feed_opts or 'n' + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), feed_opts, true) end p:register_completion_callback(coroutine.wrap(function() @@ -68,10 +68,9 @@ local find_files = function(opts) end vim.wait(300, function() end) + feed("", '') - vim.cmd [[:q]] - vim.cmd [[:Messages]] - vim.cmd [[stopinsert]] + coroutine.yield() end)) p:find() diff --git a/lua/tests/manual/find_and_sort_spec.lua b/lua/tests/manual/find_and_sort_spec.lua new file mode 100644 index 0000000..841399f --- /dev/null +++ b/lua/tests/manual/find_and_sort_spec.lua @@ -0,0 +1,115 @@ +require('plenary.reload').reload_module('plenary') +require('plenary.reload').reload_module('telescope') + +--[[ + +Goals: +1. Easily test a sorter and finder to make sure we get all the results we need. + +--]] + +local finders = require('telescope.finders') +local make_entry = require('telescope.make_entry') +local pickers = require('telescope.pickers') +local sorters = require('telescope.sorters') +local EntryManager = require('telescope.entry_manager') + +local find_and_sort_test = function(prompt, f, s) + local info = {} + + local start = vim.loop.hrtime() + + info.filtered = 0 + info.added = 0 + info.scoring_time = 0 + info.set_entry = 0 + + local entry_manager = EntryManager:new(25, function() + info.set_entry = info.set_entry + 1 + end, info) + + local completed = false + + local process_result = function(entry) + local score_start = vim.loop.hrtime() + local score = s:score(prompt, entry) + info.scoring_time = info.scoring_time + (vim.loop.hrtime() - score_start) / 1e9 + + -- Filter these out here. + if score == -1 then + info.filtered = info.filtered + 1 + return + end + + info.added = info.added + 1 + entry_manager:add_entry( + s:score(prompt, entry), + entry + ) + end + + local process_complete = function() + info.time = (vim.loop.hrtime() - start) / 1e9 + + info.total = info.filtered + info.added + completed = true + end + + f(prompt, process_result, process_complete) + + -- Wait until we're done to return + vim.wait(5000, function() return completed end, 10) + + return entry_manager, info +end + +local info_to_csv = function(info, filename) + local writer = io.open(filename, "a") + + writer:write(string.format("%.8f", info.scoring_time) .. "\t") + writer:write(string.format("%.8f", info.time) .. "\t") + writer:write(info.looped .. "\t") + writer:write(info.filtered .. "\t") + writer:write(info.added .. "\t") + writer:write(info.inserted .. "\t") + writer:write(info.total .. "\t") + writer:write(info.set_entry .. "\t") + writer:write(string.format("%.0f", collectgarbage("count")) .. "\t") + writer:write("\n") + + writer:close() +end + + +local cwd = vim.fn.expand("~/build/neovim") + +collectgarbage("collect") +for _ = 1, 1 do + + -- local s = sorters.get_fuzzy_file() + local s = sorters.get_generic_fuzzy_sorter() + local finder = finders.new_oneshot_job( + {"fdfind"}, + { + cwd = cwd, + entry_maker = make_entry.gen_from_file {cwd = cwd}, + -- disable_devicons = true, + -- maximum_results = 1000, + } + ) + + local res, info = find_and_sort_test( + "pickers.lua", + finder, + s + ) + + -- print(vim.inspect(res:get_entry(1))) + -- print(vim.inspect(info)) + + info_to_csv(info, "/home/tj/tmp/profile.csv") + + collectgarbage("collect") +end +-- No skip: 2,206,186 +-- Ya skip: 2,133 -- cgit v1.2.3