Files
neovim/test/functional/legacy/008_autocommands_spec.lua
zeertzjq e3d46a6337 test: start test runners in Xtest_xdg dir (#37964)
This is a better way to prevent parallel tests from interfering with
each other, as there are many ways files can be created and deleted in
tests, so enforcing different file names is hard.

Using $TMPDIR can also work in most cases, but 'backipskip' etc. have
special defaults for $TMPDIR.

Symlink runtime/, src/, test/ and README.md to Xtest_xdg dir to make
tests more convenient (and symlinking test/ is required for busted).

Also, use README.md instead of test/README.md in the Ex mode inccommand
test, as test/README.md no longer contains 'N' char.
2026-02-20 06:53:33 +08:00

86 lines
2.6 KiB
Lua

-- Test for BufWritePre autocommand that deletes or unloads the buffer.
-- Test for BufUnload autocommand that unloads all other buffers.
local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local source = n.source
local clear, command, expect, eq, eval = n.clear, n.command, n.expect, t.eq, n.eval
local write_file, dedent = t.write_file, t.dedent
local read_file = t.read_file
local expect_exit = n.expect_exit
describe('autocommands that delete and unload buffers:', function()
local test_file = 'Xtest-008_autocommands.out'
local text1 = dedent([[
start of Xxx1
test
end of Xxx]])
local text2 = text1:gsub('1', '2')
setup(function()
write_file('Xxx1', text1 .. '\n')
write_file('Xxx2', text2 .. '\n')
end)
teardown(function()
os.remove(test_file)
os.remove('Xxx1')
os.remove('Xxx2')
end)
before_each(clear)
it('BufWritePre, BufUnload', function()
command('au BufWritePre Xxx1 bunload')
command('au BufWritePre Xxx2 bwipe')
command('e Xxx2')
eq('Xxx2', eval('bufname("%")'))
command('e Xxx1')
eq('Xxx1', eval('bufname("%")'))
-- The legacy test file did not check the error message.
command('let v:errmsg = "no error"')
command('silent! write')
eq('E203: Autocommands deleted or unloaded buffer to be written', eval('v:errmsg'))
eq('Xxx2', eval('bufname("%")'))
expect(text2)
-- Start editing Xxx2.
command('e! Xxx2')
-- The legacy test file did not check the error message.
command('let v:errmsg = "no error"')
-- Write Xxx2, will delete the buffer and give an error msg.
command('silent! write')
eq('E203: Autocommands deleted or unloaded buffer to be written', eval('v:errmsg'))
eq('Xxx1', eval('bufname("%")'))
expect(text1)
end)
it('BufUnload, VimLeave', function()
source([[
func CloseAll()
let i = 0
while i <= bufnr('$')
if i != bufnr('%') && bufloaded(i)
exe i . "bunload"
endif
let i += 1
endwhile
endfunc
func WriteToOut()
edit! ]] .. test_file .. [[
$put ='VimLeave done'
write
endfunc
set shada='100
au BufUnload * call CloseAll()
au VimLeave * call WriteToOut()
]])
-- Must disable 'hidden' so that the BufUnload autocmd is triggered between
-- each :edit
command('set nohidden')
command('silent! edit Xxx2')
command('silent! edit Xxx1')
command('silent! edit README.md') -- an existing file
command('silent! split new2')
expect_exit(command, 'silent! quit')
eq('VimLeave done', string.match(read_file(test_file), '^%s*(.-)%s*$'))
end)
end)