0
0
mirror of https://github.com/vim/vim.git synced 2025-09-01 21:03:39 -04:00

runtime(syntax-tests): Improve parts of "runtest.vim"

* Accommodate the calling of "EraseLineAndReturnCarriage()"
  to not interfere with the "skipped" and "failed" reports.

* Create the "failed" directory, if unavailable, without
  relying on "VerifyScreenDump()" to do it so that reporting
  with "Xtestscript#s:AssertCursorForwardProgress()" can be
  uniformly attempted.

* Make an only list copy of the "Xtestscript" contents and
  share it with every syntax test.

* Narrow the scope of the "filetype" and "failed_root" local
  variables.

closes: #16789

Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Aliaksei Budavei 2025-03-08 16:58:17 +01:00 committed by Christian Brabandt
parent dd42b05f8a
commit f63c3467b1
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09

View File

@ -15,11 +15,12 @@ let s:messagesFname = fnameescape(syntaxDir .. '/testdir/messages')
let s:messages = [] let s:messages = []
" Erase the cursor line and do not advance the cursor. " Erase the cursor line and do not advance the cursor. (Call the function
def EraseLineAndReturnCarriage(rname: string) " after each passing test report.)
def EraseLineAndReturnCarriage(line: string)
const full_width: number = winwidth(0) const full_width: number = winwidth(0)
const half_width: number = full_width - (full_width + 1) / 2 const half_width: number = full_width - (full_width + 1) / 2
if (strlen(rname) + strlen('Test' .. "\x20\x20" .. 'FAILED')) > half_width if strlen(line) > half_width
echon "\r" .. repeat("\x20", full_width) .. "\r" echon "\r" .. repeat("\x20", full_width) .. "\r"
else else
echon repeat("\x20", half_width) .. "\r" echon repeat("\x20", half_width) .. "\r"
@ -57,7 +58,6 @@ call append(line('$'), '')
let s:test_run_message = 'Test run on ' .. strftime("%Y %b %d %H:%M:%S") let s:test_run_message = 'Test run on ' .. strftime("%Y %b %d %H:%M:%S")
call append(line('$'), s:test_run_message) call append(line('$'), s:test_run_message)
silent wq silent wq
echo "\n"
if syntaxDir !~ '[/\\]runtime[/\\]syntax\>' if syntaxDir !~ '[/\\]runtime[/\\]syntax\>'
call Fatal('Current directory must be "runtime/syntax"') call Fatal('Current directory must be "runtime/syntax"')
@ -80,10 +80,15 @@ if !CanRunVimInTerminal()
endif endif
cd testdir cd testdir
if !isdirectory('done') if !isdirectory('done')
call mkdir('done') call mkdir('done')
endif endif
if !isdirectory('failed')
call mkdir('failed')
endif
set nocp set nocp
set nowrapscan set nowrapscan
set report=9999 set report=9999
@ -224,10 +229,165 @@ def s:TermWaitAndPollRuler(buf: number, in_name_and_out_name: string): list<stri
enddef enddef
func RunTest() func RunTest()
let XTESTSCRIPT =<< trim END
" Track the cursor progress through a syntax test file so that any
" degenerate input can be reported. Each file will have its own cursor.
let s:cursor = 1
" extra info for shell variables
func ShellInfo()
let msg = ''
for [key, val] in items(b:)
if key =~ '^is_'
let msg ..= key .. ': ' .. val .. ', '
endif
endfor
if msg != ''
echomsg msg
endif
endfunc
au! SwapExists * call HandleSwapExists()
func HandleSwapExists()
" Ignore finding a swap file for the test input, the user might be
" editing it and that's OK.
if expand('<afile>') =~ 'input[/\\].*\..*'
let v:swapchoice = 'e'
endif
endfunc
func LoadFiletype(type)
for file in glob("ftplugin/" .. a:type .. "*.vim", 1, 1)
exe "source " .. file
endfor
redraw!
endfunc
func SetUpVim()
call cursor(1, 1)
" Defend against rogue VIM_TEST_SETUP commands.
for _ in range(20)
let lnum = search('\C\<VIM_TEST_SETUP\>', 'eW', 20)
if lnum < 1
break
endif
exe substitute(getline(lnum), '\C.*\<VIM_TEST_SETUP\>', '', '')
endfor
call cursor(1, 1)
" BEGIN [runtime/defaults.vim]
" Also, disable italic highlighting to avoid issues on some terminals.
set display=lastline ruler scrolloff=5 t_ZH= t_ZR=
syntax on
" END [runtime/defaults.vim]
redraw!
endfunc
def s:AssertCursorForwardProgress(): bool
const curnum: number = line('.')
if curnum <= cursor
# Use "actions/upload-artifact@v4" of ci.yml for delivery.
writefile([printf('No cursor progress: %d <= %d (%s). Please file an issue.',
curnum,
cursor,
bufname('%'))],
'failed/00-FIXME',
'a')
bwipeout!
endif
cursor = curnum
return true
enddef
def ScrollToSecondPage(estate: number, op_wh: number, op_so: number): bool
if line('.') != 1 || line('w$') >= line('$')
return AssertCursorForwardProgress()
endif
try
set scrolloff=0
# Advance mark "c"[ursor] along with the cursor.
norm! Lmc
if foldclosed('.') < 0 &&
(strdisplaywidth(getline('.')) + &l:fdc * winheight(1)) >= estate
# Make for an exit for a screenful long line.
norm! j^
return AssertCursorForwardProgress()
else
# Place the cursor on the actually last visible line.
while winline() < op_wh
const lastnum: number = winline()
norm! gjmc
if lastnum > winline()
break
endif
endwhile
norm! zt
endif
finally
# COMPATIBILITY: Scroll up around "scrolloff" lines.
&scrolloff = max([1, op_so])
endtry
norm! ^
return AssertCursorForwardProgress()
enddef
def ScrollToNextPage(estate: number, op_wh: number, op_so: number): bool
if line('.') == 1 || line('w$') >= line('$')
return AssertCursorForwardProgress()
endif
try
set scrolloff=0
# Advance mark "c"[ursor] along with the cursor.
norm! Lmc
if foldclosed('.') < 0 &&
(strdisplaywidth(getline('.')) + &l:fdc * winheight(1)) >= estate
# Make for an exit for a screenful long line.
norm! j^
return AssertCursorForwardProgress()
else
# Place the cursor on the actually last visible line.
while winline() < op_wh
const lastnum: number = winline()
norm! gjmc
if lastnum > winline()
break
endif
endwhile
endif
finally
# COMPATIBILITY: Scroll up/down around "scrolloff" lines.
&scrolloff = max([1, op_so])
endtry
norm! zt
const marknum: number = line("'c")
# Eschew &smoothscroll since line("`c") is not supported.
# Remember that "w0" can point to the first line of a _closed_ fold
# whereas the last line of a _closed_ fold can be marked.
if line('w0') > marknum
while line('w0') > marknum
exe "norm! \<C-y>"
endwhile
if line('w0') != marknum
exe "norm! \<C-e>H"
endif
# Handle non-wrapped lines.
elseif line('w0') < marknum
while line('w0') < marknum
exe "norm! \<C-e>"
endwhile
if line('w0') != marknum
exe "norm! \<C-y>H"
endif
endif
norm! ^
return AssertCursorForwardProgress()
enddef
END
let MAX_FAILED_COUNT = 5
lockvar MAX_FAILED_COUNT XTESTSCRIPT
let ok_count = 0 let ok_count = 0
let failed_tests = [] let failed_tests = []
let skipped_count = 0 let skipped_count = 0
let MAX_FAILED_COUNT = 5 let last_test_status = 'invalid'
" Create a map of setup configuration filenames with their basenames as keys. " Create a map of setup configuration filenames with their basenames as keys.
let setup = glob('input/setup/*.vim', 1, 1) let setup = glob('input/setup/*.vim', 1, 1)
\ ->reduce({d, f -> extend(d, {fnamemodify(f, ':t:r'): f})}, {}) \ ->reduce({d, f -> extend(d, {fnamemodify(f, ':t:r'): f})}, {})
@ -256,8 +416,6 @@ func RunTest()
for fname in fnames for fname in fnames
let root = fnamemodify(fname, ':r') let root = fnamemodify(fname, ':r')
let fname = dirpath .. fname let fname = dirpath .. fname
let filetype = substitute(root, '\([^_.]*\)[_.].*', '\1', '')
let failed_root = 'failed/' .. root
" Execute the test if the "done" file does not exist or when the input file " Execute the test if the "done" file does not exist or when the input file
" is newer. " is newer.
@ -265,166 +423,14 @@ func RunTest()
let out_time = getftime('done/' .. root) let out_time = getftime('done/' .. root)
if out_time < 0 || in_time > out_time if out_time < 0 || in_time > out_time
call ch_log('running tests for: ' .. fname) call ch_log('running tests for: ' .. fname)
let filetype = substitute(root, '\([^_.]*\)[_.].*', '\1', '')
let failed_root = 'failed/' .. root
for dumpname in glob(failed_root .. '_\d*\.dump', 1, 1) for dumpname in glob(failed_root .. '_\d*\.dump', 1, 1)
call delete(dumpname) call delete(dumpname)
endfor endfor
call delete('done/' .. root) call delete('done/' .. root)
call writefile(XTESTSCRIPT, 'Xtestscript')
let lines =<< trim END
" Track the cursor progress through a syntax test file so that any
" degenerate input can be reported. Each file will have its own cursor.
let s:cursor = 1
" extra info for shell variables
func ShellInfo()
let msg = ''
for [key, val] in items(b:)
if key =~ '^is_'
let msg ..= key .. ': ' .. val .. ', '
endif
endfor
if msg != ''
echomsg msg
endif
endfunc
au! SwapExists * call HandleSwapExists()
func HandleSwapExists()
" Ignore finding a swap file for the test input, the user might be
" editing it and that's OK.
if expand('<afile>') =~ 'input[/\\].*\..*'
let v:swapchoice = 'e'
endif
endfunc
func LoadFiletype(type)
for file in glob("ftplugin/" .. a:type .. "*.vim", 1, 1)
exe "source " .. file
endfor
redraw!
endfunc
func SetUpVim()
call cursor(1, 1)
" Defend against rogue VIM_TEST_SETUP commands.
for _ in range(20)
let lnum = search('\C\<VIM_TEST_SETUP\>', 'eW', 20)
if lnum < 1
break
endif
exe substitute(getline(lnum), '\C.*\<VIM_TEST_SETUP\>', '', '')
endfor
call cursor(1, 1)
" BEGIN [runtime/defaults.vim]
" Also, disable italic highlighting to avoid issues on some terminals.
set display=lastline ruler scrolloff=5 t_ZH= t_ZR=
syntax on
" END [runtime/defaults.vim]
redraw!
endfunc
def s:AssertCursorForwardProgress(): bool
const curnum: number = line('.')
if curnum <= cursor
# Use "actions/upload-artifact@v4" of ci.yml for delivery.
writefile([printf('No cursor progress: %d <= %d (%s). Please file an issue.',
curnum,
cursor,
bufname('%'))],
'failed/00-FIXME',
'a')
bwipeout!
endif
cursor = curnum
return true
enddef
def ScrollToSecondPage(estate: number, op_wh: number, op_so: number): bool
if line('.') != 1 || line('w$') >= line('$')
return AssertCursorForwardProgress()
endif
try
set scrolloff=0
# Advance mark "c"[ursor] along with the cursor.
norm! Lmc
if foldclosed('.') < 0 &&
(strdisplaywidth(getline('.')) + &l:fdc * winheight(1)) >= estate
# Make for an exit for a screenful long line.
norm! j^
return AssertCursorForwardProgress()
else
# Place the cursor on the actually last visible line.
while winline() < op_wh
const lastnum: number = winline()
norm! gjmc
if lastnum > winline()
break
endif
endwhile
norm! zt
endif
finally
# COMPATIBILITY: Scroll up around "scrolloff" lines.
&scrolloff = max([1, op_so])
endtry
norm! ^
return AssertCursorForwardProgress()
enddef
def ScrollToNextPage(estate: number, op_wh: number, op_so: number): bool
if line('.') == 1 || line('w$') >= line('$')
return AssertCursorForwardProgress()
endif
try
set scrolloff=0
# Advance mark "c"[ursor] along with the cursor.
norm! Lmc
if foldclosed('.') < 0 &&
(strdisplaywidth(getline('.')) + &l:fdc * winheight(1)) >= estate
# Make for an exit for a screenful long line.
norm! j^
return AssertCursorForwardProgress()
else
# Place the cursor on the actually last visible line.
while winline() < op_wh
const lastnum: number = winline()
norm! gjmc
if lastnum > winline()
break
endif
endwhile
endif
finally
# COMPATIBILITY: Scroll up/down around "scrolloff" lines.
&scrolloff = max([1, op_so])
endtry
norm! zt
const marknum: number = line("'c")
# Eschew &smoothscroll since line("`c") is not supported.
# Remember that "w0" can point to the first line of a _closed_ fold
# whereas the last line of a _closed_ fold can be marked.
if line('w0') > marknum
while line('w0') > marknum
exe "norm! \<C-y>"
endwhile
if line('w0') != marknum
exe "norm! \<C-e>H"
endif
# Handle non-wrapped lines.
elseif line('w0') < marknum
while line('w0') < marknum
exe "norm! \<C-e>"
endwhile
if line('w0') != marknum
exe "norm! \<C-y>H"
endif
endif
norm! ^
return AssertCursorForwardProgress()
enddef
END
call writefile(lines, 'Xtestscript')
" close all but the last window " close all but the last window
while winnr('$') > 1 while winnr('$') > 1
@ -500,6 +506,11 @@ func RunTest()
" Add any assert errors to s:messages. " Add any assert errors to s:messages.
if len(v:errors) > 0 if len(v:errors) > 0
call extend(s:messages, v:errors) call extend(s:messages, v:errors)
if last_test_status == 'passed'
call EraseLineAndReturnCarriage('Test ' .. root .. ' OK')
else
echon "\n"
endif
" Echo the errors here, in case the script aborts or the "messages" file " Echo the errors here, in case the script aborts or the "messages" file
" is not displayed later. " is not displayed later.
echomsg v:errors echomsg v:errors
@ -508,13 +519,21 @@ func RunTest()
endif endif
if fail == 0 if fail == 0
call Message("Test " .. root .. " OK") if last_test_status == 'skipped'
echon "\n"
endif
let last_test_status = 'passed'
let msg = "Test " .. root .. " OK"
call Message(msg)
call EraseLineAndReturnCarriage(msg)
call writefile(['OK'], 'done/' .. root) call writefile(['OK'], 'done/' .. root)
let ok_count += 1 let ok_count += 1
else else
let last_test_status = 'failed'
call Message("Test " .. root .. " FAILED") call Message("Test " .. root .. " FAILED")
echon "\n"
call delete('done/' .. root) call delete('done/' .. root)
@ -525,12 +544,14 @@ func RunTest()
endif endif
endif endif
else else
if last_test_status == 'passed'
call EraseLineAndReturnCarriage('Test ' .. root .. ' OK')
endif
let last_test_status = 'skipped'
call Message("Test " .. root .. " skipped") call Message("Test " .. root .. " skipped")
let skipped_count += 1 let skipped_count += 1
endif endif
call EraseLineAndReturnCarriage(root)
" Append messages to the file "testdir/messages" " Append messages to the file "testdir/messages"
call AppendMessages('Input file ' .. fname .. ':') call AppendMessages('Input file ' .. fname .. ':')
@ -539,7 +560,10 @@ func RunTest()
endif endif
endfor endfor
call EraseLineAndReturnCarriage('') if last_test_status == 'passed' && exists('root')
call EraseLineAndReturnCarriage('Test ' .. root .. ' OK')
endif
call Message(s:test_run_message) call Message(s:test_run_message)
call Message('OK: ' .. ok_count) call Message('OK: ' .. ok_count)
call Message('FAILED: ' .. len(failed_tests) .. ': ' .. string(failed_tests)) call Message('FAILED: ' .. len(failed_tests) .. ': ' .. string(failed_tests))