|
|
|
|
@@ -1,6 +1,6 @@
|
|
|
|
|
" Vim script language tests
|
|
|
|
|
" Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com>
|
|
|
|
|
" Last Change: 2015 Sep 25
|
|
|
|
|
" Last Change: 2015 Dec 30
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test environment {{{1
|
|
|
|
|
@@ -608,355 +608,8 @@ com! -nargs=1 -bar ExecAsScript call ExecAsScript(<f-args>)
|
|
|
|
|
" END_OF_TEST_ENVIRONMENT - do not change or remove this line.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 1: :endwhile in function {{{1
|
|
|
|
|
"
|
|
|
|
|
" Detect if a broken loop is (incorrectly) reactivated by the
|
|
|
|
|
" :endwhile. Use a :return to prevent an endless loop, and make
|
|
|
|
|
" this test first to get a meaningful result on an error before other
|
|
|
|
|
" tests will hang.
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
XpathINIT
|
|
|
|
|
|
|
|
|
|
function! F()
|
|
|
|
|
Xpath 1 " X: 1
|
|
|
|
|
let first = 1
|
|
|
|
|
XloopINIT 2 8
|
|
|
|
|
while 1
|
|
|
|
|
Xloop 1 " X: 2 + 0 * 16
|
|
|
|
|
if first
|
|
|
|
|
Xloop 2 " X: 4 + 0 * 32
|
|
|
|
|
let first = 0
|
|
|
|
|
XloopNEXT
|
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
Xloop 4 " X: 0 + 0 * 64
|
|
|
|
|
return
|
|
|
|
|
endif
|
|
|
|
|
endwhile
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
call F()
|
|
|
|
|
Xpath 128 " X: 128
|
|
|
|
|
|
|
|
|
|
function! G()
|
|
|
|
|
Xpath 256 " X: 256 + 0 * 2048
|
|
|
|
|
let first = 1
|
|
|
|
|
XloopINIT 512 8
|
|
|
|
|
while 1
|
|
|
|
|
Xloop 1 " X: 512 + 0 * 4096
|
|
|
|
|
if first
|
|
|
|
|
Xloop 2 " X: 1024 + 0 * 8192
|
|
|
|
|
let first = 0
|
|
|
|
|
XloopNEXT
|
|
|
|
|
break
|
|
|
|
|
else
|
|
|
|
|
Xloop 4 " X: 0 + 0 * 16384
|
|
|
|
|
return
|
|
|
|
|
endif
|
|
|
|
|
if 1 " unmatched :if
|
|
|
|
|
endwhile
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
call G()
|
|
|
|
|
Xpath 32768 " X: 32768
|
|
|
|
|
|
|
|
|
|
Xcheck 34695
|
|
|
|
|
|
|
|
|
|
" Leave F and G for execution as scripts in the next test.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 2: :endwhile in script {{{1
|
|
|
|
|
"
|
|
|
|
|
" Detect if a broken loop is (incorrectly) reactivated by the
|
|
|
|
|
" :endwhile. Use a :finish to prevent an endless loop, and place
|
|
|
|
|
" this test before others that might hang to get a meaningful result
|
|
|
|
|
" on an error.
|
|
|
|
|
"
|
|
|
|
|
" This test executes the bodies of the functions F and G from the
|
|
|
|
|
" previous test as script files (:return replaced by :finish).
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
XpathINIT
|
|
|
|
|
|
|
|
|
|
ExecAsScript F " X: 1 + 2 + 4
|
|
|
|
|
Xpath 128 " X: 128
|
|
|
|
|
|
|
|
|
|
ExecAsScript G " X: 256 + 512 + 1024
|
|
|
|
|
Xpath 32768 " X: 32768
|
|
|
|
|
|
|
|
|
|
unlet first
|
|
|
|
|
delfunction F
|
|
|
|
|
delfunction G
|
|
|
|
|
|
|
|
|
|
Xcheck 34695
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 3: :if, :elseif, :while, :continue, :break {{{1
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
XpathINIT
|
|
|
|
|
if 1
|
|
|
|
|
Xpath 1 " X: 1
|
|
|
|
|
let loops = 3
|
|
|
|
|
XloopINIT 2 512
|
|
|
|
|
while loops > -1 " main loop: loops == 3, 2, 1 (which breaks)
|
|
|
|
|
if loops <= 0
|
|
|
|
|
let break_err = 1
|
|
|
|
|
let loops = -1
|
|
|
|
|
else " 3: 2: 1:
|
|
|
|
|
Xloop 1 " X: 2 + 2*512 + 2*512*512
|
|
|
|
|
endif
|
|
|
|
|
if (loops == 2)
|
|
|
|
|
while loops == 2 " dummy loop
|
|
|
|
|
Xloop 2 " X: 4*512
|
|
|
|
|
let loops = loops - 1
|
|
|
|
|
continue " stop dummy loop
|
|
|
|
|
Xloop 4 " X: 0
|
|
|
|
|
endwhile
|
|
|
|
|
XloopNEXT
|
|
|
|
|
continue " continue main loop
|
|
|
|
|
Xloop 8 " X: 0
|
|
|
|
|
elseif (loops == 1)
|
|
|
|
|
let p = 1
|
|
|
|
|
while p " dummy loop
|
|
|
|
|
Xloop 16 " X: 32*512*512
|
|
|
|
|
let p = 0
|
|
|
|
|
break " break dummy loop
|
|
|
|
|
Xloop 32 " X: 0
|
|
|
|
|
endwhile
|
|
|
|
|
Xloop 64 " X: 128*512*512
|
|
|
|
|
unlet p
|
|
|
|
|
break " break main loop
|
|
|
|
|
Xloop 128 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
if (loops > 0)
|
|
|
|
|
Xloop 256 " X: 512
|
|
|
|
|
endif
|
|
|
|
|
while loops == 3 " dummy loop
|
|
|
|
|
let loops = loops - 1
|
|
|
|
|
endwhile " end dummy loop
|
|
|
|
|
XloopNEXT
|
|
|
|
|
endwhile " end main loop
|
|
|
|
|
Xpath 268435456 " X: 1024*512*512
|
|
|
|
|
else
|
|
|
|
|
Xpath 536870912 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
Xpath 1073741824 " X: 4096*512*512
|
|
|
|
|
if exists("break_err")
|
|
|
|
|
" The Xpath command does not accept 2^31 (negative); add explicitly:
|
|
|
|
|
let Xpath = Xpath + 2147483648 " X: 0
|
|
|
|
|
unlet break_err
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
unlet loops
|
|
|
|
|
|
|
|
|
|
Xcheck 1384648195
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 4: :return {{{1
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
XpathINIT
|
|
|
|
|
|
|
|
|
|
function! F()
|
|
|
|
|
if 1
|
|
|
|
|
Xpath 1 " X: 1
|
|
|
|
|
let loops = 3
|
|
|
|
|
XloopINIT 2 16
|
|
|
|
|
while loops > 0 " 3: 2: 1:
|
|
|
|
|
Xloop 1 " X: 2 + 2*16 + 0*16*16
|
|
|
|
|
if (loops == 2)
|
|
|
|
|
Xloop 2 " X: 4*16
|
|
|
|
|
return
|
|
|
|
|
Xloop 4 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
Xloop 8 " X: 16
|
|
|
|
|
let loops = loops - 1
|
|
|
|
|
XloopNEXT
|
|
|
|
|
endwhile
|
|
|
|
|
Xpath 8192 " X: 0
|
|
|
|
|
else
|
|
|
|
|
Xpath 16384 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
call F()
|
|
|
|
|
Xpath 32768 " X: 8*16*16*16
|
|
|
|
|
|
|
|
|
|
Xcheck 32883
|
|
|
|
|
|
|
|
|
|
" Leave F for execution as a script in the next test.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 5: :finish {{{1
|
|
|
|
|
"
|
|
|
|
|
" This test executes the body of the function F from the previous test
|
|
|
|
|
" as a script file (:return replaced by :finish).
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
XpathINIT
|
|
|
|
|
|
|
|
|
|
ExecAsScript F " X: 1 + 2 + 2*16 + 4*16 + 16
|
|
|
|
|
Xpath 32768 " X: 32768
|
|
|
|
|
|
|
|
|
|
unlet loops
|
|
|
|
|
delfunction F
|
|
|
|
|
|
|
|
|
|
Xcheck 32883
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 6: Defining functions in :while loops {{{1
|
|
|
|
|
"
|
|
|
|
|
" Functions can be defined inside other functions. An inner function
|
|
|
|
|
" gets defined when the outer function is executed. Functions may
|
|
|
|
|
" also be defined inside while loops. Expressions in braces for
|
|
|
|
|
" defining the function name are allowed.
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
XpathINIT
|
|
|
|
|
|
|
|
|
|
if ExtraVim()
|
|
|
|
|
|
|
|
|
|
" The command CALL collects the argument of all its invocations in "calls"
|
|
|
|
|
" when used from a function (that is, when the global variable "calls" needs
|
|
|
|
|
" the "g:" prefix). This is to check that the function code is skipped when
|
|
|
|
|
" the function is defined. For inner functions, do so only if the outer
|
|
|
|
|
" function is not being executed.
|
|
|
|
|
"
|
|
|
|
|
let calls = ""
|
|
|
|
|
com! -nargs=1 CALL
|
|
|
|
|
\ if !exists("calls") && !exists("outer") |
|
|
|
|
|
\ let g:calls = g:calls . <args> |
|
|
|
|
|
\ endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XloopINIT! 1 16
|
|
|
|
|
|
|
|
|
|
let i = 0
|
|
|
|
|
while i < 3
|
|
|
|
|
|
|
|
|
|
XloopNEXT
|
|
|
|
|
let i = i + 1
|
|
|
|
|
|
|
|
|
|
if i == 1
|
|
|
|
|
Xloop 1 " X: 1
|
|
|
|
|
function! F1(arg)
|
|
|
|
|
CALL a:arg
|
|
|
|
|
let outer = 1
|
|
|
|
|
|
|
|
|
|
XloopINIT! 4096 4
|
|
|
|
|
let j = 0
|
|
|
|
|
while j < 1
|
|
|
|
|
XloopNEXT
|
|
|
|
|
Xloop 1 " X: 4096
|
|
|
|
|
let j = j + 1
|
|
|
|
|
function! G1(arg)
|
|
|
|
|
CALL a:arg
|
|
|
|
|
endfunction
|
|
|
|
|
Xloop 2 " X: 8192
|
|
|
|
|
endwhile
|
|
|
|
|
endfunction
|
|
|
|
|
Xloop 2 " X: 2
|
|
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
Xloop 4 " X: 4 * (16 + 256)
|
|
|
|
|
function! F{i}(i, arg)
|
|
|
|
|
CALL a:arg
|
|
|
|
|
let outer = 1
|
|
|
|
|
|
|
|
|
|
XloopINIT! 16384 4
|
|
|
|
|
if a:i == 3
|
|
|
|
|
XloopNEXT
|
|
|
|
|
XloopNEXT
|
|
|
|
|
XloopNEXT
|
|
|
|
|
endif
|
|
|
|
|
let k = 0
|
|
|
|
|
while k < 3
|
|
|
|
|
XloopNEXT
|
|
|
|
|
Xloop 1 " X: 16384*(1+4+16+64+256+1024)
|
|
|
|
|
let k = k + 1
|
|
|
|
|
function! G{a:i}{k}(arg)
|
|
|
|
|
CALL a:arg
|
|
|
|
|
endfunction
|
|
|
|
|
Xloop 2 " X: 32768*(1+4+16+64+256+1024)
|
|
|
|
|
endwhile
|
|
|
|
|
endfunction
|
|
|
|
|
Xloop 8 " X: 8 * (16 + 256)
|
|
|
|
|
|
|
|
|
|
endwhile
|
|
|
|
|
|
|
|
|
|
if exists("*G1")
|
|
|
|
|
Xpath 67108864 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
if exists("*F1")
|
|
|
|
|
call F1("F1")
|
|
|
|
|
if exists("*G1")
|
|
|
|
|
call G1("G1")
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
if exists("G21") || exists("G21") || exists("G21")
|
|
|
|
|
Xpath 134217728 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
if exists("*F2")
|
|
|
|
|
call F2(2, "F2")
|
|
|
|
|
if exists("*G21")
|
|
|
|
|
call G21("G21")
|
|
|
|
|
endif
|
|
|
|
|
if exists("*G22")
|
|
|
|
|
call G22("G22")
|
|
|
|
|
endif
|
|
|
|
|
if exists("*G23")
|
|
|
|
|
call G23("G23")
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
if exists("G31") || exists("G31") || exists("G31")
|
|
|
|
|
Xpath 268435456 " X: 0
|
|
|
|
|
endif
|
|
|
|
|
if exists("*F3")
|
|
|
|
|
call F3(3, "F3")
|
|
|
|
|
if exists("*G31")
|
|
|
|
|
call G31("G31")
|
|
|
|
|
endif
|
|
|
|
|
if exists("*G32")
|
|
|
|
|
call G32("G32")
|
|
|
|
|
endif
|
|
|
|
|
if exists("*G33")
|
|
|
|
|
call G33("G33")
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
Xpath 536870912 " X: 536870912
|
|
|
|
|
|
|
|
|
|
if calls != "F1G1F2G21G22G23F3G31G32G33"
|
|
|
|
|
Xpath 1073741824 " X: 0
|
|
|
|
|
Xout "calls is" calls
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
delfunction F1
|
|
|
|
|
delfunction G1
|
|
|
|
|
delfunction F2
|
|
|
|
|
delfunction G21
|
|
|
|
|
delfunction G22
|
|
|
|
|
delfunction G23
|
|
|
|
|
delfunction G31
|
|
|
|
|
delfunction G32
|
|
|
|
|
delfunction G33
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
Xcheck 603978947
|
|
|
|
|
|
|
|
|
|
" Tests 1 to 6 were moved to test_viml.vim
|
|
|
|
|
let Xtest = 7
|
|
|
|
|
|
|
|
|
|
"-------------------------------------------------------------------------------
|
|
|
|
|
" Test 7: Continuing on errors outside functions {{{1
|
|
|
|
|
|