123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- " 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
- 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!
|