diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Make_mvc.mak | 12 | ||||
-rw-r--r-- | src/Makefile | 8 | ||||
-rw-r--r-- | src/testdir/Make_all.mak | 18 | ||||
-rw-r--r-- | src/testdir/Make_amiga.mak | 9 | ||||
-rw-r--r-- | src/testdir/Make_dos.mak | 13 | ||||
-rw-r--r-- | src/testdir/Make_ming.mak | 25 | ||||
-rw-r--r-- | src/testdir/Make_vms.mms | 34 | ||||
-rw-r--r-- | src/testdir/Makefile | 50 | ||||
-rw-r--r-- | src/testdir/README.txt | 21 | ||||
-rw-r--r-- | src/testdir/test49.in | 32 | ||||
-rw-r--r-- | src/testdir/test49.ok | 12 | ||||
-rw-r--r-- | src/testdir/test49.vim | 1454 | ||||
-rw-r--r-- | src/testdir/test_quickfix.vim | 23 | ||||
-rw-r--r-- | src/testdir/test_vimscript.vim | 506 | ||||
-rw-r--r-- | src/version.c | 2 |
15 files changed, 552 insertions, 1667 deletions
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 9c3deb62d3..8ac39e22b5 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -1326,14 +1326,6 @@ MAIN_TARGET = $(VIM).exe # Target to run individual tests. VIMTESTTARGET = $(VIM).exe -OLD_TEST_OUTFILES = \ - $(SCRIPTS_FIRST) \ - $(SCRIPTS_ALL) \ - $(SCRIPTS_MORE1) \ - $(SCRIPTS_MORE4) \ - $(SCRIPTS_WIN32) \ - $(SCRIPTS_GUI) - all: $(MAIN_TARGET) \ vimrun.exe \ install.exe \ @@ -1485,9 +1477,9 @@ testclean: $(MAKE) /NOLOGO -f Make_dos.mak clean cd .. -# Run individual OLD style test. +# Run test1 to bootstrap tests # These do not depend on the executable, compile it when needed. -$(OLD_TEST_OUTFILES:.out=): +$(SCRIPTS_FIRST:.out=): cd testdir - if exist $@.out del $@.out $(MAKE) /NOLOGO -f Make_dos.mak VIMPROG=..\$(VIMTESTTARGET) nolog diff --git a/src/Makefile b/src/Makefile index 55c3664727..5d73fc91a3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2259,8 +2259,6 @@ test check: unittests $(TERM_TEST) scripttests # # This will produce a lot of garbage on your screen, including a few error # messages. Don't worry about that. -# If there is a real error, there will be a difference between "testXX.out" and -# a "testXX.ok" file. # If everything is alright, the final message will be "ALL DONE". If not you # get "TEST FAILURE". # @@ -2311,9 +2309,9 @@ test_libvterm: CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"; \ fi -# Run individual OLD style test. -# These do not depend on the executable, compile it when needed. -test1 test49: +# Run test1, used to bootstrap tests. +# This does not depend on the executable, compile first it when needed. +test1: cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE) # Run individual NEW style test. diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index 0900a6cfd8..57ba651c65 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -10,24 +10,6 @@ NO_INITS = -U NONE $(NO_PLUGINS) # The first script creates small.vim. SCRIPTS_FIRST = test1.out -# Tests that run on all systems. -SCRIPTS_ALL = - -# Tests that run on most systems, but not on Amiga. -SCRIPTS_MORE1 = - -# Tests that run on most systems, but not on Amiga and DOS/Windows. -SCRIPTS_MORE2 = test49.out - -# Tests that run on most systems, but not on VMS -SCRIPTS_MORE4 = - -# Tests specifically for MS-Windows. -SCRIPTS_WIN32 = - -# Tests for the GUI. -SCRIPTS_GUI = - # Tests for Vim9 script. TEST_VIM9 = \ test_vim9_cmd \ diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak index e6e55e3b4f..efd5808429 100644 --- a/src/testdir/Make_amiga.mak +++ b/src/testdir/Make_amiga.mak @@ -9,14 +9,9 @@ default: nongui include Make_all.mak -SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE4) +.SUFFIXES: .in .out .res .vim -# Must run test1 first to create small.vim. -$(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS_RES): $(SCRIPTS_FIRST) - -.SUFFIXES: .in .out - -nongui: /tmp $(SCRIPTS_FIRST) $(SCRIPTS) +nongui: /tmp $(SCRIPTS_FIRST) csh -c echo ALL DONE clean: diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak index f97b3e9bb4..5931da25df 100644 --- a/src/testdir/Make_dos.mak +++ b/src/testdir/Make_dos.mak @@ -9,25 +9,20 @@ default: nongui !include Make_all.mak -# Omitted: -# test49 fails in various ways - -SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE1) $(SCRIPTS_MORE4) - -TEST_OUTFILES = $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_WIN32) $(SCRIPTS_GUI) +TEST_OUTFILES = $(SCRIPTS_FIRST) DOSTMP = dostmp DOSTMP_OUTFILES = $(TEST_OUTFILES:test=dostmp\test) DOSTMP_INFILES = $(DOSTMP_OUTFILES:.out=.in) .SUFFIXES: .in .out .res .vim -nongui: nolog $(SCRIPTS_FIRST) $(SCRIPTS) newtests report +nongui: nolog $(SCRIPTS_FIRST) newtests report small: nolog report -gui: nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) newtests report +gui: nolog $(SCRIPTS_FIRST) newtests report -win32: nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_WIN32) newtests report +win32: nolog $(SCRIPTS_FIRST) newtests report # Copy the input files to dostmp, changing the fileformat to dos. $(DOSTMP_INFILES): $(*B).in diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak index e1f3467492..b34ae1d2c3 100644 --- a/src/testdir/Make_ming.mak +++ b/src/testdir/Make_ming.mak @@ -28,19 +28,17 @@ default: vimall include Make_all.mak -SCRIPTS = $(SCRIPTS_ALL) $(SCRIPTS_MORE1) $(SCRIPTS_MORE4) $(SCRIPTS_WIN32) - SCRIPTS_BENCH = test_bench_regexp.res # Must run test1 first to create small.vim. -$(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS_WIN32) $(NEW_TESTS_RES): $(SCRIPTS_FIRST) +$(NEW_TESTS_RES): $(SCRIPTS_FIRST) .SUFFIXES: .in .out .res .vim -vimall: fixff $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS_WIN32) newtests +vimall: fixff $(SCRIPTS_FIRST) newtests @echo ALL DONE -nongui: fixff nolog $(SCRIPTS_FIRST) $(SCRIPTS) newtests +nongui: fixff nolog $(SCRIPTS_FIRST) newtests @echo ALL DONE benchmark: $(SCRIPTS_BENCH) @@ -48,10 +46,10 @@ benchmark: $(SCRIPTS_BENCH) small: nolog @echo ALL DONE -gui: fixff nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) newtests +gui: fixff nolog $(SCRIPTS_FIRST) newtests @echo ALL DONE -win32: fixff nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_WIN32) newtests +win32: fixff nolog $(SCRIPTS_FIRST) newtests @echo ALL DONE # TODO: find a way to avoid changing the distributed files. @@ -88,19 +86,6 @@ test1.out: test1.in -@if exist test.out $(DEL) test.out -@if exist viminfo $(DEL) viminfo -.in.out: - -@if exist $*.ok $(CP) $*.ok test.ok - $(VIMPROG) -u dos.vim $(NO_INITS) -s dotest.in $*.in - @diff test.out $*.ok - -@if exist $*.out $(DEL) $*.out - @$(MV) test.out $*.out - -@if exist Xdir1 $(DELDIR) Xdir1 - -@if exist Xfind $(DELDIR) Xfind - -@if exist XfakeHOME $(DELDIR) XfakeHOME - -@if exist X* $(DEL) X* - -@if exist test.ok $(DEL) test.ok - -@if exist viminfo $(DEL) viminfo - nolog: -@if exist test.log $(DEL) test.log -@if exist messages $(DEL) messages diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms index 59da981b37..f36ae6edd8 100644 --- a/src/testdir/Make_vms.mms +++ b/src/testdir/Make_vms.mms @@ -27,26 +27,6 @@ # Uncomment if you want tests in GUI mode. Terminal mode is default. # WANT_GUI = YES -# Comment out if you want to run Unix specific tests as well, but please -# be aware, that on OpenVMS will fail, because of cat, rm, etc commands -# and directory handling. -# WANT_UNIX = YES - -# Comment out if you have gzip on your system -# HAVE_GZIP = YES - -# Comment out if you have GNU compatible diff on your system -# HAVE_GDIFF = YES - -# Comment out if you have ICONV support -# HAVE_ICONV = YES - -# Comment out if you have LUA support -# HAVE_LUA = YES - -# Comment out if you have PYTHON support -# HAVE_PYTHON = YES - ####################################################################### # End of configuration section. # @@ -57,16 +37,12 @@ VIMPROG = <->vim.exe .SUFFIXES : .out .in -SCRIPT = test1.out test49.out test77a.out +SCRIPT = test1.out test77a.out .IFDEF WANT_GUI GUI_OPTION = -g .ENDIF -.IFDEF WANT_UNIX -SCRIPT_UNIX = test49.out -.ENDIF - .in.out : -@ !clean up before doing the test -@ if "''F$SEARCH("test.out.*")'" .NES. "" then delete/noconfirm/nolog test.out.* @@ -87,7 +63,7 @@ SCRIPT_UNIX = test49.out -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.* -@ if "''F$SEARCH("Xtest.*")'" .NES. "" then delete/noconfirm/nolog Xtest.*.* -all : clean nolog $(START_WITH) $(SCRIPT) $(SCRIPT_UNIX) nolog +all : clean nolog $(START_WITH) $(SCRIPT) nolog -@ write sys$output " " -@ write sys$output "-----------------------------------------------" -@ write sys$output " All done" @@ -111,12 +87,6 @@ nolog : -@ write sys$output "-----------------------------------------------" -@ write sys$output "MAKE_VMS.MMS options:" -@ write sys$output " WANT_GUI = ""$(WANT_GUI)"" " - -@ write sys$output " WANT_UNIX = ""$(WANT_UNIX)"" " - -@ write sys$output " HAVE_GZIP = ""$(HAVE_GZIP)"" " - -@ write sys$output " HAVE_GDIFF = ""$(HAVE_GDIFF)"" " - -@ write sys$output " HAVE_ICONV = ""$(HAVE_ICONV)"" " - -@ write sys$output " HAVE_LUA = ""$(HAVE_LUA)"" " - -@ write sys$output " HAVE_PYTHON= ""$(HAVE_PYTHON)"" " -@ write sys$output "Default vimrc file is VMS.VIM:" -@ write sys$output "-----------------------------------------------" -@ type VMS.VIM diff --git a/src/testdir/Makefile b/src/testdir/Makefile index 7f9ef04342..0d51fde3e1 100644 --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -23,28 +23,19 @@ REDIR_TEST_TO_NULL = --cmd 'au SwapExists * let v:swapchoice = "e"' > /dev/null default: nongui # The list of tests is common to all systems. -# This defines NEW_TESTS, NEW_TESTS_RES, SCRIPTS_ALL, SCRIPTS_MORE* and -# SCRIPTS_GUI. +# This defines SCRIPTS_FIRST, NEW_TESTS and NEW_TESTS_RES include Make_all.mak - -SCRIPTS = $(SCRIPTS_ALL) \ - $(SCRIPTS_MORE1) \ - $(SCRIPTS_MORE2) \ - $(SCRIPTS_MORE4) - # Explicit dependencies. -test49.out: test49.vim - test_options.res test_alot.res: opt_test.vim SCRIPTS_BENCH = test_bench_regexp.res .SUFFIXES: .in .out .res .vim -nongui: nolog $(SCRIPTS_FIRST) $(SCRIPTS) newtests report +nongui: nolog $(SCRIPTS_FIRST) newtests report -gui: nolog $(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) newtests report +gui: nolog $(SCRIPTS_FIRST) newtests report benchmark: $(SCRIPTS_BENCH) @@ -63,10 +54,10 @@ report: else echo ALL DONE; \ fi" -$(SCRIPTS_FIRST) $(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS_RES): $(VIMPROG) +$(SCRIPTS_FIRST) $(NEW_TESTS_RES): $(VIMPROG) # Must run test1 first to create small.vim. -$(SCRIPTS) $(SCRIPTS_GUI) $(NEW_TESTS_RES): $(SCRIPTS_FIRST) +$(NEW_TESTS_RES): $(SCRIPTS_FIRST) # Execute an individual new style test, e.g.: @@ -116,37 +107,6 @@ test1.out: test1.in echo; exit 1; fi" -rm -rf X* viminfo -.in.out: - -rm -rf $*.failed test.ok $(RM_ON_RUN) - cp $*.ok test.ok - # Sleep a moment to avoid that the xterm title is messed up. - # 200 msec is sufficient, but only modern sleep supports a fraction of - # a second, fall back to a second if it fails. - @-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1" - $(RUN_VIM) $*.in $(REDIR_TEST_TO_NULL) - - # For flaky tests retry one time. No tests at the moment. - #@/bin/sh -c "if test -f test.out -a $* = test61; then \ - # if diff test.out $*.ok; \ - # then echo flaky test ok first time; \ - # else rm -rf $*.failed $(RM_ON_RUN); \ - # $(RUN_VIM) $*.in; \ - # fi \ - # fi" - - # Check if the test.out file matches test.ok. - @/bin/sh -c "if test -f test.out; then \ - if diff test.out $*.ok; \ - then mv -f test.out $*.out; \ - else echo $* FAILED >>test.log; mv -f test.out $*.failed; \ - fi \ - else echo $* NO OUTPUT >>test.log; \ - fi" - @/bin/sh -c "if test -f valgrind; then\ - mv -f valgrind valgrind.$*; \ - fi" - -rm -rf X* test.ok viminfo - nolog: -rm -f test.log messages diff --git a/src/testdir/README.txt b/src/testdir/README.txt index d639146761..8bfe47582a 100644 --- a/src/testdir/README.txt +++ b/src/testdir/README.txt @@ -4,14 +4,6 @@ For testing an indent script see runtime/indent/testdir/README.txt. If it makes sense, add a new test method to an already existing file. You may want to separate it from other tests with comment lines. -The numbered tests are older, we have switched to named tests. Don't add any -more numbered tests. - -And then you can choose between a new style test, which is a Vim script, or an -old style test, which uses Normal mode commands. Use a new style test if you -can. Use an old style test when it needs to run without the +eval feature. - - TO ADD A NEW STYLE TEST: 1) Create a test_<subject>.vim file. @@ -57,16 +49,3 @@ TO ADD A SCREEN DUMP TEST: Mostly the same as writing a new style test. Additionally, see help on "terminal-dumptest". Put the reference dump in "dumps/Test_func_name.dump". - -TO ADD AN OLD STYLE TEST: - -1) Create test_<subject>.in and test_<subject>.ok files. -2) Add test_<subject>.out to SCRIPTS_ALL in Make_all.mak in alphabetical order. -3) Use make test_<subject>.out to run a single test in src/testdir/. - Use make test_<subject> to run a single test in src/. -4) Also add an entry in src/Makefile. - -Keep in mind that the files are used as if everything was typed: -- To add comments use: :" (that's an Ex command comment) -- A line break is like pressing Enter. If that happens on the last line - you'll hear a beep! diff --git a/src/testdir/test49.in b/src/testdir/test49.in deleted file mode 100644 index 79f13f6a56..0000000000 --- a/src/testdir/test49.in +++ /dev/null @@ -1,32 +0,0 @@ -This is a test of the script language. - -If after adding a new test, the test output doesn't appear properly in -test49.failed, try to add one or more "G"s at the line ending in "test.out" - -STARTTEST -:so small.vim -:se nocp nomore viminfo+=nviminfo -:lang mess C -:so test49.vim -:" Go back to this file and append the results from register r. -:buf test49.in -G"rp:/^Results/,$w! test.out -:" -:" make valgrind happy -:redir => funclist -:silent func -:redir END -:for line in split(funclist, "\n") -: let name = matchstr(line, 'function \zs[A-Z]\w*\ze(') -: if name != '' -: exe "delfunc " . name -: endif -:endfor -:for v in keys(g:) -: silent! exe "unlet " . v -:endfor -:unlet v -:qa! -ENDTEST - -Results of test49.vim: diff --git a/src/testdir/test49.ok b/src/testdir/test49.ok deleted file mode 100644 index d687f5bc77..0000000000 --- a/src/testdir/test49.ok +++ /dev/null @@ -1,12 +0,0 @@ -Results of test49.vim: -*** Test 82: OK (8454401) -*** Test 83: OK (2835) -*** Test 84: OK (934782101) -*** Test 85: OK (198689) ---- Test 86: No Crash for vimgrep on BufUnload -*** Test 86: OK (0) ---- Test 88: All tests were run with throwing exceptions on error. - The $VIMNOERRTHROW control is not configured. ---- Test 88: All tests were run with throwing exceptions on interrupt. - The $VIMNOINTTHROW control is not configured. -*** Test 88: OK (50443995) diff --git a/src/testdir/test49.vim b/src/testdir/test49.vim deleted file mode 100644 index bc3cfc83d4..0000000000 --- a/src/testdir/test49.vim +++ /dev/null @@ -1,1454 +0,0 @@ -" Vim script language tests -" Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com> -" Last Change: 2020 Jun 07 - -"------------------------------------------------------------------------------- -" Test environment {{{1 -"------------------------------------------------------------------------------- - - -" Adding new tests easily. {{{2 -" -" Writing new tests is eased considerably with the following functions and -" abbreviations (see "Commands for recording the execution path", "Automatic -" argument generation"). -" -" To get the abbreviations, execute the command -" -" :let test49_set_env = 1 | source test49.vim -" -" To get them always (from src/testdir), put a line -" -" au! BufRead test49.vim let test49_set_env = 1 | source test49.vim -" -" into the local .vimrc file in the src/testdir directory. -" -if exists("test49_set_env") && test49_set_env - - " Automatic argument generation for the test environment commands. - - function! Xsum() - let addend = substitute(getline("."), '^.*"\s*X:\s*\|^.*', '', "") - " Evaluate arithmetic expression. - if addend != "" - exec "let g:Xsum = g:Xsum + " . addend - endif - endfunction - - function! Xcheck() - let g:Xsum=0 - ?XpathINIT?,.call Xsum() - exec "norm A " - return g:Xsum - endfunction - - iab Xcheck Xcheck<Space><C-R>=Xcheck()<CR><C-O>x - - function! Xcomment(num) - let str = "" - let tabwidth = &sts ? &sts : &ts - let tabs = (48+tabwidth - a:num - virtcol(".")) / tabwidth - while tabs > 0 - let str = str . "\t" - let tabs = tabs - 1 - endwhile - let str = str . '" X:' - return str - endfunction - - function! Xloop() - let back = line(".") . "|norm" . virtcol(".") . "|" - norm 0 - let last = search('X\(loop\|path\)INIT\|Xloop\>', "bW") - exec back - let theline = getline(last) - if theline =~ 'X\(loop\|path\)INIT' - let num = 1 - else - let num = 2 * substitute(theline, '.*Xloop\s*\(\d\+\).*', '\1', "") - endif - ?X\(loop\|path\)INIT? - \s/\(XloopINIT!\=\s*\d\+\s\+\)\@<=\(\d\+\)/\=2*submatch(2)/ - exec back - exec "norm a " - return num . Xcomment(strlen(num)) - endfunction - - iab Xloop Xloop<Space><C-R>=Xloop()<CR><C-O>x - - function! Xpath(loopinit) - let back = line(".") . "|norm" . virtcol(".") . "|" - norm 0 - let last = search('XpathINIT\|Xpath\>\|XloopINIT', "bW") - exec back - let theline = getline(last) - if theline =~ 'XpathINIT' - let num = 1 - elseif theline =~ 'Xpath\>' - let num = 2 * substitute(theline, '.*Xpath\s*\(\d\+\).*', '\1', "") - else - let pattern = '.*XloopINIT!\=\s*\(\d\+\)\s*\(\d\+\).*' - let num = substitute(theline, pattern, '\1', "") - let factor = substitute(theline, pattern, '\2', "") - " The "<C-O>x" from the "Xpath" iab and the character triggering its - " expansion are in the input buffer. Save and clear typeahead so - " that it is not read away by the call to "input()" below. Restore - " afterwards. - call inputsave() - let loops = input("Number of iterations in previous loop? ") - call inputrestore() - while (loops > 0) - let num = num * factor - let loops = loops - 1 - endwhile - endif - exec "norm a " - if a:loopinit - return num . " 1" - endif - return num . Xcomment(strlen(num)) - endfunction - - iab Xpath Xpath<Space><C-R>=Xpath(0)<CR><C-O>x - iab XloopINIT XloopINIT<Space><C-R>=Xpath(1)<CR><C-O>x - - " Also useful (see ExtraVim below): - aug ExtraVim - au! - au BufEnter <sfile> syn region ExtraVim - \ start=+^if\s\+ExtraVim(.*)+ end=+^endif+ - \ transparent keepend - au BufEnter <sfile> syn match ExtraComment /^"/ - \ contained containedin=ExtraVim - au BufEnter <sfile> hi link ExtraComment vimComment - aug END - - aug Xpath - au BufEnter <sfile> syn keyword Xpath - \ XpathINIT Xpath XloopINIT Xloop XloopNEXT Xcheck Xout - au BufEnter <sfile> hi link Xpath Special - aug END - - do BufEnter <sfile> - - " Do not execute the tests when sourcing this file for getting the functions - " and abbreviations above, which are intended for easily adding new test - " cases; they are not needed for test execution. Unlet the variable - " controlling this so that an explicit ":source" command for this file will - " execute the tests. - unlet test49_set_env - finish - -endif - - -" Commands for recording the execution path. {{{2 -" -" The Xpath/Xloop commands can be used for computing the eXecution path by -" adding (different) powers of 2 from those script lines, for which the -" execution should be checked. Xloop provides different addends for each -" execution of a loop. Permitted values are 2^0 to 2^30, so that 31 execution -" points (multiply counted inside loops) can be tested. -" -" Note that the arguments of the following commands can be generated -" automatically, see below. -" -" Usage: {{{3 -" -" - Use XpathINIT at the beginning of the test. -" -" - Use Xpath to check if a line is executed. -" Argument: power of 2 (decimal). -" -" - To check multiple execution of loops use Xloop for automatically -" computing Xpath values: -" -" - Use XloopINIT before the loop. -" Two arguments: -" - the first Xpath value (power of 2) to be used (Xnext), -" - factor for computing a new Xnext value when reexecuting a loop -" (by a ":continue" or ":endwhile"); this should be 2^n where -" n is the number of Xloop commands inside the loop. -" If XloopINIT! is used, the first execution of XloopNEXT is -" a no-operation. -" -" - Use Xloop inside the loop: -" One argument: -" The argument and the Xnext value are multiplied to build the -" next Xpath value. No new Xnext value is prepared. The argument -" should be 2^(n-1) for the nth Xloop command inside the loop. -" If the loop has only one Xloop command, the argument can be -" omitted (default: 1). -" -" - Use XloopNEXT before ":continue" and ":endwhile". This computes a new -" Xnext value for the next execution of the loop by multiplying the old -" one with the factor specified in the XloopINIT command. No Argument. -" Alternatively, when XloopINIT! is used, a single XloopNEXT at the -" beginning of the loop can be used. -" -" Nested loops are not supported. -" -" - Use Xcheck at end of each test. It prints the test number, the expected -" execution path value, the test result ("OK" or "FAIL"), and, if the tests -" fails, the actual execution path. -" One argument: -" Expected Xpath/Xloop sum for the correct execution path. -" In order that this value can be computed automatically, do the -" following: For each line in the test with an Xpath and Xloop -" command, add a comment starting with "X:" and specifying an -" expression that evaluates to the value contributed by this line to -" the correct execution path. (For copying an Xpath argument of at -" least two digits into the comment, press <C-P>.) At the end of the -" test, just type "Xcheck" and press <Esc>. -" -" - In order to add additional information to the test output file, use the -" Xout command. Argument(s) like ":echo". -" -" Automatic argument generation: {{{3 -" -" The arguments of the Xpath, XloopINIT, Xloop, and Xcheck commands can be -" generated automatically, so that new tests can easily be written without -" mental arithmetic. The Xcheck argument is computed from the "X:" comments -" of the preceding Xpath and Xloop commands. See the commands and -" abbreviations at the beginning of this file. -" -" Implementation: {{{3 -" XpathINIT, Xpath, XloopINIT, Xloop, XloopNEXT, Xcheck, Xout. -" -" The variants for existing g:ExtraVimResult are needed when executing a script -" in an extra Vim process, see ExtraVim below. - -" EXTRA_VIM_START - do not change or remove this line. - -com! XpathINIT let g:Xpath = 0 - -if exists("g:ExtraVimResult") - com! -count -bar Xpath exec "!echo <count> >>" . g:ExtraVimResult -else - com! -count -bar Xpath let g:Xpath = g:Xpath + <count> -endif - -com! -count -nargs=1 -bang - \ XloopINIT let g:Xnext = <count> | - \ let g:Xfactor = <args> | - \ let g:Xskip = strlen("<bang>") - -if exists("g:ExtraVimResult") - com! -count=1 -bar Xloop exec "!echo " . (g:Xnext * <count>) . " >>" . - \ g:ExtraVimResult -else - com! -count=1 -bar Xloop let g:Xpath = g:Xpath + g:Xnext * <count> -endif - -com! XloopNEXT let g:Xnext = g:Xnext * - \ (g:Xskip ? 1 : g:Xfactor) | - \ let g:Xskip = 0 - -let @r = "" -let Xtest = 1 -com! -count Xcheck let Xresult = "*** Test " . - \ (Xtest<10?" ":Xtest<100?" ":"") . - \ Xtest . ": " . ( - \ (Xpath==<count>) ? "OK (".Xpath.")" : - \ "FAIL (".Xpath." instead of <count>)" - \ ) | - \ let @R = Xresult . "\n" | - \ echo Xresult | - \ let Xtest = Xtest + 1 - -if exists("g:ExtraVimResult") - com! -nargs=+ Xoutq exec "!echo @R:'" . - \ substitute(substitute(<q-args>, - \ "'", '&\\&&', "g"), "\n", "@NL@", "g") - \ . "' >>" . g:ExtraVimResult -else - com! -nargs=+ Xoutq let @R = "--- Test " . - \ (g:Xtest<10?" ":g:Xtest<100?" ":"") . - \ g:Xtest . ": " . substitute(<q-args>, - \ "\n", "&\t ", "g") . "\n" -endif -com! -nargs=+ Xout exec 'Xoutq' <args> - -" Switch off storing of lines for undoing changes. Speeds things up a little. -set undolevels=-1 - -" EXTRA_VIM_STOP - do not change or remove this line. - - -" ExtraVim() - Run a script file in an extra Vim process. {{{2 -" -" This is useful for testing immediate abortion of the script processing due to -" an error in a command dynamically enclosed by a :try/:tryend region or when an -" exception is thrown but not caught or when an interrupt occurs. It can also -" be used for testing :finish. -" -" An interrupt location can be specified by an "INTERRUPT" comment. A number -" telling how often this location is reached (in a loop or in several function -" calls) should be specified as argument. When missing, once per script -" invocation or function call is assumed. INTERRUPT locations are tested by -" setting a breakpoint in that line and using the ">quit" debug command when -" the breakpoint is reached. A function for which an INTERRUPT location is -" specified must be defined before calling it (or executing it as a script by -" using ExecAsScript below). -" -" This function is only called in normal modus ("g:ExtraVimResult" undefined). -" -" Tests to be executed as an extra script should be written as follows: -" -" column 1 column 1 -" | | -" v v -" -" XpathINIT XpathINIT -" if ExtraVim() if ExtraVim() -" ... " ... -" ... " ... -" endif endif -" Xcheck <number> Xcheck <number> -" -" Double quotes in column 1 are removed before the script is executed. -" They should be used if the test has unbalanced conditionals (:if/:endif, -" :while:/endwhile, :try/:endtry) or for a line with a syntax error. The -" extra script may use Xpath, XloopINIT, Xloop, XloopNEXT, and Xout as usual. -" -" A file name may be specified as argument. All messages of the extra Vim -" process are then redirected to the file. An existing file is overwritten. -" -let ExtraVimCount = 0 -let ExtraVimBase = expand("<sfile>") -let ExtraVimTestEnv = "" -" -function ExtraVim(...) - " Count how often this function is called. - let g:ExtraVimCount = g:ExtraVimCount + 1 - - " Disable folds to prevent that the ranges in the ":write" commands below - " are extended up to the end of a closed fold. This also speeds things up - " considerably. - set nofoldenable - - " Open a buffer for this test script and copy the test environment to - " a temporary file. Take account of parts relevant for the extra script - " execution only. - let current_buffnr = bufnr("%") - execute "view +1" g:ExtraVimBase - if g:ExtraVimCount == 1 - let g:ExtraVimTestEnv = tempname() - execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w" - \ g:ExtraVimTestEnv "|']+" - execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w >>" - \ g:ExtraVimTestEnv "|']+" - execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w >>" - \ g:ExtraVimTestEnv "|']+" - execute "/E" . "XTRA_VIM_START/+,/E" . "XTRA_VIM_STOP/-w >>" - \ g:ExtraVimTestEnv "|']+" - endif - - " Start the extra Vim script with a ":source" command for the test - " environment. The source line number where the extra script will be - " appended, needs to be passed as variable "ExtraVimBegin" to the script. - let extra_script = tempname() - exec "!echo 'source " . g:ExtraVimTestEnv . "' >" . extra_script - let extra_begin = 1 - - " Starting behind the test environment, skip over the first g:ExtraVimCount - " occurrences of "if ExtraVim()" and copy the following lines up to the - " matching "endif" to the extra Vim script. - execute "/E" . "ND_OF_TEST_ENVIRONMENT/" - exec 'norm ' . g:ExtraVimCount . '/^\s*if\s\+ExtraVim(.*)/+' . "\n" - execute ".,/^endif/-write >>" . extra_script - - " Open a buffer for the extra Vim script, delete all ^", and write the - " script if was actually modified. - execute "edit +" . (extra_begin + 1) extra_script - ,$s/^"//e - update - - " Count the INTERRUPTs and build the breakpoint and quit commands. - let breakpoints = "" - let debug_quits = "" - let in_func = 0 - exec extra_begin - while search( - \ '"\s*INTERRUPT\h\@!\|^\s*fu\%[nction]\>!\=\s*\%(\u\|s:\)\w*\s*(\|' - \ . '^\s*\\\|^\s*endf\%[unction]\>\|' - \ . '\%(^\s*fu\%[nction]!\=\s*\)\@<!\%(\u\|s:\)\w*\s*(\|' - \ . 'ExecAsScript\s\+\%(\u\|s:\)\w*', - \ "W") > 0 - let theline = getline(".") - if theline =~ '^\s*fu' - " Function definition. - let in_func = 1 - let func_start = line(".") - let func_name = substitute(theline, - \ '^\s*fu\%[nction]!\=\s*\(\%(\u\|s:\)\w*\).*', '\1', "") - elseif theline =~ '^\s*endf' - " End of function definition. - let in_func = 0 - else - let finding = substitute(theline, '.*\(\%' . col(".") . 'c.*\)', - \ '\1', "") - if finding =~ '^"\s*INTERRUPT\h\@!' - " Interrupt comment. Compose as many quit commands as - " specified. - let cnt = substitute(finding, - \ '^"\s*INTERRUPT\s*\(\d*\).*$', '\1', "") - let quits = "" - while cnt > 0 - " Use "\r" rather than "\n" to separate the quit commands. - " "\r" is not interpreted as command separator by the ":!" - " command below but works to separate commands in the - " external vim. - let quits = quits . "q\r" - let cnt = cnt - 1 - endwhile - if in_func - " Add the function breakpoint and note the number of quits - " to be used, if specified, or one for every call else. - let breakpoints = breakpoints . " -c 'breakadd func " . - \ (line(".") - func_start) . " " . - \ func_name . "'" - if quits != "" - let debug_quits = debug_quits . quits - elseif !exists("quits{func_name}") - let quits{func_name} = "q\r" - else - let quits{func_name} = quits{func_name} . "q\r" - endif - else - " Add the file breakpoint and the quits to be used for it. - let breakpoints = breakpoints . " -c 'breakadd file " . - \ line(".") . " " . extra_script . "'" - if quits == "" - let quits = "q\r" - endif - let debug_quits = debug_quits . quits - endif - else - " Add the quits to be used for calling the function or executing - " it as script file. - if finding =~ '^ExecAsScript' - " Sourcing function as script. - let finding = substitute(finding, - \ '^ExecAsScript\s\+\(\%(\u\|s:\)\w*\).*', '\1', "") - else - " Function call. - let finding = substitute(finding, - \ '^\(\%(\u\|s:\)\w*\).*', '\1', "") - endif - if exists("quits{finding}") - let debug_quits = debug_quits . quits{finding} - endif - endif - endif - endwhile - - " Close the buffer for the script and create an (empty) resultfile. - bwipeout - let resultfile = tempname() - exec "!>" . resultfile - - " Run the script in an extra vim. Switch to extra modus by passing the - " resultfile in ExtraVimResult. Redirect messages to the file specified as - " argument if any. Use ":debuggreedy" so that the commands provided on the - " pipe are consumed at the debug prompt. Use "-N" to enable command-line - " continuation ("C" in 'cpo'). Add "nviminfo" to 'viminfo' to avoid - " messing up the user's viminfo file. - let redirect = a:0 ? - \ " -c 'au VimLeave * redir END' -c 'redir\\! >" . a:1 . "'" : "" - exec "!echo '" . debug_quits . "q' | " .. v:progpath .. " -u NONE -N -Xes" . redirect . - \ " -c 'debuggreedy|set viminfo+=nviminfo'" . - \ " -c 'let ExtraVimBegin = " . extra_begin . "'" . - \ " -c 'let ExtraVimResult = \"" . resultfile . "\"'" . breakpoints . - \ " -S " . extra_script - - " Build the resulting sum for resultfile and add it to g:Xpath. Add Xout - " information provided by the extra Vim process to the test output. - let sum = 0 - exec "edit" resultfile - let line = 1 - while line <= line("$") - let theline = getline(line) - if theline =~ '^@R:' - exec 'Xout "' . substitute(substitute( - \ escape(escape(theline, '"'), '\"'), - \ '^@R:', '', ""), '@NL@', "\n", "g") . '"' - else - let sum = sum + getline(line) - endif - let line = line + 1 - endwhile - bwipeout - let g:Xpath = g:Xpath + sum - - " Delete the extra script and the resultfile. |