Files
neovim/test/functional/plugin/difftool_spec.lua
Nicknamess96 c1e60f36f3 fix(difftool): don't reset quickfix list when closing quickfix window #38088
Closing the quickfix window previously triggered a WinClosed autocmd
that deleted all difftool autocmds and pushed an empty quickfix list,
making the difftool non-functional. Users who close the quickfix window
to gain screen real estate for viewing diffs had no way to continue
navigating entries.

Remove the qf_win tracking and its associated WinClosed autocmd so that
closing the quickfix window no longer tears down the difftool state.
Closing either diff window still performs full cleanup as before.

The BufWinEnter handler no longer passes with_qf to diff_files, so
navigating entries while the quickfix window is closed reuses the
existing diff layout without forcing a layout rebuild.

Fixes #37388
2026-02-28 09:59:53 -05:00

119 lines
3.8 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local clear = n.clear
local command = n.command
local eq = t.eq
local fn = n.fn
local pathsep = n.get_pathsep()
local testdir_left = 'Xtest-difftool-left'
local testdir_right = 'Xtest-difftool-right'
setup(function()
n.mkdir_p(testdir_left)
n.mkdir_p(testdir_right)
t.write_file(testdir_left .. pathsep .. 'file1.txt', 'hello')
t.write_file(testdir_left .. pathsep .. 'file2.txt', 'foo')
t.write_file(testdir_right .. pathsep .. 'file1.txt', 'hello world') -- modified
t.write_file(testdir_right .. pathsep .. 'file3.txt', 'bar') -- added
end)
teardown(function()
n.rmdir(testdir_left)
n.rmdir(testdir_right)
end)
describe('nvim.difftool', function()
before_each(function()
clear()
command('packadd nvim.difftool')
end)
it('shows added, modified, and deleted files in quickfix', function()
command(('DiffTool %s %s'):format(testdir_left, testdir_right))
local qflist = fn.getqflist()
local entries = {}
for _, item in ipairs(qflist) do
table.insert(entries, { text = item.text, rel = item.user_data and item.user_data.rel })
end
-- Should show:
-- file1.txt as modified (M)
-- file2.txt as deleted (D)
-- file3.txt as added (A)
eq({
{ text = 'M', rel = 'file1.txt' },
{ text = 'D', rel = 'file2.txt' },
{ text = 'A', rel = 'file3.txt' },
}, entries)
end)
it('has consistent split layout', function()
command('set nosplitright')
command(('DiffTool %s %s'):format(testdir_left, testdir_right))
local wins = fn.getwininfo()
local left_win_col = wins[1].wincol
local right_win_col = wins[2].wincol
assert(
left_win_col < right_win_col,
'Left window should be to the left of right window even with nosplitright set'
)
end)
it('handles symlinks', function()
-- Create a symlink in right dir pointing to file2.txt in left dir
local symlink_path = vim.fs.joinpath(testdir_right, 'file2.txt')
local target_path = vim.fs.joinpath('..', testdir_left, 'file2.txt')
assert(vim.uv.fs_symlink(target_path, symlink_path) == true)
finally(function()
os.remove(symlink_path)
end)
assert(fn.getftype(symlink_path) == 'link')
-- Run difftool
command(('DiffTool %s %s'):format(testdir_left, testdir_right))
local qflist = fn.getqflist()
local entries = {}
for _, item in ipairs(qflist) do
table.insert(entries, { text = item.text, rel = item.user_data and item.user_data.rel })
end
-- file2.txt should not be reported as added or deleted anymore
eq({
{ text = 'M', rel = 'file1.txt' },
{ text = 'A', rel = 'file3.txt' },
}, entries)
end)
it('has autocmds when diff window is opened', function()
command(('DiffTool %s %s'):format(testdir_left, testdir_right))
local autocmds = fn.nvim_get_autocmds({ group = 'nvim.difftool.events' })
assert(#autocmds > 0)
end)
it('cleans up autocmds when diff window is closed', function()
command(('DiffTool %s %s'):format(testdir_left, testdir_right))
command('q')
local ok = pcall(fn.nvim_get_autocmds, { group = 'nvim.difftool.events' })
eq(false, ok)
end)
it('does not reset quickfix list when closing quickfix window', function()
command(('DiffTool %s %s'):format(testdir_left, testdir_right))
local qflist_before = fn.getqflist()
assert(#qflist_before > 0, 'quickfix list should not be empty')
-- Close the quickfix window
command('cclose')
-- Quickfix list should still be intact
local qflist_after = fn.getqflist()
eq(#qflist_before, #qflist_after)
-- Autocmds should still be active
local autocmds = fn.nvim_get_autocmds({ group = 'nvim.difftool.events' })
assert(#autocmds > 0, 'autocmds should still exist after closing quickfix window')
end)
end)