summaryrefslogtreecommitdiffstats
path: root/runtime/syntax/testdir/runtest.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/syntax/testdir/runtest.vim')
-rw-r--r--runtime/syntax/testdir/runtest.vim247
1 files changed, 247 insertions, 0 deletions
diff --git a/runtime/syntax/testdir/runtest.vim b/runtime/syntax/testdir/runtest.vim
new file mode 100644
index 0000000..80f1eff
--- /dev/null
+++ b/runtime/syntax/testdir/runtest.vim
@@ -0,0 +1,247 @@
+" Runs all the syntax tests for which there is no "done/name" file.
+"
+" Current directory must be runtime/syntax.
+
+" Only do this with the +eval feature
+if 1
+
+" Remember the directory where we started. Will change to "testdir" below.
+let syntaxDir = getcwd()
+
+let s:messagesFname = fnameescape(syntaxDir .. '/testdir/messages')
+
+let s:messages = []
+
+" Add one message to the list of messages
+func Message(msg)
+ echomsg a:msg
+ call add(s:messages, a:msg)
+endfunc
+
+" Report a fatal message and exit
+func Fatal(msg)
+ echoerr a:msg
+ call AppendMessages(a:msg)
+ qall!
+endfunc
+
+" Append s:messages to the messages file and make it empty.
+func AppendMessages(header)
+ exe 'split ' .. s:messagesFname
+ call append(line('$'), '')
+ call append(line('$'), a:header)
+ call append(line('$'), s:messages)
+ let s:messages = []
+ wq
+endfunc
+
+" Relevant messages are written to the "messages" file.
+" If the file already exists it is appended to.
+exe 'split ' .. s:messagesFname
+call append(line('$'), repeat('=-', 70))
+call append(line('$'), '')
+let s:test_run_message = 'Test run on ' .. strftime("%Y %b %d %H:%M:%S")
+call append(line('$'), s:test_run_message)
+wq
+
+if syntaxDir !~ '[/\\]runtime[/\\]syntax\>'
+ call Fatal('Current directory must be "runtime/syntax"')
+endif
+if !isdirectory('testdir')
+ call Fatal('"testdir" directory not found')
+endif
+
+" Use the script for source code screendump testing. It sources other scripts,
+" therefore we must "cd" there.
+cd ../../src/testdir
+source screendump.vim
+exe 'cd ' .. fnameescape(syntaxDir)
+
+" For these tests we need to be able to run terminal Vim with 256 colors. On
+" MS-Windows the console only has 16 colors and the GUI can't run in a
+" terminal.
+if !CanRunVimInTerminal()
+ call Fatal('Cannot make screendumps, aborting')
+endif
+
+cd testdir
+if !isdirectory('done')
+ call mkdir('done')
+endif
+
+set nocp
+set nowrapscan
+set report=9999
+set modeline
+set debug=throw
+set nomore
+
+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
+
+let ok_count = 0
+let failed_tests = []
+let skipped_count = 0
+let MAX_FAILED_COUNT = 5
+for fname in glob('input/*.*', 1, 1)
+ if fname =~ '\~$'
+ " backup file, skip
+ continue
+ endif
+
+ let linecount = readfile(fname)->len()
+ let root = fnamemodify(fname, ':t:r')
+ 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
+ " is newer.
+ let in_time = getftime(fname)
+ let out_time = getftime('done/' .. root)
+ if out_time < 0 || in_time > out_time
+ call ch_log('running tests for: ' .. fname)
+
+ for dumpname in glob(failed_root .. '_\d*\.dump', 1, 1)
+ call delete(dumpname)
+ endfor
+ call delete('done/' .. root)
+
+ let lines =<< trim END
+ syntax on
+
+ " 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
+ END
+ call writefile(lines, 'Xtestscript')
+
+ " close all but the last window
+ while winnr('$') > 1
+ close
+ endwhile
+
+ " Redraw to make sure that messages are cleared and there is enough space
+ " for the terminal window.
+ redraw
+
+ let buf = RunVimInTerminal('-S Xtestscript', {})
+ " edit the file only after catching the SwapExists event
+ call term_sendkeys(buf, ":edit " .. fname .. "\<CR>")
+
+ if filetype == 'sh'
+ call term_sendkeys(buf, ":call ShellInfo()\<CR>")
+ endif
+
+ " Screendump at the start of the file: failed/root_00.dump
+ let root_00 = root .. '_00'
+ call ch_log('First screendump for ' .. fname .. ': failed/' .. root_00 .. '.dump')
+ let fail = VerifyScreenDump(buf, root_00, {})
+
+ " clear the shell info if there are not enough lines to cause a scroll
+ if filetype == 'sh' && linecount <= 19
+ call term_sendkeys(buf, ":redraw\<CR>")
+ endif
+
+ " Make a Screendump every 18 lines of the file: failed/root_NN.dump
+ let topline = 1
+ let nr = 1
+ while linecount - topline > 20
+ let topline += 18
+ call term_sendkeys(buf, printf("%dGzt", topline))
+ let root_next = root .. printf('_%02d', nr)
+ call ch_log('Next screendump for ' .. fname .. ': failed/' .. root_next .. '.dump')
+ let fail += VerifyScreenDump(buf, root_next, {})
+ let nr += 1
+ endwhile
+
+ " 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)
+ call delete('Xtestscript')
+
+ " redraw here to avoid the following messages to get mixed up with screen
+ " output.
+ redraw
+
+ " Add any assert errors to s:messages.
+ if len(v:errors) > 0
+ call extend(s:messages, v:errors)
+ " Echo the errors here, in case the script aborts or the "messages" file
+ " is not displayed later.
+ echomsg v:errors
+ let v:errors = []
+ let fail += 1
+ endif
+
+ if fail == 0
+ call Message("Test " .. root .. " OK")
+
+ call writefile(['OK'], 'done/' .. root)
+
+ let ok_count += 1
+ else
+ call Message("Test " .. root .. " FAILED")
+
+ call delete('done/' .. root)
+
+ eval failed_tests->add(root)
+ if len(failed_tests) > MAX_FAILED_COUNT
+ call Message('')
+ call Message('Too many errors, aborting')
+ endif
+ endif
+ else
+ call Message("Test " .. root .. " skipped")
+ let skipped_count += 1
+ endif
+
+ " Append messages to the file "testdir/messages"
+ call AppendMessages('Input file ' .. fname .. ':')
+
+ if len(failed_tests) > MAX_FAILED_COUNT
+ break
+ endif
+endfor
+
+call Message(s:test_run_message)
+call Message('OK: ' .. ok_count)
+call Message('FAILED: ' .. len(failed_tests) .. ': ' .. string(failed_tests))
+call Message('skipped: ' .. skipped_count)
+call AppendMessages('== SUMMARY ==')
+
+" Matching "if 1" at the start.
+endif
+
+if len(failed_tests) > 0
+ " have make report an error
+ cquit
+endif
+qall!