mirror of
https://github.com/neovim/neovim.git
synced 2024-12-29 14:41:06 -07:00
Merge pull request #11057 from blueyed/test-indent
Vim patches for indent tests
This commit is contained in:
commit
afd576ee94
1
.gitignore
vendored
1
.gitignore
vendored
@ -42,6 +42,7 @@ tags
|
||||
/src/nvim/testdir/valgrind.*
|
||||
/src/nvim/testdir/.gdbinit
|
||||
/runtime/indent/testdir/*.out
|
||||
+runtime/indent/testdir/*.fail
|
||||
# Generated by src/nvim/testdir/runnvim.sh.
|
||||
/src/nvim/testdir/*.tlog
|
||||
|
||||
|
1
Makefile
1
Makefile
@ -158,6 +158,7 @@ clean:
|
||||
+test -d build && $(BUILD_CMD) -C build clean || true
|
||||
$(MAKE) -C src/nvim/testdir clean
|
||||
$(MAKE) -C runtime/doc clean
|
||||
$(MAKE) -C runtime/indent clean
|
||||
|
||||
distclean:
|
||||
rm -rf $(DEPS_BUILD_DIR) build
|
||||
|
14
runtime/indent/Makefile
Normal file
14
runtime/indent/Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
# Portable Makefile for running indent tests.
|
||||
|
||||
VIM = vim
|
||||
VIMRUNTIME = ..
|
||||
|
||||
# Run the tests that didn't run yet or failed previously.
|
||||
# If a test succeeds a testdir/*.out file will be written.
|
||||
# If a test fails a testdir/*.fail file will be written.
|
||||
test:
|
||||
VIMRUNTIME=$(VIMRUNTIME) $(VIM) --clean --not-a-term -u testdir/runtest.vim
|
||||
|
||||
|
||||
clean:
|
||||
rm -f testdir/*.fail testdir/*.out
|
@ -43,3 +43,5 @@ running. Add a test if the function exists and use ":finish", like this:
|
||||
The user may have several options set unlike you, try to write the file such
|
||||
that it works with any option settings. Also be aware of certain features not
|
||||
being compiled in.
|
||||
|
||||
To test the indent file, see testdir/README.txt.
|
||||
|
97
runtime/indent/testdir/README.txt
Normal file
97
runtime/indent/testdir/README.txt
Normal file
@ -0,0 +1,97 @@
|
||||
TESTING INDENT SCRIPTS
|
||||
|
||||
We'll use FILETYPE for the filetype name here.
|
||||
|
||||
|
||||
FORMAT OF THE FILETYPE.IN FILE
|
||||
|
||||
First of all, create a FILETYPE.in file. It should contain:
|
||||
|
||||
- A modeline setting the 'filetype' and any other option values.
|
||||
This must work like a comment for FILETYPE. E.g. for vim:
|
||||
" vim: set ft=vim sw=4 :
|
||||
|
||||
- At least one block of lines to indent, prefixed with START_INDENT and
|
||||
followed by END_INDENT. These lines must also look like a comment for your
|
||||
FILETYPE. You would normally leave out all indent, so that the effect of
|
||||
the indent command results in adding indent. Example:
|
||||
|
||||
" START_INDENT
|
||||
func Some()
|
||||
let x = 1
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
If you just want to test normal indenting with default options, you can make
|
||||
this a large number of lines. Just add all kinds of language constructs,
|
||||
nested statements, etc. with valid syntax.
|
||||
|
||||
- Optionally, add lines with INDENT_EXE after START_INDENT, followed by a Vim
|
||||
command. This will be executed before indenting the lines. Example:
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_EXE let g:vim_indent_cont = 6
|
||||
let cmd =
|
||||
\ 'some '
|
||||
\ 'string'
|
||||
" END_INDENT
|
||||
|
||||
Note that the command is not undone, you may need to reverse the effect for
|
||||
the next block of lines.
|
||||
|
||||
- Alternatively to indenting all the lines between START_INDENT and
|
||||
END_INDENT, use an INDENT_AT line, which specifies a pattern to find the
|
||||
line to indent. Example:
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_AT this-line
|
||||
func Some()
|
||||
let f = x " this-line
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
Alternatively you can use INDENT_NEXT to indent the line below the matching
|
||||
pattern. Keep in mind that quite often it will indent relative to the
|
||||
matching line:
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_NEXT next-line
|
||||
func Some()
|
||||
" next-line
|
||||
let f = x
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
Or use INDENT_PREV to indent the line above the matching pattern:
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_PREV prev-line
|
||||
func Some()
|
||||
let f = x
|
||||
" prev-line
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
It's best to keep the whole file valid for FILETYPE, so that syntax
|
||||
highlighting works normally, and any indenting that depends on the syntax
|
||||
highlighting also works.
|
||||
|
||||
|
||||
RUNNING THE TEST
|
||||
|
||||
Before running the test, create a FILETYPE.ok file. You can leave it empty at
|
||||
first.
|
||||
|
||||
Now run "make test" from the parent directory. After Vim has done the
|
||||
indenting you will see a FILETYPE.fail file. This contains the actual result
|
||||
of indenting, and it's different from the FILETYPE.ok file.
|
||||
|
||||
Check the contents of the FILETYPE.fail file. If it is perfectly OK, then
|
||||
rename it to overwrite the FILETYPE.ok file. If you now run "make test" again,
|
||||
the test will pass and create a FILETYPE.out file, which is identical to the
|
||||
FILETYPE.ok file. The FILETYPE.fail file will be deleted.
|
||||
|
||||
If you try to run "make test" again you will notice that nothing happens,
|
||||
because the FILETYPE.out file already exists. Delete it, or do "make clean",
|
||||
so that the text runs again. If you edit the FILETYPE.in file, so that it's
|
||||
newer than the FILETYPE.out file, the test will also run.
|
132
runtime/indent/testdir/runtest.vim
Normal file
132
runtime/indent/testdir/runtest.vim
Normal file
@ -0,0 +1,132 @@
|
||||
" 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
|
||||
|
||||
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 == ''
|
||||
exe 'normal =' . (end - 1) . 'G'
|
||||
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
|
||||
normal ==
|
||||
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'
|
||||
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!
|
46
runtime/indent/testdir/vim.in
Normal file
46
runtime/indent/testdir/vim.in
Normal file
@ -0,0 +1,46 @@
|
||||
" vim: set ft=vim sw=4 :
|
||||
|
||||
" START_INDENT
|
||||
|
||||
func Some()
|
||||
let x = 1
|
||||
endfunc
|
||||
|
||||
let cmd =
|
||||
\ 'some '
|
||||
\ 'string'
|
||||
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_EXE let g:vim_indent_cont = 6
|
||||
|
||||
let cmd =
|
||||
\ 'some '
|
||||
\ 'string'
|
||||
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_EXE unlet g:vim_indent_cont
|
||||
" INDENT_AT this-line
|
||||
func Some()
|
||||
let f = x " this-line
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_NEXT next-line
|
||||
func Some()
|
||||
" next-line
|
||||
let f = x
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_PREV prev-line
|
||||
func Some()
|
||||
let f = x
|
||||
" prev-line
|
||||
endfunc
|
||||
" END_INDENT
|
46
runtime/indent/testdir/vim.ok
Normal file
46
runtime/indent/testdir/vim.ok
Normal file
@ -0,0 +1,46 @@
|
||||
" vim: set ft=vim sw=4 :
|
||||
|
||||
" START_INDENT
|
||||
|
||||
func Some()
|
||||
let x = 1
|
||||
endfunc
|
||||
|
||||
let cmd =
|
||||
\ 'some '
|
||||
\ 'string'
|
||||
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_EXE let g:vim_indent_cont = 6
|
||||
|
||||
let cmd =
|
||||
\ 'some '
|
||||
\ 'string'
|
||||
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_EXE unlet g:vim_indent_cont
|
||||
" INDENT_AT this-line
|
||||
func Some()
|
||||
let f = x " this-line
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_NEXT next-line
|
||||
func Some()
|
||||
" next-line
|
||||
let f = x
|
||||
endfunc
|
||||
" END_INDENT
|
||||
|
||||
" START_INDENT
|
||||
" INDENT_PREV prev-line
|
||||
func Some()
|
||||
let f = x
|
||||
" prev-line
|
||||
endfunc
|
||||
" END_INDENT
|
Loading…
Reference in New Issue
Block a user