diff options
Diffstat (limited to 'src/nvim/testdir/test_vimscript.vim')
| -rw-r--r-- | src/nvim/testdir/test_vimscript.vim | 7284 |
1 files changed, 0 insertions, 7284 deletions
diff --git a/src/nvim/testdir/test_vimscript.vim b/src/nvim/testdir/test_vimscript.vim deleted file mode 100644 index b0c4baf7c2..0000000000 --- a/src/nvim/testdir/test_vimscript.vim +++ /dev/null @@ -1,7284 +0,0 @@ -" Test various aspects of the Vim script language. -" Most of this was formerly in test49.vim (developed by Servatius Brandt -" <Servatius.Brandt@fujitsu-siemens.com>) - -source check.vim -source shared.vim -source script_util.vim - -"------------------------------------------------------------------------------- -" Test environment {{{1 -"------------------------------------------------------------------------------- - -" Append a message to the "messages" file -func Xout(text) - split messages - $put =a:text - wq -endfunc - -com! -nargs=1 Xout call Xout(<args>) - -" Create a new instance of Vim and run the commands in 'test' and then 'verify' -" The commands in 'test' are expected to store the test results in the Xtest.out -" file. If the test passes successfully, then Xtest.out should be empty. -func RunInNewVim(test, verify) - let init =<< trim END - set cpo-=C " support line-continuation in sourced script - source script_util.vim - XpathINIT - XloopINIT - END - let cleanup =<< trim END - call writefile(v:errors, 'Xtest.out') - qall - END - call writefile(init, 'Xtest.vim') - call writefile(a:test, 'Xtest.vim', 'a') - call writefile(a:verify, 'Xverify.vim') - call writefile(cleanup, 'Xverify.vim', 'a') - call RunVim([], [], "-S Xtest.vim -S Xverify.vim") - call assert_equal([], readfile('Xtest.out')) - call delete('Xtest.out') - call delete('Xtest.vim') - call delete('Xverify.vim') -endfunc - -"------------------------------------------------------------------------------- -" 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. -"------------------------------------------------------------------------------- - -func T1_F() - Xpath 'a' - let first = 1 - while 1 - Xpath 'b' - if first - Xpath 'c' - let first = 0 - break - else - Xpath 'd' - return - endif - endwhile -endfunc - -func T1_G() - Xpath 'h' - let first = 1 - while 1 - Xpath 'i' - if first - Xpath 'j' - let first = 0 - break - else - Xpath 'k' - return - endif - if 1 " unmatched :if - endwhile -endfunc - -func Test_endwhile_function() - XpathINIT - call T1_F() - Xpath 'F' - - try - call T1_G() - catch - " Catch missing :endif - call assert_true(v:exception =~ 'E171') - Xpath 'x' - endtry - Xpath 'G' - - call assert_equal('abcFhijxG', g:Xpath) -endfunc - -"------------------------------------------------------------------------------- -" 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 T1_F and T1_G from -" the previous test as script files (:return replaced by :finish). -"------------------------------------------------------------------------------- - -func Test_endwhile_script() - XpathINIT - ExecAsScript T1_F - Xpath 'F' - call DeleteTheScript() - - try - ExecAsScript T1_G - catch - " Catch missing :endif - call assert_true(v:exception =~ 'E171') - Xpath 'x' - endtry - Xpath 'G' - call DeleteTheScript() - - call assert_equal('abcFhijxG', g:Xpath) -endfunc - -"------------------------------------------------------------------------------- -" Test 3: :if, :elseif, :while, :continue, :break {{{1 -"------------------------------------------------------------------------------- - -func Test_if_while() - XpathINIT - if 1 - Xpath 'a' - let loops = 3 - while loops > -1 " main loop: loops == 3, 2, 1 (which breaks) - if loops <= 0 - let break_err = 1 - let loops = -1 - else - Xpath 'b' . loops - endif - if (loops == 2) - while loops == 2 " dummy loop - Xpath 'c' . loops - let loops = loops - 1 - continue " stop dummy loop - Xpath 'd' . loops - endwhile - continue " continue main loop - Xpath 'e' . loops - elseif (loops == 1) - let p = 1 - while p " dummy loop - Xpath 'f' . loops - let p = 0 - break " break dummy loop - Xpath 'g' . loops - endwhile - Xpath 'h' . loops - unlet p - break " break main loop - Xpath 'i' . loops - endif - if (loops > 0) - Xpath 'j' . loops - endif - while loops == 3 " dummy loop - let loops = loops - 1 - endwhile " end dummy loop - endwhile " end main loop - Xpath 'k' - else - Xpath 'l' - endif - Xpath 'm' - if exists("break_err") - Xpath 'm' - unlet break_err - endif - - unlet loops - - call assert_equal('ab3j3b2c2b1f1h1km', g:Xpath) -endfunc - -" Check double quote after skipped "elseif" does not give error E15 -func Test_skipped_elseif() - if "foo" ==? "foo" - let result = "first" - elseif "foo" ==? "foo" - let result = "second" - endif - call assert_equal('first', result) -endfunc - -"------------------------------------------------------------------------------- -" Test 4: :return {{{1 -"------------------------------------------------------------------------------- - -func T4_F() - if 1 - Xpath 'a' - let loops = 3 - while loops > 0 " 3: 2: 1: - Xpath 'b' . loops - if (loops == 2) - Xpath 'c' . loops - return - Xpath 'd' . loops - endif - Xpath 'e' . loops - let loops = loops - 1 - endwhile - Xpath 'f' - else - Xpath 'g' - endif -endfunc - -func Test_return() - XpathINIT - call T4_F() - Xpath '4' - - call assert_equal('ab3e3b2c24', g:Xpath) -endfunc - - -"------------------------------------------------------------------------------- -" Test 5: :finish {{{1 -" -" This test executes the body of the function T4_F from the previous -" test as a script file (:return replaced by :finish). -"------------------------------------------------------------------------------- - -func Test_finish() - XpathINIT - ExecAsScript T4_F - Xpath '5' - call DeleteTheScript() - - call assert_equal('ab3e3b2c25', g:Xpath) -endfunc - - - -"------------------------------------------------------------------------------- -" 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. -" -" The functions are defined when sourcing the script, only the -" resulting path is checked in the test function. -"------------------------------------------------------------------------------- - -XpathINIT - -" 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 - -let i = 0 -while i < 3 - let i = i + 1 - if i == 1 - Xpath 'a' - function! F1(arg) - CALL a:arg - let outer = 1 - - let j = 0 - while j < 1 - Xpath 'b' - let j = j + 1 - function! G1(arg) - CALL a:arg - endfunction - Xpath 'c' - endwhile - endfunction - Xpath 'd' - - continue - endif - - Xpath 'e' . i - function! F{i}(i, arg) - CALL a:arg - let outer = 1 - - if a:i == 3 - Xpath 'f' - endif - let k = 0 - while k < 3 - Xpath 'g' . k - let k = k + 1 - function! G{a:i}{k}(arg) - CALL a:arg - endfunction - Xpath 'h' . k - endwhile - endfunction - Xpath 'i' - -endwhile - -if exists("*G1") - Xpath 'j' -endif -if exists("*F1") - call F1("F1") - if exists("*G1") - call G1("G1") - endif -endif - -if exists("G21") || exists("G22") || exists("G23") - Xpath 'k' -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("G32") || exists("G33") - Xpath 'l' -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 'm' - -let g:test6_result = g:Xpath -let g:test6_calls = calls - -unlet calls -delfunction F1 -delfunction G1 -delfunction F2 -delfunction G21 -delfunction G22 -delfunction G23 -delfunction G31 -delfunction G32 -delfunction G33 - -func Test_defining_functions() - call assert_equal('ade2ie3ibcg0h1g1h2g2h3fg0h1g1h2g2h3m', g:test6_result) - call assert_equal('F1G1F2G21G22G23F3G31G32G33', g:test6_calls) -endfunc - -"------------------------------------------------------------------------------- -" Test 7: Continuing on errors outside functions {{{1 -" -" On an error outside a function, the script processing continues -" at the line following the outermost :endif or :endwhile. When not -" inside an :if or :while, the script processing continues at the next -" line. -"------------------------------------------------------------------------------- - -XpathINIT - -if 1 - Xpath 'a' - while 1 - Xpath 'b' - asdf - Xpath 'c' - break - endwhile | Xpath 'd' - Xpath 'e' -endif | Xpath 'f' -Xpath 'g' - -while 1 - Xpath 'h' - if 1 - Xpath 'i' - asdf - Xpath 'j' - endif | Xpath 'k' - Xpath 'l' - break -endwhile | Xpath 'm' -Xpath 'n' - -asdf -Xpath 'o' - -asdf | Xpath 'p' -Xpath 'q' - -let g:test7_result = g:Xpath - -func Test_error_in_script() - call assert_equal('abghinoq', g:test7_result) -endfunc - -"------------------------------------------------------------------------------- -" Test 8: Aborting and continuing on errors inside functions {{{1 -" -" On an error inside a function without the "abort" attribute, the -" script processing continues at the next line (unless the error was -" in a :return command). On an error inside a function with the -" "abort" attribute, the function is aborted and the script processing -" continues after the function call; the value -1 is returned then. -"------------------------------------------------------------------------------- - -XpathINIT - -func T8_F() - if 1 - Xpath 'a' - while 1 - Xpath 'b' - asdf - Xpath 'c' - asdf | Xpath 'd' - Xpath 'e' - break - endwhile - Xpath 'f' - endif | Xpath 'g' - Xpath 'h' - - while 1 - Xpath 'i' - if 1 - Xpath 'j' - asdf - Xpath 'k' - asdf | Xpath 'l' - Xpath 'm' - endif - Xpath 'n' - break - endwhile | Xpath 'o' - Xpath 'p' - - return novar " returns (default return value 0) - Xpath 'q' - return 1 " not reached -endfunc - -func T8_G() abort - if 1 - Xpath 'r' - while 1 - Xpath 's' - asdf " returns -1 - Xpath 't' - break - endwhile - Xpath 'v' - endif | Xpath 'w' - Xpath 'x' - - return -4 " not reached -endfunc - -func T8_H() abort - while 1 - Xpath 'A' - if 1 - Xpath 'B' - asdf " returns -1 - Xpath 'C' - endif - Xpath 'D' - break - endwhile | Xpath 'E' - Xpath 'F' - - return -4 " not reached -endfunc - -" Aborted functions (T8_G and T8_H) return -1. -let g:test8_sum = (T8_F() + 1) - 4 * T8_G() - 8 * T8_H() -Xpath 'X' -let g:test8_result = g:Xpath - -func Test_error_in_function() - call assert_equal(13, g:test8_sum) - call assert_equal('abcefghijkmnoprsABX', g:test8_result) - - delfunction T8_F - delfunction T8_G - delfunction T8_H -endfunc - - -"------------------------------------------------------------------------------- -" Test 9: Continuing after aborted functions {{{1 -" -" When a function with the "abort" attribute is aborted due to an -" error, the next function back in the call hierarchy without an -" "abort" attribute continues; the value -1 is returned then. -"------------------------------------------------------------------------------- - -XpathINIT - -func F() abort - Xpath 'a' - let result = G() " not aborted - Xpath 'b' - if result != 2 - Xpath 'c' - endif - return 1 -endfunc - -func G() " no abort attribute - Xpath 'd' - if H() != -1 " aborted - Xpath 'e' - endif - Xpath 'f' - return 2 -endfunc - -func H() abort - Xpath 'g' - call I() " aborted - Xpath 'h' - return 4 -endfunc - -func I() abort - Xpath 'i' - asdf " error - Xpath 'j' - return 8 -endfunc - -if F() != 1 - Xpath 'k' -endif - -let g:test9_result = g:Xpath - -delfunction F -delfunction G -delfunction H -delfunction I - -func Test_func_abort() - call assert_equal('adgifb', g:test9_result) -endfunc - - -"------------------------------------------------------------------------------- -" Test 10: :if, :elseif, :while argument parsing {{{1 -" -" A '"' or '|' in an argument expression must not be mixed up with -" a comment or a next command after a bar. Parsing errors should -" be recognized. -"------------------------------------------------------------------------------- - -XpathINIT - -func MSG(enr, emsg) - let english = v:lang == "C" || v:lang =~ '^[Ee]n' - if a:enr == "" - Xout "TODO: Add message number for:" a:emsg - let v:errmsg = ":" . v:errmsg - endif - let match = 1 - if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg) - let match = 0 - if v:errmsg == "" - Xout "Message missing." - else - let v:errmsg = v:errmsg->escape('"') - Xout "Unexpected message:" v:errmsg - endif - endif - return match -endfunc - -if 1 || strlen("\"") | Xpath 'a' - Xpath 'b' -endif -Xpath 'c' - -if 0 -elseif 1 || strlen("\"") | Xpath 'd' - Xpath 'e' -endif -Xpath 'f' - -while 1 || strlen("\"") | Xpath 'g' - Xpath 'h' - break -endwhile -Xpath 'i' - -let v:errmsg = "" -if 1 ||| strlen("\"") | Xpath 'j' - Xpath 'k' -endif -Xpath 'l' -if !MSG('E15', "Invalid expression") - Xpath 'm' -endif - -let v:errmsg = "" -if 0 -elseif 1 ||| strlen("\"") | Xpath 'n' - Xpath 'o' -endif -Xpath 'p' -if !MSG('E15', "Invalid expression") - Xpath 'q' -endif - -let v:errmsg = "" -while 1 ||| strlen("\"") | Xpath 'r' - Xpath 's' - break -endwhile -Xpath 't' -if !MSG('E15', "Invalid expression") - Xpath 'u' -endif - -let g:test10_result = g:Xpath -delfunction MSG - -func Test_expr_parsing() - call assert_equal('abcdefghilpt', g:test10_result) -endfunc - - -"------------------------------------------------------------------------------- -" Test 11: :if, :elseif, :while argument evaluation after abort {{{1 -" -" When code is skipped over due to an error, the boolean argument to -" an :if, :elseif, or :while must not be evaluated. -"------------------------------------------------------------------------------- - -XpathINIT - -let calls = 0 - -func P(num) - let g:calls = g:calls + a:num " side effect on call - return 0 -endfunc - -if 1 - Xpath 'a' - asdf " error - Xpath 'b' - if P(1) " should not be called - Xpath 'c' - elseif !P(2) " should not be called - Xpath 'd' - else - Xpath 'e' - endif - Xpath 'f' - while P(4) " should not be called - Xpath 'g' - endwhile - Xpath 'h' -endif -Xpath 'x' - -let g:test11_calls = calls -let g:test11_result = g:Xpath - -unlet calls -delfunction P - -func Test_arg_abort() - call assert_equal(0, g:test11_calls) - call assert_equal('ax', g:test11_result) -endfunc - - -"------------------------------------------------------------------------------- -" Test 12: Expressions in braces in skipped code {{{1 -" -" In code skipped over due to an error or inactive conditional, -" an expression in braces as part of a variable or function name -" should not be evaluated. -"------------------------------------------------------------------------------- - -XpathINIT - -func NULL() - Xpath 'a' - return 0 -endfunc - -func ZERO() - Xpath 'b' - return 0 -endfunc - -func! F0() - Xpath 'c' -endfunc - -func! F1(arg) - Xpath 'e' -endfunc - -let V0 = 1 - -Xpath 'f' -echo 0 ? F{NULL() + V{ZERO()}}() : 1 - -Xpath 'g' -if 0 - Xpath 'h' - call F{NULL() + V{ZERO()}}() -endif - -Xpath 'i' -if 1 - asdf " error - Xpath 'j' - call F1(F{NULL() + V{ZERO()}}()) -endif - -Xpath 'k' -if 1 - asdf " error - Xpath 'l' - call F{NULL() + V{ZERO()}}() -endif - -let g:test12_result = g:Xpath - -func Test_braces_skipped() - call assert_equal('fgik', g:test12_result) -endfunc - - -"------------------------------------------------------------------------------- -" Test 13: Failure in argument evaluation for :while {{{1 -" -" A failure in the expression evaluation for the condition of a :while -" causes the whole :while loop until the matching :endwhile being -" ignored. Continuation is at the next following line. -"------------------------------------------------------------------------------- - -XpathINIT - -Xpath 'a' -while asdf - Xpath 'b' - while 1 - Xpath 'c' - break - endwhile - Xpath 'd' - break -endwhile -Xpath 'e' - -while asdf | Xpath 'f' | endwhile | Xpath 'g' -Xpath 'h' -let g:test13_result = g:Xpath - -func Test_while_fail() - call assert_equal('aeh', g:test13_result) -endfunc - - -"------------------------------------------------------------------------------- -" Test 14: Failure in argument evaluation for :if {{{1 -" -" A failure in the expression evaluation for the condition of an :if -" does not cause the corresponding :else or :endif being matched to -" a previous :if/:elseif. Neither of both branches of the failed :if -" are executed. -"------------------------------------------------------------------------------- - -XpathINIT - -function! F() - Xpath 'a' - let x = 0 - if x " false - Xpath 'b' - elseif !x " always true - Xpath 'c' - let x = 1 - if g:boolvar " possibly undefined - Xpath 'd' - else - Xpath 'e' - endif - Xpath 'f' - elseif x " never executed - Xpath 'g' - endif - Xpath 'h' -endfunction - -let boolvar = 1 -call F() -Xpath '-' - -unlet boolvar -call F() -let g:test14_result = g:Xpath - -delfunction F - -func Test_if_fail() - call assert_equal('acdfh-acfh', g:test14_result) -endfunc - - -"------------------------------------------------------------------------------- -" Test 15: Failure in argument evaluation for :if (bar) {{{1 -" -" Like previous test, except that the failing :if ... | ... | :endif -" is in a single line. -"------------------------------------------------------------------------------- - -XpathINIT - -function! F() - Xpath 'a' - let x = 0 - if x " false - Xpath 'b' - elseif !x " always true - Xpath 'c' - let x = 1 - if g:boolvar | Xpath 'd' | else | Xpath 'e' | endif - Xpath 'f' - elseif x " never executed - Xpath 'g' - endif - Xpath 'h' -endfunction - -let boolvar = 1 -call F() -Xpath '-' - -unlet boolvar -call F() -let g:test15_result = g:Xpath - -delfunction F - -func Test_if_bar_fail() - call assert_equal('acdfh-acfh', g:test15_result) -endfunc - -"------------------------------------------------------------------------------- -" Test 16: Double :else or :elseif after :else {{{1 -" -" Multiple :elses or an :elseif after an :else are forbidden. -"------------------------------------------------------------------------------- - -func T16_F() abort - if 0 - Xpath 'a' - else - Xpath 'b' - else " aborts function - Xpath 'c' - endif - Xpath 'd' -endfunc - -func T16_G() abort - if 0 - Xpath 'a' - else - Xpath 'b' - elseif 1 " aborts function - Xpath 'c' - else - Xpath 'd' - endif - Xpath 'e' -endfunc - -func T16_H() abort - if 0 - Xpath 'a' - elseif 0 - Xpath 'b' - else - Xpath 'c' - else " aborts function - Xpath 'd' - endif - Xpath 'e' -endfunc - -func T16_I() abort - if 0 - Xpath 'a' - elseif 0 - Xpath 'b' - else - Xpath 'c' - elseif 1 " aborts function - Xpath 'd' - else - Xpath 'e' - endif - Xpath 'f' -endfunc - -func Test_Multi_Else() - XpathINIT - try - call T16_F() - catch /E583:/ - Xpath 'e' - endtry - call assert_equal('be', g:Xpath) - - XpathINIT - try - call T16_G() - catch /E584:/ - Xpath 'f' - endtry - call assert_equal('bf', g:Xpath) - - XpathINIT - try - call T16_H() - catch /E583:/ - Xpath 'f' - endtry - call assert_equal('cf', g:Xpath) - - XpathINIT - try - call T16_I() - catch /E584:/ - Xpath 'g' - endtry - call assert_equal('cg', g:Xpath) -endfunc - -"------------------------------------------------------------------------------- -" Test 17: Nesting of unmatched :if or :endif inside a :while {{{1 -" -" The :while/:endwhile takes precedence in nesting over an unclosed -" :if or an unopened :endif. -"------------------------------------------------------------------------------- - -" While loops inside a function are continued on error. -func T17_F() - let loops = 3 - while loops > 0 - let loops -= 1 - Xpath 'a' . loops - if (loops == 1) - Xpath 'b' . loops - continue - elseif (loops == 0) - Xpath 'c' . loops - break - elseif 1 - Xpath 'd' . loops - " endif missing! - endwhile " :endwhile after :if 1 - Xpath 'e' -endfunc - -func T17_G() - let loops = 2 - while loops > 0 - let loops -= 1 - Xpath 'a' . loops - if 0 - Xpath 'b' . loops - " endif missing - endwhile " :endwhile after :if 0 -endfunc - -func T17_H() - let loops = 2 - while loops > 0 - let loops -= 1 - Xpath 'a' . loops - " if missing! - endif " :endif without :if in while - Xpath 'b' . loops - endwhile -endfunc - -" Error continuation outside a function is at the outermost :endwhile or :endif. -XpathINIT -let v:errmsg = '' -let loops = 2 -while loops > 0 - let loops -= 1 - Xpath 'a' . loops - if 0 - Xpath 'b' . loops - " endif missing! Following :endwhile fails. -endwhile | Xpath 'c' -Xpath 'd' -call assert_match('E171:', v:errmsg) -call assert_equal('a1d', g:Xpath) - -func Test_unmatched_if_in_while() - XpathINIT - call assert_fails('call T17_F()', 'E171:') - call assert_equal('a2d2a1b1a0c0e', g:Xpath) - - XpathINIT - call assert_fails('call T17_G()', 'E171:') - call assert_equal('a1a0', g:Xpath) - - XpathINIT - call assert_fails('call T17_H()', 'E580:') - call assert_equal('a1b1a0b0', g:Xpath) -endfunc - -"------------------------------------------------------------------------------- -" Test 18: Interrupt (Ctrl-C pressed) {{{1 -" -" On an interrupt, the script processing is terminated immediately. -"------------------------------------------------------------------------------- - -func Test_interrupt_while_if() - let test =<< trim [CODE] - try - if 1 - Xpath 'a' - while 1 - Xpath 'b' - if 1 - Xpath 'c' - call interrupt() - call assert_report('should not get here') - break - finish - endif | call assert_report('should not get here') - call assert_report('should not get here') - endwhile | call assert_report('should not get here') - call assert_report('should not get here') - endif | call assert_report('should not get here') - call assert_report('should not get here') - catch /^Vim:Interrupt$/ - Xpath 'd' - endtry | Xpath 'e' - Xpath 'f' - [CODE] - let verify =<< trim [CODE] - call assert_equal('abcdef', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_interrupt_try() - let test =<< trim [CODE] - try - try - Xpath 'a' - call interrupt() - call assert_report('should not get here') - endtry | call assert_report('should not get here') - call assert_report('should not get here') - catch /^Vim:Interrupt$/ - Xpath 'b' - endtry | Xpath 'c' - Xpath 'd' - [CODE] - let verify =<< trim [CODE] - call assert_equal('abcd', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_interrupt_func_while_if() - let test =<< trim [CODE] - func F() - if 1 - Xpath 'a' - while 1 - Xpath 'b' - if 1 - Xpath 'c' - call interrupt() - call assert_report('should not get here') - break - return - endif | call assert_report('should not get here') - call assert_report('should not get here') - endwhile | call assert_report('should not get here') - call assert_report('should not get here') - endif | call assert_report('should not get here') - call assert_report('should not get here') - endfunc - - Xpath 'd' - try - call F() | call assert_report('should not get here') - catch /^Vim:Interrupt$/ - Xpath 'e' - endtry | Xpath 'f' - Xpath 'g' - [CODE] - let verify =<< trim [CODE] - call assert_equal('dabcefg', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_interrupt_func_try() - let test =<< trim [CODE] - func G() - try - Xpath 'a' - call interrupt() - call assert_report('should not get here') - endtry | call assert_report('should not get here') - call assert_report('should not get here') - endfunc - - Xpath 'b' - try - call G() | call assert_report('should not get here') - catch /^Vim:Interrupt$/ - Xpath 'c' - endtry | Xpath 'd' - Xpath 'e' - [CODE] - let verify =<< trim [CODE] - call assert_equal('bacde', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -"------------------------------------------------------------------------------- -" Test 19: Aborting on errors inside :try/:endtry {{{1 -" -" An error in a command dynamically enclosed in a :try/:endtry region -" aborts script processing immediately. It does not matter whether -" the failing command is outside or inside a function and whether a -" function has an "abort" attribute. -"------------------------------------------------------------------------------- - -func Test_try_error_abort_1() - let test =<< trim [CODE] - func F() abort - Xpath 'a' - asdf - call assert_report('should not get here') - endfunc - - try - Xpath 'b' - call F() - call assert_report('should not get here') - endtry | call assert_report('should not get here') - call assert_report('should not get here') - [CODE] - let verify =<< trim [CODE] - call assert_equal('ba', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_try_error_abort_2() - let test =<< trim [CODE] - func G() - Xpath 'a' - asdf - call assert_report('should not get here') - endfunc - - try - Xpath 'b' - call G() - call assert_report('should not get here') - endtry | call assert_report('should not get here') - call assert_report('should not get here') - [CODE] - let verify =<< trim [CODE] - call assert_equal('ba', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_try_error_abort_3() - let test =<< trim [CODE] - try - Xpath 'a' - asdf - call assert_report('should not get here') - endtry | call assert_report('should not get here') - call assert_report('should not get here') - [CODE] - let verify =<< trim [CODE] - call assert_equal('a', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_try_error_abort_4() - let test =<< trim [CODE] - if 1 - try - Xpath 'a' - asdf - call assert_report('should not get here') - endtry | call assert_report('should not get here') - endif | call assert_report('should not get here') - call assert_report('should not get here') - [CODE] - let verify =<< trim [CODE] - call assert_equal('a', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_try_error_abort_5() - let test =<< trim [CODE] - let p = 1 - while p - let p = 0 - try - Xpath 'a' - asdf - call assert_report('should not get here') - endtry | call assert_report('should not get here') - endwhile | call assert_report('should not get here') - call assert_report('should not get here') - [CODE] - let verify =<< trim [CODE] - call assert_equal('a', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -func Test_try_error_abort_6() - let test =<< trim [CODE] - let p = 1 - Xpath 'a' - while p - Xpath 'b' - let p = 0 - try - Xpath 'c' - endwhile | call assert_report('should not get here') - call assert_report('should not get here') - [CODE] - let verify =<< trim [CODE] - call assert_equal('abc', g:Xpath) - [CODE] - call RunInNewVim(test, verify) -endfunc - -"------------------------------------------------------------------------------- -" Test 20: Aborting on errors after :try/:endtry {{{1 -" -" When an error occurs after the last active :try/:endtry region has -" been left, termination behavior is as if no :try/:endtry has been -" seen. -"--------- |