local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local command = helpers.command
local eq = helpers.eq
local neq = helpers.neq
local exec_lua = helpers.exec_lua
local matches = helpers.matches
local meths = helpers.meths
local source = helpers.source
local pcall_err = helpers.pcall_err
before_each(clear)
describe('autocmd api', function()
describe('nvim_create_autocmd', function()
it('"command" and "callback" are mutually exclusive', function()
local rv = pcall_err(meths.create_autocmd, "BufReadPost", {
pattern = "*.py,*.pyi",
command = "echo 'Should Have Errored",
callback = "NotAllowed",
})
eq("specify either 'callback' or 'command', not both", rv)
end)
it('doesnt leak when you use ++once', function()
eq(1, exec_lua([[
local count = 0
vim.api.nvim_create_autocmd("FileType", {
pattern = "*",
callback = function() count = count + 1 end,
once = true
})
vim.cmd "set filetype=txt"
vim.cmd "set filetype=python"
return count
]], {}))
end)
it('allows passing buffer by key', function()
meths.set_var('called', 0)
meths.create_autocmd("FileType", {
command = "let g:called = g:called + 1",
buffer = 0,
})
meths.command "set filetype=txt"
eq(1, meths.get_var('called'))
-- switch to a new buffer
meths.command "new"
meths.command "set filetype=python"
eq(1, meths.get_var('called'))
end)
it('does not allow passing buffer and patterns', function()
local rv = pcall_err(meths.create_autocmd, "Filetype", {
command = "let g:called = g:called + 1",
buffer = 0,
pattern = "*.py",
})
eq("cannot pass both: 'pattern' and 'buffer' for the same autocmd", rv)
end)
it('does not allow passing invalid buffers', function()
local ok, msg = pcall(meths.create_autocmd, "Filetype", {
command = "let g:called = g:called + 1",
buffer = -1,
})
eq(false, ok)
matches('Invalid buffer id', msg)
end)
it('errors on non-functions for cb', function()
eq(false, pcall(exec_lua, [[
vim.api.nvim_create_autocmd("BufReadPost", {
pattern = "*.py,*.pyi",
callback = 5,
})
]]))
end)
it('allow passing pattern and <buffer> in same pattern', function()
local ok = pcall(meths.create_autocmd, "BufReadPost", {
pattern = "*.py,<buffer>",
command = "echo 'Should Not Error'"
})
eq(true, ok)
end)
it('should handle multiple values as comma separated list', function()
meths.create_autocmd("BufReadPost", {
pattern = "*.py,*.pyi",
command = "echo 'Should Not Have Errored'"
})
-- We should have one autocmd for *.py and one for *.pyi
eq(2, #meths.get_autocmds { event = "BufReadPost" })
end)
it('should handle multiple values as array', function()
meths.create_autocmd("BufReadPost", {
pattern = { "*.py", "*.pyi", },
command = "echo 'Should Not Have Errored'"
})
-- We should have one autocmd for *.py and one for *.pyi
eq(2, #meths.get_autocmds { event = "BufReadPost" })
end)
describe('desc', function()
it('can add description to one autocmd', function()
local cmd = "echo 'Should Not Have Errored'"
local desc = "Can show description"
meths.create_autocmd("BufReadPost", {
pattern = "*.py",
command = cmd,
desc = desc,
})
eq(desc, meths.get_autocmds { event = "BufReadPost" }[1].desc)
eq(cmd, meths.get_autocmds { event = "BufReadPost" }[1].command)
end)
it('can add description to one autocmd that uses a callback', function()
local desc = 'Can show description'
meths.set_var('desc', desc)
local result = exec_lua([[
local callback = function() print 'Should Not Have Errored' end
vim.api.nvim_create_autocmd("BufReadPost", {
pattern = "*.py",
callback = callback,
desc = vim.g.desc,
})
local aus = vim.api.nvim_get_autocmds({ event = 'BufReadPost' })
local first = aus[1]
return {
desc = first.desc,
cbtype = type(first.callback)
}
]])
eq({ desc = desc, cbtype = 'function' }, result)
end)
it('will not add a description unless it was provided', function()
exec_lua
|