diff --git a/runtime/syntax/testdir/runtest.vim b/runtime/syntax/testdir/runtest.vim
new file mode 100644
index 0000000..d57341d
--- /dev/null
+++ b/runtime/syntax/testdir/runtest.vim
@@ -0,0 +1,116 @@
+" 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
+
+let cwd = getcwd()
+if cwd !~ '[/\\]runtime[/\\]syntax\>'
+  echoerr 'Current directory must be "runtime/syntax"'
+  qall
+endif
+if !isdirectory('testdir')
+  echoerr '"testdir" directory not found'
+  qall
+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(cwd)
+
+" 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()
+  echomsg 'Cannot make screendumps, aborting'
+  qall
+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 failed_count = 0
+for fname in glob('input/*.*', 1, 1)
+  if fname =~ '\~$'
+    " backup file, skip
+    continue
+  endif
+
+  let linecount = readfile(fname)->len()
+  let root = substitute(fname, 'input[/\\]\(.*\)\..*', '\1', '')
+
+  " Execute the test if the "done" file does not exist of 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
+    for dumpname in glob('failed/' .. root .. '_\d*\.dump', 1, 1)
+      call delete(dumpname)
+    endfor
+    call delete('done/' .. root)
+
+    let lines =<< trim END
+      syntax on
+    END
+    call writefile(lines, 'Xtestscript')
+    let buf = RunVimInTerminal('-S Xtestscript ' .. fname, {})
+
+    " Screendump at the start of the file: root_00.dump
+    let fail = VerifyScreenDump(buf, root .. '_00', {})
+
+    " Make a Screendump every 18 lines of the file: root_NN.dump
+    let topline = 1
+    let nr = 1
+    while linecount - topline > 20
+      let topline += 18
+      call term_sendkeys(buf, printf("%dGzt", topline))
+      let fail += VerifyScreenDump(buf, root .. printf('_%02d', nr), {})
+      let nr += 1
+    endwhile
+
+    " Screendump at the end of the file: root_99.dump
+    call term_sendkeys(buf, 'Gzb')
+    let fail += VerifyScreenDump(buf, root .. '_99', {})
+
+    call StopVimInTerminal(buf)
+    call delete('Xtestscript')
+
+    if fail == 0
+      call writefile(['OK'], 'done/' . root)
+      echo "Test " . root . " OK\n"
+    else
+      let failed_count += 1
+    endif
+  endif
+endfor
+
+" Matching "if 1" at the start.
+endif
+
+if failed_count > 0
+  " have make report an error
+  cquit
+endif
+qall!
