aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/benchmark/autocmd_spec.lua175
-rw-r--r--test/functional/autocmd/autocmd_spec.lua18
-rw-r--r--test/functional/autocmd/show_spec.lua41
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)