Mercurial > vim
view src/testdir/test_tabline.vim @ 34379:37b4c89ba420 v9.1.0116
patch 9.1.0116: win_split_ins may not check available room
Commit: https://github.com/vim/vim/commit/0fd44a5ad81ade342cb54d8984965bdedd2272c8
Author: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Date: Tue Feb 20 20:28:15 2024 +0100
patch 9.1.0116: win_split_ins may not check available room
Problem: win_split_ins has no check for E36 when moving an existing
window
Solution: check for room and fix the issues in f_win_splitmove()
(Sean Dewar)
win_split_ins has no check for E36 when moving an existing window,
allowing for layouts with many overlapping zero-sized windows to be
created (which may also cause drawing issues with tablines and such).
f_win_splitmove also has some bugs.
So check for room and fix the issues in f_win_splitmove. Handle failure
in the two relevant win_split_ins callers by restoring the original
layout, and factor the common logic into win_splitmove.
Don't check for room when opening an autocommand window, as it's a
temporary window that's rarely interacted with or drawn anyhow, and is
rather important for some autocommands.
Issues fixed in f_win_splitmove:
- Error if splitting is disallowed.
- Fix heap-use-after-frees if autocommands fired from switching to "targetwin"
close "wp" or "oldwin".
- Fix splitting the wrong window if autocommands fired from switching to
"targetwin" switch to a different window.
- Ensure -1 is returned for all errors.
Also handle allocation failure a bit earlier in make_snapshot (callers,
except win_splitmove, don't really care if a snapshot can't be made, so
just ignore the return value).
Note: Test_smoothscroll_in_zero_width_window failed after these changes with
E36, as it was using the previous behaviour to create a zero-width window.
I've fixed the test such that it fails with UBSAN as expected when v9.0.1367 is
reverted (and simplified it too).
related: #14042
Signed-off-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 20 Feb 2024 22:30:04 +0100 |
parents | 5dfaba11d7c3 |
children |
line wrap: on
line source
" Test for tabline source shared.vim source view_util.vim source check.vim source screendump.vim func TablineWithCaughtError() let s:func_in_tabline_called = 1 try call eval('unknown expression') catch endtry return '' endfunc func TablineWithError() let s:func_in_tabline_called = 1 call eval('unknown expression') return '' endfunc func Test_caught_error_in_tabline() if has('gui') set guioptions-=e endif let showtabline_save = &showtabline set showtabline=2 let s:func_in_tabline_called = 0 let tabline = '%{TablineWithCaughtError()}' let &tabline = tabline redraw! call assert_true(s:func_in_tabline_called) call assert_equal(tabline, &tabline) set tabline= let &showtabline = showtabline_save endfunc func Test_tabline_will_be_disabled_with_error() if has('gui') set guioptions-=e endif let showtabline_save = &showtabline set showtabline=2 let s:func_in_tabline_called = 0 let tabline = '%{TablineWithError()}' try let &tabline = tabline redraw! catch endtry call assert_true(s:func_in_tabline_called) call assert_equal('', &tabline) set tabline= let &showtabline = showtabline_save endfunc func Test_redrawtabline() if has('gui') set guioptions-=e endif let showtabline_save = &showtabline set showtabline=2 set tabline=%{bufnr('$')} edit Xtabline1 edit Xtabline2 redraw call assert_match(bufnr('$') . '', Screenline(1)) au BufAdd * redrawtabline badd Xtabline3 call assert_match(bufnr('$') . '', Screenline(1)) set tabline= let &showtabline = showtabline_save au! Bufadd endfunc " Test for the "%T" and "%X" flags in the 'tabline' option func MyTabLine() let s = '' for i in range(tabpagenr('$')) " set the tab page number (for mouse clicks) let s .= '%' . (i + 1) . 'T' " the label is made by MyTabLabel() let s .= ' %{MyTabLabel(' . (i + 1) . ')} ' endfor " after the last tab fill with TabLineFill and reset tab page nr let s .= '%T' " right-align the label to close the current tab page if tabpagenr('$') > 1 let s .= '%=%Xclose' endif return s endfunc func MyTabLabel(n) let buflist = tabpagebuflist(a:n) let winnr = tabpagewinnr(a:n) return bufname(buflist[winnr - 1]) endfunc func Test_tabline_flags() if has('gui') set guioptions-=e endif set tabline=%!MyTabLine() edit Xtabline1 tabnew Xtabline2 redrawtabline call assert_match('^ Xtabline1 Xtabline2\s\+close$', Screenline(1)) set tabline= %bw! endfunc function EmptyTabname() return "" endfunction function MakeTabLine() abort let titles = map(range(1, tabpagenr('$')), '"%( %" . v:val . "T%{EmptyTabname()}%T %)"') let sep = 'あ' let tabpages = join(titles, sep) return tabpages .. sep .. '%=%999X X' endfunction func Test_tabline_empty_group() " this was reading invalid memory set tabline=%!MakeTabLine() tabnew redraw! bw! set tabline= endfunc " When there are exactly 20 tabline format items (the exact size of the " initial tabline items array), test that we don't write beyond the size " of the array. func Test_tabline_20_format_items_no_overrun() set showtabline=2 let tabline = repeat('%#StatColorHi2#', 20) let &tabline = tabline redrawtabline set showtabline& tabline& endfunc func Test_mouse_click_in_tab() " This used to crash because TabPageIdxs[] was not initialized let lines =<< trim END tabnew set mouse=a exe "norm \<LeftMouse>" END call writefile(lines, 'Xclickscript', 'D') call RunVim([], [], "-e -s -S Xclickscript -c qa") endfunc func Test_tabline_showcmd() CheckScreendump let lines =<< trim END func MyTabLine() return '%S' endfunc set showtabline=2 set tabline=%!MyTabLine() set showcmdloc=tabline call setline(1, ['a', 'b', 'c']) set foldopen+=jump 1,2fold 3 END call writefile(lines, 'XTest_tabline', 'D') let buf = RunVimInTerminal('-S XTest_tabline', {'rows': 6}) call term_sendkeys(buf, "g") call VerifyScreenDump(buf, 'Test_tabline_showcmd_1', {}) " typing "gg" should open the fold call term_sendkeys(buf, "g") call VerifyScreenDump(buf, 'Test_tabline_showcmd_2', {}) call term_sendkeys(buf, "\<C-V>Gl") call VerifyScreenDump(buf, 'Test_tabline_showcmd_3', {}) call term_sendkeys(buf, "\<Esc>1234") call VerifyScreenDump(buf, 'Test_tabline_showcmd_4', {}) call term_sendkeys(buf, "\<Esc>:set tabline=\<CR>") call term_sendkeys(buf, ":\<CR>") call term_sendkeys(buf, "1234") call VerifyScreenDump(buf, 'Test_tabline_showcmd_5', {}) call StopVimInTerminal(buf) endfunc func TruncTabLine() return '%1T口口%2Ta' .. repeat('b', &columns - 4) .. '%999X%#TabLine#c' endfunc " Test 'tabline' with truncated double-width label at the start. func Test_tabline_truncated_double_width() tabnew redraw call assert_match('X$', Screenline(1)) let attr_TabLineFill = screenattr(1, &columns - 1) let attr_TabLine = screenattr(1, &columns) call assert_notequal(attr_TabLine, attr_TabLineFill) set tabline=%!TruncTabLine() redraw call assert_equal('<a' .. repeat('b', &columns - 4) .. 'c', Screenline(1)) call assert_equal(attr_TabLineFill, screenattr(1, &columns - 2)) call assert_equal(attr_TabLine, screenattr(1, &columns - 1)) call assert_equal(attr_TabLine, screenattr(1, &columns)) bw! set tabline= endfunc " vim: shiftwidth=2 sts=2 expandtab