changeset 35557:13c45a650734

runtime(syntax-tests): Abort and report failed cursor progress Commit: https://github.com/vim/vim/commit/719714383ea6f60ac84f7b78270d111783e67606 Author: Aliaksei Budavei <0x000c70@gmail.com> Date: Fri Jul 5 21:30:02 2024 +0300 runtime(syntax-tests): Abort and report failed cursor progress Track the cursor forward progress through a syntax test file so that any degenerate input can be checked and reported. closes: #15150 Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sat, 06 Jul 2024 12:15:09 +0200
parents 85f985991681
children a18c539d869f
files runtime/syntax/testdir/runtest.vim
diffstat 1 files changed, 51 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/syntax/testdir/runtest.vim
+++ b/runtime/syntax/testdir/runtest.vim
@@ -143,6 +143,10 @@ func RunTest()
       call delete('done/' .. root)
 
       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 = ''
@@ -191,9 +195,25 @@ func RunTest()
 	  redraw!
 	endfunc
 
-	def ScrollToSecondPage(estate: number, op_wh: number, op_so: number)
+	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
+	    return AssertCursorForwardProgress()
 	  endif
 	  try
 	    set scrolloff=0
@@ -203,7 +223,7 @@ func RunTest()
 		(strdisplaywidth(getline('.')) + &l:fdc * winheight(1)) >= estate
 	      # Make for an exit for a screenful long line.
 	      norm! j^
-	      return
+	      return AssertCursorForwardProgress()
 	    else
 	      # Place the cursor on the actually last visible line.
 	      while winline() < op_wh
@@ -220,11 +240,12 @@ func RunTest()
 	    &scrolloff = max([1, op_so])
 	  endtry
 	  norm! ^
+	  return AssertCursorForwardProgress()
 	enddef
 
-	def ScrollToNextPage(estate: number, op_wh: number, op_so: number)
+	def ScrollToNextPage(estate: number, op_wh: number, op_so: number): bool
 	  if line('.') == 1 || line('w$') >= line('$')
-	    return
+	    return AssertCursorForwardProgress()
 	  endif
 	  try
 	    set scrolloff=0
@@ -234,7 +255,7 @@ func RunTest()
 		(strdisplaywidth(getline('.')) + &l:fdc * winheight(1)) >= estate
 	      # Make for an exit for a screenful long line.
 	      norm! j^
-	      return
+	      return AssertCursorForwardProgress()
 	    else
 	      # Place the cursor on the actually last visible line.
 	      while winline() < op_wh
@@ -271,6 +292,7 @@ func RunTest()
 	    endif
 	  endif
 	  norm! ^
+	  return AssertCursorForwardProgress()
 	enddef
       END
       call writefile(lines, 'Xtestscript')
@@ -319,32 +341,36 @@ func RunTest()
       let root_next = printf('%s_%02d', root, nr)
       let in_name_and_out_name = fname .. ': failed/' .. root_next .. '.dump'
 
-      if !IsWinNumOneAtEOF(in_name_and_out_name)
-	call term_sendkeys(buf, ":call ScrollToSecondPage((18 * 75 + 1), 19, 5) | redraw!\<CR>")
-	call ch_log('Next screendump for ' .. in_name_and_out_name)
-	let fail += VerifyScreenDump(buf, root_next, {})
-	let nr += 1
-	let root_next = printf('%s_%02d', root, nr)
-	let in_name_and_out_name = fname .. ': failed/' .. root_next .. '.dump'
-
-	while !IsWinNumOneAtEOF(in_name_and_out_name)
-	  call term_sendkeys(buf, ":call ScrollToNextPage((18 * 75 + 1), 19, 5) | redraw!\<CR>")
+      " Accommodate the next code block to "buf"'s contingency for self
+      " wipe-out.
+      try
+	if !IsWinNumOneAtEOF(in_name_and_out_name)
+	  call term_sendkeys(buf, ":call ScrollToSecondPage((18 * 75 + 1), 19, 5) | redraw!\<CR>")
 	  call ch_log('Next screendump for ' .. in_name_and_out_name)
 	  let fail += VerifyScreenDump(buf, root_next, {})
 	  let nr += 1
 	  let root_next = printf('%s_%02d', root, nr)
 	  let in_name_and_out_name = fname .. ': failed/' .. root_next .. '.dump'
-	endwhile
-      endif
 
-      " Screendump at the end of the file: failed/root_99.dump
-      call term_sendkeys(buf, 'Gzb')
-      let root_last = root .. '_99'
-      call ch_log('Last screendump for ' .. fname .. ': failed/' .. root_last .. '.dump')
-      let fail += VerifyScreenDump(buf, root_last, {})
+	  while !IsWinNumOneAtEOF(in_name_and_out_name)
+	    call term_sendkeys(buf, ":call ScrollToNextPage((18 * 75 + 1), 19, 5) | redraw!\<CR>")
+	    call ch_log('Next screendump for ' .. in_name_and_out_name)
+	    let fail += VerifyScreenDump(buf, root_next, {})
+	    let nr += 1
+	    let root_next = printf('%s_%02d', root, nr)
+	    let in_name_and_out_name = fname .. ': failed/' .. root_next .. '.dump'
+	  endwhile
+	endif
 
-      call StopVimInTerminal(buf)
-      call delete('Xtestscript')
+	" Screendump at the end of the file: failed/root_99.dump
+	call term_sendkeys(buf, 'Gzb')
+	let root_last = root .. '_99'
+	call ch_log('Last screendump for ' .. fname .. ': failed/' .. root_last .. '.dump')
+	let fail += VerifyScreenDump(buf, root_last, {})
+	call StopVimInTerminal(buf)
+      finally
+	call delete('Xtestscript')
+      endtry
 
       " redraw here to avoid the following messages to get mixed up with screen
       " output.