aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/testdir/test_trycatch.vim
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/testdir/test_trycatch.vim')
-rw-r--r--src/nvim/testdir/test_trycatch.vim2333
1 files changed, 0 insertions, 2333 deletions
diff --git a/src/nvim/testdir/test_trycatch.vim b/src/nvim/testdir/test_trycatch.vim
deleted file mode 100644
index ef20e03126..0000000000
--- a/src/nvim/testdir/test_trycatch.vim
+++ /dev/null
@@ -1,2333 +0,0 @@
-" Test try-catch-finally exception handling
-" Most of this was formerly in test49.
-
-source check.vim
-source shared.vim
-source vim9.vim
-
-"-------------------------------------------------------------------------------
-" Test environment {{{1
-"-------------------------------------------------------------------------------
-
-com! XpathINIT let g:Xpath = ''
-com! -nargs=1 -bar Xpath let g:Xpath = g:Xpath . <args>
-
-" Test 25: Executing :finally clauses on normal control flow {{{1
-"
-" Control flow in a :try conditional should always fall through to its
-" :finally clause. A :finally clause of a :try conditional inside an
-" inactive conditional should never be executed.
-"-------------------------------------------------------------------------------
-
-func T25_F()
- let loops = 3
- while loops > 0
- Xpath 'a' . loops
- if loops >= 2
- try
- Xpath 'b' . loops
- if loops == 2
- try
- Xpath 'c' . loops
- finally
- Xpath 'd' . loops
- endtry
- endif
- finally
- Xpath 'e' . loops
- if loops == 2
- try
- Xpath 'f' . loops
- finally
- Xpath 'g' . loops
- endtry
- endif
- endtry
- endif
- Xpath 'h' . loops
- let loops = loops - 1
- endwhile
- Xpath 'i'
-endfunc
-
-func T25_G()
- if 1
- try
- Xpath 'A'
- call T25_F()
- Xpath 'B'
- finally
- Xpath 'C'
- endtry
- else
- try
- Xpath 'D'
- finally
- Xpath 'E'
- endtry
- endif
-endfunc
-
-func Test_finally()
- XpathINIT
- call T25_G()
- call assert_equal('Aa3b3e3h3a2b2c2d2e2f2g2h2a1h1iBC', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 26: Executing :finally clauses after :continue or :break {{{1
-"
-" For a :continue or :break dynamically enclosed in a :try/:endtry
-" region inside the next surrounding :while/:endwhile, if the
-" :continue/:break is before the :finally, the :finally clause is
-" executed first. If the :continue/:break is after the :finally, the
-" :finally clause is broken (like an :if/:endif region).
-"-------------------------------------------------------------------------------
-
-func T26_F()
- try
- let loops = 3
- while loops > 0
- try
- try
- if loops == 2
- Xpath 'a' . loops
- let loops = loops - 1
- continue
- elseif loops == 1
- Xpath 'b' . loops
- break
- finish
- endif
- Xpath 'c' . loops
- endtry
- finally
- Xpath 'd' . loops
- endtry
- Xpath 'e' . loops
- let loops = loops - 1
- endwhile
- Xpath 'f'
- finally
- Xpath 'g'
- let loops = 3
- while loops > 0
- try
- finally
- try
- if loops == 2
- Xpath 'h' . loops
- let loops = loops - 1
- continue
- elseif loops == 1
- Xpath 'i' . loops
- break
- finish
- endif
- endtry
- Xpath 'j' . loops
- endtry
- Xpath 'k' . loops
- let loops = loops - 1
- endwhile
- Xpath 'l'
- endtry
- Xpath 'm'
-endfunc
-
-func Test_finally_after_continue()
- XpathINIT
- call T26_F()
- call assert_equal('c3d3e3a2d1b1d1fgj3k3h2i1lm', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 32: Remembering the :return value on :finally {{{1
-"
-" If a :finally clause is executed due to a :return specifying
-" a value, this is the value visible to the caller if not overwritten
-" by a new :return in the :finally clause. A :return without a value
-" in the :finally clause overwrites with value 0.
-"-------------------------------------------------------------------------------
-
-func T32_F()
- try
- Xpath 'a'
- try
- Xpath 'b'
- return "ABCD"
- Xpath 'c'
- finally
- Xpath 'd'
- endtry
- Xpath 'e'
- finally
- Xpath 'f'
- endtry
- Xpath 'g'
-endfunc
-
-func T32_G()
- try
- Xpath 'h'
- return 8
- Xpath 'i'
- finally
- Xpath 'j'
- return 16 + strlen(T32_F())
- Xpath 'k'
- endtry
- Xpath 'l'
-endfunc
-
-func T32_H()
- try
- Xpath 'm'
- return 32
- Xpath 'n'
- finally
- Xpath 'o'
- return
- Xpath 'p'
- endtry
- Xpath 'q'
-endfunc
-
-func T32_I()
- try
- Xpath 'r'
- finally
- Xpath 's'
- return T32_G() + T32_H() + 64
- Xpath 't'
- endtry
- Xpath 'u'
-endfunc
-
-func Test_finally_return()
- XpathINIT
- call assert_equal(84, T32_I())
- call assert_equal('rshjabdfmo', g:Xpath)
-endfunc
-
-"-------------------------------------------------------------------------------
-" Test 33: :return under :execute or user command and :finally {{{1
-"
-" A :return command may be executed under an ":execute" or from
-" a user command. Executing of :finally clauses and passing through
-" the return code works also then.
-"-------------------------------------------------------------------------------
-
-func T33_F()
- try
- RETURN 10
- Xpath 'a'
- finally
- Xpath 'b'
- endtry
- Xpath 'c'
-endfunc
-
-func T33_G()
- try
- RETURN 20
- Xpath 'd'
- finally
- Xpath 'e'
- RETURN 30
- Xpath 'f'
- endtry
- Xpath 'g'
-endfunc
-
-func T33_H()
- try
- execute "try | return 40 | finally | return 50 | endtry"
- Xpath 'h'
- finally
- Xpath 'i'
- endtry
- Xpath 'j'
-endfunc
-
-func T33_I()
- try
- execute "try | return 60 | finally | return 70 | endtry"
- Xpath 'k'
- finally
- Xpath 'l'
- execute "try | return 80 | finally | return 90 | endtry"
- Xpath 'm'
- endtry
- Xpath 'n'
-endfunc
-
-func T33_J()
- try
- RETURN 100
- Xpath 'o'
- finally
- Xpath 'p'
- return
- Xpath 'q'
- endtry
- Xpath 'r'
-endfunc
-
-func T33_K()
- try
- execute "try | return 110 | finally | return 120 | endtry"
- Xpath 's'
- finally
- Xpath 't'
- execute "try | return 130 | finally | return | endtry"
- Xpath 'u'
- endtry
- Xpath 'v'
-endfunc
-
-func T33_L()
- try
- return
- Xpath 'w'
- finally
- Xpath 'x'
- RETURN 140
- Xpath 'y'
- endtry
- Xpath 'z'
-endfunc
-
-func T33_M()
- try
- return
- Xpath 'A'
- finally
- Xpath 'B'
- execute "try | return 150 | finally | return 160 | endtry"
- Xpath 'C'
- endtry
- Xpath 'D'
-endfunc
-
-func T33_N()
- RETURN 170
-endfunc
-
-func T33_O()
- execute "try | return 180 | finally | return 190 | endtry"
-endfunc
-
-func Test_finally_cmd_return()
- command! -nargs=? RETURN
- \ try | return <args> | finally | return <args> * 2 | endtry
- XpathINIT
- call assert_equal(20, T33_F())
- call assert_equal(60, T33_G())
- call assert_equal(50, T33_H())
- call assert_equal(90, T33_I())
- call assert_equal(0, T33_J())
- call assert_equal(0, T33_K())
- call assert_equal(280, T33_L())
- call assert_equal(160, T33_M())
- call assert_equal(340, T33_N())
- call assert_equal(190, T33_O())
- call assert_equal('beilptxB', g:Xpath)
- delcommand RETURN
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 41: Skipped :throw finding next command {{{1
-"
-" A :throw in an inactive conditional must not hide a following
-" command.
-"-------------------------------------------------------------------------------
-
-func T41_F()
- Xpath 'a'
- if 0 | throw 'never' | endif | Xpath 'b'
- Xpath 'c'
-endfunc
-
-func T41_G()
- Xpath 'd'
- while 0 | throw 'never' | endwhile | Xpath 'e'
- Xpath 'f'
-endfunc
-
-func T41_H()
- Xpath 'g'
- if 0 | try | throw 'never' | endtry | endif | Xpath 'h'
- Xpath 'i'
-endfunc
-
-func Test_throw_inactive_cond()
- XpathINIT
- try
- Xpath 'j'
- call T41_F()
- Xpath 'k'
- catch /.*/
- Xpath 'l'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- Xpath 'm'
- call T41_G()
- Xpath 'n'
- catch /.*/
- Xpath 'o'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- Xpath 'p'
- call T41_H()
- Xpath 'q'
- catch /.*/
- Xpath 'r'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- call assert_equal('jabckmdefnpghiq', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 42: Catching number and string exceptions {{{1
-"
-" When a number is thrown, it is converted to a string exception.
-" Numbers and strings may be caught by specifying a regular exception
-" as argument to the :catch command.
-"-------------------------------------------------------------------------------
-
-
-func T42_F()
- try
-
- try
- Xpath 'a'
- throw 4711
- Xpath 'b'
- catch /4711/
- Xpath 'c'
- endtry
-
- try
- Xpath 'd'
- throw 4711
- Xpath 'e'
- catch /^4711$/
- Xpath 'f'
- endtry
-
- try
- Xpath 'g'
- throw 4711
- Xpath 'h'
- catch /\d/
- Xpath 'i'
- endtry
-
- try
- Xpath 'j'
- throw 4711
- Xpath 'k'
- catch /^\d\+$/
- Xpath 'l'
- endtry
-
- try
- Xpath 'm'
- throw "arrgh"
- Xpath 'n'
- catch /arrgh/
- Xpath 'o'
- endtry
-
- try
- Xpath 'p'
- throw "arrgh"
- Xpath 'q'
- catch /^arrgh$/
- Xpath 'r'
- endtry
-
- try
- Xpath 's'
- throw "arrgh"
- Xpath 't'
- catch /\l/
- Xpath 'u'
- endtry
-
- try
- Xpath 'v'
- throw "arrgh"
- Xpath 'w'
- catch /^\l\+$/
- Xpath 'x'
- endtry
-
- try
- try
- Xpath 'y'
- throw "ARRGH"
- Xpath 'z'
- catch /^arrgh$/
- Xpath 'A'
- endtry
- catch /^\carrgh$/
- Xpath 'B'
- endtry
-
- try
- Xpath 'C'
- throw ""
- Xpath 'D'
- catch /^$/
- Xpath 'E'
- endtry
-
- catch /.*/
- Xpath 'F'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-endfunc
-
-func Test_catch_number_string()
- XpathINIT
- call T42_F()
- call assert_equal('acdfgijlmoprsuvxyBCE', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 43: Selecting the correct :catch clause {{{1
-"
-" When an exception is thrown and there are multiple :catch clauses,
-" the first matching one is taken.
-"-------------------------------------------------------------------------------
-
-func T43_F()
- let loops = 3
- while loops > 0
- try
- if loops == 3
- Xpath 'a' . loops
- throw "a"
- Xpath 'b' . loops
- elseif loops == 2
- Xpath 'c' . loops
- throw "ab"
- Xpath 'd' . loops
- elseif loops == 1
- Xpath 'e' . loops
- throw "abc"
- Xpath 'f' . loops
- endif
- catch /abc/
- Xpath 'g' . loops
- catch /ab/
- Xpath 'h' . loops
- catch /.*/
- Xpath 'i' . loops
- catch /a/
- Xpath 'j' . loops
- endtry
-
- let loops = loops - 1
- endwhile
- Xpath 'k'
-endfunc
-
-func Test_multi_catch()
- XpathINIT
- call T43_F()
- call assert_equal('a3i3c2h2e1g1k', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 44: Missing or empty :catch patterns {{{1
-"
-" A missing or empty :catch pattern means the same as /.*/, that is,
-" catches everything. To catch only empty exceptions, /^$/ must be
-" used. A :catch with missing, empty, or /.*/ argument also works
-" when followed by another command separated by a bar on the same
-" line. :catch patterns cannot be specified between ||. But other
-" pattern separators can be used instead of //.
-"-------------------------------------------------------------------------------
-
-func T44_F()
- try
- try
- Xpath 'a'
- throw ""
- catch /^$/
- Xpath 'b'
- endtry
-
- try
- Xpath 'c'
- throw ""
- catch /.*/
- Xpath 'd'
- endtry
-
- try
- Xpath 'e'
- throw ""
- catch //
- Xpath 'f'
- endtry
-
- try
- Xpath 'g'
- throw ""
- catch
- Xpath 'h'
- endtry
-
- try
- Xpath 'i'
- throw "oops"
- catch /^$/
- Xpath 'j'
- catch /.*/
- Xpath 'k'
- endtry
-
- try
- Xpath 'l'
- throw "arrgh"
- catch /^$/
- Xpath 'm'
- catch //
- Xpath 'n'
- endtry
-
- try
- Xpath 'o'
- throw "brrr"
- catch /^$/
- Xpath 'p'
- catch
- Xpath 'q'
- endtry
-
- try | Xpath 'r' | throw "x" | catch /.*/ | Xpath 's' | endtry
-
- try | Xpath 't' | throw "y" | catch // | Xpath 'u' | endtry
-
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- " Extra try level: if ":catch" without arguments below raises
- " a syntax error because it misinterprets the "Xpath" as a pattern,
- " let it be caught by the ":catch /.*/" below.
- try
- try | Xpath 'v' | throw "z" | catch | Xpath 'w' | :
- endtry
- endtry
- catch /.*/
- let caught = 1
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- finally
- if $VIMNOERRTHROW && v:errmsg != ""
- call assert_report(v:errmsg)
- endif
- if caught || $VIMNOERRTHROW && v:errmsg != ""
- Xpath 'x'
- endif
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
-
- let cologne = 4711
- try
- try
- Xpath 'y'
- throw "throw cologne"
- " Next lines catches all and throws 4711:
- catch |throw cologne|
- Xpath 'z'
- endtry
- catch /4711/
- Xpath 'A'
- endtry
-
- try
- Xpath 'B'
- throw "plus"
- catch +plus+
- Xpath 'C'
- endtry
-
- Xpath 'D'
- catch /.*/
- Xpath 'E'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-endfunc
-
-func Test_empty_catch()
- XpathINIT
- call T44_F()
- call assert_equal('abcdefghiklnoqrstuvwyABCD', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 45: Catching exceptions from nested :try blocks {{{1
-"
-" When :try blocks are nested, an exception is caught by the innermost
-" try conditional that has a matching :catch clause.
-"-------------------------------------------------------------------------------
-
-func T45_F()
- let loops = 3
- while loops > 0
- try
- try
- try
- try
- if loops == 3
- Xpath 'a' . loops
- throw "a"
- Xpath 'b' . loops
- elseif loops == 2
- Xpath 'c' . loops
- throw "ab"
- Xpath 'd' . loops
- elseif loops == 1
- Xpath 'e' . loops
- throw "abc"
- Xpath 'f' . loops
- endif
- catch /abc/
- Xpath 'g' . loops
- endtry
- catch /ab/
- Xpath 'h' . loops
- endtry
- catch /.*/
- Xpath 'i' . loops
- endtry
- catch /a/
- Xpath 'j' . loops
- endtry
-
- let loops = loops - 1
- endwhile
- Xpath 'k'
-endfunc
-
-func Test_catch_from_nested_try()
- XpathINIT
- call T45_F()
- call assert_equal('a3i3c2h2e1g1k', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 46: Executing :finally after a :throw in nested :try {{{1
-"
-" When an exception is thrown from within nested :try blocks, the
-" :finally clauses of the non-catching try conditionals should be
-" executed before the matching :catch of the next surrounding :try
-" gets the control. If this also has a :finally clause, it is
-" executed afterwards.
-"-------------------------------------------------------------------------------
-
-func T46_F()
- let sum = 0
-
- try
- Xpath 'a'
- try
- Xpath 'b'
- try
- Xpath 'c'
- try
- Xpath 'd'
- throw "ABC"
- Xpath 'e'
- catch /xyz/
- Xpath 'f'
- finally
- Xpath 'g'
- if sum != 0
- Xpath 'h'
- endif
- let sum = sum + 1
- endtry
- Xpath 'i'
- catch /123/
- Xpath 'j'
- catch /321/
- Xpath 'k'
- finally
- Xpath 'l'
- if sum != 1
- Xpath 'm'
- endif
- let sum = sum + 2
- endtry
- Xpath 'n'
- finally
- Xpath 'o'
- if sum != 3
- Xpath 'p'
- endif
- let sum = sum + 4
- endtry
- Xpath 'q'
- catch /ABC/
- Xpath 'r'
- if sum != 7
- Xpath 's'
- endif
- let sum = sum + 8
- finally
- Xpath 't'
- if sum != 15
- Xpath 'u'
- endif
- let sum = sum + 16
- endtry
- Xpath 'v'
- if sum != 31
- Xpath 'w'
- endif
-endfunc
-
-func Test_finally_after_throw()
- XpathINIT
- call T46_F()
- call assert_equal('abcdglortv', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 47: Throwing exceptions from a :catch clause {{{1
-"
-" When an exception is thrown from a :catch clause, it should not be
-" caught by a :catch of the same :try conditional. After executing
-" the :finally clause (if present), surrounding try conditionals
-" should be checked for a matching :catch.
-"-------------------------------------------------------------------------------
-
-func T47_F()
- Xpath 'a'
- try
- Xpath 'b'
- try
- Xpath 'c'
- try
- Xpath 'd'
- throw "x1"
- Xpath 'e'
- catch /x1/
- Xpath 'f'
- try
- Xpath 'g'
- throw "x2"
- Xpath 'h'
- catch /x1/
- Xpath 'i'
- catch /x2/
- Xpath 'j'
- try
- Xpath 'k'
- throw "x3"
- Xpath 'l'
- catch /x1/
- Xpath 'm'
- catch /x2/
- Xpath 'n'
- finally
- Xpath 'o'
- endtry
- Xpath 'p'
- catch /x3/
- Xpath 'q'
- endtry
- Xpath 'r'
- catch /x1/
- Xpath 's'
- catch /x2/
- Xpath 't'
- catch /x3/
- Xpath 'u'
- finally
- Xpath 'v'
- endtry
- Xpath 'w'
- catch /x1/
- Xpath 'x'
- catch /x2/
- Xpath 'y'
- catch /x3/
- Xpath 'z'
- endtry
- Xpath 'A'
- catch /.*/
- Xpath 'B'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
- Xpath 'C'
-endfunc
-
-func Test_throw_from_catch()
- XpathINIT
- call T47_F()
- call assert_equal('abcdfgjkovzAC', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 48: Throwing exceptions from a :finally clause {{{1
-"
-" When an exception is thrown from a :finally clause, it should not be
-" caught by a :catch of the same :try conditional. Surrounding try
-" conditionals should be checked for a matching :catch. A previously
-" thrown exception is discarded.
-"-------------------------------------------------------------------------------
-
-func T48_F()
- try
-
- try
- try
- Xpath 'a'
- catch /x1/
- Xpath 'b'
- finally
- Xpath 'c'
- throw "x1"
- Xpath 'd'
- endtry
- Xpath 'e'
- catch /x1/
- Xpath 'f'
- endtry
- Xpath 'g'
-
- try
- try
- Xpath 'h'
- throw "x2"
- Xpath 'i'
- catch /x2/
- Xpath 'j'
- catch /x3/
- Xpath 'k'
- finally
- Xpath 'l'
- throw "x3"
- Xpath 'm'
- endtry
- Xpath 'n'
- catch /x2/
- Xpath 'o'
- catch /x3/
- Xpath 'p'
- endtry
- Xpath 'q'
-
- try
- try
- try
- Xpath 'r'
- throw "x4"
- Xpath 's'
- catch /x5/
- Xpath 't'
- finally
- Xpath 'u'
- throw "x5" " discards 'x4'
- Xpath 'v'
- endtry
- Xpath 'w'
- catch /x4/
- Xpath 'x'
- finally
- Xpath 'y'
- endtry
- Xpath 'z'
- catch /x5/
- Xpath 'A'
- endtry
- Xpath 'B'
-
- catch /.*/
- Xpath 'C'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
- Xpath 'D'
-endfunc
-
-func Test_throw_from_finally()
- XpathINIT
- call T48_F()
- call assert_equal('acfghjlpqruyABD', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 51: Throwing exceptions across :execute and user commands {{{1
-"
-" A :throw command may be executed under an ":execute" or from
-" a user command.
-"-------------------------------------------------------------------------------
-
-func T51_F()
- command! -nargs=? THROW1 throw <args> | throw 1
- command! -nargs=? THROW2 try | throw <args> | endtry | throw 2
- command! -nargs=? THROW3 try | throw 3 | catch /3/ | throw <args> | endtry
- command! -nargs=? THROW4 try | throw 4 | finally | throw <args> | endtry
-
- try
-
- try
- try
- Xpath 'a'
- THROW1 "A"
- catch /A/
- Xpath 'b'
- endtry
- catch /1/
- Xpath 'c'
- endtry
-
- try
- try
- Xpath 'd'
- THROW2 "B"
- catch /B/
- Xpath 'e'
- endtry
- catch /2/
- Xpath 'f'
- endtry
-
- try
- try
- Xpath 'g'
- THROW3 "C"
- catch /C/
- Xpath 'h'
- endtry
- catch /3/
- Xpath 'i'
- endtry
-
- try
- try
- Xpath 'j'
- THROW4 "D"
- catch /D/
- Xpath 'k'
- endtry
- catch /4/
- Xpath 'l'
- endtry
-
- try
- try
- Xpath 'm'
- execute 'throw "E" | throw 5'
- catch /E/
- Xpath 'n'
- endtry
- catch /5/
- Xpath 'o'
- endtry
-
- try
- try
- Xpath 'p'
- execute 'try | throw "F" | endtry | throw 6'
- catch /F/
- Xpath 'q'
- endtry
- catch /6/
- Xpath 'r'
- endtry
-
- try
- try
- Xpath 's'
- execute'try | throw 7 | catch /7/ | throw "G" | endtry'
- catch /G/
- Xpath 't'
- endtry
- catch /7/
- Xpath 'u'
- endtry
-
- try
- try
- Xpath 'v'
- execute 'try | throw 8 | finally | throw "H" | endtry'
- catch /H/
- Xpath 'w'
- endtry
- catch /8/
- Xpath 'x'
- endtry
-
- catch /.*/
- Xpath 'y'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- Xpath 'z'
-
- delcommand THROW1
- delcommand THROW2
- delcommand THROW3
- delcommand THROW4
-endfunc
-
-func Test_throw_across_commands()
- XpathINIT
- call T51_F()
- call assert_equal('abdeghjkmnpqstvwz', g:Xpath)
-endfunc
-
-
-
-"-------------------------------------------------------------------------------
-" Test 69: :throw across :if, :elseif, :while {{{1
-"
-" On an :if, :elseif, or :while command, an exception might be thrown
-" during evaluation of the expression to test. The exception can be
-" caught by the script.
-"-------------------------------------------------------------------------------
-
-func T69_throw(x)
- Xpath 'x'
- throw a:x
-endfunc
-
-func Test_throw_ifelsewhile()
- XpathINIT
-
- try
- try
- Xpath 'a'
- if 111 == T69_throw("if") + 111
- Xpath 'b'
- else
- Xpath 'c'
- endif
- Xpath 'd'
- catch /^if$/
- Xpath 'e'
- catch /.*/
- Xpath 'f'
- call assert_report("if: " . v:exception . " in " . v:throwpoint)
- endtry
-
- try
- Xpath 'g'
- if v:false
- Xpath 'h'
- elseif 222 == T69_throw("elseif") + 222
- Xpath 'i'
- else
- Xpath 'j'
- endif
- Xpath 'k'
- catch /^elseif$/
- Xpath 'l'
- catch /.*/
- Xpath 'm'
- call assert_report("elseif: " . v:exception . " in " . v:throwpoint)
- endtry
-
- try
- Xpath 'n'
- while 333 == T69_throw("while") + 333
- Xpath 'o'
- break
- endwhile
- Xpath 'p'
- catch /^while$/
- Xpath 'q'
- catch /.*/
- Xpath 'r'
- call assert_report("while: " .. v:exception .. " in " .. v:throwpoint)
- endtry
- catch /^0$/ " default return value
- Xpath 's'
- call assert_report(v:throwpoint)
- catch /.*/
- call assert_report(v:exception .. " in " .. v:throwpoint)
- Xpath 't'
- endtry
-
- call assert_equal('axegxlnxq', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 70: :throw across :return or :throw {{{1
-"
-" On a :return or :throw command, an exception might be thrown during
-" evaluation of the expression to return or throw, respectively. The
-" exception can be caught by the script.
-"-------------------------------------------------------------------------------
-
-let T70_taken = ""
-
-func T70_throw(x, n)
- let g:T70_taken = g:T70_taken . "T" . a:n
- throw a:x
-endfunc
-
-func T70_F(x, y, n)
- let g:T70_taken = g:T70_taken . "F" . a:n
- return a:x + T70_throw(a:y, a:n)
-endfunc
-
-func T70_G(x, y, n)
- let g:T70_taken = g:T70_taken . "G" . a:n
- throw a:x . T70_throw(a:y, a:n)
- return a:x
-endfunc
-
-func Test_throwreturn()
- XpathINIT
-
- try
- try
- Xpath 'a'
- call T70_F(4711, "return", 1)
- Xpath 'b'
- catch /^return$/
- Xpath 'c'
- catch /.*/
- Xpath 'd'
- call assert_report("return: " .. v:exception .. " in " .. v:throwpoint)
- endtry
-
- try
- Xpath 'e'
- let var = T70_F(4712, "return-var", 2)
- Xpath 'f'
- catch /^return-var$/
- Xpath 'g'
- catch /.*/
- Xpath 'h'
- call assert_report("return-var: " . v:exception . " in " . v:throwpoint)
- finally
- unlet! var
- endtry
-
- try
- Xpath 'i'
- throw "except1" . T70_throw("throw1", 3)
- Xpath 'j'
- catch /^except1/
- Xpath 'k'
- catch /^throw1$/
- Xpath 'l'
- catch /.*/
- Xpath 'm'
- call assert_report("throw1: " .. v:exception .. " in " .. v:throwpoint)
- endtry
-
- try
- Xpath 'n'
- call T70_G("except2", "throw2", 4)
- Xpath 'o'
- catch /^except2/
- Xpath 'p'
- catch /^throw2$/
- Xpath 'q'
- catch /.*/
- Xpath 'r'
- call assert_report("throw2: " .. v:exception .. " in " .. v:throwpoint)
- endtry
-
- try
- Xpath 's'
- let var = T70_G("except3", "throw3", 5)
- Xpath 't'
- catch /^except3/
- Xpath 'u'
- catch /^throw3$/
- Xpath 'v'
- catch /.*/
- Xpath 'w'
- call assert_report("throw3: " .. v:exception .. " in " .. v:throwpoint)
- finally
- unlet! var
- endtry
-
- call assert_equal('F1T1F2T2T3G4T4G5T5', g:T70_taken)
- Xpath 'x'
- catch /^0$/ " default return value
- Xpath 'y'
- call assert_report(v:throwpoint)
- catch /.*/
- Xpath 'z'
- call assert_report('Caught' .. v:exception .. ' in ' .. v:throwpoint)
- endtry
-
- call assert_equal('acegilnqsvx', g:Xpath)
-endfunc
-
-"-------------------------------------------------------------------------------
-" Test 71: :throw across :echo variants and :execute {{{1
-"
-" On an :echo, :echon, :echomsg, :echoerr, or :execute command, an
-" exception might be thrown during evaluation of the arguments to
-" be displayed or executed as a command, respectively. Any following
-" arguments are not evaluated, then. The exception can be caught by
-" the script.
-"-------------------------------------------------------------------------------
-
-let T71_taken = ""
-
-func T71_throw(x, n)
- let g:T71_taken = g:T71_taken . "T" . a:n
- throw a:x
-endfunc
-
-func T71_F(n)
- let g:T71_taken = g:T71_taken . "F" . a:n
- return "F" . a:n
-endfunc
-
-func Test_throw_echo()
- XpathINIT
-
- try
- try
- Xpath 'a'
- echo 'echo ' . T71_throw("echo-except", 1) . T71_F(1)
- Xpath 'b'
- catch /^echo-except$/
- Xpath 'c'
- catch /.*/
- Xpath 'd'
- call assert_report("echo: " .. v:exception .. " in " .. v:throwpoint)
- endtry
-
- try
- Xpath 'e'
- echon "echon " . T71_throw("echon-except", 2) . T71_F(2)
- Xpath 'f'
- catch /^echon-except$/
- Xpath 'g'
- catch /.*/
- Xpath 'h'
- call assert_report('echon: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- Xpath 'i'
- echomsg "echomsg " . T71_throw("echomsg-except", 3) . T71_F(3)
- Xpath 'j'
- catch /^echomsg-except$/
- Xpath 'k'
- catch /.*/
- Xpath 'l'
- call assert_report('echomsg: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- Xpath 'm'
- echoerr "echoerr " . T71_throw("echoerr-except", 4) . T71_F(4)
- Xpath 'n'
- catch /^echoerr-except$/
- Xpath 'o'
- catch /Vim/
- Xpath 'p'
- catch /echoerr/
- Xpath 'q'
- catch /.*/
- Xpath 'r'
- call assert_report('echoerr: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- Xpath 's'
- execute "echo 'execute " . T71_throw("execute-except", 5) . T71_F(5) "'"
- Xpath 't'
- catch /^execute-except$/
- Xpath 'u'
- catch /.*/
- Xpath 'v'
- call assert_report('execute: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- call assert_equal('T1T2T3T4T5', g:T71_taken)
- Xpath 'w'
- catch /^0$/ " default return value
- Xpath 'x'
- call assert_report(v:throwpoint)
- catch /.*/
- Xpath 'y'
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- call assert_equal('acegikmosuw', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 72: :throw across :let or :unlet {{{1
-"
-" On a :let command, an exception might be thrown during evaluation
-" of the expression to assign. On an :let or :unlet command, the
-" evaluation of the name of the variable to be assigned or list or
-" deleted, respectively, may throw an exception. Any following
-" arguments are not evaluated, then. The exception can be caught by
-" the script.
-"-------------------------------------------------------------------------------
-
-let throwcount = 0
-
-func T72_throw(x)
- let g:throwcount = g:throwcount + 1
- throw a:x
-endfunc
-
-let T72_addpath = ''
-
-func T72_addpath(p)
- let g:T72_addpath = g:T72_addpath . a:p
-endfunc
-
-func Test_throw_let()
- XpathINIT
-
- try
- try
- let $VAR = 'old_value'
- Xpath 'a'
- let $VAR = 'let(' . T72_throw('var') . ')'
- Xpath 'b'
- catch /^var$/
- Xpath 'c'
- finally
- call assert_equal('old_value', $VAR)
- endtry
-
- try
- let @a = 'old_value'
- Xpath 'd'
- let @a = 'let(' . T72_throw('reg') . ')'
- Xpath 'e'
- catch /^reg$/
- try
- Xpath 'f'
- let @A = 'let(' . T72_throw('REG') . ')'
- Xpath 'g'
- catch /^REG$/
- Xpath 'h'
- endtry
- finally
- call assert_equal('old_value', @a)
- call assert_equal('old_value', @A)
- endtry
-
- try
- let saved_gpath = &g:path
- let saved_lpath = &l:path
- Xpath 'i'
- let &path = 'let(' . T72_throw('opt') . ')'
- Xpath 'j'
- catch /^opt$/
- try
- Xpath 'k'
- let &g:path = 'let(' . T72_throw('gopt') . ')'
- Xpath 'l'
- catch /^gopt$/
- try
- Xpath 'm'
- let &l:path = 'let(' . T72_throw('lopt') . ')'
- Xpath 'n'
- catch /^lopt$/
- Xpath 'o'
- endtry
- endtry
- finally
- call assert_equal(saved_gpath, &g:path)
- call assert_equal(saved_lpath, &l:path)
- let &g:path = saved_gpath
- let &l:path = saved_lpath
- endtry
-
- unlet! var1 var2 var3
-
- try
- Xpath 'p'
- let var1 = 'let(' . T72_throw('var1') . ')'
- Xpath 'q'
- catch /^var1$/
- Xpath 'r'
- finally
- call assert_true(!exists('var1'))
- endtry
-
- try
- let var2 = 'old_value'
- Xpath 's'
- let var2 = 'let(' . T72_throw('var2'). ')'
- Xpath 't'
- catch /^var2$/
- Xpath 'u'
- finally
- call assert_equal('old_value', var2)
- endtry
-
- try
- Xpath 'v'
- let var{T72_throw('var3')} = 4711
- Xpath 'w'
- catch /^var3$/
- Xpath 'x'
- endtry
-
- try
- call T72_addpath('T1')
- let var{T72_throw('var4')} var{T72_addpath('T2')} | call T72_addpath('T3')
- call T72_addpath('T4')
- catch /^var4$/
- call T72_addpath('T5')
- endtry
-
- try
- call T72_addpath('T6')
- unlet var{T72_throw('var5')} var{T72_addpath('T7')}
- \ | call T72_addpath('T8')
- call T72_addpath('T9')
- catch /^var5$/
- call T72_addpath('T10')
- endtry
-
- call assert_equal('T1T5T6T10', g:T72_addpath)
- call assert_equal(11, g:throwcount)
- catch /.*/
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- call assert_equal('acdfhikmoprsuvx', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 73: :throw across :function, :delfunction {{{1
-"
-" The :function and :delfunction commands may cause an expression
-" specified in braces to be evaluated. During evaluation, an
-" exception might be thrown. The exception can be caught by the
-" script.
-"-------------------------------------------------------------------------------
-
-let T73_taken = ''
-
-func T73_throw(x, n)
- let g:T73_taken = g:T73_taken . 'T' . a:n
- throw a:x
-endfunc
-
-func T73_expr(x, n)
- let g:T73_taken = g:T73_taken . 'E' . a:n
- if a:n % 2 == 0
- call T73_throw(a:x, a:n)
- endif
- return 2 - a:n % 2
-endfunc
-
-func Test_throw_func()
- XpathINIT
-
- try
- try
- " Define function.
- Xpath 'a'
- function! F0()
- endfunction
- Xpath 'b'
- function! F{T73_expr('function-def-ok', 1)}()
- endfunction
- Xpath 'c'
- function! F{T73_expr('function-def', 2)}()
- endfunction
- Xpath 'd'
- catch /^function-def-ok$/
- Xpath 'e'
- catch /^function-def$/
- Xpath 'f'
- catch /.*/
- call assert_report('def: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- " List function.
- Xpath 'g'
- function F0
- Xpath 'h'
- function F{T73_expr('function-lst-ok', 3)}
- Xpath 'i'
- function F{T73_expr('function-lst', 4)}
- Xpath 'j'
- catch /^function-lst-ok$/
- Xpath 'k'
- catch /^function-lst$/
- Xpath 'l'
- catch /.*/
- call assert_report('lst: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- " Delete function
- Xpath 'm'
- delfunction F0
- Xpath 'n'
- delfunction F{T73_expr('function-del-ok', 5)}
- Xpath 'o'
- delfunction F{T73_expr('function-del', 6)}
- Xpath 'p'
- catch /^function-del-ok$/
- Xpath 'q'
- catch /^function-del$/
- Xpath 'r'
- catch /.*/
- call assert_report('del: ' . v:exception . ' in ' . v:throwpoint)
- endtry
- call assert_equal('E1E2T2E3E4T4E5E6T6', g:T73_taken)
- catch /.*/
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- call assert_equal('abcfghilmnor', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 74: :throw across builtin functions and commands {{{1
-"
-" Some functions like exists(), searchpair() take expression
-" arguments, other functions or commands like substitute() or
-" :substitute cause an expression (specified in the regular
-" expression) to be evaluated. During evaluation an exception
-" might be thrown. The exception can be caught by the script.
-"-------------------------------------------------------------------------------
-
-let T74_taken = ""
-
-func T74_throw(x, n)
- let g:T74_taken = g:T74_taken . "T" . a:n
- throw a:x
-endfunc
-
-func T74_expr(x, n)
- let g:T74_taken = g:T74_taken . "E" . a:n
- call T74_throw(a:x . a:n, a:n)
- return "EXPR"
-endfunc
-
-func T74_skip(x, n)
- let g:T74_taken = g:T74_taken . "S" . a:n . "(" . line(".")
- let theline = getline(".")
- if theline =~ "skip"
- let g:T74_taken = g:T74_taken . "s)"
- return 1
- elseif theline =~ "throw"
- let g:T74_taken = g:T74_taken . "t)"
- call T74_throw(a:x . a:n, a:n)
- else
- let g:T74_taken = g:T74_taken . ")"
- return 0
- endif
-endfunc
-
-func T74_subst(x, n)
- let g:T74_taken = g:T74_taken . "U" . a:n . "(" . line(".")
- let theline = getline(".")
- if theline =~ "not" " T74_subst() should not be called for this line
- let g:T74_taken = g:T74_taken . "n)"
- call T74_throw(a:x . a:n, a:n)
- elseif theline =~ "throw"
- let g:T74_taken = g:T74_taken . "t)"
- call T74_throw(a:x . a:n, a:n)
- else
- let g:T74_taken = g:T74_taken . ")"
- return "replaced"
- endif
-endfunc
-
-func Test_throw_builtin_func()
- XpathINIT
-
- try
- try
- Xpath 'a'
- let result = exists('*{T74_expr("exists", 1)}')
- Xpath 'b'
- catch /^exists1$/
- Xpath 'c'
- try
- let result = exists('{T74_expr("exists", 2)}')
- Xpath 'd'
- catch /^exists2$/
- Xpath 'e'
- catch /.*/
- call assert_report('exists2: ' . v:exception . ' in ' . v:throwpoint)
- endtry
- catch /.*/
- call assert_report('exists1: ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- try
- let file = tempname()
- exec "edit" file
- call append(0, [
- \ 'begin',
- \ 'xx',
- \ 'middle 3',
- \ 'xx',
- \ 'middle 5 skip',
- \ 'xx',
- \ 'middle 7 throw',
- \ 'xx',
- \ 'end'])
- normal! gg
- Xpath 'f'
- let result = searchpair("begin", "middle", "end", '',
- \ 'T74_skip("searchpair", 3)')
- Xpath 'g'
- let result = searchpair("begin", "middle", "end", '',
- \ 'T74_skip("searchpair", 4)')
- Xpath 'h'
- let result = searchpair("begin", "middle", "end", '',
- \ 'T74_skip("searchpair", 5)')
- Xpath 'i'
- catch /^searchpair[35]$/
- Xpath 'j'
- catch /^searchpair4$/
- Xpath 'k'
- catch /.*/
- call assert_report('searchpair: ' . v:exception . ' in ' . v:throwpoint)
- finally
- bwipeout!
- call delete(file)
- endtry
-
- try
- let file = tempname()
- exec "edit" file
- call append(0, [
- \ 'subst 1',
- \ 'subst 2',
- \ 'not',
- \ 'subst 4',
- \ 'subst throw',
- \ 'subst 6'])
- normal! gg
- Xpath 'l'
- 1,2substitute/subst/\=T74_subst("substitute", 6)/
- try
- Xpath 'm'
- try
- let v:errmsg = ""
- 3substitute/subst/\=T74_subst("substitute", 7)/
- finally
- if v:errmsg != ""
- " If exceptions are not thrown on errors, fake the error
- " exception in order to get the same execution path.
- throw "faked Vim(substitute)"
- endif
- endtry
- catch /Vim(substitute)/ " Pattern not found ('e' flag missing)
- Xpath 'n'
- 3substitute/subst/\=T74_subst("substitute", 8)/e
- Xpath 'o'
- endtry
- Xpath 'p'
- 4,6substitute/subst/\=T74_subst("substitute", 9)/
- Xpath 'q'
- catch /^substitute[678]/
- Xpath 'r'
- catch /^substitute9/
- Xpath 's'
- finally
- bwipeout!
- call delete(file)
- endtry
-
- try
- Xpath 't'
- let var = substitute("sub", "sub", '\=T74_throw("substitute()y", 10)', '')
- Xpath 'u'
- catch /substitute()y/
- Xpath 'v'
- catch /.*/
- call assert_report('substitute()y: ' . v:exception . ' in '
- \ . v:throwpoint)
- endtry
-
- try
- Xpath 'w'
- let var = substitute("not", "sub", '\=T74_throw("substitute()n", 11)', '')
- Xpath 'x'
- catch /substitute()n/
- Xpath 'y'
- catch /.*/
- call assert_report('substitute()n: ' . v:exception . ' in '
- \ . v:throwpoint)
- endtry
-
- call assert_equal('E1T1E2T2S3(3)S4(5s)S4(7t)T4U6(1)U6(2)U9(4)U9(5t)T9T10',
- \ g:T74_taken)
-
- catch /.*/
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- endtry
-
- call assert_equal('acefgklmnopstvwx', g:Xpath)
-endfunc
-
-
-"-------------------------------------------------------------------------------
-" Test 75: Errors in builtin functions. {{{1
-"
-" On an error in a builtin function called inside a :try/:endtry
-" region, the evaluation of the expression calling that function and
-" the command containing that expression are abandoned. The error can
-" be caught as an exception.
-"
-" A simple :call of the builtin function is a trivial case. If the
-" builtin function is called in the argument list of another function,
-" no further arguments are evaluated, and the other function is not
-" executed. If the builtin function is called from the argument of
-" a :return command, the :return command is not executed. If the
-" builtin function is called from the argument of a :throw command,
-" the :throw command is not executed. The evaluation of the
-" expression calling the builtin function is abandoned.
-"-------------------------------------------------------------------------------
-
-func T75_F1(arg1)
- Xpath 'a'
-endfunc
-
-func T75_F2(arg1, arg2)
- Xpath 'b'
-endfunc
-
-func T75_G()
- Xpath 'c'
-endfunc
-
-func T75_H()
- Xpath 'd'
-endfunc
-
-func T75_R()
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- Xpath 'e'
- return append(1, "s")
- catch /E21/
- let caught = 1
- catch /.*/
- Xpath 'f'
- finally
- Xpath 'g'
- if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
- Xpath 'h'
- endif
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
- Xpath 'i'
-endfunc
-
-func Test_builtin_func_error()
- XpathINIT
-
- try
- set noma " let append() fail with "E21"
-
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- Xpath 'j'
- call append(1, "s")
- catch /E21/
- let caught = 1
- catch /.*/
- Xpath 'k'
- finally
- Xpath 'l'
- if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
- Xpath 'm'
- endif
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
-
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- Xpath 'n'
- call T75_F1('x' . append(1, "s"))
- catch /E21/
- let caught = 1
- catch /.*/
- Xpath 'o'
- finally
- Xpath 'p'
- if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
- Xpath 'q'
- endif
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
-
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- Xpath 'r'
- call T75_F2('x' . append(1, "s"), T75_G())
- catch /E21/
- let caught = 1
- catch /.*/
- Xpath 's'
- finally
- Xpath 't'
- if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
- Xpath 'u'
- endif
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
-
- call T75_R()
-
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- Xpath 'v'
- throw "T" . append(1, "s")
- catch /E21/
- let caught = 1
- catch /^T.*/
- Xpath 'w'
- catch /.*/
- Xpath 'x'
- finally
- Xpath 'y'
- if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
- Xpath 'z'
- endif
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
-
- while 1
- try
- let caught = 0
- let v:errmsg = ""
- Xpath 'A'
- let x = "a"
- let x = x . "b" . append(1, "s") . T75_H()
- catch /E21/
- let caught = 1
- catch /.*/
- Xpath 'B'
- finally
- Xpath 'C'
- if caught || $VIMNOERRTHROW && v:errmsg =~ 'E21'
- Xpath 'D'
- endif
- call assert_equal('a', x)
- break " discard error for $VIMNOERRTHROW
- endtry
- endwhile
- catch /.*/
- call assert_report('Caught ' . v:exception . ' in ' . v:throwpoint)
- finally
- set ma&
- endtry
-
- call assert_equal('jlmnpqrtueghivyzACD', g:Xpath)
-endfunc
-
-func Test_reload_in_try_catch()
- call writefile(['x'], 'Xreload')
- set autoread
- edit Xreload
- tabnew
- call writefile(['xx'], 'Xreload')
- augroup ReLoad
- au FileReadPost Xreload let x = doesnotexist
- au BufReadPost Xreload let x = doesnotexist
- augroup END
- try
- edit Xreload
- catch
- endtry
- tabnew
-
- tabclose
- tabclose
- autocmd! ReLoad
- set noautoread
- bwipe! Xreload
- call delete('Xreload')
-endfunc
-
-" Test for errors with :catch, :throw, :finally {{{1
-func Test_try_catch_errors()
- call assert_fails('throw |', 'E471:')
- call assert_fails("throw \n ", 'E471:')
- call assert_fails('catch abc', 'E654:')
- call assert_fails('try | let i = 1| finally | catch | endtry', 'E604:')
- call assert_fails('finally', 'E606:')
- call assert_fails('try | finally | finally | endtry', 'E607:')
- call assert_fails('try | for i in range(5) | endif | endtry', 'E580:')
- call assert_fails('try | while v:true | endtry', 'E170:')
- call assert_fails('try | if v:true | endtry', 'E171:')
-
- " this was using a negative index in cstack[]
- let lines =<< trim END
- try
- for
- if
- endwhile
- if
- finally
- END
- call CheckScriptFailure(lines, 'E690:')
-
- let lines =<< trim END
- try
- for
- if
- endwhile
- if
- endtry
- END
- call CheckScriptFailure(lines, 'E690:')
-endfunc
-
-" Test for verbose messages with :try :catch, and :finally {{{1
-func Test_try_catch_verbose()
- " This test works only when the language is English
- CheckEnglish
-
- set verbose=14
-
- " Test for verbose messages displayed when an exception is caught
- redir => msg
- try
- echo i
- catch /E121:/
- finally
- endtry
- redir END
- let expected = [
- \ 'Exception thrown: Vim(echo):E121: Undefined variable: i', '',
- \ 'Exception caught: Vim(echo):E121: Undefined variable: i', '',
- \ 'Exception finished: Vim(echo):E121: Undefined variable: i']
- call assert_equal(expected, split(msg, "\n"))
-
- " Test for verbose messages displayed when an exception is discarded
- redir => msg
- try
- try
- throw 'abc'
- finally
- throw 'xyz'
- endtry
- catch
- endtry
- redir END
- let expected = [
- \ 'Exception thrown: abc', '',
- \ 'Exception made pending: abc', '',
- \ 'Exception thrown: xyz', '',
- \ 'Exception discarded: abc', '',
- \ 'Exception caught: xyz', '',
- \ 'Exception finished: xyz']
- call assert_equal(expected, split(msg, "\n"))
-
- " Test for messages displayed when :throw is resumed after :finally
- redir => msg
- try
- try
- throw 'abc'
- finally
- endtry
- catch
- endtry
- redir END
- let expected = [
- \ 'Exception thrown: abc', '',
- \ 'Exception made pending: abc', '',
- \ 'Exception resumed: abc', '',
- \ 'Exception caught: abc', '',
- \ 'Exception finished: abc']
- call assert_equal(expected, split(msg, "\n"))
-
- " Test for messages displayed when :break is resumed after :finally
- redir => msg
- for i in range(1)
- try
- break
- finally
- endtry
- endfor
- redir END
- let expected = [':break made pending', '', ':break resumed']
- call assert_equal(expected, split(msg, "\n"))
-
- " Test for messages displayed when :continue is resumed after :finally
- redir => msg
- for i in range(1)
- try
- continue
- finally
- endtry
- endfor
- redir END
- let expected = [':continue made pending', '', ':continue resumed']
- call assert_equal(expected, split(msg, "\n"))
-
- " Test for messages displayed when :return is resumed after :finally
- func Xtest()
- try
- return 'vim'
- finally
- endtry
- endfunc
- redir => msg
- call Xtest()
- redir END
- let expected = [
- \ 'calling Xtest()', '',
- \ ':return vim made pending', '',
- \ ':return vim resumed', '',
- \ 'Xtest returning ''vim''', '',
- \ 'continuing in Test_try_catch_verbose']
- call assert_equal(expected, split(msg, "\n"))
- delfunc Xtest
-
- " Test for messages displayed when :finish is resumed after :finally
- call writefile(['try', 'finish', 'finally', 'endtry'], 'Xscript')
- redir => msg
- source Xscript
- redir END
- let expected = [
- \ ':finish made pending', '',
- \ ':finish resumed', '',
- \ 'finished sourcing Xscript',
- \ 'continuing in Test_try_catch_verbose']
- call assert_equal(expected, split(msg, "\n")[1:])
- call delete('Xscript')
-
- " Test for messages displayed when a pending :continue is discarded by an
- " exception in a finally handler
- redir => msg
- try
- for i in range(1)
- try
- continue
- finally
- throw 'abc'
- endtry
- endfor
- catch
- endtry
- redir END
- let expected = [
- \ ':continue made pending', '',
- \ 'Exception thrown: abc', '',
- \ ':continue discarded', '',
- \ 'Exception caught: abc', '',
- \ 'Exception finished: abc']
- call assert_equal(expected, split(msg, "\n"))
-
- set verbose&
-endfunc
-
-" Test for throwing an exception from a BufEnter autocmd {{{1
-func Test_BufEnter_exception()
- augroup bufenter_exception
- au!
- autocmd BufEnter Xfile1 throw 'abc'
- augroup END
-
- let caught_abc = 0
- try
- sp Xfile1
- catch /^abc/
- let caught_abc = 1
- endtry
- call assert_equal(1, caught_abc)
- call assert_equal(1, winnr('$'))
-
- augroup bufenter_exception
- au!
- augroup END
- augroup! bufenter_exception
- %bwipe!
-
- " Test for recursively throwing exceptions in autocmds
- augroup bufenter_exception
- au!
- autocmd BufEnter Xfile1 throw 'bufenter'
- autocmd BufLeave Xfile1 throw 'bufleave'
- augroup END
-
- let ex_count = 0
- try
- try
- sp Xfile1
- catch /^bufenter/
- let ex_count += 1
- endtry
- catch /^bufleave/
- let ex_count += 10
- endtry
- call assert_equal(10, ex_count)
- call assert_equal(2, winnr('$'))
-
- augroup bufenter_exception
- au!
- augroup END
- augroup! bufenter_exception
- %bwipe!
-endfunc
-
-" Test for using throw in a called function with following error {{{1
-func Test_user_command_throw_in_function_call()
- let lines =<< trim END
- function s:get_dict() abort
- throw 'my_error'
- endfunction
-
- try
- call s:get_dict().foo()
- catch /my_error/
- let caught = 'yes'
- catch
- let caught = v:exception
- endtry
- call assert_equal('yes', caught)
- END
- call writefile(lines, 'XtestThrow')
- source XtestThrow
-
- call delete('XtestThrow')
- unlet g:caught
-endfunc
-
-" Test that after reporting an uncaught exception there is no error for a
-" missing :endif
-func Test_after_exception_no_endif_error()
- function Throw()
- throw "Failure"
- endfunction
-
- function Foo()
- if 1
- call Throw()
- endif
- endfunction
- call assert_fails('call Foo()', ['E605:', 'E605:'])
- delfunc Throw
- delfunc Foo
-endfunc
-
-" Test for using throw in a called function with following endtry {{{1
-func Test_user_command_function_call_with_endtry()
- let lines =<< trim END
- funct s:throw(msg) abort
- throw a:msg
- endfunc
- func s:main() abort
- try
- try
- throw 'err1'
- catch
- call s:throw('err2') | endtry
- catch
- let s:caught = 'yes'
- endtry
- endfunc
-
- call s:main()
- call assert_equal('yes', s:caught)
- END
- call writefile(lines, 'XtestThrow')
- source XtestThrow
-
- call delete('XtestThrow')
-endfunc
-
-func ThisWillFail()
-
-endfunc
-
-" This was crashing prior to the fix in 8.2.3478.
-func Test_error_in_catch_and_finally()
- let lines =<< trim END
- try
- echo x
- catch
- for l in []
- finally
- END
- call writefile(lines, 'XtestCatchAndFinally')
- try
- source XtestCatchAndFinally
- catch /E600:/
- endtry
-
- call delete('XtestCatchAndFinally')
-endfunc
-
-" This was causing an illegal memory access
-func Test_leave_block_in_endtry_not_called()
- let lines =<< trim END
- " vim9script
- " try #
- try "
- for x in []
- if
- endwhile
- if
- endtry
- END
- call writefile(lines, 'XtestEndtry')
- try
- source XtestEndtry
- catch /E171:/
- endtry
-
- call delete('XtestEndtry')
-endfunc
-
-" Modeline {{{1
-" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker