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:
parent
dd42b05f8a
commit
f63c3467b1
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user