Mercurial > vim
view src/testdir/test_winbuf_close.vim @ 34686:83875247fbc0 v9.1.0224
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Commit: https://github.com/vim/vim/commit/515f734e687f28f7199b2a8042197624d9f3ec15
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Thu Mar 28 12:01:14 2024 +0100
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Problem: If a line has "right" & "below" virtual text properties,
where the "below" property may be stored first due to lack of
ordering between them, then the line height is calculated to
be 1 more and causes the cursor to far over the line.
Solution: Remove some unnecessary setting of a
`next_right_goes_below = TRUE` flag for "below" and "above"
text properties. (Dylan Thacker-Smith)
I modified a regression test I recently added to cover this case,
leveraging the fact that "after", "right" & "below" text properties are
being stored in the reverse of the order they are added in. The
previous version of this regression test was crafted to workaround this
issue so it can be addressed by this separate patch.
closes: #14317
Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 28 Mar 2024 12:15:03 +0100 |
parents | dbec60b8c253 |
children |
line wrap: on
line source
" Test for commands that close windows and/or buffers: " :quit " :close " :hide " :only " :sall " :all " :ball " :buf " :edit " func Test_winbuf_close() enew | only call writefile(['testtext 1'], 'Xtest1', 'D') call writefile(['testtext 2'], 'Xtest2', 'D') call writefile(['testtext 3'], 'Xtest3', 'D') next! Xtest1 Xtest2 call setline(1, 'testtext 1 1') " test for working :n when hidden set set hidden next call assert_equal('Xtest2', bufname('%')) " test for failing :rew when hidden not set set nohidden call setline(1, 'testtext 2 2') call assert_fails('rewind', 'E37:') call assert_equal('Xtest2', bufname('%')) call assert_equal('testtext 2 2', getline(1)) " test for working :rew when hidden set set hidden rewind call assert_equal('Xtest1', bufname('%')) call assert_equal('testtext 1 1', getline(1)) " test for :all keeping a buffer when it's modified set nohidden call setline(1, 'testtext 1 1 1') split next Xtest2 Xtest3 all 1wincmd w call assert_equal('Xtest1', bufname('%')) call assert_equal('testtext 1 1 1', getline(1)) " test abandoning changed buffer, should be unloaded even when 'hidden' set set hidden call setline(1, 'testtext 1 1 1 1') quit! call assert_equal('Xtest2', bufname('%')) call assert_equal('testtext 2 2', getline(1)) unhide call assert_equal('Xtest2', bufname('%')) call assert_equal('testtext 2 2', getline(1)) " test ":hide" hides anyway when 'hidden' not set set nohidden call setline(1, 'testtext 2 2 2') hide call assert_equal('Xtest3', bufname('%')) call assert_equal('testtext 3', getline(1)) " test ":edit" failing in modified buffer when 'hidden' not set call setline(1, 'testtext 3 3') call assert_fails('edit Xtest1', 'E37:') call assert_equal('Xtest3', bufname('%')) call assert_equal('testtext 3 3', getline(1)) " test ":edit" working in modified buffer when 'hidden' set set hidden edit Xtest1 call assert_equal('Xtest1', bufname('%')) call assert_equal('testtext 1', getline(1)) " test ":close" not hiding when 'hidden' not set in modified buffer split Xtest3 set nohidden call setline(1, 'testtext 3 3 3') call assert_fails('close', 'E37:') call assert_equal('Xtest3', bufname('%')) call assert_equal('testtext 3 3 3', getline(1)) " test ":close!" does hide when 'hidden' not set in modified buffer; call setline(1, 'testtext 3 3 3 3') close! call assert_equal('Xtest1', bufname('%')) call assert_equal('testtext 1', getline(1)) set nohidden " test ":all!" hides changed buffer split Xtest4 call setline(1, 'testtext 4') all! 1wincmd w call assert_equal('Xtest2', bufname('%')) call assert_equal('testtext 2 2 2', getline(1)) " test ":q!" and hidden buffer. bwipe! Xtest1 Xtest2 Xtest3 Xtest4 split Xtest1 wincmd w bwipe! set modified bot split Xtest2 set modified bot split Xtest3 set modified wincmd t hide call assert_equal('Xtest2', bufname('%')) quit! call assert_equal('Xtest3', bufname('%')) call assert_fails('silent! quit!', 'E37:') call assert_equal('Xtest1', bufname('%')) endfunc " Test that ":close" will respect 'winfixheight' when possible. func Test_winfixheight_on_close() set nosplitbelow nosplitright split | split | vsplit $wincmd w setlocal winfixheight let l:height = winheight(0) 3close call assert_equal(l:height, winheight(0)) %bwipeout! setlocal nowinfixheight splitbelow& splitright& endfunc " Test that ":close" will respect 'winfixwidth' when possible. func Test_winfixwidth_on_close() set nosplitbelow nosplitright vsplit | vsplit | split $wincmd w setlocal winfixwidth let l:width = winwidth(0) 3close call assert_equal(l:width, winwidth(0)) %bwipeout! setlocal nowinfixwidth splitbelow& splitright& endfunction " Test that 'winfixheight' will be respected even there is non-leaf frame func Test_winfixheight_non_leaf_frame() vsplit botright 11new let l:wid = win_getid() setlocal winfixheight call assert_equal(11, winheight(l:wid)) botright new bwipe! call assert_equal(11, winheight(l:wid)) %bwipe! endf " Test that 'winfixwidth' will be respected even there is non-leaf frame func Test_winfixwidth_non_leaf_frame() split topleft 11vnew let l:wid = win_getid() setlocal winfixwidth call assert_equal(11, winwidth(l:wid)) topleft new bwipe! call assert_equal(11, winwidth(l:wid)) %bwipe! endf func Test_tabwin_close() enew let l:wid = win_getid() tabedit call win_execute(l:wid, 'close') " Should not crash. call assert_true(v:true) " This tests closing a window in another tab, while leaving the tab open " i.e. two windows in another tab. tabedit let w:this_win = 42 new let othertab_wid = win_getid() tabprevious call win_execute(othertab_wid, 'q') " drawing the tabline helps check that the other tab's windows and buffers " are still valid redrawtabline " but to be certain, ensure we can focus the other tab too tabnext call assert_equal(42, w:this_win) bwipe! endfunc " Test when closing a split window (above/below) restores space to the window " below when 'noequalalways' and 'splitright' are set. func Test_window_close_splitright_noequalalways() set noequalalways set splitright new let w1 = win_getid() new let w2 = win_getid() execute "normal \<c-w>b" let h = winheight(0) let w = win_getid() new q call assert_equal(h, winheight(0), "Window height does not match eight before opening and closing another window") call assert_equal(w, win_getid(), "Did not return to original window after opening and closing a window") endfunc " vim: shiftwidth=2 sts=2 expandtab