159 lines
3.6 KiB
VimL
159 lines
3.6 KiB
VimL
" Runs all the indent tests for which there is no .out file.
|
|
"
|
|
" Current directory must be runtime/indent.
|
|
|
|
" Only do this with the +eval feature.
|
|
if 1
|
|
|
|
set nocp
|
|
filetype indent on
|
|
syn on
|
|
set nowrapscan
|
|
set report=9999
|
|
set modeline
|
|
set debug=throw
|
|
set nomore
|
|
|
|
" Remember the directory where we started.
|
|
let indentDir = getcwd()
|
|
cd ../../src/testdir
|
|
|
|
" Needed for ValgrindOrAsan().
|
|
source shared.vim
|
|
exe 'cd ' .. fnameescape(indentDir)
|
|
|
|
if ValgrindOrAsan()
|
|
let g:vim_indent = {"searchpair_timeout": 1024}
|
|
let g:python_indent = {"searchpair_timeout": 1024}
|
|
endif
|
|
|
|
au! SwapExists * call HandleSwapExists()
|
|
func HandleSwapExists()
|
|
" Ignore finding a swap file for the test input and output, the user might be
|
|
" editing them and that's OK.
|
|
if expand('<afile>') =~ '.*\.\%(in\|out\|fail\|ok\)'
|
|
let v:swapchoice = 'e'
|
|
endif
|
|
endfunc
|
|
|
|
let failed_count = 0
|
|
for fname in glob('testdir/*.in', 1, 1)
|
|
let root = substitute(fname, '\.in', '', '')
|
|
|
|
" Execute the test if the .out file does not exist of when the .in file is
|
|
" newer.
|
|
let in_time = getftime(fname)
|
|
let out_time = getftime(root .. '.out')
|
|
if out_time < 0 || in_time > out_time
|
|
call delete(root .. '.fail')
|
|
call delete(root .. '.out')
|
|
|
|
set sw& ts& filetype=
|
|
exe 'split ' .. fname
|
|
|
|
let did_some = 0
|
|
let failed = 0
|
|
let end = 1
|
|
while 1
|
|
" Indent all the lines between "START_INDENT" and "END_INDENT".
|
|
exe end
|
|
let start = search('\<START_INDENT\>')
|
|
let end = search('\<END_INDENT\>')
|
|
if start <= 0 || end <= 0 || end <= start
|
|
if did_some == 0
|
|
call append(0, 'ERROR: START_INDENT and/or END_INDENT not found')
|
|
let failed = 1
|
|
endif
|
|
break
|
|
else
|
|
let did_some = 1
|
|
|
|
" Execute all commands marked with INDENT_EXE and find any pattern.
|
|
let lnum = start
|
|
let pattern = ''
|
|
let at = ''
|
|
while 1
|
|
exe lnum + 1
|
|
let lnum_exe = search('\<INDENT_EXE\>')
|
|
exe lnum + 1
|
|
let indent_at = search('\<INDENT_\%(AT\|NEXT\|PREV\)\>')
|
|
if lnum_exe > 0 && lnum_exe < end && (indent_at <= 0 || lnum_exe < indent_at)
|
|
exe substitute(getline(lnum_exe), '.*INDENT_EXE', '', '')
|
|
let lnum = lnum_exe
|
|
let start = lnum
|
|
elseif indent_at > 0 && indent_at < end
|
|
if pattern != ''
|
|
call append(indent_at, 'ERROR: duplicate pattern')
|
|
let failed = 1
|
|
break
|
|
endif
|
|
let text = getline(indent_at)
|
|
let pattern = substitute(text, '.*INDENT_\S*\s*', '', '')
|
|
let at = substitute(text, '.*INDENT_\(\S*\).*', '\1', '')
|
|
let lnum = indent_at
|
|
let start = lnum
|
|
else
|
|
break
|
|
endif
|
|
endwhile
|
|
|
|
exe start + 1
|
|
if pattern == ''
|
|
try
|
|
exe 'normal =' .. (end - 1) .. 'G'
|
|
catch
|
|
call append(indent_at, 'ERROR: ' .. v:exception)
|
|
let failed = 1
|
|
endtry
|
|
else
|
|
let lnum = search(pattern)
|
|
if lnum <= 0
|
|
call append(indent_at, 'ERROR: pattern not found: ' .. pattern)
|
|
let failed = 1
|
|
break
|
|
endif
|
|
if at == 'AT'
|
|
exe lnum
|
|
elseif at == 'NEXT'
|
|
exe lnum + 1
|
|
else
|
|
exe lnum - 1
|
|
endif
|
|
try
|
|
normal ==
|
|
catch
|
|
call append(indent_at, 'ERROR: ' .. v:exception)
|
|
let failed = 1
|
|
endtry
|
|
endif
|
|
endif
|
|
endwhile
|
|
|
|
if !failed
|
|
" Check the resulting text equals the .ok file.
|
|
if getline(1, '$') != readfile(root .. '.ok')
|
|
let failed = 1
|
|
endif
|
|
endif
|
|
|
|
if failed
|
|
let failed_count += 1
|
|
exe 'write ' .. root .. '.fail'
|
|
echoerr 'Test ' .. fname .. ' FAILED!'
|
|
else
|
|
exe 'write ' .. root .. '.out'
|
|
echo "Test " .. fname .. " OK\n"
|
|
endif
|
|
|
|
quit! " Close the indented file.
|
|
endif
|
|
endfor
|
|
|
|
" Matching "if 1" at the start.
|
|
endif
|
|
|
|
if failed_count > 0
|
|
" Have make report an error.
|
|
cquit
|
|
endif
|
|
qall!
|