* fix(commands): register VimLeavePre to call stop_all Problem: spawned compiler processes and watching autocmds were never cleaned up when Neovim exited, leaving orphaned processes running. Solution: register a VimLeavePre autocmd in commands setup that calls compiler.stop_all(), which kills active processes, unwatches all buffers, and stops the reload server. * fix(compiler): replace BufWipeout with BufUnload Problem: cleanup autocmds used BufWipeout, which only fires for :bwipeout. The common :bdelete path (used by most buffer managers and nvim_buf_delete) fires BufUnload but not BufWipeout, so processes and watches leaked on normal buffer deletion. Solution: switch all three cleanup autocmds from BufWipeout to BufUnload, which fires for both :bdelete and :bwipeout. * fix(init): guard against unnamed buffer in public API Problem: calling compile/toggle/clean/open on an unsaved scratch buffer passed an empty string as ctx.file, producing nonsensical output paths like ".pdf" and silently passing empty strings to compiler binaries. Solution: add an early return with a WARN notification in compile, toggle, clean, and open when the buffer has no file name. * fix(compiler): add fs_stat check to one-shot open path Problem: the long-running process path already guarded opens with vim.uv.fs_stat(), but the one-shot compile path and M.open() did not. Compilation can exit 0 and produce no output, and output files can be externally deleted between compile and open. Solution: add the same fs_stat guard to the one-shot open branch and to M.open() before attempting to launch the viewer. * fix(compiler): check executable before spawning process Problem: if a configured binary was missing or not in PATH, vim.system would fail silently or with a cryptic OS error. The user had no actionable feedback without running :checkhealth. Solution: check vim.fn.executable() at the start of M.compile() and notify with an ERROR-level message pointing to :checkhealth preview if the binary is not found. * fix(compiler): reformat one-shot open condition for line length Problem: the added fs_stat condition exceeded stylua's line length limit on the one-shot open guard. Solution: split the boolean condition across multiple lines to match the project's stylua formatting rules.
58 lines
1.5 KiB
Lua
58 lines
1.5 KiB
Lua
local helpers = require('spec.helpers')
|
|
|
|
describe('commands', function()
|
|
before_each(function()
|
|
helpers.reset_config()
|
|
end)
|
|
|
|
describe('setup', function()
|
|
it('creates the :Preview command', function()
|
|
require('preview.commands').setup()
|
|
local cmds = vim.api.nvim_get_commands({})
|
|
assert.is_not_nil(cmds.Preview)
|
|
end)
|
|
|
|
it('registers VimLeavePre autocmd', function()
|
|
require('preview.commands').setup()
|
|
local aus = vim.api.nvim_get_autocmds({ event = 'VimLeavePre' })
|
|
local found = false
|
|
for _, au in ipairs(aus) do
|
|
if au.callback then
|
|
found = true
|
|
break
|
|
end
|
|
end
|
|
assert.is_true(found)
|
|
end)
|
|
end)
|
|
|
|
describe('dispatch', function()
|
|
it('does not error on :Preview compile with no provider', function()
|
|
require('preview.commands').setup()
|
|
assert.has_no.errors(function()
|
|
vim.cmd('Preview compile')
|
|
end)
|
|
end)
|
|
|
|
it('does not error on :Preview status', function()
|
|
require('preview.commands').setup()
|
|
assert.has_no.errors(function()
|
|
vim.cmd('Preview status')
|
|
end)
|
|
end)
|
|
|
|
it('does not error on :Preview open', function()
|
|
require('preview.commands').setup()
|
|
assert.has_no.errors(function()
|
|
vim.cmd('Preview open')
|
|
end)
|
|
end)
|
|
|
|
it('does not error on :Preview toggle with no provider', function()
|
|
require('preview.commands').setup()
|
|
assert.has_no.errors(function()
|
|
vim.cmd('Preview toggle')
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|