diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/benchmark/autocmd_spec.lua | 175 | ||||
-rw-r--r-- | test/functional/autocmd/autocmd_spec.lua | 18 | ||||
-rw-r--r-- | test/functional/autocmd/show_spec.lua | 41 |
3 files changed, 234 insertions, 0 deletions
diff --git a/test/benchmark/autocmd_spec.lua b/test/benchmark/autocmd_spec.lua new file mode 100644 index 0000000000..f243d9c94d --- /dev/null +++ b/test/benchmark/autocmd_spec.lua @@ -0,0 +1,175 @@ +local helpers = require('test.functional.helpers')(after_each) + +local clear = helpers.clear +local exec_lua = helpers.exec_lua + +local N = 7500 + +describe('autocmd perf', function() + before_each(function() + clear() + + exec_lua([[ + out = {} + function start() + ts = vim.loop.hrtime() + end + function stop(name) + out[#out+1] = ('%14.6f ms - %s'):format((vim.loop.hrtime() - ts) / 1000000, name) + end + ]]) + end) + + after_each(function() + for _, line in ipairs(exec_lua([[return out]])) do + print(line) + end + end) + + it('nvim_create_autocmd, nvim_del_autocmd (same pattern)', function() + exec_lua([[ + local N = ... + local ids = {} + + start() + for i = 1, N do + ids[i] = vim.api.nvim_create_autocmd('User', { + pattern = 'Benchmark', + command = 'eval 0', -- noop + }) + end + stop('nvim_create_autocmd') + + start() + for i = 1, N do + vim.api.nvim_del_autocmd(ids[i]) + end + stop('nvim_del_autocmd') + ]], N) + end) + + it('nvim_create_autocmd, nvim_del_autocmd (unique patterns)', function() + exec_lua([[ + local N = ... + local ids = {} + + start() + for i = 1, N do + ids[i] = vim.api.nvim_create_autocmd('User', { + pattern = 'Benchmark' .. i, + command = 'eval 0', -- noop + }) + end + stop('nvim_create_autocmd') + + start() + for i = 1, N do + vim.api.nvim_del_autocmd(ids[i]) + end + stop('nvim_del_autocmd') + ]], N) + end) + + it('nvim_create_autocmd + nvim_del_autocmd', function() + exec_lua([[ + local N = ... + + start() + for _ = 1, N do + local id = vim.api.nvim_create_autocmd('User', { + pattern = 'Benchmark', + command = 'eval 0', -- noop + }) + vim.api.nvim_del_autocmd(id) + end + stop('nvim_create_autocmd + nvim_del_autocmd') + ]], N) + end) + + it('nvim_exec_autocmds (same pattern)', function() + exec_lua([[ + local N = ... + + for i = 1, N do + vim.api.nvim_create_autocmd('User', { + pattern = 'Benchmark', + command = 'eval 0', -- noop + }) + end + + start() + vim.api.nvim_exec_autocmds('User', { pattern = 'Benchmark', modeline = false }) + stop('nvim_exec_autocmds') + ]], N) + end) + + it('nvim_del_augroup_by_id', function() + exec_lua([[ + local N = ... + local group = vim.api.nvim_create_augroup('Benchmark', {}) + + for i = 1, N do + vim.api.nvim_create_autocmd('User', { + pattern = 'Benchmark', + command = 'eval 0', -- noop + group = group, + }) + end + + start() + vim.api.nvim_del_augroup_by_id(group) + stop('nvim_del_augroup_by_id') + ]], N) + end) + + it('nvim_del_augroup_by_name', function() + exec_lua([[ + local N = ... + local group = vim.api.nvim_create_augroup('Benchmark', {}) + + for i = 1, N do + vim.api.nvim_create_autocmd('User', { + pattern = 'Benchmark', + command = 'eval 0', -- noop + group = group, + }) + end + + start() + vim.api.nvim_del_augroup_by_name('Benchmark') + stop('nvim_del_augroup_by_id') + ]], N) + end) + + it(':autocmd, :autocmd! (same pattern)', function() + exec_lua([[ + local N = ... + + start() + for i = 1, N do + vim.cmd('autocmd User Benchmark eval 0') + end + stop(':autocmd') + + start() + vim.cmd('autocmd! User Benchmark') + stop(':autocmd!') + ]], N) + end) + + it(':autocmd, :autocmd! (unique patterns)', function() + exec_lua([[ + local N = ... + + start() + for i = 1, N do + vim.cmd(('autocmd User Benchmark%d eval 0'):format(i)) + end + stop(':autocmd') + + start() + vim.cmd('autocmd! User') + stop(':autocmd!') + ]], N) + end) +end) diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index fb5bab445c..82c7f9502f 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -611,4 +611,22 @@ describe('autocmd', function() eq(4, #meths.get_autocmds { event = "BufReadCmd", group = "TestingPatterns" }) end) end) + + it('no use-after-free when adding autocommands from a callback', function() + exec_lua [[ + vim.cmd "autocmd! TabNew" + vim.g.count = 0 + vim.api.nvim_create_autocmd('TabNew', { + callback = function() + vim.g.count = vim.g.count + 1 + for _ = 1, 100 do + vim.cmd "autocmd TabNew * let g:count += 1" + end + return true + end, + }) + vim.cmd "tabnew" + ]] + eq(1, eval('g:count')) -- Added autocommands should not be executed + end) end) diff --git a/test/functional/autocmd/show_spec.lua b/test/functional/autocmd/show_spec.lua index 505bed834b..9e0a5b819a 100644 --- a/test/functional/autocmd/show_spec.lua +++ b/test/functional/autocmd/show_spec.lua @@ -180,4 +180,45 @@ describe(":autocmd", function() test_3 User B echo "B3"]]), funcs.execute('autocmd test_3 * B')) end) + + it('should skip consecutive patterns', function() + exec([[ + autocmd! BufEnter + augroup test_1 + autocmd BufEnter A echo 'A' + autocmd BufEnter A echo 'B' + autocmd BufEnter A echo 'C' + autocmd BufEnter B echo 'D' + autocmd BufEnter B echo 'E' + autocmd BufEnter B echo 'F' + augroup END + augroup test_2 + autocmd BufEnter C echo 'A' + autocmd BufEnter C echo 'B' + autocmd BufEnter C echo 'C' + autocmd BufEnter D echo 'D' + autocmd BufEnter D echo 'E' + autocmd BufEnter D echo 'F' + augroup END + + let g:output = execute('autocmd BufEnter') + ]]) + eq(dedent([[ + + --- Autocommands --- + test_1 BufEnter + A echo 'A' + echo 'B' + echo 'C' + B echo 'D' + echo 'E' + echo 'F' + test_2 BufEnter + C echo 'A' + echo 'B' + echo 'C' + D echo 'D' + echo 'E' + echo 'F']]), eval('g:output')) + end) end) |