Patch 8.2.1383
Problem: Test 49 is old style.
Solution: Convert test cases to new style. (Yegappan Lakshmanan,
closes #6638)
Files: src/testdir/test49.ok, src/testdir/test49.vim,
src/testdir/test_vimscript.vim
*** ../vim-8.2.1382/src/testdir/test49.ok 2020-08-05 11:20:45.174462615
+0200
--- src/testdir/test49.ok 2020-08-07 16:47:00.954221297 +0200
***************
*** 1,18 ****
Results of test49.vim:
- *** Test 52: OK (1247112011)
- *** Test 53: OK (131071)
- *** Test 54: OK (2047)
- *** Test 55: OK (1023)
- *** Test 56: OK (511)
- *** Test 57: OK (2147450880)
- *** Test 58: OK (624945)
*** Test 59: OK (2038431743)
*** Test 60: OK (311511339)
- *** Test 61: OK (374889517)
*** Test 62: OK (286331153)
*** Test 63: OK (236978127)
*** Test 64: OK (1499645335)
- *** Test 65: OK (70187)
*** Test 66: OK (5464)
*** Test 67: OK (212514423)
*** Test 68: OK (212514423)
--- 1,9 ----
*** ../vim-8.2.1382/src/testdir/test49.vim 2020-08-05 11:20:45.174462615
+0200
--- src/testdir/test49.vim 2020-08-07 16:47:00.954221297 +0200
***************
*** 607,629 ****
" END_OF_TEST_ENVIRONMENT - do not change or remove this line.
- " Tests 1 to 50, 87 were moved to test_vimscript.vim
- " Tests 25, 26, 32, 33, 41-48, 51, 69-75 were moved to test_trycatch.vim
- let Xtest = 52
-
-
"-------------------------------------------------------------------------------
- " Test 52: Uncaught exceptions
{{{1
- "
- " When an exception is thrown but not caught, an error message is
- " displayed when the script is terminated. In case of an interrupt
- " or error exception, the normal interrupt or error message(s) are
- " displayed.
-
"-------------------------------------------------------------------------------
-
- XpathINIT
-
- let msgfile = tempname()
-
function! MESSAGES(...)
try
exec "edit" g:msgfile
--- 607,612 ----
***************
*** 665,1604 ****
return match
endfunction
- if ExtraVim(msgfile)
- Xpath 1 " X: 1
- throw "arrgh"
- endif
-
- Xpath 2 " X: 2
- if !MESSAGES('E605', "Exception not caught")
- Xpath 4 " X: 0
- endif
-
- if ExtraVim(msgfile)
- try
- Xpath 8 " X: 8
- throw "oops"
- catch /arrgh/
- Xpath 16 " X: 0
- endtry
- Xpath 32 " X: 0
- endif
-
- Xpath 64 " X: 64
- if !MESSAGES('E605', "Exception not caught")
- Xpath 128 " X: 0
- endif
-
- if ExtraVim(msgfile)
- function! T()
- throw "brrr"
- endfunction
-
- try
- Xpath 256 " X: 256
- throw "arrgh"
- catch /.*/
- Xpath 512 " X: 512
- call T()
- endtry
- Xpath 1024 " X: 0
- endif
-
- Xpath 2048 " X: 2048
- if !MESSAGES('E605', "Exception not caught")
- Xpath 4096 " X: 0
- endif
-
- if ExtraVim(msgfile)
- try
- Xpath 8192 " X: 8192
- throw "arrgh"
- finally
- Xpath 16384 " X: 16384
- throw "brrr"
- endtry
- Xpath 32768 " X: 0
- endif
-
- Xpath 65536 " X: 65536
- if !MESSAGES('E605', "Exception not caught")
- Xpath 131072 " X: 0
- endif
-
- if ExtraVim(msgfile)
- try
- Xpath 262144 " X: 262144
- "INTERRUPT
- endtry
- Xpath 524288 " X: 0
- endif
-
- Xpath 1048576 " X: 1048576
- if !MESSAGES('INT', "Interrupted")
- Xpath 2097152 " X: 0
- endif
-
- if ExtraVim(msgfile)
- try
- Xpath 4194304 " X: 4194304
- let x = novar " error E121; exception: E121
- catch /E15:/ " should not catch
- Xpath 8388608 " X: 0
- endtry
- Xpath 16777216 " X: 0
- endif
-
- Xpath 33554432 " X: 33554432
- if !MESSAGES('E121', "Undefined variable")
- Xpath 67108864 " X: 0
- endif
-
- if ExtraVim(msgfile)
- try
- Xpath 134217728 " X: 134217728
- " unlet novar # " error E108/E488; exception: E488
- catch /E108:/ " should not catch
- Xpath 268435456 " X: 0
- endtry
- Xpath 536870912 " X: 0
- endif
-
- Xpath 1073741824 " X: 1073741824
- if !MESSAGES('E108', "No such variable", 'E488', "Trailing characters")
- " The Xpath command does not accept 2^31 (negative); add explicitly:
- let Xpath = Xpath + 2147483648 " X: 0
- endif
-
- call delete(msgfile)
- unlet msgfile
-
- Xcheck 1247112011
-
" Leave MESSAGES() for the next tests.
!
!
"-------------------------------------------------------------------------------
! " Test 53: Nesting errors: :endif/:else/:elseif {{{1
! "
! " For nesting errors of :if conditionals the correct error messages
! " should be given.
! "
! " This test reuses the function MESSAGES() from the previous test.
! " This functions checks the messages in g:msgfile.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! let msgfile = tempname()
!
! if ExtraVim(msgfile)
! " endif
! endif
! if MESSAGES('E580', ":endif without :if")
! Xpath 1 " X: 1
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " endif
! " endwhile
! endif
! if MESSAGES('E580', ":endif without :if")
! Xpath 2 " X: 2
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " endif
! " endtry
! endif
! if MESSAGES('E580', ":endif without :if")
! Xpath 4 " X: 4
! endif
!
! if ExtraVim(msgfile)
! " try
! " endif
! " endtry
! endif
! if MESSAGES('E580', ":endif without :if")
! Xpath 8 " X: 8
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " endif
! " endtry
! endif
! if MESSAGES('E580', ":endif without :if")
! Xpath 16 " X: 16
! endif
!
! if ExtraVim(msgfile)
! " else
! endif
! if MESSAGES('E581', ":else without :if")
! Xpath 32 " X: 32
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " else
! " endwhile
! endif
! if MESSAGES('E581', ":else without :if")
! Xpath 64 " X: 64
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " else
! " endtry
! endif
! if MESSAGES('E581', ":else without :if")
! Xpath 128 " X: 128
! endif
!
! if ExtraVim(msgfile)
! " try
! " else
! " endtry
! endif
! if MESSAGES('E581', ":else without :if")
! Xpath 256 " X: 256
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " else
! " endtry
! endif
! if MESSAGES('E581', ":else without :if")
! Xpath 512 " X: 512
! endif
!
! if ExtraVim(msgfile)
! " elseif
! endif
! if MESSAGES('E582', ":elseif without :if")
! Xpath 1024 " X: 1024
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " elseif
! " endwhile
! endif
! if MESSAGES('E582', ":elseif without :if")
! Xpath 2048 " X: 2048
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " elseif
! " endtry
! endif
! if MESSAGES('E582', ":elseif without :if")
! Xpath 4096 " X: 4096
! endif
!
! if ExtraVim(msgfile)
! " try
! " elseif
! " endtry
! endif
! if MESSAGES('E582', ":elseif without :if")
! Xpath 8192 " X: 8192
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " elseif
! " endtry
! endif
! if MESSAGES('E582', ":elseif without :if")
! Xpath 16384 " X: 16384
! endif
!
! if ExtraVim(msgfile)
! " if 1
! " else
! " else
! " endif
! endif
! if MESSAGES('E583', "multiple :else")
! Xpath 32768 " X: 32768
! endif
!
! if ExtraVim(msgfile)
! " if 1
! " else
! " elseif 1
! " endif
! endif
! if MESSAGES('E584', ":elseif after :else")
! Xpath 65536 " X: 65536
! endif
!
! call delete(msgfile)
! unlet msgfile
!
! Xcheck 131071
!
! " Leave MESSAGES() for the next test.
!
!
!
"-------------------------------------------------------------------------------
! " Test 54: Nesting errors: :while/:endwhile {{{1
! "
! " For nesting errors of :while conditionals the correct error messages
! " should be given.
! "
! " This test reuses the function MESSAGES() from the previous test.
! " This functions checks the messages in g:msgfile.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! let msgfile = tempname()
!
! if ExtraVim(msgfile)
! " endwhile
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 1 " X: 1
! endif
!
! if ExtraVim(msgfile)
! " if 1
! " endwhile
! " endif
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 2 " X: 2
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " if 1
! " endwhile
! endif
! if MESSAGES('E171', "Missing :endif")
! Xpath 4 " X: 4
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " endwhile
! " endtry
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 8 " X: 8
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " try
! " finally
! " endwhile
! endif
! if MESSAGES('E600', "Missing :endtry")
! Xpath 16 " X: 16
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " if 1
! " try
! " finally
! " endwhile
! endif
! if MESSAGES('E600', "Missing :endtry")
! Xpath 32 " X: 32
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " try
! " finally
! " if 1
! " endwhile
! endif
! if MESSAGES('E171', "Missing :endif")
! Xpath 64 " X: 64
! endif
!
! if ExtraVim(msgfile)
! " try
! " endwhile
! " endtry
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 128 " X: 128
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " try
! " endwhile
! " endtry
! " endwhile
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 256 " X: 256
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " endwhile
! " endtry
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 512 " X: 512
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " try
! " throw "a"
! " catch /a/
! " endwhile
! " endtry
! " endwhile
! endif
! if MESSAGES('E588', ":endwhile without :while")
! Xpath 1024 " X: 1024
! endif
!
!
! call delete(msgfile)
! unlet msgfile
!
! Xcheck 2047
!
! " Leave MESSAGES() for the next test.
!
!
!
"-------------------------------------------------------------------------------
! " Test 55: Nesting errors: :continue/:break {{{1
! "
! " For nesting errors of :continue and :break commands the correct
! " error messages should be given.
! "
! " This test reuses the function MESSAGES() from the previous test.
! " This functions checks the messages in g:msgfile.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! let msgfile = tempname()
!
! if ExtraVim(msgfile)
! " continue
! endif
! if MESSAGES('E586', ":continue without :while")
! Xpath 1 " X: 1
! endif
!
! if ExtraVim(msgfile)
! " if 1
! " continue
! " endif
! endif
! if MESSAGES('E586', ":continue without :while")
! Xpath 2 " X: 2
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " continue
! " endtry
! endif
! if MESSAGES('E586', ":continue without :while")
! Xpath 4 " X: 4
! endif
!
! if ExtraVim(msgfile)
! " try
! " continue
! " endtry
! endif
! if MESSAGES('E586', ":continue without :while")
! Xpath 8 " X: 8
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " continue
! " endtry
! endif
! if MESSAGES('E586', ":continue without :while")
! Xpath 16 " X: 16
! endif
!
! if ExtraVim(msgfile)
! " break
! endif
! if MESSAGES('E587', ":break without :while")
! Xpath 32 " X: 32
! endif
!
! if ExtraVim(msgfile)
! " if 1
! " break
! " endif
! endif
! if MESSAGES('E587', ":break without :while")
! Xpath 64 " X: 64
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " break
! " endtry
! endif
! if MESSAGES('E587', ":break without :while")
! Xpath 128 " X: 128
! endif
!
! if ExtraVim(msgfile)
! " try
! " break
! " endtry
! endif
! if MESSAGES('E587', ":break without :while")
! Xpath 256 " X: 256
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " break
! " endtry
! endif
! if MESSAGES('E587', ":break without :while")
! Xpath 512 " X: 512
! endif
!
! call delete(msgfile)
! unlet msgfile
!
! Xcheck 1023
!
! " Leave MESSAGES() for the next test.
!
!
!
"-------------------------------------------------------------------------------
! " Test 56: Nesting errors: :endtry {{{1
! "
! " For nesting errors of :try conditionals the correct error messages
! " should be given.
! "
! " This test reuses the function MESSAGES() from the previous test.
! " This functions checks the messages in g:msgfile.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! let msgfile = tempname()
!
! if ExtraVim(msgfile)
! " endtry
! endif
! if MESSAGES('E602', ":endtry without :try")
! Xpath 1 " X: 1
! endif
!
! if ExtraVim(msgfile)
! " if 1
! " endtry
! " endif
! endif
! if MESSAGES('E602', ":endtry without :try")
! Xpath 2 " X: 2
! endif
!
! if ExtraVim(msgfile)
! " while 1
! " endtry
! " endwhile
! endif
! if MESSAGES('E602', ":endtry without :try")
! Xpath 4 " X: 4
! endif
!
! if ExtraVim(msgfile)
! " try
! " if 1
! " endtry
! endif
! if MESSAGES('E171', "Missing :endif")
! Xpath 8 " X: 8
! endif
!
! if ExtraVim(msgfile)
! " try
! " while 1
! " endtry
! endif
! if MESSAGES('E170', "Missing :endwhile")
! Xpath 16 " X: 16
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " if 1
! " endtry
! endif
! if MESSAGES('E171', "Missing :endif")
! Xpath 32 " X: 32
! endif
!
! if ExtraVim(msgfile)
! " try
! " finally
! " while 1
! " endtry
! endif
! if MESSAGES('E170', "Missing :endwhile")
! Xpath 64 " X: 64
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " if 1
! " endtry
! endif
! if MESSAGES('E171', "Missing :endif")
! Xpath 128 " X: 128
! endif
!
! if ExtraVim(msgfile)
! " try
! " throw "a"
! " catch /a/
! " while 1
! " endtry
! endif
! if MESSAGES('E170', "Missing :endwhile")
! Xpath 256 " X: 256
! endif
!
! call delete(msgfile)
! unlet msgfile
!
! delfunction MESSAGES
!
! Xcheck 511
!
!
!
"-------------------------------------------------------------------------------
! " Test 57: v:exception and v:throwpoint for user exceptions {{{1
! "
! " v:exception evaluates to the value of the exception that was caught
! " most recently and is not finished. (A caught exception is finished
! " when the next ":catch", ":finally", or ":endtry" is reached.)
! " v:throwpoint evaluates to the script/function name and line number
! " where that exception has been thrown.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! function! FuncException()
! let g:exception = v:exception
! endfunction
!
! function! FuncThrowpoint()
! let g:throwpoint = v:throwpoint
! endfunction
!
! let scriptException = MakeScript("FuncException")
! let scriptThrowPoint = MakeScript("FuncThrowpoint")
!
! command! CmdException let g:exception = v:exception
! command! CmdThrowpoint let g:throwpoint = v:throwpoint
!
! XloopINIT! 1 2
!
! function! CHECK(n, exception, throwname, throwline)
! XloopNEXT
! let error = 0
! if v:exception != a:exception
! Xout a:n.": v:exception is" v:exception "instead of" a:exception
! let error = 1
! endif
! if v:throwpoint !~ a:throwname
! let name = escape(a:throwname, '\')
! Xout a:n.": v:throwpoint (".v:throwpoint.") does not match" name
! let error = 1
! endif
! if v:throwpoint !~ a:throwline
! let line = escape(a:throwline, '\')
! Xout a:n.": v:throwpoint (".v:throwpoint.") does not match" line
! let error = 1
! endif
! if error
! Xloop 1 " X: 0
! endif
! endfunction
!
! function! T(arg, line)
! if a:line == 2
! throw a:arg " in line 2
! elseif a:line == 4
! throw a:arg " in line 4
! elseif a:line == 6
! throw a:arg " in line 6
! elseif a:line == 8
! throw a:arg " in line 8
! endif
! endfunction
!
! function! G(arg, line)
! call T(a:arg, a:line)
! endfunction
!
! function! F(arg, line)
! call G(a:arg, a:line)
! endfunction
!
! let scriptT = MakeScript("T")
! let scriptG = MakeScript("G", scriptT)
! let scriptF = MakeScript("F", scriptG)
!
! try
! Xpath 32768 " X: 32768
! call F("oops", 2)
! catch /.*/
! Xpath 65536 " X: 65536
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(1, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! exec "let exception = v:exception"
! exec "let throwpoint = v:throwpoint"
! call CHECK(2, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! CmdException
! CmdThrowpoint
! call CHECK(3, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! call FuncException()
! call FuncThrowpoint()
! call CHECK(4, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! exec "source" scriptException
! exec "source" scriptThrowPoint
! call CHECK(5, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! try
! Xpath 131072 " X: 131072
! call G("arrgh", 4)
! catch /.*/
! Xpath 262144 " X: 262144
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(6, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
! try
! Xpath 524288 " X: 524288
! let g:arg = "autsch"
! let g:line = 6
! exec "source" scriptF
! catch /.*/
! Xpath 1048576 " X: 1048576
! let exception = v:exception
! let throwpoint = v:throwpoint
! " Symbolic links in tempname()s are not resolved, whereas resolving
! " is done for v:throwpoint. Resolve the temporary file name for
! " scriptT, so that it can be matched against v:throwpoint.
! call CHECK(7, "autsch", resolve(scriptT), '\<6\>')
! finally
! Xpath 2097152 " X: 2097152
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(8, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
! try
! Xpath 4194304 " X: 4194304
! let g:arg = "brrrr"
! let g:line = 8
! exec "source" scriptG
! catch /.*/
! Xpath 8388608 " X: 8388608
! let exception = v:exception
! let throwpoint = v:throwpoint
! " Resolve scriptT for matching it against v:throwpoint.
! call CHECK(9, "brrrr", resolve(scriptT), '\<8\>')
! finally
! Xpath 16777216 " X: 16777216
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(10, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
! endtry
! Xpath 33554432 " X: 33554432
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(11, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
! endtry
! Xpath 67108864 " X: 67108864
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(12, "arrgh", '\<G\[1]\.\.T\>', '\<4\>')
! finally
! Xpath 134217728 " X: 134217728
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(13, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! endtry
! Xpath 268435456 " X: 268435456
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(14, "oops", '\<F\[1]\.\.G\[1]\.\.T\>', '\<2\>')
! finally
! Xpath 536870912 " X: 536870912
! let exception = v:exception
! let throwpoint = v:throwpoint
! call CHECK(15, "", '^$', '^$')
! endtry
!
! Xpath 1073741824 " X: 1073741824
!
! unlet exception throwpoint
! delfunction FuncException
! delfunction FuncThrowpoint
! call delete(scriptException)
! call delete(scriptThrowPoint)
! unlet scriptException scriptThrowPoint
! delcommand CmdException
! delcommand CmdThrowpoint
! delfunction T
! delfunction G
! delfunction F
! call delete(scriptT)
! call delete(scriptG)
! call delete(scriptF)
! unlet scriptT scriptG scriptF
!
! Xcheck 2147450880
!
!
!
"-------------------------------------------------------------------------------
! "
! " Test 58: v:exception and v:throwpoint for error/interrupt exceptions
{{{1
! "
! " v:exception and v:throwpoint work also for error and interrupt
! " exceptions.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! if ExtraVim()
!
! function! T(line)
! if a:line == 2
! delfunction T " error (function in use) in line 2
! elseif a:line == 4
! let dummy = 0 " INTERRUPT1 - interrupt in line 4
! endif
! endfunction
!
! while 1
! try
! Xpath 1 " X: 1
! let caught = 0
! call T(2)
! catch /.*/
! let caught = 1
! if v:exception !~ 'Vim(delfunction):'
! Xpath 2 " X: 0
! endif
! if v:throwpoint !~ '\<T\>'
! Xpath 4 " X: 0
! endif
! if v:throwpoint !~ '\<2\>'
! Xpath 8 " X: 0
! endif
! finally
! Xpath 16 " X: 16
! if caught || $VIMNOERRTHROW
! Xpath 32 " X: 32
! endif
! if v:exception != ""
! Xpath 64 " X: 0
! endif
! if v:throwpoint != ""
! Xpath 128 " X: 0
! endif
! break " discard error for $VIMNOERRTHROW
! endtry
! endwhile
!
! Xpath 256 " X: 256
! if v:exception != ""
! Xpath 512 " X: 0
! endif
! if v:throwpoint != ""
! Xpath 1024 " X: 0
! endif
!
! while 1
! try
! Xpath 2048 " X: 2048
! let caught = 0
! call T(4)
! catch /.*/
! let caught = 1
! if v:exception != 'Vim:Interrupt'
! Xpath 4096 " X: 0
! endif
! if v:throwpoint !~ '\<T\>'
! Xpath 8192 " X: 0
! endif
! if v:throwpoint !~ '\<4\>'
! Xpath 16384 " X: 0
! endif
! finally
! Xpath 32768 " X: 32768
! if caught || $VIMNOINTTHROW
! Xpath 65536 " X: 65536
! endif
! if v:exception != ""
! Xpath 131072 " X: 0
! endif
! if v:throwpoint != ""
! Xpath 262144 " X: 0
! endif
! break " discard error for $VIMNOERRTHROW
! endtry
! endwhile
!
! Xpath 524288 " X: 524288
! if v:exception != ""
! Xpath 1048576 " X: 0
! endif
! if v:throwpoint != ""
! Xpath 2097152 " X: 0
! endif
!
! endif
!
! Xcheck 624945
!
"-------------------------------------------------------------------------------
"
--- 648,658 ----
return match
endfunction
" Leave MESSAGES() for the next tests.
! " Tests 1 to 50, 52 to 57, 87 were moved to test_vimscript.vim
! " Tests 25, 26, 32, 33, 41-48, 51, 69-75 were moved to test_trycatch.vim
! let Xtest = 59
"-------------------------------------------------------------------------------
"
***************
*** 2067,2208 ****
Xcheck 311511339
!
!
"-------------------------------------------------------------------------------
! " Test 61: Catching interrupt exceptions {{{1
! "
! " When an interrupt occurs inside a :try/:endtry region, an
! " interrupt exception is thrown and can be caught. Its value is
! " "Vim:Interrupt". If the interrupt occurs after an error or a :throw
! " but before a matching :catch is reached, all following :catches of
! " that try block are ignored, but the interrupt exception can be
! " caught by the next surrounding try conditional. An interrupt is
! " ignored when there is a previous interrupt that has not been caught
! " or causes a :finally clause to be executed.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! if ExtraVim()
!
! while 1
! try
! try
! Xpath 1 " X: 1
! let caught = 0
! "INTERRUPT
! Xpath 2 " X: 0
! catch /^Vim:Interrupt$/
! let caught = 1
! finally
! Xpath 4 " X: 4
! if caught || $VIMNOINTTHROW
! Xpath 8 " X: 8
! endif
! endtry
! catch /.*/
! Xpath 16 " X: 0
! Xout v:exception "in" v:throwpoint
! finally
! break " discard interrupt for $VIMNOINTTHROW
! endtry
! endwhile
!
! while 1
! try
! try
! let caught = 0
! try
! Xpath 32 " X: 32
! asdf
! Xpath 64 " X: 0
! catch /do_not_catch/
! Xpath 128 " X: 0
! catch /.*/ "INTERRUPT - throw interrupt if !$VIMNOERRTHROW
! Xpath 256 " X: 0
! catch /.*/
! Xpath 512 " X: 0
! finally "INTERRUPT - throw interrupt if $VIMNOERRTHROW
! Xpath 1024 " X: 1024
! endtry
! catch /^Vim:Interrupt$/
! let caught = 1
! finally
! Xpath 2048 " X: 2048
! if caught || $VIMNOINTTHROW
! Xpath 4096 " X: 4096
! endif
! endtry
! catch /.*/
! Xpath 8192 " X: 0
! Xout v:exception "in" v:throwpoint
! finally
! break " discard interrupt for $VIMNOINTTHROW
! endtry
! endwhile
!
! while 1
! try
! try
! let caught = 0
! try
! Xpath 16384 " X: 16384
! throw "x"
! Xpath 32768 " X: 0
! catch /do_not_catch/
! Xpath 65536 " X: 0
! catch /x/ "INTERRUPT
! Xpath 131072 " X: 0
! catch /.*/
! Xpath 262144 " X: 0
! endtry
! catch /^Vim:Interrupt$/
! let caught = 1
! finally
! Xpath 524288 " X: 524288
! if caught || $VIMNOINTTHROW
! Xpath 1048576 " X: 1048576
! endif
! endtry
! catch /.*/
! Xpath 2097152 " X: 0
! Xout v:exception "in" v:throwpoint
! finally
! break " discard interrupt for $VIMNOINTTHROW
! endtry
! endwhile
!
! while 1
! try
! let caught = 0
! try
! Xpath 4194304 " X: 4194304
! "INTERRUPT
! Xpath 8388608 " X: 0
! catch /do_not_catch/ "INTERRUPT
! Xpath 16777216 " X: 0
! catch /^Vim:Interrupt$/
! let caught = 1
! finally
! Xpath 33554432 " X: 33554432
! if caught || $VIMNOINTTHROW
! Xpath 67108864 " X: 67108864
! endif
! endtry
! catch /.*/
! Xpath 134217728 " X: 0
! Xout v:exception "in" v:throwpoint
! finally
! break " discard interrupt for $VIMNOINTTHROW
! endtry
! endwhile
!
! Xpath 268435456 " X: 268435456
!
! endif
!
! Xcheck 374889517
!
"-------------------------------------------------------------------------------
" Test 62: Catching error exceptions {{{1
--- 1121,1128 ----
Xcheck 311511339
! " Test 61 was moved to test_vimscript.vim
! let Xtest = 62
"-------------------------------------------------------------------------------
" Test 62: Catching error exceptions {{{1
***************
*** 2725,2824 ****
Xcheck 1499645335
!
!
"-------------------------------------------------------------------------------
! " Test 65: Errors in the /pattern/ argument of a :catch {{{1
! "
! " On an error in the /pattern/ argument of a :catch, the :catch does
! " not match. Any following :catches of the same :try/:endtry don't
! " match either. Finally clauses are executed.
!
"-------------------------------------------------------------------------------
!
! XpathINIT
!
! function! 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 = escape(v:errmsg, '"')
! Xout "Unexpected message:" v:errmsg
! endif
! endif
! return match
! endfunction
!
! try
! try
! Xpath 1 " X: 1
! throw "oops"
! catch /^oops$/
! Xpath 2 " X: 2
! catch /\)/ " not checked; exception has already been caught
! Xpath 4 " X: 0
! endtry
! Xpath 8 " X: 8
! catch /.*/
! Xpath 16 " X: 0
! Xout v:exception "in" v:throwpoint
! endtry
!
! function! F()
! try
! let caught = 0
! try
! try
! Xpath 32 " X: 32
! throw "ab"
! catch /abc/ " does not catch
! Xpath 64 " X: 0
! catch /\)/ " error; discards exception
! Xpath 128 " X: 0
! catch /.*/ " not checked
! Xpath 256 " X: 0
! finally
! Xpath 512 " X: 512
! endtry
! Xpath 1024 " X: 0
! catch /^ab$/ " checked, but original exception is discarded
! Xpath 2048 " X: 0
! catch /^Vim(catch):/
! let caught = 1
! let v:errmsg = substitute(v:exception, '^Vim(catch):', '', "")
! finally
! Xpath 4096 " X: 4096
! if !caught && !$VIMNOERRTHROW
! Xpath 8192 " X: 0
! endif
! if !MSG('E475', "Invalid argument")
! Xpath 16384 " X: 0
! endif
! if !caught
! return | " discard error
! endif
! endtry
! catch /.*/
! Xpath 32768 " X: 0
! Xout v:exception "in" v:throwpoint
! endtry
! endfunction
!
! call F()
! Xpath 65536 " X: 65536
!
! delfunction MSG
! delfunction F
! unlet! caught
!
! Xcheck 70187
!
"-------------------------------------------------------------------------------
" Test 66: Stop range :call on error, interrupt, or :throw {{{1
--- 1645,1652 ----
Xcheck 1499645335
! " Test 65 was moved to test_vimscript.vim
! let Xtest = 66
"-------------------------------------------------------------------------------
" Test 66: Stop range :call on error, interrupt, or :throw {{{1
*** ../vim-8.2.1382/src/testdir/test_vimscript.vim 2020-08-05
11:20:45.178462605 +0200
--- src/testdir/test_vimscript.vim 2020-08-07 16:47:00.954221297 +0200
***************
*** 2764,2769 ****
--- 2764,3916 ----
endfunc
"-------------------------------------------------------------------------------
+ " Test 52: Uncaught exceptions
{{{1
+ "
+ " When an exception is thrown but not caught, an error message is
+ " displayed when the script is terminated. In case of an interrupt
+ " or error exception, the normal interrupt or error message(s) are
+ " displayed.
+
"-------------------------------------------------------------------------------
+
+ func Test_uncaught_exception_1()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ Xpath 'a'
+ throw "arrgh"
+ call assert_report('should not get here')`
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('E605: Exception not caught: arrgh', v:errmsg)
+ call assert_equal('a', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+ func Test_uncaught_exception_2()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ try
+ Xpath 'a'
+ throw "oops"
+ call assert_report('should not get here')`
+ catch /arrgh/
+ call assert_report('should not get here')`
+ endtry
+ call assert_report('should not get here')`
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('E605: Exception not caught: oops', v:errmsg)
+ call assert_equal('a', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+ func Test_uncaught_exception_3()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ func T()
+ Xpath 'c'
+ throw "brrr"
+ call assert_report('should not get here')`
+ endfunc
+
+ try
+ Xpath 'a'
+ throw "arrgh"
+ call assert_report('should not get here')`
+ catch /.*/
+ Xpath 'b'
+ call T()
+ call assert_report('should not get here')`
+ endtry
+ call assert_report('should not get here')`
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('E605: Exception not caught: brrr', v:errmsg)
+ call assert_equal('abc', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+ func Test_uncaught_exception_4()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ try
+ Xpath 'a'
+ throw "arrgh"
+ call assert_report('should not get here')`
+ finally
+ Xpath 'b'
+ throw "brrr"
+ call assert_report('should not get here')`
+ endtry
+ call assert_report('should not get here')`
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('E605: Exception not caught: brrr', v:errmsg)
+ call assert_equal('ab', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+ func Test_uncaught_exception_5()
+ CheckEnglish
+
+ " Need to catch and handle interrupt, otherwise the test will wait for the
+ " user to press <Enter> to continue
+ 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')
+ catch /^Vim:Interrupt$/
+ Xpath 'b'
+ endtry
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('ab', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+ func Test_uncaught_exception_6()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ try
+ Xpath 'a'
+ let x = novar " error E121; exception: E121
+ catch /E15:/ " should not catch
+ call assert_report('should not get here')
+ endtry
+ call assert_report('should not get here')
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('a', g:Xpath)
+ call assert_equal('E121: Undefined variable: novar', v:errmsg)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+ func Test_uncaught_exception_7()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ try
+ Xpath 'a'
+ " error E108/E488; exception: E488
+ unlet novar #
+ catch /E108:/ " should not catch
+ call assert_report('should not get here')
+ endtry
+ call assert_report('should not get here')
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('a', g:Xpath)
+ call assert_equal('E488: Trailing characters: #', v:errmsg)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 53: Nesting errors: :endif/:else/:elseif {{{1
+ "
+ " For nesting errors of :if conditionals the correct error messages
+ " should be given.
+
"-------------------------------------------------------------------------------
+
+ func Test_nested_if_else_errors()
+ CheckEnglish
+
+ " :endif without :if
+ let code =<< trim END
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without
:if')
+
+ " :endif without :if
+ let code =<< trim END
+ while 1
+ endif
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without
:if')
+
+ " :endif without :if
+ let code =<< trim END
+ try
+ finally
+ endif
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without
:if')
+
+ " :endif without :if
+ let code =<< trim END
+ try
+ endif
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without
:if')
+
+ " :endif without :if
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ endif
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without
:if')
+
+ " :else without :if
+ let code =<< trim END
+ else
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+
+ " :else without :if
+ let code =<< trim END
+ while 1
+ else
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+
+ " :else without :if
+ let code =<< trim END
+ try
+ finally
+ else
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+
+ " :else without :if
+ let code =<< trim END
+ try
+ else
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+
+ " :else without :if
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ else
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
+
+ " :elseif without :if
+ let code =<< trim END
+ elseif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without
:if')
+
+ " :elseif without :if
+ let code =<< trim END
+ while 1
+ elseif
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without
:if')
+
+ " :elseif without :if
+ let code =<< trim END
+ try
+ finally
+ elseif
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without
:if')
+
+ " :elseif without :if
+ let code =<< trim END
+ try
+ elseif
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without
:if')
+
+ " :elseif without :if
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ elseif
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without
:if')
+
+ " multiple :else
+ let code =<< trim END
+ if 1
+ else
+ else
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(else):E583: multiple :else')
+
+ " :elseif after :else
+ let code =<< trim END
+ if 1
+ else
+ elseif 1
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(elseif):E584: :elseif after
:else')
+
+ call delete('Xtest')
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 54: Nesting errors: :while/:endwhile {{{1
+ "
+ " For nesting errors of :while conditionals the correct error messages
+ " should be given.
+ "
+ " This test reuses the function MESSAGES() from the previous test.
+ " This functions checks the messages in g:msgfile.
+
"-------------------------------------------------------------------------------
+
+ func Test_nested_while_error()
+ CheckEnglish
+
+ " :endwhile without :while
+ let code =<< trim END
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ " :endwhile without :while
+ let code =<< trim END
+ if 1
+ endwhile
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ " Missing :endif
+ let code =<< trim END
+ while 1
+ if 1
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
+
+ " :endwhile without :while
+ let code =<< trim END
+ try
+ finally
+ endwhile
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ " Missing :endtry
+ let code =<< trim END
+ while 1
+ try
+ finally
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing
:endtry')
+
+ " Missing :endtry
+ let code =<< trim END
+ while 1
+ if 1
+ try
+ finally
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing
:endtry')
+
+ " Missing :endif
+ let code =<< trim END
+ while 1
+ try
+ finally
+ if 1
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
+
+ " :endwhile without :while
+ let code =<< trim END
+ try
+ endwhile
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ " :endwhile without :while
+ let code =<< trim END
+ while 1
+ try
+ endwhile
+ endtry
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ " :endwhile without :while
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ endwhile
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ " :endwhile without :while
+ let code =<< trim END
+ while 1
+ try
+ throw "a"
+ catch /a/
+ endwhile
+ endtry
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile
without :while')
+
+ call delete('Xtest')
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 55: Nesting errors: :continue/:break {{{1
+ "
+ " For nesting errors of :continue and :break commands the correct
+ " error messages should be given.
+ "
+ " This test reuses the function MESSAGES() from the previous test.
+ " This functions checks the messages in g:msgfile.
+
"-------------------------------------------------------------------------------
+
+ func Test_nested_cont_break_error()
+ CheckEnglish
+
+ " :continue without :while
+ let code =<< trim END
+ continue
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(continue):E586: :continue
without :while or :for')
+
+ " :continue without :while
+ let code =<< trim END
+ if 1
+ continue
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(continue):E586: :continue
without :while or :for')
+
+ " :continue without :while
+ let code =<< trim END
+ try
+ finally
+ continue
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(continue):E586: :continue
without :while or :for')
+
+ " :continue without :while
+ let code =<< trim END
+ try
+ continue
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(continue):E586: :continue
without :while or :for')
+
+ " :continue without :while
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ continue
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(continue):E586: :continue
without :while or :for')
+
+ " :break without :while
+ let code =<< trim END
+ break
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(break):E587: :break without
:while or :for')
+
+ " :break without :while
+ let code =<< trim END
+ if 1
+ break
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(break):E587: :break without
:while or :for')
+
+ " :break without :while
+ let code =<< trim END
+ try
+ finally
+ break
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(break):E587: :break without
:while or :for')
+
+ " :break without :while
+ let code =<< trim END
+ try
+ break
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(break):E587: :break without
:while or :for')
+
+ " :break without :while
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ break
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(break):E587: :break without
:while or :for')
+
+ call delete('Xtest')
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 56: Nesting errors: :endtry {{{1
+ "
+ " For nesting errors of :try conditionals the correct error messages
+ " should be given.
+ "
+ " This test reuses the function MESSAGES() from the previous test.
+ " This functions checks the messages in g:msgfile.
+
"-------------------------------------------------------------------------------
+
+ func Test_nested_endtry_error()
+ CheckEnglish
+
+ " :endtry without :try
+ let code =<< trim END
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without
:try')
+
+ " :endtry without :try
+ let code =<< trim END
+ if 1
+ endtry
+ endif
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without
:try')
+
+ " :endtry without :try
+ let code =<< trim END
+ while 1
+ endtry
+ endwhile
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without
:try')
+
+ " Missing :endif
+ let code =<< trim END
+ try
+ if 1
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
+
+ " Missing :endwhile
+ let code =<< trim END
+ try
+ while 1
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing
:endwhile')
+
+ " Missing :endif
+ let code =<< trim END
+ try
+ finally
+ if 1
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
+
+ " Missing :endwhile
+ let code =<< trim END
+ try
+ finally
+ while 1
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing
:endwhile')
+
+ " Missing :endif
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ if 1
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
+
+ " Missing :endwhile
+ let code =<< trim END
+ try
+ throw "a"
+ catch /a/
+ while 1
+ endtry
+ END
+ call writefile(code, 'Xtest')
+ call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing
:endwhile')
+
+ call delete('Xtest')
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 57: v:exception and v:throwpoint for user exceptions {{{1
+ "
+ " v:exception evaluates to the value of the exception that was caught
+ " most recently and is not finished. (A caught exception is finished
+ " when the next ":catch", ":finally", or ":endtry" is reached.)
+ " v:throwpoint evaluates to the script/function name and line number
+ " where that exception has been thrown.
+
"-------------------------------------------------------------------------------
+
+ func Test_user_exception_info()
+ CheckEnglish
+
+ XpathINIT
+ XloopINIT
+
+ func FuncException()
+ let g:exception = v:exception
+ endfunc
+
+ func FuncThrowpoint()
+ let g:throwpoint = v:throwpoint
+ endfunc
+
+ let scriptException = MakeScript("FuncException")
+ let scriptThrowPoint = MakeScript("FuncThrowpoint")
+
+ command! CmdException let g:exception = v:exception
+ command! CmdThrowpoint let g:throwpoint = v:throwpoint
+
+ func T(arg, line)
+ if a:line == 2
+ throw a:arg " in line 2
+ elseif a:line == 4
+ throw a:arg " in line 4
+ elseif a:line == 6
+ throw a:arg " in line 6
+ elseif a:line == 8
+ throw a:arg " in line 8
+ endif
+ endfunc
+
+ func G(arg, line)
+ call T(a:arg, a:line)
+ endfunc
+
+ func F(arg, line)
+ call G(a:arg, a:line)
+ endfunc
+
+ let scriptT = MakeScript("T")
+ let scriptG = MakeScript("G", scriptT)
+ let scriptF = MakeScript("F", scriptG)
+
+ try
+ Xpath 'a'
+ call F("oops", 2)
+ catch /.*/
+ Xpath 'b'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+
+ exec "let exception = v:exception"
+ exec "let throwpoint = v:throwpoint"
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+
+ CmdException
+ CmdThrowpoint
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+
+ call FuncException()
+ call FuncThrowpoint()
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+
+ exec "source" scriptException
+ exec "source" scriptThrowPoint
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+
+ try
+ Xpath 'c'
+ call G("arrgh", 4)
+ catch /.*/
+ Xpath 'd'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("arrgh", v:exception)
+ call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<4\>', v:throwpoint)
+
+ try
+ Xpath 'e'
+ let g:arg = "autsch"
+ let g:line = 6
+ exec "source" scriptF
+ catch /.*/
+ Xpath 'f'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("autsch", v:exception)
+ call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
+ call assert_match('\<6\>', v:throwpoint)
+ finally
+ Xpath 'g'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("arrgh", v:exception)
+ call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<4\>', v:throwpoint)
+ try
+ Xpath 'h'
+ let g:arg = "brrrr"
+ let g:line = 8
+ exec "source" scriptG
+ catch /.*/
+ Xpath 'i'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ " Resolve scriptT for matching it against v:throwpoint.
+ call assert_equal("brrrr", v:exception)
+ call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
+ call assert_match('\<8\>', v:throwpoint)
+ finally
+ Xpath 'j'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("arrgh", v:exception)
+ call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<4\>', v:throwpoint)
+ endtry
+ Xpath 'k'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("arrgh", v:exception)
+ call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<4\>', v:throwpoint)
+ endtry
+ Xpath 'l'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("arrgh", v:exception)
+ call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<4\>', v:throwpoint)
+ finally
+ Xpath 'm'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+ endtry
+ Xpath 'n'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("oops", v:exception)
+ call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
+ call assert_match('\<2\>', v:throwpoint)
+ finally
+ Xpath 'o'
+ let exception = v:exception
+ let throwpoint = v:throwpoint
+ call assert_equal("", v:exception)
+ call assert_match('^$', v:throwpoint)
+ call assert_match('^$', v:throwpoint)
+ endtry
+
+ call assert_equal('abcdefghijklmno', g:Xpath)
+
+ unlet exception throwpoint
+ delfunction FuncException
+ delfunction FuncThrowpoint
+ call delete(scriptException)
+ call delete(scriptThrowPoint)
+ unlet scriptException scriptThrowPoint
+ delcommand CmdException
+ delcommand CmdThrowpoint
+ delfunction T
+ delfunction G
+ delfunction F
+ call delete(scriptT)
+ call delete(scriptG)
+ call delete(scriptF)
+ unlet scriptT scriptG scriptF
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ "
+ " Test 58: v:exception and v:throwpoint for error/interrupt exceptions
{{{1
+ "
+ " v:exception and v:throwpoint work also for error and interrupt
+ " exceptions.
+
"-------------------------------------------------------------------------------
+
+ func Test_execption_info_for_error()
+ CheckEnglish
+
+ let test =<< trim [CODE]
+ func T(line)
+ if a:line == 2
+ delfunction T " error (function in use) in line 2
+ elseif a:line == 4
+ call interrupt()
+ endif
+ endfunc
+
+ while 1
+ try
+ Xpath 'a'
+ call T(2)
+ call assert_report('should not get here')
+ catch /.*/
+ Xpath 'b'
+ if v:exception !~ 'Vim(delfunction):'
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint !~ '\<T\>'
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint !~ '\<2\>'
+ call assert_report('should not get here')
+ endif
+ finally
+ Xpath 'c'
+ if v:exception != ""
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint != ""
+ call assert_report('should not get here')
+ endif
+ break
+ endtry
+ endwhile
+
+ Xpath 'd'
+ if v:exception != ""
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint != ""
+ call assert_report('should not get here')
+ endif
+
+ while 1
+ try
+ Xpath 'e'
+ call T(4)
+ call assert_report('should not get here')
+ catch /.*/
+ Xpath 'f'
+ if v:exception != 'Vim:Interrupt'
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint !~ 'function T'
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint !~ '\<4\>'
+ call assert_report('should not get here')
+ endif
+ finally
+ Xpath 'g'
+ if v:exception != ""
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint != ""
+ call assert_report('should not get here')
+ endif
+ break
+ endtry
+ endwhile
+
+ Xpath 'h'
+ if v:exception != ""
+ call assert_report('should not get here')
+ endif
+ if v:throwpoint != ""
+ call assert_report('should not get here')
+ endif
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('abcdefgh', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 61: Catching interrupt exceptions {{{1
+ "
+ " When an interrupt occurs inside a :try/:endtry region, an
+ " interrupt exception is thrown and can be caught. Its value is
+ " "Vim:Interrupt". If the interrupt occurs after an error or a :throw
+ " but before a matching :catch is reached, all following :catches of
+ " that try block are ignored, but the interrupt exception can be
+ " caught by the next surrounding try conditional. An interrupt is
+ " ignored when there is a previous interrupt that has not been caught
+ " or causes a :finally clause to be executed.
+
"-------------------------------------------------------------------------------
+
+ func Test_catch_intr_exception()
+ let test =<< trim [CODE]
+ while 1
+ try
+ try
+ Xpath 'a'
+ call interrupt()
+ call assert_report('should not get here')
+ catch /^Vim:Interrupt$/
+ Xpath 'b'
+ finally
+ Xpath 'c'
+ endtry
+ catch /.*/
+ call assert_report('should not get here')
+ finally
+ Xpath 'd'
+ break
+ endtry
+ endwhile
+
+ while 1
+ try
+ try
+ try
+ Xpath 'e'
+ asdf
+ call assert_report('should not get here')
+ catch /do_not_catch/
+ call assert_report('should not get here')
+ catch /.*/
+ Xpath 'f'
+ call interrupt()
+ call assert_report('should not get here')
+ catch /.*/
+ call assert_report('should not get here')
+ finally
+ Xpath 'g'
+ call interrupt()
+ call assert_report('should not get here')
+ endtry
+ catch /^Vim:Interrupt$/
+ Xpath 'h'
+ finally
+ Xpath 'i'
+ endtry
+ catch /.*/
+ call assert_report('should not get here')
+ finally
+ Xpath 'j'
+ break
+ endtry
+ endwhile
+
+ while 1
+ try
+ try
+ try
+ Xpath 'k'
+ throw "x"
+ call assert_report('should not get here')
+ catch /do_not_catch/
+ call assert_report('should not get here')
+ catch /x/
+ Xpath 'l'
+ call interrupt()
+ call assert_report('should not get here')
+ catch /.*/
+ call assert_report('should not get here')
+ endtry
+ catch /^Vim:Interrupt$/
+ Xpath 'm'
+ finally
+ Xpath 'n'
+ endtry
+ catch /.*/
+ call assert_report('should not get here')
+ finally
+ Xpath 'o'
+ break
+ endtry
+ endwhile
+
+ while 1
+ try
+ try
+ Xpath 'p'
+ call interrupt()
+ call assert_report('should not get here')
+ catch /do_not_catch/
+ call interrupt()
+ call assert_report('should not get here')
+ catch /^Vim:Interrupt$/
+ Xpath 'q'
+ finally
+ Xpath 'r'
+ endtry
+ catch /.*/
+ call assert_report('should not get here')
+ finally
+ Xpath 's'
+ break
+ endtry
+ endwhile
+
+ Xpath 't'
+ [CODE]
+ let verify =<< trim [CODE]
+ call assert_equal('abcdefghijklmnopqrst', g:Xpath)
+ [CODE]
+ call RunInNewVim(test, verify)
+ endfunc
+
+
"-------------------------------------------------------------------------------
+ " Test 65: Errors in the /pattern/ argument of a :catch {{{1
+ "
+ " On an error in the /pattern/ argument of a :catch, the :catch does
+ " not match. Any following :catches of the same :try/:endtry don't
+ " match either. Finally clauses are executed.
+
"-------------------------------------------------------------------------------
+
+ func Test_catch_pattern_error()
+ CheckEnglish
+ XpathINIT
+
+ try
+ try
+ Xpath 'a'
+ throw "oops"
+ catch /^oops$/
+ Xpath 'b'
+ catch /\)/ " not checked; exception has already been caught
+ call assert_report('should not get here')
+ endtry
+ Xpath 'c'
+ catch /.*/
+ call assert_report('should not get here')
+ endtry
+ call assert_equal('abc', g:Xpath)
+
+ XpathINIT
+ func F()
+ try
+ try
+ try
+ Xpath 'a'
+ throw "ab"
+ catch /abc/ " does not catch
+ call assert_report('should not get here')
+ catch /\)/ " error; discards exception
+ call assert_report('should not get here')
+ catch /.*/ " not checked
+ call assert_report('should not get here')
+ finally
+ Xpath 'b'
+ endtry
+ call assert_report('should not get here')
+ catch /^ab$/ " checked, but original exception is discarded
+ call assert_report('should not get here')
+ catch /^Vim(catch):/
+ Xpath 'c'
+ call assert_match('Vim(catch):E475: Invalid argument:', v:exception)
+ finally
+ Xpath 'd'
+ endtry
+ Xpath 'e'
+ catch /.*/
+ call assert_report('should not get here')
+ endtry
+ Xpath 'f'
+ endfunc
+
+ call F()
+ call assert_equal('abcdef', g:Xpath)
+
+ delfunc F
+ endfunc
+
+
"-------------------------------------------------------------------------------
" Test 87 using (expr) ? funcref : funcref {{{1
"
" Vim needs to correctly parse the funcref and even when it does
*** ../vim-8.2.1382/src/version.c 2020-08-06 22:11:02.565081026 +0200
--- src/version.c 2020-08-07 16:48:20.606021816 +0200
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 1383,
/**/
--
hundred-and-one symptoms of being an internet addict:
138. You develop a liking for cold coffee.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/202008071449.077Enawo3854615%40masaka.moolenaar.net.