15d7ead3bSBram Moolenaar" Test various aspects of the Vim script language.
2b544f3c8SBram Moolenaar" Most of this was formerly in test49.
3b544f3c8SBram Moolenaar
48c5a278fSBram Moolenaarsource check.vim
593344c2dSBram Moolenaarsource shared.vim
6a6296200SBram Moolenaarsource script_util.vim
78c5a278fSBram Moolenaar
8b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
9b544f3c8SBram Moolenaar" Test environment							    {{{1
10b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
11b544f3c8SBram Moolenaar
12b544f3c8SBram Moolenaar" Append a message to the "messages" file
131e115360SBram Moolenaarfunc Xout(text)
14b544f3c8SBram Moolenaar    split messages
15b544f3c8SBram Moolenaar    $put =a:text
16b544f3c8SBram Moolenaar    wq
17b544f3c8SBram Moolenaarendfunc
18b544f3c8SBram Moolenaar
19b544f3c8SBram Moolenaarcom! -nargs=1	     Xout     call Xout(<args>)
20b544f3c8SBram Moolenaar
21a6296200SBram Moolenaar" Create a new instance of Vim and run the commands in 'test' and then 'verify'
22a6296200SBram Moolenaar" The commands in 'test' are expected to store the test results in the Xtest.out
23a6296200SBram Moolenaar" file. If the test passes successfully, then Xtest.out should be empty.
24a6296200SBram Moolenaarfunc RunInNewVim(test, verify)
25a6296200SBram Moolenaar  let init =<< trim END
26*efb64829SBram Moolenaar    set cpo-=C            " support line-continuation in sourced script
27a6296200SBram Moolenaar    source script_util.vim
28a6296200SBram Moolenaar    XpathINIT
29a6296200SBram Moolenaar    XloopINIT
30a6296200SBram Moolenaar  END
31a6296200SBram Moolenaar  let cleanup =<< trim END
32a6296200SBram Moolenaar    call writefile(v:errors, 'Xtest.out')
33a6296200SBram Moolenaar    qall
34a6296200SBram Moolenaar  END
35a6296200SBram Moolenaar  call writefile(init, 'Xtest.vim')
36a6296200SBram Moolenaar  call writefile(a:test, 'Xtest.vim', 'a')
37a6296200SBram Moolenaar  call writefile(a:verify, 'Xverify.vim')
38a6296200SBram Moolenaar  call writefile(cleanup, 'Xverify.vim', 'a')
39a6296200SBram Moolenaar  call RunVim([], [], "-S Xtest.vim -S Xverify.vim")
40a6296200SBram Moolenaar  call assert_equal([], readfile('Xtest.out'))
41a6296200SBram Moolenaar  call delete('Xtest.out')
42a6296200SBram Moolenaar  call delete('Xtest.vim')
43a6296200SBram Moolenaar  call delete('Xverify.vim')
441e115360SBram Moolenaarendfunc
45b544f3c8SBram Moolenaar
46b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
47b544f3c8SBram Moolenaar" Test 1:   :endwhile in function					    {{{1
48b544f3c8SBram Moolenaar"
49b544f3c8SBram Moolenaar"	    Detect if a broken loop is (incorrectly) reactivated by the
50b544f3c8SBram Moolenaar"	    :endwhile.  Use a :return to prevent an endless loop, and make
51b544f3c8SBram Moolenaar"	    this test first to get a meaningful result on an error before other
52b544f3c8SBram Moolenaar"	    tests will hang.
53b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
54b544f3c8SBram Moolenaar
55a6296200SBram Moolenaarfunc T1_F()
56b544f3c8SBram Moolenaar    Xpath 'a'
57b544f3c8SBram Moolenaar    let first = 1
58b544f3c8SBram Moolenaar    while 1
59b544f3c8SBram Moolenaar	Xpath 'b'
60b544f3c8SBram Moolenaar	if first
61b544f3c8SBram Moolenaar	    Xpath 'c'
62b544f3c8SBram Moolenaar	    let first = 0
63b544f3c8SBram Moolenaar	    break
64b544f3c8SBram Moolenaar	else
65b544f3c8SBram Moolenaar	    Xpath 'd'
66b544f3c8SBram Moolenaar	    return
67b544f3c8SBram Moolenaar	endif
68b544f3c8SBram Moolenaar    endwhile
69a6296200SBram Moolenaarendfunc
70b544f3c8SBram Moolenaar
71a6296200SBram Moolenaarfunc T1_G()
72b544f3c8SBram Moolenaar    Xpath 'h'
73b544f3c8SBram Moolenaar    let first = 1
74b544f3c8SBram Moolenaar    while 1
75b544f3c8SBram Moolenaar	Xpath 'i'
76b544f3c8SBram Moolenaar	if first
77b544f3c8SBram Moolenaar	    Xpath 'j'
78b544f3c8SBram Moolenaar	    let first = 0
79b544f3c8SBram Moolenaar	    break
80b544f3c8SBram Moolenaar	else
81b544f3c8SBram Moolenaar	    Xpath 'k'
82b544f3c8SBram Moolenaar	    return
83b544f3c8SBram Moolenaar	endif
84b544f3c8SBram Moolenaar	if 1	" unmatched :if
85b544f3c8SBram Moolenaar    endwhile
86a6296200SBram Moolenaarendfunc
87b544f3c8SBram Moolenaar
88b544f3c8SBram Moolenaarfunc Test_endwhile_function()
89b544f3c8SBram Moolenaar  XpathINIT
90b544f3c8SBram Moolenaar  call T1_F()
91b544f3c8SBram Moolenaar  Xpath 'F'
92b544f3c8SBram Moolenaar
93b544f3c8SBram Moolenaar  try
94b544f3c8SBram Moolenaar    call T1_G()
95b544f3c8SBram Moolenaar  catch
96b544f3c8SBram Moolenaar    " Catch missing :endif
97b544f3c8SBram Moolenaar    call assert_true(v:exception =~ 'E171')
98b544f3c8SBram Moolenaar    Xpath 'x'
99b544f3c8SBram Moolenaar  endtry
100b544f3c8SBram Moolenaar  Xpath 'G'
101b544f3c8SBram Moolenaar
102b544f3c8SBram Moolenaar  call assert_equal('abcFhijxG', g:Xpath)
103b544f3c8SBram Moolenaarendfunc
104b544f3c8SBram Moolenaar
105b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
106b544f3c8SBram Moolenaar" Test 2:   :endwhile in script						    {{{1
107b544f3c8SBram Moolenaar"
108b544f3c8SBram Moolenaar"	    Detect if a broken loop is (incorrectly) reactivated by the
109b544f3c8SBram Moolenaar"	    :endwhile.  Use a :finish to prevent an endless loop, and place
110b544f3c8SBram Moolenaar"	    this test before others that might hang to get a meaningful result
111b544f3c8SBram Moolenaar"	    on an error.
112b544f3c8SBram Moolenaar"
113b544f3c8SBram Moolenaar"	    This test executes the bodies of the functions T1_F and T1_G from
114b544f3c8SBram Moolenaar"	    the previous test as script files (:return replaced by :finish).
115b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
116b544f3c8SBram Moolenaar
117b544f3c8SBram Moolenaarfunc Test_endwhile_script()
118b544f3c8SBram Moolenaar  XpathINIT
119b544f3c8SBram Moolenaar  ExecAsScript T1_F
120b544f3c8SBram Moolenaar  Xpath 'F'
121b544f3c8SBram Moolenaar  call DeleteTheScript()
122b544f3c8SBram Moolenaar
123b544f3c8SBram Moolenaar  try
124b544f3c8SBram Moolenaar    ExecAsScript T1_G
125b544f3c8SBram Moolenaar  catch
126b544f3c8SBram Moolenaar    " Catch missing :endif
127b544f3c8SBram Moolenaar    call assert_true(v:exception =~ 'E171')
128b544f3c8SBram Moolenaar    Xpath 'x'
129b544f3c8SBram Moolenaar  endtry
130b544f3c8SBram Moolenaar  Xpath 'G'
131b544f3c8SBram Moolenaar  call DeleteTheScript()
132b544f3c8SBram Moolenaar
133b544f3c8SBram Moolenaar  call assert_equal('abcFhijxG', g:Xpath)
134b544f3c8SBram Moolenaarendfunc
135b544f3c8SBram Moolenaar
136b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
137b544f3c8SBram Moolenaar" Test 3:   :if, :elseif, :while, :continue, :break			    {{{1
138b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
139b544f3c8SBram Moolenaar
140a6296200SBram Moolenaarfunc Test_if_while()
141b544f3c8SBram Moolenaar    XpathINIT
142b544f3c8SBram Moolenaar    if 1
143b544f3c8SBram Moolenaar	Xpath 'a'
144b544f3c8SBram Moolenaar	let loops = 3
145b544f3c8SBram Moolenaar	while loops > -1	    " main loop: loops == 3, 2, 1 (which breaks)
146b544f3c8SBram Moolenaar	    if loops <= 0
147b544f3c8SBram Moolenaar		let break_err = 1
148b544f3c8SBram Moolenaar		let loops = -1
149b544f3c8SBram Moolenaar	    else
150b544f3c8SBram Moolenaar		Xpath 'b' . loops
151b544f3c8SBram Moolenaar	    endif
152b544f3c8SBram Moolenaar	    if (loops == 2)
153b544f3c8SBram Moolenaar		while loops == 2 " dummy loop
154b544f3c8SBram Moolenaar		    Xpath 'c' . loops
155b544f3c8SBram Moolenaar		    let loops = loops - 1
156b544f3c8SBram Moolenaar		    continue    " stop dummy loop
157b544f3c8SBram Moolenaar		    Xpath 'd' . loops
158b544f3c8SBram Moolenaar		endwhile
159b544f3c8SBram Moolenaar		continue	    " continue main loop
160b544f3c8SBram Moolenaar		Xpath 'e' . loops
161b544f3c8SBram Moolenaar	    elseif (loops == 1)
162b544f3c8SBram Moolenaar		let p = 1
163b544f3c8SBram Moolenaar		while p	    " dummy loop
164b544f3c8SBram Moolenaar		    Xpath 'f' . loops
165b544f3c8SBram Moolenaar		    let p = 0
166b544f3c8SBram Moolenaar		    break	    " break dummy loop
167b544f3c8SBram Moolenaar		    Xpath 'g' . loops
168b544f3c8SBram Moolenaar		endwhile
169b544f3c8SBram Moolenaar		Xpath 'h' . loops
170b544f3c8SBram Moolenaar		unlet p
171b544f3c8SBram Moolenaar		break	    " break main loop
172b544f3c8SBram Moolenaar		Xpath 'i' . loops
173b544f3c8SBram Moolenaar	    endif
174b544f3c8SBram Moolenaar	    if (loops > 0)
175b544f3c8SBram Moolenaar		Xpath 'j' . loops
176b544f3c8SBram Moolenaar	    endif
177b544f3c8SBram Moolenaar	    while loops == 3    " dummy loop
178b544f3c8SBram Moolenaar		let loops = loops - 1
179b544f3c8SBram Moolenaar	    endwhile	    " end dummy loop
180b544f3c8SBram Moolenaar	endwhile		    " end main loop
181b544f3c8SBram Moolenaar	Xpath 'k'
182b544f3c8SBram Moolenaar    else
183b544f3c8SBram Moolenaar	Xpath 'l'
184b544f3c8SBram Moolenaar    endif
185b544f3c8SBram Moolenaar    Xpath 'm'
186b544f3c8SBram Moolenaar    if exists("break_err")
187b544f3c8SBram Moolenaar	Xpath 'm'
188b544f3c8SBram Moolenaar	unlet break_err
189b544f3c8SBram Moolenaar    endif
190b544f3c8SBram Moolenaar
191b544f3c8SBram Moolenaar    unlet loops
192b544f3c8SBram Moolenaar
193b544f3c8SBram Moolenaar    call assert_equal('ab3j3b2c2b1f1h1km', g:Xpath)
194b544f3c8SBram Moolenaarendfunc
195b544f3c8SBram Moolenaar
196b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
197b544f3c8SBram Moolenaar" Test 4:   :return							    {{{1
198b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
199b544f3c8SBram Moolenaar
200a6296200SBram Moolenaarfunc T4_F()
201b544f3c8SBram Moolenaar    if 1
202b544f3c8SBram Moolenaar	Xpath 'a'
203b544f3c8SBram Moolenaar	let loops = 3
204b544f3c8SBram Moolenaar	while loops > 0				"    3:  2:     1:
205b544f3c8SBram Moolenaar	    Xpath 'b' . loops
206b544f3c8SBram Moolenaar	    if (loops == 2)
207b544f3c8SBram Moolenaar		Xpath 'c' . loops
208b544f3c8SBram Moolenaar		return
209b544f3c8SBram Moolenaar		Xpath 'd' . loops
210b544f3c8SBram Moolenaar	    endif
211b544f3c8SBram Moolenaar	    Xpath 'e' . loops
212b544f3c8SBram Moolenaar	    let loops = loops - 1
213b544f3c8SBram Moolenaar	endwhile
214b544f3c8SBram Moolenaar	Xpath 'f'
215b544f3c8SBram Moolenaar    else
216b544f3c8SBram Moolenaar	Xpath 'g'
217b544f3c8SBram Moolenaar    endif
218a6296200SBram Moolenaarendfunc
219b544f3c8SBram Moolenaar
220a6296200SBram Moolenaarfunc Test_return()
221b544f3c8SBram Moolenaar    XpathINIT
222b544f3c8SBram Moolenaar    call T4_F()
223b544f3c8SBram Moolenaar    Xpath '4'
224b544f3c8SBram Moolenaar
225b544f3c8SBram Moolenaar    call assert_equal('ab3e3b2c24', g:Xpath)
226a6296200SBram Moolenaarendfunc
227b544f3c8SBram Moolenaar
228b544f3c8SBram Moolenaar
229b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
230b544f3c8SBram Moolenaar" Test 5:   :finish							    {{{1
231b544f3c8SBram Moolenaar"
232b544f3c8SBram Moolenaar"	    This test executes the body of the function T4_F from the previous
233b544f3c8SBram Moolenaar"	    test as a script file (:return replaced by :finish).
234b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
235b544f3c8SBram Moolenaar
236a6296200SBram Moolenaarfunc Test_finish()
237b544f3c8SBram Moolenaar    XpathINIT
238b544f3c8SBram Moolenaar    ExecAsScript T4_F
239b544f3c8SBram Moolenaar    Xpath '5'
240b544f3c8SBram Moolenaar    call DeleteTheScript()
241b544f3c8SBram Moolenaar
242b544f3c8SBram Moolenaar    call assert_equal('ab3e3b2c25', g:Xpath)
243a6296200SBram Moolenaarendfunc
244b544f3c8SBram Moolenaar
245b544f3c8SBram Moolenaar
246b544f3c8SBram Moolenaar
247b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
248b544f3c8SBram Moolenaar" Test 6:   Defining functions in :while loops				    {{{1
249b544f3c8SBram Moolenaar"
250b544f3c8SBram Moolenaar"	     Functions can be defined inside other functions.  An inner function
251b544f3c8SBram Moolenaar"	     gets defined when the outer function is executed.  Functions may
252b544f3c8SBram Moolenaar"	     also be defined inside while loops.  Expressions in braces for
253b544f3c8SBram Moolenaar"	     defining the function name are allowed.
254b544f3c8SBram Moolenaar"
255b544f3c8SBram Moolenaar"	     The functions are defined when sourcing the script, only the
256b544f3c8SBram Moolenaar"	     resulting path is checked in the test function.
257b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
258b544f3c8SBram Moolenaar
259b544f3c8SBram MoolenaarXpathINIT
260b544f3c8SBram Moolenaar
261b544f3c8SBram Moolenaar" The command CALL collects the argument of all its invocations in "calls"
262b544f3c8SBram Moolenaar" when used from a function (that is, when the global variable "calls" needs
263b544f3c8SBram Moolenaar" the "g:" prefix).  This is to check that the function code is skipped when
264b544f3c8SBram Moolenaar" the function is defined.  For inner functions, do so only if the outer
265b544f3c8SBram Moolenaar" function is not being executed.
266b544f3c8SBram Moolenaar"
267b544f3c8SBram Moolenaarlet calls = ""
268b544f3c8SBram Moolenaarcom! -nargs=1 CALL
269b544f3c8SBram Moolenaar	    \ if !exists("calls") && !exists("outer") |
270b544f3c8SBram Moolenaar	    \ let g:calls = g:calls . <args> |
271b544f3c8SBram Moolenaar	    \ endif
272b544f3c8SBram Moolenaar
273b544f3c8SBram Moolenaarlet i = 0
274b544f3c8SBram Moolenaarwhile i < 3
275b544f3c8SBram Moolenaar    let i = i + 1
276b544f3c8SBram Moolenaar    if i == 1
277b544f3c8SBram Moolenaar	Xpath 'a'
278b544f3c8SBram Moolenaar	function! F1(arg)
279b544f3c8SBram Moolenaar	    CALL a:arg
280b544f3c8SBram Moolenaar	    let outer = 1
281b544f3c8SBram Moolenaar
282b544f3c8SBram Moolenaar	    let j = 0
283b544f3c8SBram Moolenaar	    while j < 1
284b544f3c8SBram Moolenaar		Xpath 'b'
285b544f3c8SBram Moolenaar		let j = j + 1
286b544f3c8SBram Moolenaar		function! G1(arg)
287b544f3c8SBram Moolenaar		    CALL a:arg
288b544f3c8SBram Moolenaar		endfunction
289b544f3c8SBram Moolenaar		Xpath 'c'
290b544f3c8SBram Moolenaar	    endwhile
291b544f3c8SBram Moolenaar	endfunction
292b544f3c8SBram Moolenaar	Xpath 'd'
293b544f3c8SBram Moolenaar
294b544f3c8SBram Moolenaar	continue
295b544f3c8SBram Moolenaar    endif
296b544f3c8SBram Moolenaar
297b544f3c8SBram Moolenaar    Xpath 'e' . i
298b544f3c8SBram Moolenaar    function! F{i}(i, arg)
299b544f3c8SBram Moolenaar	CALL a:arg
300b544f3c8SBram Moolenaar	let outer = 1
301b544f3c8SBram Moolenaar
302b544f3c8SBram Moolenaar	if a:i == 3
303b544f3c8SBram Moolenaar	    Xpath 'f'
304b544f3c8SBram Moolenaar	endif
305b544f3c8SBram Moolenaar	let k = 0
306b544f3c8SBram Moolenaar	while k < 3
307b544f3c8SBram Moolenaar	    Xpath 'g' . k
308b544f3c8SBram Moolenaar	    let k = k + 1
309b544f3c8SBram Moolenaar	    function! G{a:i}{k}(arg)
310b544f3c8SBram Moolenaar		CALL a:arg
311b544f3c8SBram Moolenaar	    endfunction
312b544f3c8SBram Moolenaar	    Xpath 'h' . k
313b544f3c8SBram Moolenaar	endwhile
314b544f3c8SBram Moolenaar    endfunction
315b544f3c8SBram Moolenaar    Xpath 'i'
316b544f3c8SBram Moolenaar
317b544f3c8SBram Moolenaarendwhile
318b544f3c8SBram Moolenaar
319b544f3c8SBram Moolenaarif exists("*G1")
320b544f3c8SBram Moolenaar    Xpath 'j'
321b544f3c8SBram Moolenaarendif
322b544f3c8SBram Moolenaarif exists("*F1")
323b544f3c8SBram Moolenaar    call F1("F1")
324b544f3c8SBram Moolenaar    if exists("*G1")
325b544f3c8SBram Moolenaar       call G1("G1")
326b544f3c8SBram Moolenaar    endif
327b544f3c8SBram Moolenaarendif
328b544f3c8SBram Moolenaar
329b544f3c8SBram Moolenaarif exists("G21") || exists("G22") || exists("G23")
330b544f3c8SBram Moolenaar    Xpath 'k'
331b544f3c8SBram Moolenaarendif
332b544f3c8SBram Moolenaarif exists("*F2")
333b544f3c8SBram Moolenaar    call F2(2, "F2")
334b544f3c8SBram Moolenaar    if exists("*G21")
335b544f3c8SBram Moolenaar       call G21("G21")
336b544f3c8SBram Moolenaar    endif
337b544f3c8SBram Moolenaar    if exists("*G22")
338b544f3c8SBram Moolenaar       call G22("G22")
339b544f3c8SBram Moolenaar    endif
340b544f3c8SBram Moolenaar    if exists("*G23")
341b544f3c8SBram Moolenaar       call G23("G23")
342b544f3c8SBram Moolenaar    endif
343b544f3c8SBram Moolenaarendif
344b544f3c8SBram Moolenaar
345b544f3c8SBram Moolenaarif exists("G31") || exists("G32") || exists("G33")
346b544f3c8SBram Moolenaar    Xpath 'l'
347b544f3c8SBram Moolenaarendif
348b544f3c8SBram Moolenaarif exists("*F3")
349b544f3c8SBram Moolenaar    call F3(3, "F3")
350b544f3c8SBram Moolenaar    if exists("*G31")
351b544f3c8SBram Moolenaar       call G31("G31")
352b544f3c8SBram Moolenaar    endif
353b544f3c8SBram Moolenaar    if exists("*G32")
354b544f3c8SBram Moolenaar       call G32("G32")
355b544f3c8SBram Moolenaar    endif
356b544f3c8SBram Moolenaar    if exists("*G33")
357b544f3c8SBram Moolenaar       call G33("G33")
358b544f3c8SBram Moolenaar    endif
359b544f3c8SBram Moolenaarendif
360b544f3c8SBram Moolenaar
361b544f3c8SBram MoolenaarXpath 'm'
362b544f3c8SBram Moolenaar
363b544f3c8SBram Moolenaarlet g:test6_result = g:Xpath
364b544f3c8SBram Moolenaarlet g:test6_calls = calls
365b544f3c8SBram Moolenaar
366b544f3c8SBram Moolenaarunlet calls
367b544f3c8SBram Moolenaardelfunction F1
368b544f3c8SBram Moolenaardelfunction G1
369b544f3c8SBram Moolenaardelfunction F2
370b544f3c8SBram Moolenaardelfunction G21
371b544f3c8SBram Moolenaardelfunction G22
372b544f3c8SBram Moolenaardelfunction G23
373b544f3c8SBram Moolenaardelfunction G31
374b544f3c8SBram Moolenaardelfunction G32
375b544f3c8SBram Moolenaardelfunction G33
376b544f3c8SBram Moolenaar
377a6296200SBram Moolenaarfunc Test_defining_functions()
378b544f3c8SBram Moolenaar    call assert_equal('ade2ie3ibcg0h1g1h2g2h3fg0h1g1h2g2h3m', g:test6_result)
379b544f3c8SBram Moolenaar    call assert_equal('F1G1F2G21G22G23F3G31G32G33', g:test6_calls)
380b544f3c8SBram Moolenaarendfunc
381b544f3c8SBram Moolenaar
382b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
383b544f3c8SBram Moolenaar" Test 7:   Continuing on errors outside functions			    {{{1
384b544f3c8SBram Moolenaar"
385b544f3c8SBram Moolenaar"	    On an error outside a function, the script processing continues
386b544f3c8SBram Moolenaar"	    at the line following the outermost :endif or :endwhile.  When not
387b544f3c8SBram Moolenaar"	    inside an :if or :while, the script processing continues at the next
388b544f3c8SBram Moolenaar"	    line.
389b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
390b544f3c8SBram Moolenaar
391b544f3c8SBram MoolenaarXpathINIT
392b544f3c8SBram Moolenaar
393b544f3c8SBram Moolenaarif 1
394b544f3c8SBram Moolenaar    Xpath 'a'
395b544f3c8SBram Moolenaar    while 1
396b544f3c8SBram Moolenaar	Xpath 'b'
397b544f3c8SBram Moolenaar	asdf
398b544f3c8SBram Moolenaar	Xpath 'c'
399b544f3c8SBram Moolenaar	break
400b544f3c8SBram Moolenaar    endwhile | Xpath 'd'
401b544f3c8SBram Moolenaar    Xpath 'e'
402b544f3c8SBram Moolenaarendif | Xpath 'f'
403b544f3c8SBram MoolenaarXpath 'g'
404b544f3c8SBram Moolenaar
405b544f3c8SBram Moolenaarwhile 1
406b544f3c8SBram Moolenaar    Xpath 'h'
407b544f3c8SBram Moolenaar    if 1
408b544f3c8SBram Moolenaar	Xpath 'i'
409b544f3c8SBram Moolenaar	asdf
410b544f3c8SBram Moolenaar	Xpath 'j'
411b544f3c8SBram Moolenaar    endif | Xpath 'k'
412b544f3c8SBram Moolenaar    Xpath 'l'
413b544f3c8SBram Moolenaar    break
414b544f3c8SBram Moolenaarendwhile | Xpath 'm'
415b544f3c8SBram MoolenaarXpath 'n'
416b544f3c8SBram Moolenaar
417b544f3c8SBram Moolenaarasdf
418b544f3c8SBram MoolenaarXpath 'o'
419b544f3c8SBram Moolenaar
420b544f3c8SBram Moolenaarasdf | Xpath 'p'
421b544f3c8SBram MoolenaarXpath 'q'
422b544f3c8SBram Moolenaar
423b544f3c8SBram Moolenaarlet g:test7_result = g:Xpath
424b544f3c8SBram Moolenaar
425b544f3c8SBram Moolenaarfunc Test_error_in_script()
426b544f3c8SBram Moolenaar    call assert_equal('abghinoq', g:test7_result)
427b544f3c8SBram Moolenaarendfunc
428b544f3c8SBram Moolenaar
429b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
430b544f3c8SBram Moolenaar" Test 8:   Aborting and continuing on errors inside functions		    {{{1
431b544f3c8SBram Moolenaar"
432b544f3c8SBram Moolenaar"	    On an error inside a function without the "abort" attribute, the
433b544f3c8SBram Moolenaar"	    script processing continues at the next line (unless the error was
434b544f3c8SBram Moolenaar"	    in a :return command).  On an error inside a function with the
435b544f3c8SBram Moolenaar"	    "abort" attribute, the function is aborted and the script processing
436b544f3c8SBram Moolenaar"	    continues after the function call; the value -1 is returned then.
437b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
438b544f3c8SBram Moolenaar
439b544f3c8SBram MoolenaarXpathINIT
440b544f3c8SBram Moolenaar
441a6296200SBram Moolenaarfunc T8_F()
442b544f3c8SBram Moolenaar    if 1
443b544f3c8SBram Moolenaar	Xpath 'a'
444b544f3c8SBram Moolenaar	while 1
445b544f3c8SBram Moolenaar	    Xpath 'b'
446b544f3c8SBram Moolenaar	    asdf
447b544f3c8SBram Moolenaar	    Xpath 'c'
448b544f3c8SBram Moolenaar	    asdf | Xpath 'd'
449b544f3c8SBram Moolenaar	    Xpath 'e'
450b544f3c8SBram Moolenaar	    break
451b544f3c8SBram Moolenaar	endwhile
452b544f3c8SBram Moolenaar	Xpath 'f'
453b544f3c8SBram Moolenaar    endif | Xpath 'g'
454b544f3c8SBram Moolenaar    Xpath 'h'
455b544f3c8SBram Moolenaar
456b544f3c8SBram Moolenaar    while 1
457b544f3c8SBram Moolenaar	Xpath 'i'
458b544f3c8SBram Moolenaar	if 1
459b544f3c8SBram Moolenaar	    Xpath 'j'
460b544f3c8SBram Moolenaar	    asdf
461b544f3c8SBram Moolenaar	    Xpath 'k'
462b544f3c8SBram Moolenaar	    asdf | Xpath 'l'
463b544f3c8SBram Moolenaar	    Xpath 'm'
464b544f3c8SBram Moolenaar	endif
465b544f3c8SBram Moolenaar	Xpath 'n'
466b544f3c8SBram Moolenaar	break
467b544f3c8SBram Moolenaar    endwhile | Xpath 'o'
468b544f3c8SBram Moolenaar    Xpath 'p'
469b544f3c8SBram Moolenaar
470b544f3c8SBram Moolenaar    return novar		" returns (default return value 0)
471b544f3c8SBram Moolenaar    Xpath 'q'
472b544f3c8SBram Moolenaar    return 1			" not reached
473a6296200SBram Moolenaarendfunc
474b544f3c8SBram Moolenaar
475a6296200SBram Moolenaarfunc T8_G() abort
476b544f3c8SBram Moolenaar    if 1
477b544f3c8SBram Moolenaar	Xpath 'r'
478b544f3c8SBram Moolenaar	while 1
479b544f3c8SBram Moolenaar	    Xpath 's'
480b544f3c8SBram Moolenaar	    asdf		" returns -1
481b544f3c8SBram Moolenaar	    Xpath 't'
482b544f3c8SBram Moolenaar	    break
483b544f3c8SBram Moolenaar	endwhile
484b544f3c8SBram Moolenaar	Xpath 'v'
485b544f3c8SBram Moolenaar    endif | Xpath 'w'
486b544f3c8SBram Moolenaar    Xpath 'x'
487b544f3c8SBram Moolenaar
488b544f3c8SBram Moolenaar    return -4			" not reached
489a6296200SBram Moolenaarendfunc
490b544f3c8SBram Moolenaar
491a6296200SBram Moolenaarfunc T8_H() abort
492b544f3c8SBram Moolenaar    while 1
493b544f3c8SBram Moolenaar	Xpath 'A'
494b544f3c8SBram Moolenaar	if 1
495b544f3c8SBram Moolenaar	    Xpath 'B'
496b544f3c8SBram Moolenaar	    asdf		" returns -1
497b544f3c8SBram Moolenaar	    Xpath 'C'
498b544f3c8SBram Moolenaar	endif
499b544f3c8SBram Moolenaar	Xpath 'D'
500b544f3c8SBram Moolenaar	break
501b544f3c8SBram Moolenaar    endwhile | Xpath 'E'
502b544f3c8SBram Moolenaar    Xpath 'F'
503b544f3c8SBram Moolenaar
504b544f3c8SBram Moolenaar    return -4			" not reached
505a6296200SBram Moolenaarendfunc
506b544f3c8SBram Moolenaar
507b544f3c8SBram Moolenaar" Aborted functions (T8_G and T8_H) return -1.
508b544f3c8SBram Moolenaarlet g:test8_sum = (T8_F() + 1) - 4 * T8_G() - 8 * T8_H()
509b544f3c8SBram MoolenaarXpath 'X'
510b544f3c8SBram Moolenaarlet g:test8_result = g:Xpath
511b544f3c8SBram Moolenaar
512b544f3c8SBram Moolenaarfunc Test_error_in_function()
513b544f3c8SBram Moolenaar    call assert_equal(13, g:test8_sum)
514b544f3c8SBram Moolenaar    call assert_equal('abcefghijkmnoprsABX', g:test8_result)
515b544f3c8SBram Moolenaar
516b544f3c8SBram Moolenaar    delfunction T8_F
517b544f3c8SBram Moolenaar    delfunction T8_G
518b544f3c8SBram Moolenaar    delfunction T8_H
519b544f3c8SBram Moolenaarendfunc
520b544f3c8SBram Moolenaar
521b544f3c8SBram Moolenaar
522b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
523b544f3c8SBram Moolenaar" Test 9:   Continuing after aborted functions				    {{{1
524b544f3c8SBram Moolenaar"
525b544f3c8SBram Moolenaar"	    When a function with the "abort" attribute is aborted due to an
526b544f3c8SBram Moolenaar"	    error, the next function back in the call hierarchy without an
527b544f3c8SBram Moolenaar"	    "abort" attribute continues; the value -1 is returned then.
528b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
529b544f3c8SBram Moolenaar
530b544f3c8SBram MoolenaarXpathINIT
531b544f3c8SBram Moolenaar
532a6296200SBram Moolenaarfunc F() abort
533b544f3c8SBram Moolenaar    Xpath 'a'
534b544f3c8SBram Moolenaar    let result = G()	" not aborted
535b544f3c8SBram Moolenaar    Xpath 'b'
536b544f3c8SBram Moolenaar    if result != 2
537b544f3c8SBram Moolenaar	Xpath 'c'
538b544f3c8SBram Moolenaar    endif
539b544f3c8SBram Moolenaar    return 1
540a6296200SBram Moolenaarendfunc
541b544f3c8SBram Moolenaar
542a6296200SBram Moolenaarfunc G()		" no abort attribute
543b544f3c8SBram Moolenaar    Xpath 'd'
544b544f3c8SBram Moolenaar    if H() != -1	" aborted
545b544f3c8SBram Moolenaar	Xpath 'e'
546b544f3c8SBram Moolenaar    endif
547b544f3c8SBram Moolenaar    Xpath 'f'
548b544f3c8SBram Moolenaar    return 2
549a6296200SBram Moolenaarendfunc
550b544f3c8SBram Moolenaar
551a6296200SBram Moolenaarfunc H() abort
552b544f3c8SBram Moolenaar    Xpath 'g'
553b544f3c8SBram Moolenaar    call I()		" aborted
554b544f3c8SBram Moolenaar    Xpath 'h'
555b544f3c8SBram Moolenaar    return 4
556a6296200SBram Moolenaarendfunc
557b544f3c8SBram Moolenaar
558a6296200SBram Moolenaarfunc I() abort
559b544f3c8SBram Moolenaar    Xpath 'i'
560b544f3c8SBram Moolenaar    asdf		" error
561b544f3c8SBram Moolenaar    Xpath 'j'
562b544f3c8SBram Moolenaar    return 8
563a6296200SBram Moolenaarendfunc
564b544f3c8SBram Moolenaar
565b544f3c8SBram Moolenaarif F() != 1
566b544f3c8SBram Moolenaar    Xpath 'k'
567b544f3c8SBram Moolenaarendif
568b544f3c8SBram Moolenaar
569b544f3c8SBram Moolenaarlet g:test9_result = g:Xpath
570b544f3c8SBram Moolenaar
571b544f3c8SBram Moolenaardelfunction F
572b544f3c8SBram Moolenaardelfunction G
573b544f3c8SBram Moolenaardelfunction H
574b544f3c8SBram Moolenaardelfunction I
575b544f3c8SBram Moolenaar
576b544f3c8SBram Moolenaarfunc Test_func_abort()
577b544f3c8SBram Moolenaar    call assert_equal('adgifb', g:test9_result)
578b544f3c8SBram Moolenaarendfunc
579b544f3c8SBram Moolenaar
580b544f3c8SBram Moolenaar
581b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
582b544f3c8SBram Moolenaar" Test 10:  :if, :elseif, :while argument parsing			    {{{1
583b544f3c8SBram Moolenaar"
584b544f3c8SBram Moolenaar"	    A '"' or '|' in an argument expression must not be mixed up with
585b544f3c8SBram Moolenaar"	    a comment or a next command after a bar.  Parsing errors should
586b544f3c8SBram Moolenaar"	    be recognized.
587b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
588b544f3c8SBram Moolenaar
589b544f3c8SBram MoolenaarXpathINIT
590b544f3c8SBram Moolenaar
591a6296200SBram Moolenaarfunc MSG(enr, emsg)
592b544f3c8SBram Moolenaar    let english = v:lang == "C" || v:lang =~ '^[Ee]n'
593b544f3c8SBram Moolenaar    if a:enr == ""
594b544f3c8SBram Moolenaar	Xout "TODO: Add message number for:" a:emsg
595b544f3c8SBram Moolenaar	let v:errmsg = ":" . v:errmsg
596b544f3c8SBram Moolenaar    endif
597b544f3c8SBram Moolenaar    let match = 1
598b544f3c8SBram Moolenaar    if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg)
599b544f3c8SBram Moolenaar	let match = 0
600b544f3c8SBram Moolenaar	if v:errmsg == ""
601b544f3c8SBram Moolenaar	    Xout "Message missing."
602b544f3c8SBram Moolenaar	else
603a4208966SBram Moolenaar	    let v:errmsg = v:errmsg->escape('"')
604b544f3c8SBram Moolenaar	    Xout "Unexpected message:" v:errmsg
605b544f3c8SBram Moolenaar	endif
606b544f3c8SBram Moolenaar    endif
607b544f3c8SBram Moolenaar    return match
6081e115360SBram Moolenaarendfunc
609b544f3c8SBram Moolenaar
610b544f3c8SBram Moolenaarif 1 || strlen("\"") | Xpath 'a'
611b544f3c8SBram Moolenaar    Xpath 'b'
612b544f3c8SBram Moolenaarendif
613b544f3c8SBram MoolenaarXpath 'c'
614b544f3c8SBram Moolenaar
615b544f3c8SBram Moolenaarif 0
616b544f3c8SBram Moolenaarelseif 1 || strlen("\"") | Xpath 'd'
617b544f3c8SBram Moolenaar    Xpath 'e'
618b544f3c8SBram Moolenaarendif
619b544f3c8SBram MoolenaarXpath 'f'
620b544f3c8SBram Moolenaar
621b544f3c8SBram Moolenaarwhile 1 || strlen("\"") | Xpath 'g'
622b544f3c8SBram Moolenaar    Xpath 'h'
623b544f3c8SBram Moolenaar    break
624b544f3c8SBram Moolenaarendwhile
625b544f3c8SBram MoolenaarXpath 'i'
626b544f3c8SBram Moolenaar
627b544f3c8SBram Moolenaarlet v:errmsg = ""
628b544f3c8SBram Moolenaarif 1 ||| strlen("\"") | Xpath 'j'
629b544f3c8SBram Moolenaar    Xpath 'k'
630b544f3c8SBram Moolenaarendif
631b544f3c8SBram MoolenaarXpath 'l'
632b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression")
633b544f3c8SBram Moolenaar    Xpath 'm'
634b544f3c8SBram Moolenaarendif
635b544f3c8SBram Moolenaar
636b544f3c8SBram Moolenaarlet v:errmsg = ""
637b544f3c8SBram Moolenaarif 0
638b544f3c8SBram Moolenaarelseif 1 ||| strlen("\"") | Xpath 'n'
639b544f3c8SBram Moolenaar    Xpath 'o'
640b544f3c8SBram Moolenaarendif
641b544f3c8SBram MoolenaarXpath 'p'
642b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression")
643b544f3c8SBram Moolenaar    Xpath 'q'
644b544f3c8SBram Moolenaarendif
645b544f3c8SBram Moolenaar
646b544f3c8SBram Moolenaarlet v:errmsg = ""
647b544f3c8SBram Moolenaarwhile 1 ||| strlen("\"") | Xpath 'r'
648b544f3c8SBram Moolenaar    Xpath 's'
649b544f3c8SBram Moolenaar    break
650b544f3c8SBram Moolenaarendwhile
651b544f3c8SBram MoolenaarXpath 't'
652b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression")
653b544f3c8SBram Moolenaar    Xpath 'u'
654b544f3c8SBram Moolenaarendif
655b544f3c8SBram Moolenaar
656b544f3c8SBram Moolenaarlet g:test10_result = g:Xpath
657b544f3c8SBram Moolenaardelfunction MSG
658b544f3c8SBram Moolenaar
659b544f3c8SBram Moolenaarfunc Test_expr_parsing()
660b544f3c8SBram Moolenaar    call assert_equal('abcdefghilpt', g:test10_result)
661b544f3c8SBram Moolenaarendfunc
662b544f3c8SBram Moolenaar
663b544f3c8SBram Moolenaar
664b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
665b544f3c8SBram Moolenaar" Test 11:  :if, :elseif, :while argument evaluation after abort	    {{{1
666b544f3c8SBram Moolenaar"
667b544f3c8SBram Moolenaar"	    When code is skipped over due to an error, the boolean argument to
668b544f3c8SBram Moolenaar"	    an :if, :elseif, or :while must not be evaluated.
669b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
670b544f3c8SBram Moolenaar
671b544f3c8SBram MoolenaarXpathINIT
672b544f3c8SBram Moolenaar
673b544f3c8SBram Moolenaarlet calls = 0
674b544f3c8SBram Moolenaar
675a6296200SBram Moolenaarfunc P(num)
676b544f3c8SBram Moolenaar    let g:calls = g:calls + a:num   " side effect on call
677b544f3c8SBram Moolenaar    return 0
678a6296200SBram Moolenaarendfunc
679b544f3c8SBram Moolenaar
680b544f3c8SBram Moolenaarif 1
681b544f3c8SBram Moolenaar    Xpath 'a'
682b544f3c8SBram Moolenaar    asdf		" error
683b544f3c8SBram Moolenaar    Xpath 'b'
684b544f3c8SBram Moolenaar    if P(1)		" should not be called
685b544f3c8SBram Moolenaar	Xpath 'c'
686b544f3c8SBram Moolenaar    elseif !P(2)	" should not be called
687b544f3c8SBram Moolenaar	Xpath 'd'
688b544f3c8SBram Moolenaar    else
689b544f3c8SBram Moolenaar	Xpath 'e'
690b544f3c8SBram Moolenaar    endif
691b544f3c8SBram Moolenaar    Xpath 'f'
692b544f3c8SBram Moolenaar    while P(4)		" should not be called
693b544f3c8SBram Moolenaar	Xpath 'g'
694b544f3c8SBram Moolenaar    endwhile
695b544f3c8SBram Moolenaar    Xpath 'h'
696b544f3c8SBram Moolenaarendif
697b544f3c8SBram MoolenaarXpath 'x'
698b544f3c8SBram Moolenaar
699b544f3c8SBram Moolenaarlet g:test11_calls = calls
700b544f3c8SBram Moolenaarlet g:test11_result = g:Xpath
701b544f3c8SBram Moolenaar
702b544f3c8SBram Moolenaarunlet calls
703b544f3c8SBram Moolenaardelfunction P
704b544f3c8SBram Moolenaar
705b544f3c8SBram Moolenaarfunc Test_arg_abort()
706b544f3c8SBram Moolenaar    call assert_equal(0, g:test11_calls)
707b544f3c8SBram Moolenaar    call assert_equal('ax', g:test11_result)
708b544f3c8SBram Moolenaarendfunc
709b544f3c8SBram Moolenaar
710b544f3c8SBram Moolenaar
711b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
712b544f3c8SBram Moolenaar" Test 12:  Expressions in braces in skipped code			    {{{1
713b544f3c8SBram Moolenaar"
714b544f3c8SBram Moolenaar"	    In code skipped over due to an error or inactive conditional,
715b544f3c8SBram Moolenaar"	    an expression in braces as part of a variable or function name
716b544f3c8SBram Moolenaar"	    should not be evaluated.
717b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
718b544f3c8SBram Moolenaar
719b544f3c8SBram MoolenaarXpathINIT
720b544f3c8SBram Moolenaar
721b544f3c8SBram Moolenaarfunction! NULL()
722b544f3c8SBram Moolenaar    Xpath 'a'
723b544f3c8SBram Moolenaar    return 0
724b544f3c8SBram Moolenaarendfunction
725b544f3c8SBram Moolenaar
726b544f3c8SBram Moolenaarfunction! ZERO()
727b544f3c8SBram Moolenaar    Xpath 'b'
728b544f3c8SBram Moolenaar    return 0
729b544f3c8SBram Moolenaarendfunction
730b544f3c8SBram Moolenaar
731b544f3c8SBram Moolenaarfunction! F0()
732b544f3c8SBram Moolenaar    Xpath 'c'
733b544f3c8SBram Moolenaarendfunction
734b544f3c8SBram Moolenaar
735b544f3c8SBram Moolenaarfunction! F1(arg)
736b544f3c8SBram Moolenaar    Xpath 'e'
737b544f3c8SBram Moolenaarendfunction
738b544f3c8SBram Moolenaar
739b544f3c8SBram Moolenaarlet V0 = 1
740b544f3c8SBram Moolenaar
741b544f3c8SBram MoolenaarXpath 'f'
742b544f3c8SBram Moolenaarecho 0 ? F{NULL() + V{ZERO()}}() : 1
743b544f3c8SBram Moolenaar
744b544f3c8SBram MoolenaarXpath 'g'
745b544f3c8SBram Moolenaarif 0
746b544f3c8SBram Moolenaar    Xpath 'h'
747b544f3c8SBram Moolenaar    call F{NULL() + V{ZERO()}}()
748b544f3c8SBram Moolenaarendif
749b544f3c8SBram Moolenaar
750b544f3c8SBram MoolenaarXpath 'i'
751b544f3c8SBram Moolenaarif 1
752b544f3c8SBram Moolenaar    asdf		" error
753b544f3c8SBram Moolenaar    Xpath 'j'
754b544f3c8SBram Moolenaar    call F1(F{NULL() + V{ZERO()}}())
755b544f3c8SBram Moolenaarendif
756b544f3c8SBram Moolenaar
757b544f3c8SBram MoolenaarXpath 'k'
758b544f3c8SBram Moolenaarif 1
759b544f3c8SBram Moolenaar    asdf		" error
760b544f3c8SBram Moolenaar    Xpath 'l'
761b544f3c8SBram Moolenaar    call F{NULL() + V{ZERO()}}()
762b544f3c8SBram Moolenaarendif
763b544f3c8SBram Moolenaar
764b544f3c8SBram Moolenaarlet g:test12_result = g:Xpath
765b544f3c8SBram Moolenaar
766b544f3c8SBram Moolenaarfunc Test_braces_skipped()
767b544f3c8SBram Moolenaar    call assert_equal('fgik', g:test12_result)
768b544f3c8SBram Moolenaarendfunc
769b544f3c8SBram Moolenaar
770b544f3c8SBram Moolenaar
771b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
772b544f3c8SBram Moolenaar" Test 13:  Failure in argument evaluation for :while			    {{{1
773b544f3c8SBram Moolenaar"
774b544f3c8SBram Moolenaar"	    A failure in the expression evaluation for the condition of a :while
775b544f3c8SBram Moolenaar"	    causes the whole :while loop until the matching :endwhile being
776b544f3c8SBram Moolenaar"	    ignored.  Continuation is at the next following line.
777b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
778b544f3c8SBram Moolenaar
779b544f3c8SBram MoolenaarXpathINIT
780b544f3c8SBram Moolenaar
781b544f3c8SBram MoolenaarXpath 'a'
782b544f3c8SBram Moolenaarwhile asdf
783b544f3c8SBram Moolenaar    Xpath 'b'
784b544f3c8SBram Moolenaar    while 1
785b544f3c8SBram Moolenaar	Xpath 'c'
786b544f3c8SBram Moolenaar	break
787b544f3c8SBram Moolenaar    endwhile
788b544f3c8SBram Moolenaar    Xpath 'd'
789b544f3c8SBram Moolenaar    break
790b544f3c8SBram Moolenaarendwhile
791b544f3c8SBram MoolenaarXpath 'e'
792b544f3c8SBram Moolenaar
793b544f3c8SBram Moolenaarwhile asdf | Xpath 'f' | endwhile | Xpath 'g'
794b544f3c8SBram MoolenaarXpath 'h'
795b544f3c8SBram Moolenaarlet g:test13_result = g:Xpath
796b544f3c8SBram Moolenaar
797b544f3c8SBram Moolenaarfunc Test_while_fail()
798b544f3c8SBram Moolenaar    call assert_equal('aeh', g:test13_result)
799b544f3c8SBram Moolenaarendfunc
800b544f3c8SBram Moolenaar
801b544f3c8SBram Moolenaar
802b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
803b544f3c8SBram Moolenaar" Test 14:  Failure in argument evaluation for :if			    {{{1
804b544f3c8SBram Moolenaar"
805b544f3c8SBram Moolenaar"	    A failure in the expression evaluation for the condition of an :if
806b544f3c8SBram Moolenaar"	    does not cause the corresponding :else or :endif being matched to
807b544f3c8SBram Moolenaar"	    a previous :if/:elseif.  Neither of both branches of the failed :if
808b544f3c8SBram Moolenaar"	    are executed.
809b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
810b544f3c8SBram Moolenaar
811b544f3c8SBram MoolenaarXpathINIT
812b544f3c8SBram Moolenaar
813b544f3c8SBram Moolenaarfunction! F()
814b544f3c8SBram Moolenaar    Xpath 'a'
815b544f3c8SBram Moolenaar    let x = 0
816b544f3c8SBram Moolenaar    if x		" false
817b544f3c8SBram Moolenaar	Xpath 'b'
818b544f3c8SBram Moolenaar    elseif !x		" always true
819b544f3c8SBram Moolenaar	Xpath 'c'
820b544f3c8SBram Moolenaar	let x = 1
821b544f3c8SBram Moolenaar	if g:boolvar	" possibly undefined
822b544f3c8SBram Moolenaar	    Xpath 'd'
823b544f3c8SBram Moolenaar	else
824b544f3c8SBram Moolenaar	    Xpath 'e'
825b544f3c8SBram Moolenaar	endif
826b544f3c8SBram Moolenaar	Xpath 'f'
827b544f3c8SBram Moolenaar    elseif x		" never executed
828b544f3c8SBram Moolenaar	Xpath 'g'
829b544f3c8SBram Moolenaar    endif
830b544f3c8SBram Moolenaar    Xpath 'h'
831b544f3c8SBram Moolenaarendfunction
832b544f3c8SBram Moolenaar
833b544f3c8SBram Moolenaarlet boolvar = 1
834b544f3c8SBram Moolenaarcall F()
835b544f3c8SBram MoolenaarXpath '-'
836b544f3c8SBram Moolenaar
837b544f3c8SBram Moolenaarunlet boolvar
838b544f3c8SBram Moolenaarcall F()
839b544f3c8SBram Moolenaarlet g:test14_result = g:Xpath
840b544f3c8SBram Moolenaar
841b544f3c8SBram Moolenaardelfunction F
842b544f3c8SBram Moolenaar
843b544f3c8SBram Moolenaarfunc Test_if_fail()
844b544f3c8SBram Moolenaar    call assert_equal('acdfh-acfh', g:test14_result)
845b544f3c8SBram Moolenaarendfunc
846b544f3c8SBram Moolenaar
847b544f3c8SBram Moolenaar
848b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
849b544f3c8SBram Moolenaar" Test 15:  Failure in argument evaluation for :if (bar)		    {{{1
850b544f3c8SBram Moolenaar"
851b544f3c8SBram Moolenaar"	    Like previous test, except that the failing :if ... | ... | :endif
852b544f3c8SBram Moolenaar"	    is in a single line.
853b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
854b544f3c8SBram Moolenaar
855b544f3c8SBram MoolenaarXpathINIT
856b544f3c8SBram Moolenaar
857b544f3c8SBram Moolenaarfunction! F()
858b544f3c8SBram Moolenaar    Xpath 'a'
859b544f3c8SBram Moolenaar    let x = 0
860b544f3c8SBram Moolenaar    if x		" false
861b544f3c8SBram Moolenaar	Xpath 'b'
862b544f3c8SBram Moolenaar    elseif !x		" always true
863b544f3c8SBram Moolenaar	Xpath 'c'
864b544f3c8SBram Moolenaar	let x = 1
865b544f3c8SBram Moolenaar	if g:boolvar | Xpath 'd' | else | Xpath 'e' | endif
866b544f3c8SBram Moolenaar	Xpath 'f'
867b544f3c8SBram Moolenaar    elseif x		" never executed
868b544f3c8SBram Moolenaar	Xpath 'g'
869b544f3c8SBram Moolenaar    endif
870b544f3c8SBram Moolenaar    Xpath 'h'
871b544f3c8SBram Moolenaarendfunction
872b544f3c8SBram Moolenaar
873b544f3c8SBram Moolenaarlet boolvar = 1
874b544f3c8SBram Moolenaarcall F()
875b544f3c8SBram MoolenaarXpath '-'
876b544f3c8SBram Moolenaar
877b544f3c8SBram Moolenaarunlet boolvar
878b544f3c8SBram Moolenaarcall F()
879b544f3c8SBram Moolenaarlet g:test15_result = g:Xpath
880b544f3c8SBram Moolenaar
881b544f3c8SBram Moolenaardelfunction F
882b544f3c8SBram Moolenaar
883b544f3c8SBram Moolenaarfunc Test_if_bar_fail()
884b544f3c8SBram Moolenaar    call assert_equal('acdfh-acfh', g:test15_result)
885b544f3c8SBram Moolenaarendfunc
886b544f3c8SBram Moolenaar
887b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
8881f068233SBram Moolenaar" Test 16:  Double :else or :elseif after :else				    {{{1
8891f068233SBram Moolenaar"
8901f068233SBram Moolenaar"	    Multiple :elses or an :elseif after an :else are forbidden.
8911f068233SBram Moolenaar"-------------------------------------------------------------------------------
8921f068233SBram Moolenaar
8931f068233SBram Moolenaarfunc T16_F() abort
8941f068233SBram Moolenaar  if 0
8951f068233SBram Moolenaar    Xpath 'a'
8961f068233SBram Moolenaar  else
8971f068233SBram Moolenaar    Xpath 'b'
8981f068233SBram Moolenaar  else		" aborts function
8991f068233SBram Moolenaar    Xpath 'c'
9001f068233SBram Moolenaar  endif
9011f068233SBram Moolenaar  Xpath 'd'
9021f068233SBram Moolenaarendfunc
9031f068233SBram Moolenaar
9041f068233SBram Moolenaarfunc T16_G() abort
9051f068233SBram Moolenaar  if 0
9061f068233SBram Moolenaar    Xpath 'a'
9071f068233SBram Moolenaar  else
9081f068233SBram Moolenaar    Xpath 'b'
9091f068233SBram Moolenaar  elseif 1		" aborts function
9101f068233SBram Moolenaar    Xpath 'c'
9111f068233SBram Moolenaar  else
9121f068233SBram Moolenaar    Xpath 'd'
9131f068233SBram Moolenaar  endif
9141f068233SBram Moolenaar  Xpath 'e'
9151f068233SBram Moolenaarendfunc
9161f068233SBram Moolenaar
9171f068233SBram Moolenaarfunc T16_H() abort
9181f068233SBram Moolenaar  if 0
9191f068233SBram Moolenaar    Xpath 'a'
9201f068233SBram Moolenaar  elseif 0
9211f068233SBram Moolenaar    Xpath 'b'
9221f068233SBram Moolenaar  else
9231f068233SBram Moolenaar    Xpath 'c'
9241f068233SBram Moolenaar  else		" aborts function
9251f068233SBram Moolenaar    Xpath 'd'
9261f068233SBram Moolenaar  endif
9271f068233SBram Moolenaar  Xpath 'e'
9281f068233SBram Moolenaarendfunc
9291f068233SBram Moolenaar
9301f068233SBram Moolenaarfunc T16_I() abort
9311f068233SBram Moolenaar  if 0
9321f068233SBram Moolenaar    Xpath 'a'
9331f068233SBram Moolenaar  elseif 0
9341f068233SBram Moolenaar    Xpath 'b'
9351f068233SBram Moolenaar  else
9361f068233SBram Moolenaar    Xpath 'c'
9371f068233SBram Moolenaar  elseif 1		" aborts function
9381f068233SBram Moolenaar    Xpath 'd'
9391f068233SBram Moolenaar  else
9401f068233SBram Moolenaar    Xpath 'e'
9411f068233SBram Moolenaar  endif
9421f068233SBram Moolenaar  Xpath 'f'
9431f068233SBram Moolenaarendfunc
9441f068233SBram Moolenaar
9451f068233SBram Moolenaarfunc Test_Multi_Else()
9461f068233SBram Moolenaar  XpathINIT
9471f068233SBram Moolenaar  try
9481f068233SBram Moolenaar    call T16_F()
9491f068233SBram Moolenaar  catch /E583:/
9501f068233SBram Moolenaar    Xpath 'e'
9511f068233SBram Moolenaar  endtry
9521f068233SBram Moolenaar  call assert_equal('be', g:Xpath)
9531f068233SBram Moolenaar
9541f068233SBram Moolenaar  XpathINIT
9551f068233SBram Moolenaar  try
9561f068233SBram Moolenaar    call T16_G()
9571f068233SBram Moolenaar  catch /E584:/
9581f068233SBram Moolenaar    Xpath 'f'
9591f068233SBram Moolenaar  endtry
9601f068233SBram Moolenaar  call assert_equal('bf', g:Xpath)
9611f068233SBram Moolenaar
9621f068233SBram Moolenaar  XpathINIT
9631f068233SBram Moolenaar  try
9641f068233SBram Moolenaar    call T16_H()
9651f068233SBram Moolenaar  catch /E583:/
9661f068233SBram Moolenaar    Xpath 'f'
9671f068233SBram Moolenaar  endtry
9681f068233SBram Moolenaar  call assert_equal('cf', g:Xpath)
9691f068233SBram Moolenaar
9701f068233SBram Moolenaar  XpathINIT
9711f068233SBram Moolenaar  try
9721f068233SBram Moolenaar    call T16_I()
9731f068233SBram Moolenaar  catch /E584:/
9741f068233SBram Moolenaar    Xpath 'g'
9751f068233SBram Moolenaar  endtry
9761f068233SBram Moolenaar  call assert_equal('cg', g:Xpath)
9771f068233SBram Moolenaarendfunc
9781f068233SBram Moolenaar
9791f068233SBram Moolenaar"-------------------------------------------------------------------------------
9801f068233SBram Moolenaar" Test 17:  Nesting of unmatched :if or :endif inside a :while		    {{{1
9811f068233SBram Moolenaar"
9821f068233SBram Moolenaar"	    The :while/:endwhile takes precedence in nesting over an unclosed
9831f068233SBram Moolenaar"	    :if or an unopened :endif.
9841f068233SBram Moolenaar"-------------------------------------------------------------------------------
9851f068233SBram Moolenaar
9861f068233SBram Moolenaar" While loops inside a function are continued on error.
9871f068233SBram Moolenaarfunc T17_F()
9881f068233SBram Moolenaar  let loops = 3
9891f068233SBram Moolenaar  while loops > 0
9901f068233SBram Moolenaar    let loops -= 1
9911f068233SBram Moolenaar    Xpath 'a' . loops
9921f068233SBram Moolenaar    if (loops == 1)
9931f068233SBram Moolenaar      Xpath 'b' . loops
9941f068233SBram Moolenaar      continue
9951f068233SBram Moolenaar    elseif (loops == 0)
9961f068233SBram Moolenaar      Xpath 'c' . loops
9971f068233SBram Moolenaar      break
9981f068233SBram Moolenaar    elseif 1
9991f068233SBram Moolenaar      Xpath 'd' . loops
10001f068233SBram Moolenaar    " endif missing!
10011f068233SBram Moolenaar  endwhile	" :endwhile after :if 1
10021f068233SBram Moolenaar  Xpath 'e'
10031f068233SBram Moolenaarendfunc
10041f068233SBram Moolenaar
10051f068233SBram Moolenaarfunc T17_G()
10061f068233SBram Moolenaar  let loops = 2
10071f068233SBram Moolenaar  while loops > 0
10081f068233SBram Moolenaar    let loops -= 1
10091f068233SBram Moolenaar    Xpath 'a' . loops
10101f068233SBram Moolenaar    if 0
10111f068233SBram Moolenaar      Xpath 'b' . loops
10121f068233SBram Moolenaar    " endif missing
10131f068233SBram Moolenaar  endwhile	" :endwhile after :if 0
10141f068233SBram Moolenaarendfunc
10151f068233SBram Moolenaar
10161f068233SBram Moolenaarfunc T17_H()
10171f068233SBram Moolenaar  let loops = 2
10181f068233SBram Moolenaar  while loops > 0
10191f068233SBram Moolenaar    let loops -= 1
10201f068233SBram Moolenaar    Xpath 'a' . loops
10211f068233SBram Moolenaar    " if missing!
10221f068233SBram Moolenaar    endif	" :endif without :if in while
10231f068233SBram Moolenaar    Xpath 'b' . loops
10241f068233SBram Moolenaar  endwhile
10251f068233SBram Moolenaarendfunc
10261f068233SBram Moolenaar
10271f068233SBram Moolenaar" Error continuation outside a function is at the outermost :endwhile or :endif.
10281f068233SBram MoolenaarXpathINIT
10291f068233SBram Moolenaarlet v:errmsg = ''
10301f068233SBram Moolenaarlet loops = 2
10311f068233SBram Moolenaarwhile loops > 0
10321f068233SBram Moolenaar    let loops -= 1
10331f068233SBram Moolenaar    Xpath 'a' . loops
10341f068233SBram Moolenaar    if 0
10351f068233SBram Moolenaar	Xpath 'b' . loops
10361f068233SBram Moolenaar    " endif missing! Following :endwhile fails.
10371f068233SBram Moolenaarendwhile | Xpath 'c'
10381f068233SBram MoolenaarXpath 'd'
10391f068233SBram Moolenaarcall assert_match('E171:', v:errmsg)
10401f068233SBram Moolenaarcall assert_equal('a1d', g:Xpath)
10411f068233SBram Moolenaar
10421f068233SBram Moolenaarfunc Test_unmatched_if_in_while()
10431f068233SBram Moolenaar  XpathINIT
10441f068233SBram Moolenaar  call assert_fails('call T17_F()', 'E171:')
10451f068233SBram Moolenaar  call assert_equal('a2d2a1b1a0c0e', g:Xpath)
10461f068233SBram Moolenaar
10471f068233SBram Moolenaar  XpathINIT
10481f068233SBram Moolenaar  call assert_fails('call T17_G()', 'E171:')
10491f068233SBram Moolenaar  call assert_equal('a1a0', g:Xpath)
10501f068233SBram Moolenaar
10511f068233SBram Moolenaar  XpathINIT
10521f068233SBram Moolenaar  call assert_fails('call T17_H()', 'E580:')
10531f068233SBram Moolenaar  call assert_equal('a1b1a0b0', g:Xpath)
10541f068233SBram Moolenaarendfunc
10551f068233SBram Moolenaar
10561f068233SBram Moolenaar"-------------------------------------------------------------------------------
1057a6296200SBram Moolenaar" Test 18:  Interrupt (Ctrl-C pressed)					    {{{1
1058a6296200SBram Moolenaar"
1059a6296200SBram Moolenaar"	    On an interrupt, the script processing is terminated immediately.
10601f068233SBram Moolenaar"-------------------------------------------------------------------------------
1061a6296200SBram Moolenaar
1062a6296200SBram Moolenaarfunc Test_interrupt_while_if()
1063a6296200SBram Moolenaar  let test =<< trim [CODE]
1064a6296200SBram Moolenaar    try
1065a6296200SBram Moolenaar      if 1
1066a6296200SBram Moolenaar        Xpath 'a'
1067a6296200SBram Moolenaar        while 1
1068a6296200SBram Moolenaar          Xpath 'b'
1069a6296200SBram Moolenaar          if 1
1070a6296200SBram Moolenaar            Xpath 'c'
1071a6296200SBram Moolenaar            call interrupt()
1072a6296200SBram Moolenaar            call assert_report('should not get here')
1073a6296200SBram Moolenaar            break
1074a6296200SBram Moolenaar            finish
1075a6296200SBram Moolenaar          endif | call assert_report('should not get here')
1076a6296200SBram Moolenaar          call assert_report('should not get here')
1077a6296200SBram Moolenaar        endwhile | call assert_report('should not get here')
1078a6296200SBram Moolenaar        call assert_report('should not get here')
1079a6296200SBram Moolenaar      endif | call assert_report('should not get here')
1080a6296200SBram Moolenaar      call assert_report('should not get here')
1081a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1082a6296200SBram Moolenaar      Xpath 'd'
1083a6296200SBram Moolenaar    endtry | Xpath 'e'
1084a6296200SBram Moolenaar    Xpath 'f'
1085a6296200SBram Moolenaar  [CODE]
1086a6296200SBram Moolenaar  let verify =<< trim [CODE]
1087a6296200SBram Moolenaar    call assert_equal('abcdef', g:Xpath)
1088a6296200SBram Moolenaar  [CODE]
1089a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1090a6296200SBram Moolenaarendfunc
1091a6296200SBram Moolenaar
1092a6296200SBram Moolenaarfunc Test_interrupt_try()
1093a6296200SBram Moolenaar  let test =<< trim [CODE]
1094a6296200SBram Moolenaar    try
1095a6296200SBram Moolenaar      try
1096a6296200SBram Moolenaar        Xpath 'a'
1097a6296200SBram Moolenaar        call interrupt()
1098a6296200SBram Moolenaar        call assert_report('should not get here')
1099a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1100a6296200SBram Moolenaar      call assert_report('should not get here')
1101a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1102a6296200SBram Moolenaar      Xpath 'b'
1103a6296200SBram Moolenaar    endtry | Xpath 'c'
1104a6296200SBram Moolenaar    Xpath 'd'
1105a6296200SBram Moolenaar  [CODE]
1106a6296200SBram Moolenaar  let verify =<< trim [CODE]
1107a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1108a6296200SBram Moolenaar  [CODE]
1109a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1110a6296200SBram Moolenaarendfunc
1111a6296200SBram Moolenaar
1112a6296200SBram Moolenaarfunc Test_interrupt_func_while_if()
1113a6296200SBram Moolenaar  let test =<< trim [CODE]
1114a6296200SBram Moolenaar    func F()
1115a6296200SBram Moolenaar      if 1
1116a6296200SBram Moolenaar        Xpath 'a'
1117a6296200SBram Moolenaar        while 1
1118a6296200SBram Moolenaar          Xpath 'b'
1119a6296200SBram Moolenaar          if 1
1120a6296200SBram Moolenaar            Xpath 'c'
1121a6296200SBram Moolenaar            call interrupt()
1122a6296200SBram Moolenaar            call assert_report('should not get here')
1123a6296200SBram Moolenaar            break
1124a6296200SBram Moolenaar            return
1125a6296200SBram Moolenaar          endif | call assert_report('should not get here')
1126a6296200SBram Moolenaar          call assert_report('should not get here')
1127a6296200SBram Moolenaar        endwhile | call assert_report('should not get here')
1128a6296200SBram Moolenaar        call assert_report('should not get here')
1129a6296200SBram Moolenaar      endif | call assert_report('should not get here')
1130a6296200SBram Moolenaar      call assert_report('should not get here')
1131a6296200SBram Moolenaar    endfunc
1132a6296200SBram Moolenaar
1133a6296200SBram Moolenaar    Xpath 'd'
1134a6296200SBram Moolenaar    try
1135a6296200SBram Moolenaar      call F() | call assert_report('should not get here')
1136a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1137a6296200SBram Moolenaar      Xpath 'e'
1138a6296200SBram Moolenaar    endtry | Xpath 'f'
1139a6296200SBram Moolenaar    Xpath 'g'
1140a6296200SBram Moolenaar  [CODE]
1141a6296200SBram Moolenaar  let verify =<< trim [CODE]
1142a6296200SBram Moolenaar    call assert_equal('dabcefg', g:Xpath)
1143a6296200SBram Moolenaar  [CODE]
1144a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1145a6296200SBram Moolenaarendfunc
1146a6296200SBram Moolenaar
1147a6296200SBram Moolenaarfunc Test_interrupt_func_try()
1148a6296200SBram Moolenaar  let test =<< trim [CODE]
1149a6296200SBram Moolenaar    func G()
1150a6296200SBram Moolenaar      try
1151a6296200SBram Moolenaar        Xpath 'a'
1152a6296200SBram Moolenaar        call interrupt()
1153a6296200SBram Moolenaar        call assert_report('should not get here')
1154a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1155a6296200SBram Moolenaar      call assert_report('should not get here')
1156a6296200SBram Moolenaar    endfunc
1157a6296200SBram Moolenaar
1158a6296200SBram Moolenaar    Xpath 'b'
1159a6296200SBram Moolenaar    try
1160a6296200SBram Moolenaar      call G() | call assert_report('should not get here')
1161a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1162a6296200SBram Moolenaar      Xpath 'c'
1163a6296200SBram Moolenaar    endtry | Xpath 'd'
1164a6296200SBram Moolenaar    Xpath 'e'
1165a6296200SBram Moolenaar  [CODE]
1166a6296200SBram Moolenaar  let verify =<< trim [CODE]
1167a6296200SBram Moolenaar    call assert_equal('bacde', g:Xpath)
1168a6296200SBram Moolenaar  [CODE]
1169a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1170a6296200SBram Moolenaarendfunc
1171a6296200SBram Moolenaar
1172a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1173a6296200SBram Moolenaar" Test 19:  Aborting on errors inside :try/:endtry			    {{{1
1174a6296200SBram Moolenaar"
1175a6296200SBram Moolenaar"	    An error in a command dynamically enclosed in a :try/:endtry region
1176a6296200SBram Moolenaar"	    aborts script processing immediately.  It does not matter whether
1177a6296200SBram Moolenaar"	    the failing command is outside or inside a function and whether a
1178a6296200SBram Moolenaar"	    function has an "abort" attribute.
1179a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1180a6296200SBram Moolenaar
1181a6296200SBram Moolenaarfunc Test_try_error_abort_1()
1182a6296200SBram Moolenaar  let test =<< trim [CODE]
1183a6296200SBram Moolenaar    func F() abort
1184a6296200SBram Moolenaar      Xpath 'a'
1185a6296200SBram Moolenaar      asdf
1186a6296200SBram Moolenaar      call assert_report('should not get here')
1187a6296200SBram Moolenaar    endfunc
1188a6296200SBram Moolenaar
1189a6296200SBram Moolenaar    try
1190a6296200SBram Moolenaar      Xpath 'b'
1191a6296200SBram Moolenaar      call F()
1192a6296200SBram Moolenaar      call assert_report('should not get here')
1193a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1194a6296200SBram Moolenaar    call assert_report('should not get here')
1195a6296200SBram Moolenaar  [CODE]
1196a6296200SBram Moolenaar  let verify =<< trim [CODE]
1197a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1198a6296200SBram Moolenaar  [CODE]
1199a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1200a6296200SBram Moolenaarendfunc
1201a6296200SBram Moolenaar
1202a6296200SBram Moolenaarfunc Test_try_error_abort_2()
1203a6296200SBram Moolenaar  let test =<< trim [CODE]
1204a6296200SBram Moolenaar    func G()
1205a6296200SBram Moolenaar      Xpath 'a'
1206a6296200SBram Moolenaar      asdf
1207a6296200SBram Moolenaar      call assert_report('should not get here')
1208a6296200SBram Moolenaar    endfunc
1209a6296200SBram Moolenaar
1210a6296200SBram Moolenaar    try
1211a6296200SBram Moolenaar      Xpath 'b'
1212a6296200SBram Moolenaar      call G()
1213a6296200SBram Moolenaar      call assert_report('should not get here')
1214a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1215a6296200SBram Moolenaar    call assert_report('should not get here')
1216a6296200SBram Moolenaar  [CODE]
1217a6296200SBram Moolenaar  let verify =<< trim [CODE]
1218a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1219a6296200SBram Moolenaar  [CODE]
1220a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1221a6296200SBram Moolenaarendfunc
1222a6296200SBram Moolenaar
1223a6296200SBram Moolenaarfunc Test_try_error_abort_3()
1224a6296200SBram Moolenaar  let test =<< trim [CODE]
1225a6296200SBram Moolenaar    try
1226a6296200SBram Moolenaar      Xpath 'a'
1227a6296200SBram Moolenaar      asdf
1228a6296200SBram Moolenaar      call assert_report('should not get here')
1229a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1230a6296200SBram Moolenaar    call assert_report('should not get here')
1231a6296200SBram Moolenaar  [CODE]
1232a6296200SBram Moolenaar  let verify =<< trim [CODE]
1233a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1234a6296200SBram Moolenaar  [CODE]
1235a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1236a6296200SBram Moolenaarendfunc
1237a6296200SBram Moolenaar
1238a6296200SBram Moolenaarfunc Test_try_error_abort_4()
1239a6296200SBram Moolenaar  let test =<< trim [CODE]
1240a6296200SBram Moolenaar    if 1
1241a6296200SBram Moolenaar      try
1242a6296200SBram Moolenaar        Xpath 'a'
1243a6296200SBram Moolenaar        asdf
1244a6296200SBram Moolenaar        call assert_report('should not get here')
1245a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1246a6296200SBram Moolenaar    endif | call assert_report('should not get here')
1247a6296200SBram Moolenaar    call assert_report('should not get here')
1248a6296200SBram Moolenaar  [CODE]
1249a6296200SBram Moolenaar  let verify =<< trim [CODE]
1250a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1251a6296200SBram Moolenaar  [CODE]
1252a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1253a6296200SBram Moolenaarendfunc
1254a6296200SBram Moolenaar
1255a6296200SBram Moolenaarfunc Test_try_error_abort_5()
1256a6296200SBram Moolenaar  let test =<< trim [CODE]
1257a6296200SBram Moolenaar    let p = 1
1258a6296200SBram Moolenaar    while p
1259a6296200SBram Moolenaar      let p = 0
1260a6296200SBram Moolenaar      try
1261a6296200SBram Moolenaar        Xpath 'a'
1262a6296200SBram Moolenaar        asdf
1263a6296200SBram Moolenaar        call assert_report('should not get here')
1264a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1265a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1266a6296200SBram Moolenaar    call assert_report('should not get here')
1267a6296200SBram Moolenaar  [CODE]
1268a6296200SBram Moolenaar  let verify =<< trim [CODE]
1269a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1270a6296200SBram Moolenaar  [CODE]
1271a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1272a6296200SBram Moolenaarendfunc
1273a6296200SBram Moolenaar
1274a6296200SBram Moolenaarfunc Test_try_error_abort_6()
1275a6296200SBram Moolenaar  let test =<< trim [CODE]
1276a6296200SBram Moolenaar    let p = 1
1277a6296200SBram Moolenaar    Xpath 'a'
1278a6296200SBram Moolenaar    while p
1279a6296200SBram Moolenaar      Xpath 'b'
1280a6296200SBram Moolenaar      let p = 0
1281a6296200SBram Moolenaar      try
1282a6296200SBram Moolenaar        Xpath 'c'
1283a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1284a6296200SBram Moolenaar    call assert_report('should not get here')
1285a6296200SBram Moolenaar  [CODE]
1286a6296200SBram Moolenaar  let verify =<< trim [CODE]
1287a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1288a6296200SBram Moolenaar  [CODE]
1289a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1290a6296200SBram Moolenaarendfunc
1291a6296200SBram Moolenaar
1292a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1293a6296200SBram Moolenaar" Test 20:  Aborting on errors after :try/:endtry			    {{{1
1294a6296200SBram Moolenaar"
1295a6296200SBram Moolenaar"	    When an error occurs after the last active :try/:endtry region has
1296a6296200SBram Moolenaar"	    been left, termination behavior is as if no :try/:endtry has been
1297a6296200SBram Moolenaar"	    seen.
1298a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1299a6296200SBram Moolenaar
1300a6296200SBram Moolenaarfunc Test_error_after_try_1()
1301a6296200SBram Moolenaar  let test =<< trim [CODE]
1302a6296200SBram Moolenaar    let p = 1
1303a6296200SBram Moolenaar    while p
1304a6296200SBram Moolenaar      let p = 0
1305a6296200SBram Moolenaar      Xpath 'a'
1306a6296200SBram Moolenaar      try
1307a6296200SBram Moolenaar        Xpath 'b'
1308a6296200SBram Moolenaar      endtry
1309a6296200SBram Moolenaar      asdf
1310a6296200SBram Moolenaar      call assert_report('should not get here')
1311a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1312a6296200SBram Moolenaar    Xpath 'c'
1313a6296200SBram Moolenaar  [CODE]
1314a6296200SBram Moolenaar  let verify =<< trim [CODE]
1315a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1316a6296200SBram Moolenaar  [CODE]
1317a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1318a6296200SBram Moolenaarendfunc
1319a6296200SBram Moolenaar
1320a6296200SBram Moolenaarfunc Test_error_after_try_2()
1321a6296200SBram Moolenaar  let test =<< trim [CODE]
1322a6296200SBram Moolenaar    while 1
1323a6296200SBram Moolenaar      try
1324a6296200SBram Moolenaar        Xpath 'a'
1325a6296200SBram Moolenaar        break
1326a6296200SBram Moolenaar        call assert_report('should not get here')
1327a6296200SBram Moolenaar      endtry
1328a6296200SBram Moolenaar    endwhile
1329a6296200SBram Moolenaar    Xpath 'b'
1330a6296200SBram Moolenaar    asdf
1331a6296200SBram Moolenaar    Xpath 'c'
1332a6296200SBram Moolenaar  [CODE]
1333a6296200SBram Moolenaar  let verify =<< trim [CODE]
1334a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1335a6296200SBram Moolenaar  [CODE]
1336a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1337a6296200SBram Moolenaarendfunc
1338a6296200SBram Moolenaar
1339a6296200SBram Moolenaarfunc Test_error_after_try_3()
1340a6296200SBram Moolenaar  let test =<< trim [CODE]
1341a6296200SBram Moolenaar    while 1
1342a6296200SBram Moolenaar      try
1343a6296200SBram Moolenaar        Xpath 'a'
1344a6296200SBram Moolenaar        break
1345a6296200SBram Moolenaar        call assert_report('should not get here')
1346a6296200SBram Moolenaar      finally
1347a6296200SBram Moolenaar        Xpath 'b'
1348a6296200SBram Moolenaar      endtry
1349a6296200SBram Moolenaar    endwhile
1350a6296200SBram Moolenaar    Xpath 'c'
1351a6296200SBram Moolenaar    asdf
1352a6296200SBram Moolenaar    Xpath 'd'
1353a6296200SBram Moolenaar  [CODE]
1354a6296200SBram Moolenaar  let verify =<< trim [CODE]
1355a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1356a6296200SBram Moolenaar  [CODE]
1357a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1358a6296200SBram Moolenaarendfunc
1359a6296200SBram Moolenaar
1360a6296200SBram Moolenaarfunc Test_error_after_try_4()
1361a6296200SBram Moolenaar  let test =<< trim [CODE]
1362a6296200SBram Moolenaar    while 1
1363a6296200SBram Moolenaar      try
1364a6296200SBram Moolenaar        Xpath 'a'
1365a6296200SBram Moolenaar      finally
1366a6296200SBram Moolenaar        Xpath 'b'
1367a6296200SBram Moolenaar        break
1368a6296200SBram Moolenaar        call assert_report('should not get here')
1369a6296200SBram Moolenaar      endtry
1370a6296200SBram Moolenaar    endwhile
1371a6296200SBram Moolenaar    Xpath 'c'
1372a6296200SBram Moolenaar    asdf
1373a6296200SBram Moolenaar    Xpath 'd'
1374a6296200SBram Moolenaar  [CODE]
1375a6296200SBram Moolenaar  let verify =<< trim [CODE]
1376a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1377a6296200SBram Moolenaar  [CODE]
1378a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1379a6296200SBram Moolenaarendfunc
1380a6296200SBram Moolenaar
1381a6296200SBram Moolenaarfunc Test_error_after_try_5()
1382a6296200SBram Moolenaar  let test =<< trim [CODE]
1383a6296200SBram Moolenaar    let p = 1
1384a6296200SBram Moolenaar    while p
1385a6296200SBram Moolenaar      let p = 0
1386a6296200SBram Moolenaar      try
1387a6296200SBram Moolenaar        Xpath 'a'
1388a6296200SBram Moolenaar        continue
1389a6296200SBram Moolenaar        call assert_report('should not get here')
1390a6296200SBram Moolenaar      endtry
1391a6296200SBram Moolenaar    endwhile
1392a6296200SBram Moolenaar    Xpath 'b'
1393a6296200SBram Moolenaar    asdf
1394a6296200SBram Moolenaar    Xpath 'c'
1395a6296200SBram Moolenaar  [CODE]
1396a6296200SBram Moolenaar  let verify =<< trim [CODE]
1397a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1398a6296200SBram Moolenaar  [CODE]
1399a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1400a6296200SBram Moolenaarendfunc
1401a6296200SBram Moolenaar
1402a6296200SBram Moolenaarfunc Test_error_after_try_6()
1403a6296200SBram Moolenaar  let test =<< trim [CODE]
1404a6296200SBram Moolenaar    let p = 1
1405a6296200SBram Moolenaar    while p
1406a6296200SBram Moolenaar      let p = 0
1407a6296200SBram Moolenaar      try
1408a6296200SBram Moolenaar        Xpath 'a'
1409a6296200SBram Moolenaar        continue
1410a6296200SBram Moolenaar        call assert_report('should not get here')
1411a6296200SBram Moolenaar      finally
1412a6296200SBram Moolenaar        Xpath 'b'
1413a6296200SBram Moolenaar      endtry
1414a6296200SBram Moolenaar    endwhile
1415a6296200SBram Moolenaar    Xpath 'c'
1416a6296200SBram Moolenaar    asdf
1417a6296200SBram Moolenaar    Xpath 'd'
1418a6296200SBram Moolenaar  [CODE]
1419a6296200SBram Moolenaar  let verify =<< trim [CODE]
1420a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1421a6296200SBram Moolenaar  [CODE]
1422a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1423a6296200SBram Moolenaarendfunc
1424a6296200SBram Moolenaar
1425a6296200SBram Moolenaarfunc Test_error_after_try_7()
1426a6296200SBram Moolenaar  let test =<< trim [CODE]
1427a6296200SBram Moolenaar    let p = 1
1428a6296200SBram Moolenaar    while p
1429a6296200SBram Moolenaar      let p = 0
1430a6296200SBram Moolenaar      try
1431a6296200SBram Moolenaar        Xpath 'a'
1432a6296200SBram Moolenaar      finally
1433a6296200SBram Moolenaar        Xpath 'b'
1434a6296200SBram Moolenaar        continue
1435a6296200SBram Moolenaar        call assert_report('should not get here')
1436a6296200SBram Moolenaar      endtry
1437a6296200SBram Moolenaar    endwhile
1438a6296200SBram Moolenaar    Xpath 'c'
1439a6296200SBram Moolenaar    asdf
1440a6296200SBram Moolenaar    Xpath 'd'
1441a6296200SBram Moolenaar  [CODE]
1442a6296200SBram Moolenaar  let verify =<< trim [CODE]
1443a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1444a6296200SBram Moolenaar  [CODE]
1445a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1446a6296200SBram Moolenaarendfunc
1447a6296200SBram Moolenaar
1448a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1449a6296200SBram Moolenaar" Test 21:  :finally for :try after :continue/:break/:return/:finish	    {{{1
1450a6296200SBram Moolenaar"
1451a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :continue,
1452a6296200SBram Moolenaar"	    :break, :return, or :finish, its :finally clause should not be
1453a6296200SBram Moolenaar"	    executed.
1454a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1455a6296200SBram Moolenaar
1456a6296200SBram Moolenaarfunc Test_finally_after_loop_ctrl_statement()
1457a6296200SBram Moolenaar  let test =<< trim [CODE]
1458a6296200SBram Moolenaar    func F()
1459a6296200SBram Moolenaar      let loops = 2
1460a6296200SBram Moolenaar      while loops > 0
1461a6296200SBram Moolenaar        XloopNEXT
1462a6296200SBram Moolenaar        let loops = loops - 1
1463a6296200SBram Moolenaar        try
1464a6296200SBram Moolenaar          if loops == 1
1465a6296200SBram Moolenaar            Xloop 'a'
1466a6296200SBram Moolenaar            continue
1467a6296200SBram Moolenaar            call assert_report('should not get here')
1468a6296200SBram Moolenaar          elseif loops == 0
1469a6296200SBram Moolenaar            Xloop 'b'
1470a6296200SBram Moolenaar            break
1471a6296200SBram Moolenaar            call assert_report('should not get here')
1472a6296200SBram Moolenaar          endif
1473a6296200SBram Moolenaar
1474a6296200SBram Moolenaar          try		" inactive
1475a6296200SBram Moolenaar            call assert_report('should not get here')
1476a6296200SBram Moolenaar          finally
1477a6296200SBram Moolenaar            call assert_report('should not get here')
1478a6296200SBram Moolenaar          endtry
1479a6296200SBram Moolenaar        finally
1480a6296200SBram Moolenaar          Xloop 'c'
1481a6296200SBram Moolenaar        endtry
1482a6296200SBram Moolenaar        call assert_report('should not get here')
1483a6296200SBram Moolenaar      endwhile
1484a6296200SBram Moolenaar
1485a6296200SBram Moolenaar      try
1486a6296200SBram Moolenaar        Xpath 'd'
1487a6296200SBram Moolenaar        return
1488a6296200SBram Moolenaar        call assert_report('should not get here')
1489a6296200SBram Moolenaar        try		    " inactive
1490a6296200SBram Moolenaar          call assert_report('should not get here')
1491a6296200SBram Moolenaar        finally
1492a6296200SBram Moolenaar          call assert_report('should not get here')
1493a6296200SBram Moolenaar        endtry
1494a6296200SBram Moolenaar      finally
1495a6296200SBram Moolenaar        Xpath 'e'
1496a6296200SBram Moolenaar      endtry
1497a6296200SBram Moolenaar      call assert_report('should not get here')
1498a6296200SBram Moolenaar    endfunc
1499a6296200SBram Moolenaar
1500a6296200SBram Moolenaar    try
1501a6296200SBram Moolenaar      Xpath 'f'
1502a6296200SBram Moolenaar      call F()
1503a6296200SBram Moolenaar      Xpath 'g'
1504a6296200SBram Moolenaar      finish
1505a6296200SBram Moolenaar      call assert_report('should not get here')
1506a6296200SBram Moolenaar      try		" inactive
1507a6296200SBram Moolenaar        call assert_report('should not get here')
1508a6296200SBram Moolenaar      finally
1509a6296200SBram Moolenaar        call assert_report('should not get here')
1510a6296200SBram Moolenaar      endtry
1511a6296200SBram Moolenaar    finally
1512a6296200SBram Moolenaar      Xpath 'h'
1513a6296200SBram Moolenaar    endtry
1514a6296200SBram Moolenaar    call assert_report('should not get here')
1515a6296200SBram Moolenaar  [CODE]
1516a6296200SBram Moolenaar  let verify =<< trim [CODE]
1517a6296200SBram Moolenaar    call assert_equal('fa2c2b3c3degh', g:Xpath)
1518a6296200SBram Moolenaar  [CODE]
1519a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1520a6296200SBram Moolenaarendfunc
1521a6296200SBram Moolenaar
1522a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1523a6296200SBram Moolenaar" Test 22:  :finally for a :try after an error/interrupt/:throw		    {{{1
1524a6296200SBram Moolenaar"
1525a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding error or
1526a6296200SBram Moolenaar"	    interrupt or :throw, its :finally clause should not be executed.
1527a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1528a6296200SBram Moolenaar
1529a6296200SBram Moolenaarfunc Test_finally_after_error_in_func()
1530a6296200SBram Moolenaar  let test =<< trim [CODE]
1531a6296200SBram Moolenaar    func Error()
1532a6296200SBram Moolenaar      try
1533a6296200SBram Moolenaar        Xpath 'b'
1534a6296200SBram Moolenaar        asdf    " aborting error, triggering error exception
1535a6296200SBram Moolenaar        call assert_report('should not get here')
1536a6296200SBram Moolenaar      endtry
1537a6296200SBram Moolenaar      call assert_report('should not get here')
1538a6296200SBram Moolenaar    endfunc
1539a6296200SBram Moolenaar
1540a6296200SBram Moolenaar    Xpath 'a'
1541a6296200SBram Moolenaar    call Error()
1542a6296200SBram Moolenaar    call assert_report('should not get here')
1543a6296200SBram Moolenaar
1544a6296200SBram Moolenaar    if 1	" not active due to error
1545a6296200SBram Moolenaar      try	" not active since :if inactive
1546a6296200SBram Moolenaar        call assert_report('should not get here')
1547a6296200SBram Moolenaar      finally
1548a6296200SBram Moolenaar        call assert_report('should not get here')
1549a6296200SBram Moolenaar      endtry
1550a6296200SBram Moolenaar    endif
1551a6296200SBram Moolenaar
1552a6296200SBram Moolenaar    try		" not active due to error
1553a6296200SBram Moolenaar      call assert_report('should not get here')
1554a6296200SBram Moolenaar    finally
1555a6296200SBram Moolenaar      call assert_report('should not get here')
1556a6296200SBram Moolenaar    endtry
1557a6296200SBram Moolenaar  [CODE]
1558a6296200SBram Moolenaar  let verify =<< trim [CODE]
1559a6296200SBram Moolenaar    call assert_equal('ab', g:Xpath)
1560a6296200SBram Moolenaar  [CODE]
1561a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1562a6296200SBram Moolenaarendfunc
1563a6296200SBram Moolenaar
1564a6296200SBram Moolenaarfunc Test_finally_after_interrupt()
1565a6296200SBram Moolenaar  let test =<< trim [CODE]
1566a6296200SBram Moolenaar    func Interrupt()
1567a6296200SBram Moolenaar      try
1568a6296200SBram Moolenaar        Xpath 'a'
1569a6296200SBram Moolenaar        call interrupt()            " triggering interrupt exception
1570a6296200SBram Moolenaar        call assert_report('should not get here')
1571a6296200SBram Moolenaar      endtry
1572a6296200SBram Moolenaar    endfunc
1573a6296200SBram Moolenaar
1574a6296200SBram Moolenaar    Xpath 'b'
1575a6296200SBram Moolenaar    try
1576a6296200SBram Moolenaar      call Interrupt()
1577a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1578a6296200SBram Moolenaar      Xpath 'c'
1579a6296200SBram Moolenaar      finish
1580a6296200SBram Moolenaar    endtry
1581a6296200SBram Moolenaar    call assert_report('should not get here')
1582a6296200SBram Moolenaar
1583a6296200SBram Moolenaar    if 1	" not active due to interrupt
1584a6296200SBram Moolenaar      try	" not active since :if inactive
1585a6296200SBram Moolenaar        call assert_report('should not get here')
1586a6296200SBram Moolenaar      finally
1587a6296200SBram Moolenaar        call assert_report('should not get here')
1588a6296200SBram Moolenaar      endtry
1589a6296200SBram Moolenaar    endif
1590a6296200SBram Moolenaar
1591a6296200SBram Moolenaar    try		" not active due to interrupt
1592a6296200SBram Moolenaar      call assert_report('should not get here')
1593a6296200SBram Moolenaar    finally
1594a6296200SBram Moolenaar      call assert_report('should not get here')
1595a6296200SBram Moolenaar    endtry
1596a6296200SBram Moolenaar  [CODE]
1597a6296200SBram Moolenaar  let verify =<< trim [CODE]
1598a6296200SBram Moolenaar    call assert_equal('bac', g:Xpath)
1599a6296200SBram Moolenaar  [CODE]
1600a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1601a6296200SBram Moolenaarendfunc
1602a6296200SBram Moolenaar
1603a6296200SBram Moolenaarfunc Test_finally_after_throw()
1604a6296200SBram Moolenaar  let test =<< trim [CODE]
1605a6296200SBram Moolenaar    func Throw()
1606a6296200SBram Moolenaar      Xpath 'a'
1607a6296200SBram Moolenaar      throw 'xyz'
1608a6296200SBram Moolenaar    endfunc
1609a6296200SBram Moolenaar
1610a6296200SBram Moolenaar    Xpath 'b'
1611a6296200SBram Moolenaar    call Throw()
1612a6296200SBram Moolenaar    call assert_report('should not get here')
1613a6296200SBram Moolenaar
1614a6296200SBram Moolenaar    if 1	" not active due to :throw
1615a6296200SBram Moolenaar      try	" not active since :if inactive
1616a6296200SBram Moolenaar        call assert_report('should not get here')
1617a6296200SBram Moolenaar      finally
1618a6296200SBram Moolenaar        call assert_report('should not get here')
1619a6296200SBram Moolenaar      endtry
1620a6296200SBram Moolenaar    endif
1621a6296200SBram Moolenaar
1622a6296200SBram Moolenaar    try		" not active due to :throw
1623a6296200SBram Moolenaar      call assert_report('should not get here')
1624a6296200SBram Moolenaar    finally
1625a6296200SBram Moolenaar      call assert_report('should not get here')
1626a6296200SBram Moolenaar    endtry
1627a6296200SBram Moolenaar  [CODE]
1628a6296200SBram Moolenaar  let verify =<< trim [CODE]
1629a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1630a6296200SBram Moolenaar  [CODE]
1631a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1632a6296200SBram Moolenaarendfunc
1633a6296200SBram Moolenaar
1634a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1635a6296200SBram Moolenaar" Test 23:  :catch clauses for a :try after a :throw			    {{{1
1636a6296200SBram Moolenaar"
1637a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :throw,
1638a6296200SBram Moolenaar"	    none of its :catch clauses should be executed.
1639a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1640a6296200SBram Moolenaar
1641a6296200SBram Moolenaarfunc Test_catch_after_throw()
1642a6296200SBram Moolenaar  let test =<< trim [CODE]
1643a6296200SBram Moolenaar    try
1644a6296200SBram Moolenaar      Xpath 'a'
1645a6296200SBram Moolenaar      throw "xyz"
1646a6296200SBram Moolenaar      call assert_report('should not get here')
1647a6296200SBram Moolenaar
1648a6296200SBram Moolenaar      if 1	" not active due to :throw
1649a6296200SBram Moolenaar        try	" not active since :if inactive
1650a6296200SBram Moolenaar          call assert_report('should not get here')
1651a6296200SBram Moolenaar        catch /xyz/
1652a6296200SBram Moolenaar          call assert_report('should not get here')
1653a6296200SBram Moolenaar        endtry
1654a6296200SBram Moolenaar      endif
1655a6296200SBram Moolenaar    catch /xyz/
1656a6296200SBram Moolenaar      Xpath 'b'
1657a6296200SBram Moolenaar    endtry
1658a6296200SBram Moolenaar
1659a6296200SBram Moolenaar    Xpath 'c'
1660a6296200SBram Moolenaar    throw "abc"
1661a6296200SBram Moolenaar    call assert_report('should not get here')
1662a6296200SBram Moolenaar
1663a6296200SBram Moolenaar    try		" not active due to :throw
1664a6296200SBram Moolenaar      call assert_report('should not get here')
1665a6296200SBram Moolenaar    catch /abc/
1666a6296200SBram Moolenaar      call assert_report('should not get here')
1667a6296200SBram Moolenaar    endtry
1668a6296200SBram Moolenaar  [CODE]
1669a6296200SBram Moolenaar  let verify =<< trim [CODE]
1670a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1671a6296200SBram Moolenaar  [CODE]
1672a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1673a6296200SBram Moolenaarendfunc
1674a6296200SBram Moolenaar
1675a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1676a6296200SBram Moolenaar" Test 24:  :endtry for a :try after a :throw				    {{{1
1677a6296200SBram Moolenaar"
1678a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :throw,
1679a6296200SBram Moolenaar"	    its :endtry should not rethrow the exception to the next surrounding
1680a6296200SBram Moolenaar"	    active :try conditional.
1681a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1682a6296200SBram Moolenaar
1683a6296200SBram Moolenaarfunc Test_endtry_after_throw()
1684a6296200SBram Moolenaar  let test =<< trim [CODE]
1685a6296200SBram Moolenaar    try			" try 1
1686a6296200SBram Moolenaar      try		" try 2
1687a6296200SBram Moolenaar        Xpath 'a'
1688a6296200SBram Moolenaar        throw "xyz"	" makes try 2 inactive
1689a6296200SBram Moolenaar        call assert_report('should not get here')
1690a6296200SBram Moolenaar
1691a6296200SBram Moolenaar        try		" try 3
1692a6296200SBram Moolenaar          call assert_report('should not get here')
1693a6296200SBram Moolenaar        endtry	" no rethrow to try 1
1694a6296200SBram Moolenaar      catch /xyz/	" should catch although try 2 inactive
1695a6296200SBram Moolenaar        Xpath 'b'
1696a6296200SBram Moolenaar      endtry
1697a6296200SBram Moolenaar    catch /xyz/		" try 1 active, but exception already caught
1698a6296200SBram Moolenaar      call assert_report('should not get here')
1699a6296200SBram Moolenaar    endtry
1700a6296200SBram Moolenaar    Xpath 'c'
1701a6296200SBram Moolenaar  [CODE]
1702a6296200SBram Moolenaar  let verify =<< trim [CODE]
1703a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1704a6296200SBram Moolenaar  [CODE]
1705a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1706a6296200SBram Moolenaarendfunc
1707a6296200SBram Moolenaar
1708a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1709a6296200SBram Moolenaar" Test 27:  Executing :finally clauses after :return			    {{{1
1710a6296200SBram Moolenaar"
1711a6296200SBram Moolenaar"	    For a :return command dynamically enclosed in a :try/:endtry region,
1712a6296200SBram Moolenaar"	    :finally clauses are executed and the called function is ended.
1713a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1714a6296200SBram Moolenaar
1715a6296200SBram Moolenaarfunc T27_F()
1716a6296200SBram Moolenaar  try
1717a6296200SBram Moolenaar    Xpath 'a'
1718a6296200SBram Moolenaar    try
1719a6296200SBram Moolenaar      Xpath 'b'
1720a6296200SBram Moolenaar      return
1721a6296200SBram Moolenaar      call assert_report('should not get here')
1722a6296200SBram Moolenaar    finally
1723a6296200SBram Moolenaar      Xpath 'c'
1724a6296200SBram Moolenaar    endtry
1725a6296200SBram Moolenaar    Xpath 'd'
1726a6296200SBram Moolenaar  finally
1727a6296200SBram Moolenaar    Xpath 'e'
1728a6296200SBram Moolenaar  endtry
1729a6296200SBram Moolenaar  call assert_report('should not get here')
1730a6296200SBram Moolenaarendfunc
1731a6296200SBram Moolenaar
1732a6296200SBram Moolenaarfunc T27_G()
1733a6296200SBram Moolenaar  try
1734a6296200SBram Moolenaar    Xpath 'f'
1735a6296200SBram Moolenaar    return
1736a6296200SBram Moolenaar    call assert_report('should not get here')
1737a6296200SBram Moolenaar  finally
1738a6296200SBram Moolenaar    Xpath 'g'
1739a6296200SBram Moolenaar    call T27_F()
1740a6296200SBram Moolenaar    Xpath 'h'
1741a6296200SBram Moolenaar  endtry
1742a6296200SBram Moolenaar  call assert_report('should not get here')
1743a6296200SBram Moolenaarendfunc
1744a6296200SBram Moolenaar
1745a6296200SBram Moolenaarfunc T27_H()
1746a6296200SBram Moolenaar  try
1747a6296200SBram Moolenaar    Xpath 'i'
1748a6296200SBram Moolenaar    call T27_G()
1749a6296200SBram Moolenaar    Xpath 'j'
1750a6296200SBram Moolenaar  finally
1751a6296200SBram Moolenaar    Xpath 'k'
1752a6296200SBram Moolenaar    return
1753a6296200SBram Moolenaar    call assert_report('should not get here')
1754a6296200SBram Moolenaar  endtry
1755a6296200SBram Moolenaar  call assert_report('should not get here')
1756a6296200SBram Moolenaarendfunction
1757a6296200SBram Moolenaar
1758a6296200SBram Moolenaarfunc Test_finally_after_return()
1759a6296200SBram Moolenaar  XpathINIT
1760a6296200SBram Moolenaar  try
1761a6296200SBram Moolenaar      Xpath 'l'
1762a6296200SBram Moolenaar      call T27_H()
1763a6296200SBram Moolenaar      Xpath 'm'
1764a6296200SBram Moolenaar  finally
1765a6296200SBram Moolenaar      Xpath 'n'
1766a6296200SBram Moolenaar  endtry
1767a6296200SBram Moolenaar  call assert_equal('lifgabcehjkmn', g:Xpath)
1768a6296200SBram Moolenaarendfunc
1769a6296200SBram Moolenaar
1770a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1771a6296200SBram Moolenaar" Test 28:  Executing :finally clauses after :finish			    {{{1
1772a6296200SBram Moolenaar"
1773a6296200SBram Moolenaar"	    For a :finish command dynamically enclosed in a :try/:endtry region,
1774a6296200SBram Moolenaar"	    :finally clauses are executed and the sourced file is finished.
1775a6296200SBram Moolenaar"
1776a6296200SBram Moolenaar"	    This test executes the bodies of the functions F, G, and H from the
1777a6296200SBram Moolenaar"	    previous test as script files (:return replaced by :finish).
1778a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1779a6296200SBram Moolenaar
1780a6296200SBram Moolenaarfunc Test_finally_after_finish()
1781a6296200SBram Moolenaar  XpathINIT
1782a6296200SBram Moolenaar
1783a6296200SBram Moolenaar  let scriptF = MakeScript("T27_F")
1784a6296200SBram Moolenaar  let scriptG = MakeScript("T27_G", scriptF)
1785a6296200SBram Moolenaar  let scriptH = MakeScript("T27_H", scriptG)
1786a6296200SBram Moolenaar
1787a6296200SBram Moolenaar  try
1788a6296200SBram Moolenaar    Xpath 'A'
1789a6296200SBram Moolenaar    exec "source" scriptH
1790a6296200SBram Moolenaar    Xpath 'B'
1791a6296200SBram Moolenaar  finally
1792a6296200SBram Moolenaar    Xpath 'C'
1793a6296200SBram Moolenaar  endtry
1794a6296200SBram Moolenaar  Xpath 'D'
1795a6296200SBram Moolenaar  call assert_equal('AifgabcehjkBCD', g:Xpath)
1796a6296200SBram Moolenaar  call delete(scriptF)
1797a6296200SBram Moolenaar  call delete(scriptG)
1798a6296200SBram Moolenaar  call delete(scriptH)
1799a6296200SBram Moolenaarendfunc
1800a6296200SBram Moolenaar
1801a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1802a6296200SBram Moolenaar" Test 29:  Executing :finally clauses on errors			    {{{1
1803a6296200SBram Moolenaar"
1804a6296200SBram Moolenaar"	    After an error in a command dynamically enclosed in a :try/:endtry
1805a6296200SBram Moolenaar"	    region, :finally clauses are executed and the script processing is
1806a6296200SBram Moolenaar"	    terminated.
1807a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1808a6296200SBram Moolenaar
1809a6296200SBram Moolenaarfunc Test_finally_after_error_1()
1810a6296200SBram Moolenaar  let test =<< trim [CODE]
1811a6296200SBram Moolenaar    func F()
1812a6296200SBram Moolenaar      while 1
1813a6296200SBram Moolenaar        try
1814a6296200SBram Moolenaar          Xpath 'a'
1815a6296200SBram Moolenaar          while 1
1816a6296200SBram Moolenaar            try
1817a6296200SBram Moolenaar              Xpath 'b'
1818a6296200SBram Moolenaar              asdf	    " error
1819a6296200SBram Moolenaar              call assert_report('should not get here')
1820a6296200SBram Moolenaar            finally
1821a6296200SBram Moolenaar              Xpath 'c'
1822a6296200SBram Moolenaar            endtry | call assert_report('should not get here')
1823a6296200SBram Moolenaar            call assert_report('should not get here')
1824a6296200SBram Moolenaar            break
1825a6296200SBram Moolenaar          endwhile
1826a6296200SBram Moolenaar          call assert_report('should not get here')
1827a6296200SBram Moolenaar        finally
1828a6296200SBram Moolenaar          Xpath 'd'
1829a6296200SBram Moolenaar        endtry | call assert_report('should not get here')
1830a6296200SBram Moolenaar        call assert_report('should not get here')
1831a6296200SBram Moolenaar        break
1832a6296200SBram Moolenaar      endwhile
1833a6296200SBram Moolenaar      call assert_report('should not get here')
1834a6296200SBram Moolenaar    endfunc
1835a6296200SBram Moolenaar
1836a6296200SBram Moolenaar    while 1
1837a6296200SBram Moolenaar      try
1838a6296200SBram Moolenaar        Xpath 'e'
1839a6296200SBram Moolenaar        while 1
1840a6296200SBram Moolenaar          call F()
1841a6296200SBram Moolenaar          call assert_report('should not get here')
1842a6296200SBram Moolenaar          break
1843a6296200SBram Moolenaar        endwhile  | call assert_report('should not get here')
1844a6296200SBram Moolenaar        call assert_report('should not get here')
1845a6296200SBram Moolenaar      finally
1846a6296200SBram Moolenaar        Xpath 'f'
1847a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1848a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1849a6296200SBram Moolenaar    call assert_report('should not get here')
1850a6296200SBram Moolenaar  [CODE]
1851a6296200SBram Moolenaar  let verify =<< trim [CODE]
1852a6296200SBram Moolenaar    call assert_equal('eabcdf', g:Xpath)
1853a6296200SBram Moolenaar  [CODE]
1854a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1855a6296200SBram Moolenaarendfunc
1856a6296200SBram Moolenaar
1857a6296200SBram Moolenaarfunc Test_finally_after_error_2()
1858a6296200SBram Moolenaar  let test =<< trim [CODE]
1859a6296200SBram Moolenaar    func G() abort
1860a6296200SBram Moolenaar      if 1
1861a6296200SBram Moolenaar        try
1862a6296200SBram Moolenaar          Xpath 'a'
1863a6296200SBram Moolenaar          asdf	    " error
1864a6296200SBram Moolenaar          call assert_report('should not get here')
1865a6296200SBram Moolenaar        finally
1866a6296200SBram Moolenaar          Xpath 'b'
1867a6296200SBram Moolenaar        endtry | Xpath 'c'
1868a6296200SBram Moolenaar      endif | Xpath 'd'
1869a6296200SBram Moolenaar      call assert_report('should not get here')
1870a6296200SBram Moolenaar    endfunc
1871a6296200SBram Moolenaar
1872a6296200SBram Moolenaar    if 1
1873a6296200SBram Moolenaar      try
1874a6296200SBram Moolenaar        Xpath 'e'
1875a6296200SBram Moolenaar        call G()
1876a6296200SBram Moolenaar        call assert_report('should not get here')
1877a6296200SBram Moolenaar      finally
1878a6296200SBram Moolenaar        Xpath 'f'
1879a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1880a6296200SBram Moolenaar    endif | call assert_report('should not get here')
1881a6296200SBram Moolenaar    call assert_report('should not get here')
1882a6296200SBram Moolenaar  [CODE]
1883a6296200SBram Moolenaar  let verify =<< trim [CODE]
1884a6296200SBram Moolenaar    call assert_equal('eabf', g:Xpath)
1885a6296200SBram Moolenaar  [CODE]
1886a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1887a6296200SBram Moolenaarendfunc
1888a6296200SBram Moolenaar
1889a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1890a6296200SBram Moolenaar" Test 30:  Executing :finally clauses on interrupt			    {{{1
1891a6296200SBram Moolenaar"
1892a6296200SBram Moolenaar"	    After an interrupt in a command dynamically enclosed in
1893a6296200SBram Moolenaar"	    a :try/:endtry region, :finally clauses are executed and the
1894a6296200SBram Moolenaar"	    script processing is terminated.
1895a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1896a6296200SBram Moolenaar
1897a6296200SBram Moolenaarfunc Test_finally_on_interrupt()
1898a6296200SBram Moolenaar  let test =<< trim [CODE]
1899a6296200SBram Moolenaar    func F()
1900a6296200SBram Moolenaar      try
1901a6296200SBram Moolenaar        Xloop 'a'
1902a6296200SBram Moolenaar        call interrupt()
1903a6296200SBram Moolenaar        call assert_report('should not get here')
1904a6296200SBram Moolenaar      finally
1905a6296200SBram Moolenaar        Xloop 'b'
1906a6296200SBram Moolenaar      endtry
1907a6296200SBram Moolenaar      call assert_report('should not get here')
1908a6296200SBram Moolenaar    endfunc
1909a6296200SBram Moolenaar
1910a6296200SBram Moolenaar    try
1911a6296200SBram Moolenaar      try
1912a6296200SBram Moolenaar        Xpath 'c'
1913a6296200SBram Moolenaar        try
1914a6296200SBram Moolenaar          Xpath 'd'
1915a6296200SBram Moolenaar          call interrupt()
1916a6296200SBram Moolenaar          call assert_report('should not get here')
1917a6296200SBram Moolenaar        finally
1918a6296200SBram Moolenaar          Xpath 'e'
1919a6296200SBram Moolenaar          try
1920a6296200SBram Moolenaar            Xpath 'f'
1921a6296200SBram Moolenaar            try
1922a6296200SBram Moolenaar              Xpath 'g'
1923a6296200SBram Moolenaar            finally
1924a6296200SBram Moolenaar              Xpath 'h'
1925a6296200SBram Moolenaar              try
1926a6296200SBram Moolenaar                Xpath 'i'
1927a6296200SBram Moolenaar                call interrupt()
1928a6296200SBram Moolenaar                call assert_report('should not get here')
1929a6296200SBram Moolenaar              endtry
1930a6296200SBram Moolenaar              call assert_report('should not get here')
1931a6296200SBram Moolenaar            endtry
1932a6296200SBram Moolenaar            call assert_report('should not get here')
1933a6296200SBram Moolenaar          endtry
1934a6296200SBram Moolenaar          call assert_report('should not get here')
1935a6296200SBram Moolenaar        endtry
1936a6296200SBram Moolenaar        call assert_report('should not get here')
1937a6296200SBram Moolenaar      finally
1938a6296200SBram Moolenaar        Xpath 'j'
1939a6296200SBram Moolenaar        try
1940a6296200SBram Moolenaar          Xpath 'k'
1941a6296200SBram Moolenaar          call F()
1942a6296200SBram Moolenaar          call assert_report('should not get here')
1943a6296200SBram Moolenaar        finally
1944a6296200SBram Moolenaar          Xpath 'l'
1945a6296200SBram Moolenaar          try
1946a6296200SBram Moolenaar            Xpath 'm'
1947a6296200SBram Moolenaar            XloopNEXT
1948a6296200SBram Moolenaar            ExecAsScript F
1949a6296200SBram Moolenaar            call assert_report('should not get here')
1950a6296200SBram Moolenaar          finally
1951a6296200SBram Moolenaar            Xpath 'n'
1952a6296200SBram Moolenaar          endtry
1953a6296200SBram Moolenaar          call assert_report('should not get here')
1954a6296200SBram Moolenaar        endtry
1955a6296200SBram Moolenaar        call assert_report('should not get here')
1956a6296200SBram Moolenaar      endtry
1957a6296200SBram Moolenaar      call assert_report('should not get here')
1958a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1959a6296200SBram Moolenaar      Xpath 'o'
1960a6296200SBram Moolenaar    endtry
1961a6296200SBram Moolenaar  [CODE]
1962a6296200SBram Moolenaar  let verify =<< trim [CODE]
1963a6296200SBram Moolenaar    call assert_equal('cdefghijka1b1lma2b2no', g:Xpath)
1964a6296200SBram Moolenaar  [CODE]
1965a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1966a6296200SBram Moolenaarendfunc
1967a6296200SBram Moolenaar
1968a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1969a6296200SBram Moolenaar" Test 31:  Executing :finally clauses after :throw			    {{{1
1970a6296200SBram Moolenaar"
1971a6296200SBram Moolenaar"	    After a :throw dynamically enclosed in a :try/:endtry region,
1972a6296200SBram Moolenaar"	    :finally clauses are executed and the script processing is
1973a6296200SBram Moolenaar"	    terminated.
1974a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1975a6296200SBram Moolenaar
1976a6296200SBram Moolenaarfunc Test_finally_after_throw_2()
1977a6296200SBram Moolenaar  let test =<< trim [CODE]
1978a6296200SBram Moolenaar    func F()
1979a6296200SBram Moolenaar      try
1980a6296200SBram Moolenaar        Xloop 'a'
1981a6296200SBram Moolenaar        throw "exception"
1982a6296200SBram Moolenaar        call assert_report('should not get here')
1983a6296200SBram Moolenaar      finally
1984a6296200SBram Moolenaar        Xloop 'b'
1985a6296200SBram Moolenaar      endtry
1986a6296200SBram Moolenaar      call assert_report('should not get here')
1987a6296200SBram Moolenaar    endfunc
1988a6296200SBram Moolenaar
1989a6296200SBram Moolenaar    try
1990a6296200SBram Moolenaar      Xpath 'c'
1991a6296200SBram Moolenaar      try
1992a6296200SBram Moolenaar        Xpath 'd'
1993a6296200SBram Moolenaar        throw "exception"
1994a6296200SBram Moolenaar        call assert_report('should not get here')
1995a6296200SBram Moolenaar      finally
1996a6296200SBram Moolenaar        Xpath 'e'
1997a6296200SBram Moolenaar        try
1998a6296200SBram Moolenaar          Xpath 'f'
1999a6296200SBram Moolenaar          try
2000a6296200SBram Moolenaar            Xpath 'g'
2001a6296200SBram Moolenaar          finally
2002a6296200SBram Moolenaar            Xpath 'h'
2003a6296200SBram Moolenaar            try
2004a6296200SBram Moolenaar              Xpath 'i'
2005a6296200SBram Moolenaar              throw "exception"
2006a6296200SBram Moolenaar              call assert_report('should not get here')
2007a6296200SBram Moolenaar            endtry
2008a6296200SBram Moolenaar            call assert_report('should not get here')
2009a6296200SBram Moolenaar          endtry
2010a6296200SBram Moolenaar          call assert_report('should not get here')
2011a6296200SBram Moolenaar        endtry
2012a6296200SBram Moolenaar        call assert_report('should not get here')
2013a6296200SBram Moolenaar      endtry
2014a6296200SBram Moolenaar      call assert_report('should not get here')
2015a6296200SBram Moolenaar    finally
2016a6296200SBram Moolenaar      Xpath 'j'
2017a6296200SBram Moolenaar      try
2018a6296200SBram Moolenaar        Xpath 'k'
2019a6296200SBram Moolenaar        call F()
2020a6296200SBram Moolenaar        call assert_report('should not get here')
2021a6296200SBram Moolenaar      finally
2022a6296200SBram Moolenaar        Xpath 'l'
2023a6296200SBram Moolenaar        try
2024a6296200SBram Moolenaar          Xpath 'm'
2025a6296200SBram Moolenaar          XloopNEXT
2026a6296200SBram Moolenaar          ExecAsScript F
2027a6296200SBram Moolenaar          call assert_report('should not get here')
2028a6296200SBram Moolenaar        finally
2029a6296200SBram Moolenaar          Xpath 'n'
2030a6296200SBram Moolenaar        endtry
2031a6296200SBram Moolenaar        call assert_report('should not get here')
2032a6296200SBram Moolenaar      endtry
2033a6296200SBram Moolenaar      call assert_report('should not get here')
2034a6296200SBram Moolenaar    endtry
2035a6296200SBram Moolenaar    call assert_report('should not get here')
2036a6296200SBram Moolenaar  [CODE]
2037a6296200SBram Moolenaar  let verify =<< trim [CODE]
2038a6296200SBram Moolenaar    call assert_equal('cdefghijka1b1lma2b2n', g:Xpath)
2039a6296200SBram Moolenaar  [CODE]
2040a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2041a6296200SBram Moolenaarendfunc
2042a6296200SBram Moolenaar
2043a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2044a6296200SBram Moolenaar" Test 34:  :finally reason discarded by :continue			    {{{1
2045a6296200SBram Moolenaar"
2046a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2047a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2048a6296200SBram Moolenaar"	    discarded by a :continue in the finally clause.
2049a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2050a6296200SBram Moolenaar
2051a6296200SBram Moolenaarfunc Test_finally_after_continue()
2052a6296200SBram Moolenaar  let test =<< trim [CODE]
2053a6296200SBram Moolenaar    func C(jump)
2054a6296200SBram Moolenaar      XloopNEXT
2055a6296200SBram Moolenaar      let loop = 0
2056a6296200SBram Moolenaar      while loop < 2
2057a6296200SBram Moolenaar        let loop = loop + 1
2058a6296200SBram Moolenaar        if loop == 1
2059a6296200SBram Moolenaar          try
2060a6296200SBram Moolenaar            if a:jump == "continue"
2061a6296200SBram Moolenaar              continue
2062a6296200SBram Moolenaar            elseif a:jump == "break"
2063a6296200SBram Moolenaar              break
2064a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2065a6296200SBram Moolenaar              return
2066a6296200SBram Moolenaar            elseif a:jump == "error"
2067a6296200SBram Moolenaar              asdf
2068a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2069a6296200SBram Moolenaar              call interrupt()
2070a6296200SBram Moolenaar              let dummy = 0
2071a6296200SBram Moolenaar            elseif a:jump == "throw"
2072a6296200SBram Moolenaar              throw "abc"
2073a6296200SBram Moolenaar            endif
2074a6296200SBram Moolenaar          finally
2075a6296200SBram Moolenaar            continue	" discards jump that caused the :finally
2076a6296200SBram Moolenaar            call assert_report('should not get here')
2077a6296200SBram Moolenaar          endtry
2078a6296200SBram Moolenaar          call assert_report('should not get here')
2079a6296200SBram Moolenaar        elseif loop == 2
2080a6296200SBram Moolenaar          Xloop 'a'
2081a6296200SBram Moolenaar        endif
2082a6296200SBram Moolenaar      endwhile
2083a6296200SBram Moolenaar    endfunc
2084a6296200SBram Moolenaar
2085a6296200SBram Moolenaar    call C("continue")
2086a6296200SBram Moolenaar    Xpath 'b'
2087a6296200SBram Moolenaar    call C("break")
2088a6296200SBram Moolenaar    Xpath 'c'
2089a6296200SBram Moolenaar    call C("return")
2090a6296200SBram Moolenaar    Xpath 'd'
2091a6296200SBram Moolenaar    let g:jump = "finish"
2092a6296200SBram Moolenaar    ExecAsScript C
2093a6296200SBram Moolenaar    unlet g:jump
2094a6296200SBram Moolenaar    Xpath 'e'
2095a6296200SBram Moolenaar    try
2096a6296200SBram Moolenaar      call C("error")
2097a6296200SBram Moolenaar      Xpath 'f'
2098a6296200SBram Moolenaar    finally
2099a6296200SBram Moolenaar      Xpath 'g'
2100a6296200SBram Moolenaar      try
2101a6296200SBram Moolenaar        call C("interrupt")
2102a6296200SBram Moolenaar        Xpath 'h'
2103a6296200SBram Moolenaar      finally
2104a6296200SBram Moolenaar        Xpath 'i'
2105a6296200SBram Moolenaar        call C("throw")
2106a6296200SBram Moolenaar        Xpath 'j'
2107a6296200SBram Moolenaar      endtry
2108a6296200SBram Moolenaar    endtry
2109a6296200SBram Moolenaar    Xpath 'k'
2110a6296200SBram Moolenaar  [CODE]
2111a6296200SBram Moolenaar  let verify =<< trim [CODE]
2112a6296200SBram Moolenaar    call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath)
2113a6296200SBram Moolenaar  [CODE]
2114a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2115a6296200SBram Moolenaarendfunc
2116a6296200SBram Moolenaar
2117a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2118a6296200SBram Moolenaar" Test 35:  :finally reason discarded by :break				    {{{1
2119a6296200SBram Moolenaar"
2120a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2121a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2122a6296200SBram Moolenaar"	    discarded by a :break in the finally clause.
2123a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2124a6296200SBram Moolenaar
2125a6296200SBram Moolenaarfunc Test_finally_discard_by_break()
2126a6296200SBram Moolenaar  let test =<< trim [CODE]
2127a6296200SBram Moolenaar    func B(jump)
2128a6296200SBram Moolenaar      XloopNEXT
2129a6296200SBram Moolenaar      let loop = 0
2130a6296200SBram Moolenaar      while loop < 2
2131a6296200SBram Moolenaar        let loop = loop + 1
2132a6296200SBram Moolenaar        if loop == 1
2133a6296200SBram Moolenaar          try
2134a6296200SBram Moolenaar            if a:jump == "continue"
2135a6296200SBram Moolenaar              continue
2136a6296200SBram Moolenaar            elseif a:jump == "break"
2137a6296200SBram Moolenaar              break
2138a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2139a6296200SBram Moolenaar              return
2140a6296200SBram Moolenaar            elseif a:jump == "error"
2141a6296200SBram Moolenaar              asdf
2142a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2143a6296200SBram Moolenaar              call interrupt()
2144a6296200SBram Moolenaar              let dummy = 0
2145a6296200SBram Moolenaar            elseif a:jump == "throw"
2146a6296200SBram Moolenaar              throw "abc"
2147a6296200SBram Moolenaar            endif
2148a6296200SBram Moolenaar          finally
2149a6296200SBram Moolenaar            break	" discards jump that caused the :finally
2150a6296200SBram Moolenaar            call assert_report('should not get here')
2151a6296200SBram Moolenaar          endtry
2152a6296200SBram Moolenaar        elseif loop == 2
2153a6296200SBram Moolenaar          call assert_report('should not get here')
2154a6296200SBram Moolenaar        endif
2155a6296200SBram Moolenaar      endwhile
2156a6296200SBram Moolenaar      Xloop 'a'
2157a6296200SBram Moolenaar    endfunc
2158a6296200SBram Moolenaar
2159a6296200SBram Moolenaar    call B("continue")
2160a6296200SBram Moolenaar    Xpath 'b'
2161a6296200SBram Moolenaar    call B("break")
2162a6296200SBram Moolenaar    Xpath 'c'
2163a6296200SBram Moolenaar    call B("return")
2164a6296200SBram Moolenaar    Xpath 'd'
2165a6296200SBram Moolenaar    let g:jump = "finish"
2166a6296200SBram Moolenaar    ExecAsScript B
2167a6296200SBram Moolenaar    unlet g:jump
2168a6296200SBram Moolenaar    Xpath 'e'
2169a6296200SBram Moolenaar    try
2170a6296200SBram Moolenaar      call B("error")
2171a6296200SBram Moolenaar      Xpath 'f'
2172a6296200SBram Moolenaar    finally
2173a6296200SBram Moolenaar      Xpath 'g'
2174a6296200SBram Moolenaar      try
2175a6296200SBram Moolenaar        call B("interrupt")
2176a6296200SBram Moolenaar        Xpath 'h'
2177a6296200SBram Moolenaar      finally
2178a6296200SBram Moolenaar        Xpath 'i'
2179a6296200SBram Moolenaar        call B("throw")
2180a6296200SBram Moolenaar        Xpath 'j'
2181a6296200SBram Moolenaar      endtry
2182a6296200SBram Moolenaar    endtry
2183a6296200SBram Moolenaar    Xpath 'k'
2184a6296200SBram Moolenaar  [CODE]
2185a6296200SBram Moolenaar  let verify =<< trim [CODE]
2186a6296200SBram Moolenaar    call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath)
2187a6296200SBram Moolenaar  [CODE]
2188a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2189a6296200SBram Moolenaarendfunc
2190a6296200SBram Moolenaar
2191a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2192a6296200SBram Moolenaar" Test 36:  :finally reason discarded by :return			    {{{1
2193a6296200SBram Moolenaar"
2194a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2195a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2196a6296200SBram Moolenaar"	    discarded by a :return in the finally clause.
2197a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2198a6296200SBram Moolenaar
2199a6296200SBram Moolenaarfunc Test_finally_discard_by_return()
2200a6296200SBram Moolenaar  let test =<< trim [CODE]
2201a6296200SBram Moolenaar    func R(jump, retval) abort
2202a6296200SBram Moolenaar      let loop = 0
2203a6296200SBram Moolenaar      while loop < 2
2204a6296200SBram Moolenaar        let loop = loop + 1
2205a6296200SBram Moolenaar        if loop == 1
2206a6296200SBram Moolenaar          try
2207a6296200SBram Moolenaar            if a:jump == "continue"
2208a6296200SBram Moolenaar              continue
2209a6296200SBram Moolenaar            elseif a:jump == "break"
2210a6296200SBram Moolenaar              break
2211a6296200SBram Moolenaar            elseif a:jump == "return"
2212a6296200SBram Moolenaar              return
2213a6296200SBram Moolenaar            elseif a:jump == "error"
2214a6296200SBram Moolenaar              asdf
2215a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2216a6296200SBram Moolenaar              call interrupt()
2217a6296200SBram Moolenaar              let dummy = 0
2218a6296200SBram Moolenaar            elseif a:jump == "throw"
2219a6296200SBram Moolenaar              throw "abc"
2220a6296200SBram Moolenaar            endif
2221a6296200SBram Moolenaar          finally
2222a6296200SBram Moolenaar            return a:retval	" discards jump that caused the :finally
2223a6296200SBram Moolenaar            call assert_report('should not get here')
2224a6296200SBram Moolenaar          endtry
2225a6296200SBram Moolenaar        elseif loop == 2
2226a6296200SBram Moolenaar          call assert_report('should not get here')
2227a6296200SBram Moolenaar        endif
2228a6296200SBram Moolenaar      endwhile
2229a6296200SBram Moolenaar      call assert_report('should not get here')
2230a6296200SBram Moolenaar    endfunc
2231a6296200SBram Moolenaar
2232a6296200SBram Moolenaar    let sum =  -R("continue", -8)
2233a6296200SBram Moolenaar    Xpath 'a'
2234a6296200SBram Moolenaar    let sum = sum - R("break", -16)
2235a6296200SBram Moolenaar    Xpath 'b'
2236a6296200SBram Moolenaar    let sum = sum - R("return", -32)
2237a6296200SBram Moolenaar    Xpath 'c'
2238a6296200SBram Moolenaar    try
2239a6296200SBram Moolenaar      let sum = sum - R("error", -64)
2240a6296200SBram Moolenaar      Xpath 'd'
2241a6296200SBram Moolenaar    finally
2242a6296200SBram Moolenaar      Xpath 'e'
2243a6296200SBram Moolenaar      try
2244a6296200SBram Moolenaar        let sum = sum - R("interrupt", -128)
2245a6296200SBram Moolenaar        Xpath 'f'
2246a6296200SBram Moolenaar      finally
2247a6296200SBram Moolenaar        Xpath 'g'
2248a6296200SBram Moolenaar        let sum = sum - R("throw", -256)
2249a6296200SBram Moolenaar        Xpath 'h'
2250a6296200SBram Moolenaar      endtry
2251a6296200SBram Moolenaar    endtry
2252a6296200SBram Moolenaar    Xpath 'i'
2253a6296200SBram Moolenaar
2254a6296200SBram Moolenaar    let expected = 8 + 16 + 32 + 64 + 128 + 256
2255a6296200SBram Moolenaar    call assert_equal(sum, expected)
2256a6296200SBram Moolenaar  [CODE]
2257a6296200SBram Moolenaar  let verify =<< trim [CODE]
2258a6296200SBram Moolenaar    call assert_equal('abcdefghi', g:Xpath)
2259a6296200SBram Moolenaar  [CODE]
2260a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2261a6296200SBram Moolenaarendfunc
2262a6296200SBram Moolenaar
2263a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2264a6296200SBram Moolenaar" Test 37:  :finally reason discarded by :finish			    {{{1
2265a6296200SBram Moolenaar"
2266a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2267a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2268a6296200SBram Moolenaar"	    discarded by a :finish in the finally clause.
2269a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2270a6296200SBram Moolenaar
2271a6296200SBram Moolenaarfunc Test_finally_discard_by_finish()
2272a6296200SBram Moolenaar  let test =<< trim [CODE]
2273a6296200SBram Moolenaar    func F(jump)	" not executed as function, transformed to a script
2274a6296200SBram Moolenaar      let loop = 0
2275a6296200SBram Moolenaar      while loop < 2
2276a6296200SBram Moolenaar        let loop = loop + 1
2277a6296200SBram Moolenaar        if loop == 1
2278a6296200SBram Moolenaar          try
2279a6296200SBram Moolenaar            if a:jump == "continue"
2280a6296200SBram Moolenaar              continue
2281a6296200SBram Moolenaar            elseif a:jump == "break"
2282a6296200SBram Moolenaar              break
2283a6296200SBram Moolenaar            elseif a:jump == "finish"
2284a6296200SBram Moolenaar              finish
2285a6296200SBram Moolenaar            elseif a:jump == "error"
2286a6296200SBram Moolenaar              asdf
2287a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2288a6296200SBram Moolenaar              call interrupt()
2289a6296200SBram Moolenaar              let dummy = 0
2290a6296200SBram Moolenaar            elseif a:jump == "throw"
2291a6296200SBram Moolenaar              throw "abc"
2292a6296200SBram Moolenaar            endif
2293a6296200SBram Moolenaar          finally
2294a6296200SBram Moolenaar            finish	" discards jump that caused the :finally
2295a6296200SBram Moolenaar            call assert_report('should not get here')
2296a6296200SBram Moolenaar          endtry
2297a6296200SBram Moolenaar        elseif loop == 2
2298a6296200SBram Moolenaar          call assert_report('should not get here')
2299a6296200SBram Moolenaar        endif
2300a6296200SBram Moolenaar      endwhile
2301a6296200SBram Moolenaar      call assert_report('should not get here')
2302a6296200SBram Moolenaar    endfunc
2303a6296200SBram Moolenaar
2304a6296200SBram Moolenaar    let scriptF = MakeScript("F")
2305a6296200SBram Moolenaar    delfunction F
2306a6296200SBram Moolenaar
2307a6296200SBram Moolenaar    let g:jump = "continue"
2308a6296200SBram Moolenaar    exec "source" scriptF
2309a6296200SBram Moolenaar    Xpath 'a'
2310a6296200SBram Moolenaar    let g:jump = "break"
2311a6296200SBram Moolenaar    exec "source" scriptF
2312a6296200SBram Moolenaar    Xpath 'b'
2313a6296200SBram Moolenaar    let g:jump = "finish"
2314a6296200SBram Moolenaar    exec "source" scriptF
2315a6296200SBram Moolenaar    Xpath 'c'
2316a6296200SBram Moolenaar    try
2317a6296200SBram Moolenaar      let g:jump = "error"
2318a6296200SBram Moolenaar      exec "source" scriptF
2319a6296200SBram Moolenaar      Xpath 'd'
2320a6296200SBram Moolenaar    finally
2321a6296200SBram Moolenaar      Xpath 'e'
2322a6296200SBram Moolenaar      try
2323a6296200SBram Moolenaar        let g:jump = "interrupt"
2324a6296200SBram Moolenaar        exec "source" scriptF
2325a6296200SBram Moolenaar        Xpath 'f'
2326a6296200SBram Moolenaar      finally
2327a6296200SBram Moolenaar        Xpath 'g'
2328a6296200SBram Moolenaar        try
2329a6296200SBram Moolenaar          let g:jump = "throw"
2330a6296200SBram Moolenaar          exec "source" scriptF
2331a6296200SBram Moolenaar          Xpath 'h'
2332a6296200SBram Moolenaar        finally
2333a6296200SBram Moolenaar          Xpath 'i'
2334a6296200SBram Moolenaar        endtry
2335a6296200SBram Moolenaar      endtry
2336a6296200SBram Moolenaar    endtry
2337a6296200SBram Moolenaar    unlet g:jump
2338a6296200SBram Moolenaar    call delete(scriptF)
2339a6296200SBram Moolenaar  [CODE]
2340a6296200SBram Moolenaar  let verify =<< trim [CODE]
2341a6296200SBram Moolenaar    call assert_equal('abcdefghi', g:Xpath)
2342a6296200SBram Moolenaar  [CODE]
2343a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2344a6296200SBram Moolenaarendfunc
2345a6296200SBram Moolenaar
2346a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2347a6296200SBram Moolenaar" Test 38:  :finally reason discarded by an error			    {{{1
2348a6296200SBram Moolenaar"
2349a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2350a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2351a6296200SBram Moolenaar"	    discarded by an error in the finally clause.
2352a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2353a6296200SBram Moolenaar
2354a6296200SBram Moolenaarfunc Test_finally_discard_by_error()
2355a6296200SBram Moolenaar  let test =<< trim [CODE]
2356a6296200SBram Moolenaar    func E(jump)
2357a6296200SBram Moolenaar      let loop = 0
2358a6296200SBram Moolenaar      while loop < 2
2359a6296200SBram Moolenaar        let loop = loop + 1
2360a6296200SBram Moolenaar        if loop == 1
2361a6296200SBram Moolenaar          try
2362a6296200SBram Moolenaar            if a:jump == "continue"
2363a6296200SBram Moolenaar              continue
2364a6296200SBram Moolenaar            elseif a:jump == "break"
2365a6296200SBram Moolenaar              break
2366a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2367a6296200SBram Moolenaar              return
2368a6296200SBram Moolenaar            elseif a:jump == "error"
2369a6296200SBram Moolenaar              asdf
2370a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2371a6296200SBram Moolenaar              call interrupt()
2372a6296200SBram Moolenaar              let dummy = 0
2373a6296200SBram Moolenaar            elseif a:jump == "throw"
2374a6296200SBram Moolenaar              throw "abc"
2375a6296200SBram Moolenaar            endif
2376a6296200SBram Moolenaar          finally
2377a6296200SBram Moolenaar            asdf	" error; discards jump that caused the :finally
2378a6296200SBram Moolenaar          endtry
2379a6296200SBram Moolenaar        elseif loop == 2
2380a6296200SBram Moolenaar          call assert_report('should not get here')
2381a6296200SBram Moolenaar        endif
2382a6296200SBram Moolenaar      endwhile
2383a6296200SBram Moolenaar      call assert_report('should not get here')
2384a6296200SBram Moolenaar    endfunc
2385a6296200SBram Moolenaar
2386a6296200SBram Moolenaar    try
2387a6296200SBram Moolenaar      Xpath 'a'
2388a6296200SBram Moolenaar      call E("continue")
2389a6296200SBram Moolenaar      call assert_report('should not get here')
2390a6296200SBram Moolenaar    finally
2391a6296200SBram Moolenaar      try
2392a6296200SBram Moolenaar        Xpath 'b'
2393a6296200SBram Moolenaar        call E("break")
2394a6296200SBram Moolenaar        call assert_report('should not get here')
2395a6296200SBram Moolenaar      finally
2396a6296200SBram Moolenaar        try
2397a6296200SBram Moolenaar          Xpath 'c'
2398a6296200SBram Moolenaar          call E("return")
2399a6296200SBram Moolenaar          call assert_report('should not get here')
2400a6296200SBram Moolenaar        finally
2401a6296200SBram Moolenaar          try
2402a6296200SBram Moolenaar            Xpath 'd'
2403a6296200SBram Moolenaar            let g:jump = "finish"
2404a6296200SBram Moolenaar            ExecAsScript E
2405a6296200SBram Moolenaar            call assert_report('should not get here')
2406a6296200SBram Moolenaar          finally
2407a6296200SBram Moolenaar            unlet g:jump
2408a6296200SBram Moolenaar            try
2409a6296200SBram Moolenaar              Xpath 'e'
2410a6296200SBram Moolenaar              call E("error")
2411a6296200SBram Moolenaar              call assert_report('should not get here')
2412a6296200SBram Moolenaar            finally
2413a6296200SBram Moolenaar              try
2414a6296200SBram Moolenaar                Xpath 'f'
2415a6296200SBram Moolenaar                call E("interrupt")
2416a6296200SBram Moolenaar                call assert_report('should not get here')
2417a6296200SBram Moolenaar              finally
2418a6296200SBram Moolenaar                try
2419a6296200SBram Moolenaar                  Xpath 'g'
2420a6296200SBram Moolenaar                  call E("throw")
2421a6296200SBram Moolenaar                  call assert_report('should not get here')
2422a6296200SBram Moolenaar                finally
2423a6296200SBram Moolenaar                  Xpath 'h'
2424a6296200SBram Moolenaar                  delfunction E
2425a6296200SBram Moolenaar                endtry
2426a6296200SBram Moolenaar              endtry
2427a6296200SBram Moolenaar            endtry
2428a6296200SBram Moolenaar          endtry
2429a6296200SBram Moolenaar        endtry
2430a6296200SBram Moolenaar      endtry
2431a6296200SBram Moolenaar    endtry
2432a6296200SBram Moolenaar    call assert_report('should not get here')
2433a6296200SBram Moolenaar  [CODE]
2434a6296200SBram Moolenaar  let verify =<< trim [CODE]
2435a6296200SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
2436a6296200SBram Moolenaar  [CODE]
2437a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2438a6296200SBram Moolenaarendfunc
2439a6296200SBram Moolenaar
2440a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2441a6296200SBram Moolenaar" Test 39:  :finally reason discarded by an interrupt			    {{{1
2442a6296200SBram Moolenaar"
2443a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2444a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2445a6296200SBram Moolenaar"	    discarded by an interrupt in the finally clause.
2446a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2447a6296200SBram Moolenaar
2448a6296200SBram Moolenaarfunc Test_finally_discarded_by_interrupt()
2449a6296200SBram Moolenaar  let test =<< trim [CODE]
2450a6296200SBram Moolenaar    func I(jump)
2451a6296200SBram Moolenaar      let loop = 0
2452a6296200SBram Moolenaar      while loop < 2
2453a6296200SBram Moolenaar        let loop = loop + 1
2454a6296200SBram Moolenaar        if loop == 1
2455a6296200SBram Moolenaar          try
2456a6296200SBram Moolenaar            if a:jump == "continue"
2457a6296200SBram Moolenaar              continue
2458a6296200SBram Moolenaar            elseif a:jump == "break"
2459a6296200SBram Moolenaar              break
2460a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2461a6296200SBram Moolenaar              return
2462a6296200SBram Moolenaar            elseif a:jump == "error"
2463a6296200SBram Moolenaar              asdf
2464a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2465a6296200SBram Moolenaar              call interrupt()
2466a6296200SBram Moolenaar              let dummy = 0
2467a6296200SBram Moolenaar            elseif a:jump == "throw"
2468a6296200SBram Moolenaar              throw "abc"
2469a6296200SBram Moolenaar            endif
2470a6296200SBram Moolenaar          finally
2471a6296200SBram Moolenaar            call interrupt()
2472a6296200SBram Moolenaar            let dummy = 0
2473a6296200SBram Moolenaar          endtry
2474a6296200SBram Moolenaar        elseif loop == 2
2475a6296200SBram Moolenaar          call assert_report('should not get here')
2476a6296200SBram Moolenaar        endif
2477a6296200SBram Moolenaar      endwhile
2478a6296200SBram Moolenaar      call assert_report('should not get here')
2479a6296200SBram Moolenaar    endfunc
2480a6296200SBram Moolenaar
2481a6296200SBram Moolenaar    try
2482a6296200SBram Moolenaar      try
2483a6296200SBram Moolenaar        Xpath 'a'
2484a6296200SBram Moolenaar        call I("continue")
2485a6296200SBram Moolenaar        call assert_report('should not get here')
2486a6296200SBram Moolenaar      finally
2487a6296200SBram Moolenaar        try
2488a6296200SBram Moolenaar          Xpath 'b'
2489a6296200SBram Moolenaar          call I("break")
2490a6296200SBram Moolenaar          call assert_report('should not get here')
2491a6296200SBram Moolenaar        finally
2492a6296200SBram Moolenaar          try
2493a6296200SBram Moolenaar            Xpath 'c'
2494a6296200SBram Moolenaar            call I("return")
2495a6296200SBram Moolenaar            call assert_report('should not get here')
2496a6296200SBram Moolenaar          finally
2497a6296200SBram Moolenaar            try
2498a6296200SBram Moolenaar              Xpath 'd'
2499a6296200SBram Moolenaar              let g:jump = "finish"
2500a6296200SBram Moolenaar              ExecAsScript I
2501a6296200SBram Moolenaar              call assert_report('should not get here')
2502a6296200SBram Moolenaar            finally
2503a6296200SBram Moolenaar              unlet g:jump
2504a6296200SBram Moolenaar              try
2505a6296200SBram Moolenaar                Xpath 'e'
2506a6296200SBram Moolenaar                call I("error")
2507a6296200SBram Moolenaar                call assert_report('should not get here')
2508a6296200SBram Moolenaar              finally
2509a6296200SBram Moolenaar                try
2510a6296200SBram Moolenaar                  Xpath 'f'
2511a6296200SBram Moolenaar                  call I("interrupt")
2512a6296200SBram Moolenaar                  call assert_report('should not get here')
2513a6296200SBram Moolenaar                finally
2514a6296200SBram Moolenaar                  try
2515a6296200SBram Moolenaar                    Xpath 'g'
2516a6296200SBram Moolenaar                    call I("throw")
2517a6296200SBram Moolenaar                    call assert_report('should not get here')
2518a6296200SBram Moolenaar                  finally
2519a6296200SBram Moolenaar                    Xpath 'h'
2520a6296200SBram Moolenaar                    delfunction I
2521a6296200SBram Moolenaar                  endtry
2522a6296200SBram Moolenaar                endtry
2523a6296200SBram Moolenaar              endtry
2524a6296200SBram Moolenaar            endtry
2525a6296200SBram Moolenaar          endtry
2526a6296200SBram Moolenaar        endtry
2527a6296200SBram Moolenaar      endtry
2528a6296200SBram Moolenaar      call assert_report('should not get here')
2529a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
2530a6296200SBram Moolenaar      Xpath 'A'
2531a6296200SBram Moolenaar    endtry
2532a6296200SBram Moolenaar  [CODE]
2533a6296200SBram Moolenaar  let verify =<< trim [CODE]
2534a6296200SBram Moolenaar    call assert_equal('abcdefghA', g:Xpath)
2535a6296200SBram Moolenaar  [CODE]
2536a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2537a6296200SBram Moolenaarendfunc
2538a6296200SBram Moolenaar
2539a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2540a6296200SBram Moolenaar" Test 40:  :finally reason discarded by :throw				    {{{1
2541a6296200SBram Moolenaar"
2542a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2543a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2544a6296200SBram Moolenaar"	    discarded by a :throw in the finally clause.
2545a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2546a6296200SBram Moolenaar
2547a6296200SBram Moolenaarfunc Test_finally_discard_by_throw()
2548a6296200SBram Moolenaar  let test =<< trim [CODE]
2549a6296200SBram Moolenaar    func T(jump)
2550a6296200SBram Moolenaar      let loop = 0
2551a6296200SBram Moolenaar      while loop < 2
2552a6296200SBram Moolenaar        let loop = loop + 1
2553a6296200SBram Moolenaar        if loop == 1
2554a6296200SBram Moolenaar          try
2555a6296200SBram Moolenaar            if a:jump == "continue"
2556a6296200SBram Moolenaar              continue
2557a6296200SBram Moolenaar            elseif a:jump == "break"
2558a6296200SBram Moolenaar              break
2559a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2560a6296200SBram Moolenaar              return
2561a6296200SBram Moolenaar            elseif a:jump == "error"
2562a6296200SBram Moolenaar              asdf
2563a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2564a6296200SBram Moolenaar              call interrupt()
2565a6296200SBram Moolenaar              let dummy = 0
2566a6296200SBram Moolenaar            elseif a:jump == "throw"
2567a6296200SBram Moolenaar              throw "abc"
2568a6296200SBram Moolenaar            endif
2569a6296200SBram Moolenaar          finally
2570a6296200SBram Moolenaar            throw "xyz"	" discards jump that caused the :finally
2571a6296200SBram Moolenaar          endtry
2572a6296200SBram Moolenaar        elseif loop == 2
2573a6296200SBram Moolenaar          call assert_report('should not get here')
2574a6296200SBram Moolenaar        endif
2575a6296200SBram Moolenaar      endwhile
2576a6296200SBram Moolenaar      call assert_report('should not get here')
2577a6296200SBram Moolenaar    endfunc
2578a6296200SBram Moolenaar
2579a6296200SBram Moolenaar    try
2580a6296200SBram Moolenaar      Xpath 'a'
2581a6296200SBram Moolenaar      call T("continue")
2582a6296200SBram Moolenaar      call assert_report('should not get here')
2583a6296200SBram Moolenaar    finally
2584a6296200SBram Moolenaar      try
2585a6296200SBram Moolenaar        Xpath 'b'
2586a6296200SBram Moolenaar        call T("break")
2587a6296200SBram Moolenaar        call assert_report('should not get here')
2588a6296200SBram Moolenaar      finally
2589a6296200SBram Moolenaar        try
2590a6296200SBram Moolenaar          Xpath 'c'
2591a6296200SBram Moolenaar          call T("return")
2592a6296200SBram Moolenaar          call assert_report('should not get here')
2593a6296200SBram Moolenaar        finally
2594a6296200SBram Moolenaar          try
2595a6296200SBram Moolenaar            Xpath 'd'
2596a6296200SBram Moolenaar            let g:jump = "finish"
2597a6296200SBram Moolenaar            ExecAsScript T
2598a6296200SBram Moolenaar            call assert_report('should not get here')
2599a6296200SBram Moolenaar          finally
2600a6296200SBram Moolenaar            unlet g:jump
2601a6296200SBram Moolenaar            try
2602a6296200SBram Moolenaar              Xpath 'e'
2603a6296200SBram Moolenaar              call T("error")
2604a6296200SBram Moolenaar              call assert_report('should not get here')
2605a6296200SBram Moolenaar            finally
2606a6296200SBram Moolenaar              try
2607a6296200SBram Moolenaar                Xpath 'f'
2608a6296200SBram Moolenaar                call T("interrupt")
2609a6296200SBram Moolenaar                call assert_report('should not get here')
2610a6296200SBram Moolenaar              finally
2611a6296200SBram Moolenaar                try
2612a6296200SBram Moolenaar                  Xpath 'g'
2613a6296200SBram Moolenaar                  call T("throw")
2614a6296200SBram Moolenaar                  call assert_report('should not get here')
2615a6296200SBram Moolenaar                finally
2616a6296200SBram Moolenaar                  Xpath 'h'
2617a6296200SBram Moolenaar                  delfunction T
2618a6296200SBram Moolenaar                endtry
2619a6296200SBram Moolenaar              endtry
2620a6296200SBram Moolenaar            endtry
2621a6296200SBram Moolenaar          endtry
2622a6296200SBram Moolenaar        endtry
2623a6296200SBram Moolenaar      endtry
2624a6296200SBram Moolenaar    endtry
2625a6296200SBram Moolenaar    call assert_report('should not get here')
2626a6296200SBram Moolenaar  [CODE]
2627a6296200SBram Moolenaar  let verify =<< trim [CODE]
2628a6296200SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
2629a6296200SBram Moolenaar  [CODE]
2630a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2631a6296200SBram Moolenaarendfunc
2632a6296200SBram Moolenaar
2633a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2634a6296200SBram Moolenaar" Test 49:  Throwing exceptions across functions			    {{{1
2635a6296200SBram Moolenaar"
2636a6296200SBram Moolenaar"	    When an exception is thrown but not caught inside a function, the
2637a6296200SBram Moolenaar"	    caller is checked for a matching :catch clause.
2638a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2639a6296200SBram Moolenaar
2640a6296200SBram Moolenaarfunc T49_C()
2641a6296200SBram Moolenaar  try
2642a6296200SBram Moolenaar    Xpath 'a'
2643a6296200SBram Moolenaar    throw "arrgh"
2644a6296200SBram Moolenaar    call assert_report('should not get here')
2645a6296200SBram Moolenaar  catch /arrgh/
2646a6296200SBram Moolenaar    Xpath 'b'
2647a6296200SBram Moolenaar  endtry
2648a6296200SBram Moolenaar  Xpath 'c'
2649a6296200SBram Moolenaarendfunc
2650a6296200SBram Moolenaar
2651a6296200SBram Moolenaarfunc T49_T1()
2652a6296200SBram Moolenaar  XloopNEXT
2653a6296200SBram Moolenaar  try
2654a6296200SBram Moolenaar    Xloop 'd'
2655a6296200SBram Moolenaar    throw "arrgh"
2656a6296200SBram Moolenaar    call assert_report('should not get here')
2657a6296200SBram Moolenaar  finally
2658a6296200SBram Moolenaar    Xloop 'e'
2659a6296200SBram Moolenaar  endtry
2660a6296200SBram Moolenaar  Xloop 'f'
2661a6296200SBram Moolenaarendfunc
2662a6296200SBram Moolenaar
2663a6296200SBram Moolenaarfunc T49_T2()
2664a6296200SBram Moolenaar  try
2665a6296200SBram Moolenaar    Xpath 'g'
2666a6296200SBram Moolenaar    call T49_T1()
2667a6296200SBram Moolenaar    call assert_report('should not get here')
2668a6296200SBram Moolenaar  finally
2669a6296200SBram Moolenaar    Xpath 'h'
2670a6296200SBram Moolenaar  endtry
2671a6296200SBram Moolenaar  call assert_report('should not get here')
2672a6296200SBram Moolenaarendfunc
2673a6296200SBram Moolenaar
2674a6296200SBram Moolenaarfunc Test_throw_exception_across_funcs()
2675a6296200SBram Moolenaar  XpathINIT
2676a6296200SBram Moolenaar  XloopINIT
2677a6296200SBram Moolenaar  try
2678a6296200SBram Moolenaar    Xpath 'i'
2679a6296200SBram Moolenaar    call T49_C()            " throw and catch
2680a6296200SBram Moolenaar    Xpath 'j'
2681a6296200SBram Moolenaar  catch /.*/
2682a6296200SBram Moolenaar    call assert_report('should not get here')
2683a6296200SBram Moolenaar  endtry
2684a6296200SBram Moolenaar
2685a6296200SBram Moolenaar  try
2686a6296200SBram Moolenaar    Xpath 'k'
2687a6296200SBram Moolenaar    call T49_T1()  " throw, one level
2688a6296200SBram Moolenaar    call assert_report('should not get here')
2689a6296200SBram Moolenaar  catch /arrgh/
2690a6296200SBram Moolenaar    Xpath 'l'
2691a6296200SBram Moolenaar  catch /.*/
2692a6296200SBram Moolenaar    call assert_report('should not get here')
2693a6296200SBram Moolenaar  endtry
2694a6296200SBram Moolenaar
2695a6296200SBram Moolenaar  try
2696a6296200SBram Moolenaar    Xpath 'm'
2697a6296200SBram Moolenaar    call T49_T2()	" throw, two levels
2698a6296200SBram Moolenaar    call assert_report('should not get here')
2699a6296200SBram Moolenaar  catch /arrgh/
2700a6296200SBram Moolenaar    Xpath 'n'
2701a6296200SBram Moolenaar  catch /.*/
2702a6296200SBram Moolenaar    call assert_report('should not get here')
2703a6296200SBram Moolenaar  endtry
2704a6296200SBram Moolenaar  Xpath 'o'
2705a6296200SBram Moolenaar
2706a6296200SBram Moolenaar  call assert_equal('iabcjkd2e2lmgd3e3hno', g:Xpath)
2707a6296200SBram Moolenaarendfunc
2708a6296200SBram Moolenaar
2709a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2710a6296200SBram Moolenaar" Test 50:  Throwing exceptions across script files			    {{{1
2711a6296200SBram Moolenaar"
2712a6296200SBram Moolenaar"	    When an exception is thrown but not caught inside a script file,
2713a6296200SBram Moolenaar"	    the sourcing script or function is checked for a matching :catch
2714a6296200SBram Moolenaar"	    clause.
2715a6296200SBram Moolenaar"
2716a6296200SBram Moolenaar"	    This test executes the bodies of the functions C, T1, and T2 from
2717a6296200SBram Moolenaar"	    the previous test as script files (:return replaced by :finish).
2718a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2719a6296200SBram Moolenaar
2720a6296200SBram Moolenaarfunc T50_F()
2721a6296200SBram Moolenaar  try
2722a6296200SBram Moolenaar    Xpath 'A'
2723a6296200SBram Moolenaar    exec "source" g:scriptC
2724a6296200SBram Moolenaar    Xpath 'B'
2725a6296200SBram Moolenaar  catch /.*/
2726a6296200SBram Moolenaar    call assert_report('should not get here')
2727a6296200SBram Moolenaar  endtry
2728a6296200SBram Moolenaar
2729a6296200SBram Moolenaar  try
2730a6296200SBram Moolenaar    Xpath 'C'
2731a6296200SBram Moolenaar    exec "source" g:scriptT1
2732a6296200SBram Moolenaar    call assert_report('should not get here')
2733a6296200SBram Moolenaar  catch /arrgh/
2734a6296200SBram Moolenaar    Xpath 'D'
2735a6296200SBram Moolenaar  catch /.*/
2736a6296200SBram Moolenaar    call assert_report('should not get here')
2737a6296200SBram Moolenaar  endtry
2738a6296200SBram Moolenaarendfunc
2739a6296200SBram Moolenaar
2740a6296200SBram Moolenaarfunc Test_throw_across_script()
2741a6296200SBram Moolenaar  XpathINIT
2742a6296200SBram Moolenaar  XloopINIT
2743a6296200SBram Moolenaar  let g:scriptC = MakeScript("T49_C")
2744a6296200SBram Moolenaar  let g:scriptT1 = MakeScript("T49_T1")
2745a6296200SBram Moolenaar  let scriptT2 = MakeScript("T49_T2", g:scriptT1)
2746a6296200SBram Moolenaar
2747a6296200SBram Moolenaar  try
2748a6296200SBram Moolenaar    Xpath 'E'
2749a6296200SBram Moolenaar    call T50_F()
2750a6296200SBram Moolenaar    Xpath 'F'
2751a6296200SBram Moolenaar    exec "source" scriptT2
2752a6296200SBram Moolenaar    call assert_report('should not get here')
2753a6296200SBram Moolenaar  catch /arrgh/
2754a6296200SBram Moolenaar    Xpath 'G'
2755a6296200SBram Moolenaar  catch /.*/
2756a6296200SBram Moolenaar    call assert_report('should not get here')
2757a6296200SBram Moolenaar  endtry
2758a6296200SBram Moolenaar  Xpath 'H'
2759a6296200SBram Moolenaar  call assert_equal('EAabcBCd2e2DFgd3e3hGH', g:Xpath)
2760a6296200SBram Moolenaar
2761a6296200SBram Moolenaar  call delete(g:scriptC)
2762a6296200SBram Moolenaar  call delete(g:scriptT1)
2763a6296200SBram Moolenaar  call delete(scriptT2)
2764a6296200SBram Moolenaar  unlet g:scriptC g:scriptT1 scriptT2
2765a6296200SBram Moolenaarendfunc
2766a6296200SBram Moolenaar
27671f068233SBram Moolenaar"-------------------------------------------------------------------------------
27689470a4d8SBram Moolenaar" Test 52:  Uncaught exceptions						    {{{1
27699470a4d8SBram Moolenaar"
27709470a4d8SBram Moolenaar"	    When an exception is thrown but not caught, an error message is
27719470a4d8SBram Moolenaar"	    displayed when the script is terminated.  In case of an interrupt
27729470a4d8SBram Moolenaar"	    or error exception, the normal interrupt or error message(s) are
27739470a4d8SBram Moolenaar"	    displayed.
27749470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
27759470a4d8SBram Moolenaar
27769470a4d8SBram Moolenaarfunc Test_uncaught_exception_1()
27779470a4d8SBram Moolenaar  CheckEnglish
27789470a4d8SBram Moolenaar
27799470a4d8SBram Moolenaar  let test =<< trim [CODE]
27809470a4d8SBram Moolenaar    Xpath 'a'
27819470a4d8SBram Moolenaar    throw "arrgh"
27829470a4d8SBram Moolenaar    call assert_report('should not get here')`
27839470a4d8SBram Moolenaar  [CODE]
27849470a4d8SBram Moolenaar  let verify =<< trim [CODE]
27859470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: arrgh', v:errmsg)
27869470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
27879470a4d8SBram Moolenaar  [CODE]
27889470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
27899470a4d8SBram Moolenaarendfunc
27909470a4d8SBram Moolenaar
27919470a4d8SBram Moolenaarfunc Test_uncaught_exception_2()
27929470a4d8SBram Moolenaar  CheckEnglish
27939470a4d8SBram Moolenaar
27949470a4d8SBram Moolenaar  let test =<< trim [CODE]
27959470a4d8SBram Moolenaar    try
27969470a4d8SBram Moolenaar      Xpath 'a'
27979470a4d8SBram Moolenaar      throw "oops"
27989470a4d8SBram Moolenaar      call assert_report('should not get here')`
27999470a4d8SBram Moolenaar    catch /arrgh/
28009470a4d8SBram Moolenaar      call assert_report('should not get here')`
28019470a4d8SBram Moolenaar    endtry
28029470a4d8SBram Moolenaar    call assert_report('should not get here')`
28039470a4d8SBram Moolenaar  [CODE]
28049470a4d8SBram Moolenaar  let verify =<< trim [CODE]
28059470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: oops', v:errmsg)
28069470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
28079470a4d8SBram Moolenaar  [CODE]
28089470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
28099470a4d8SBram Moolenaarendfunc
28109470a4d8SBram Moolenaar
28119470a4d8SBram Moolenaarfunc Test_uncaught_exception_3()
28129470a4d8SBram Moolenaar  CheckEnglish
28139470a4d8SBram Moolenaar
28149470a4d8SBram Moolenaar  let test =<< trim [CODE]
28159470a4d8SBram Moolenaar    func T()
28169470a4d8SBram Moolenaar      Xpath 'c'
28179470a4d8SBram Moolenaar      throw "brrr"
28189470a4d8SBram Moolenaar      call assert_report('should not get here')`
28199470a4d8SBram Moolenaar    endfunc
28209470a4d8SBram Moolenaar
28219470a4d8SBram Moolenaar    try
28229470a4d8SBram Moolenaar      Xpath 'a'
28239470a4d8SBram Moolenaar      throw "arrgh"
28249470a4d8SBram Moolenaar      call assert_report('should not get here')`
28259470a4d8SBram Moolenaar    catch /.*/
28269470a4d8SBram Moolenaar      Xpath 'b'
28279470a4d8SBram Moolenaar      call T()
28289470a4d8SBram Moolenaar      call assert_report('should not get here')`
28299470a4d8SBram Moolenaar    endtry
28309470a4d8SBram Moolenaar    call assert_report('should not get here')`
28319470a4d8SBram Moolenaar  [CODE]
28329470a4d8SBram Moolenaar  let verify =<< trim [CODE]
28339470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: brrr', v:errmsg)
28349470a4d8SBram Moolenaar    call assert_equal('abc', g:Xpath)
28359470a4d8SBram Moolenaar  [CODE]
28369470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
28379470a4d8SBram Moolenaarendfunc
28389470a4d8SBram Moolenaar
28399470a4d8SBram Moolenaarfunc Test_uncaught_exception_4()
28409470a4d8SBram Moolenaar  CheckEnglish
28419470a4d8SBram Moolenaar
28429470a4d8SBram Moolenaar  let test =<< trim [CODE]
28439470a4d8SBram Moolenaar    try
28449470a4d8SBram Moolenaar      Xpath 'a'
28459470a4d8SBram Moolenaar      throw "arrgh"
28469470a4d8SBram Moolenaar      call assert_report('should not get here')`
28479470a4d8SBram Moolenaar    finally
28489470a4d8SBram Moolenaar      Xpath 'b'
28499470a4d8SBram Moolenaar      throw "brrr"
28509470a4d8SBram Moolenaar      call assert_report('should not get here')`
28519470a4d8SBram Moolenaar    endtry
28529470a4d8SBram Moolenaar    call assert_report('should not get here')`
28539470a4d8SBram Moolenaar  [CODE]
28549470a4d8SBram Moolenaar  let verify =<< trim [CODE]
28559470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: brrr', v:errmsg)
28569470a4d8SBram Moolenaar    call assert_equal('ab', g:Xpath)
28579470a4d8SBram Moolenaar  [CODE]
28589470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
28599470a4d8SBram Moolenaarendfunc
28609470a4d8SBram Moolenaar
28619470a4d8SBram Moolenaarfunc Test_uncaught_exception_5()
28629470a4d8SBram Moolenaar  CheckEnglish
28639470a4d8SBram Moolenaar
28649470a4d8SBram Moolenaar  " Need to catch and handle interrupt, otherwise the test will wait for the
28659470a4d8SBram Moolenaar  " user to press <Enter> to continue
28669470a4d8SBram Moolenaar  let test =<< trim [CODE]
28679470a4d8SBram Moolenaar    try
28689470a4d8SBram Moolenaar      try
28699470a4d8SBram Moolenaar        Xpath 'a'
28709470a4d8SBram Moolenaar        call interrupt()
28719470a4d8SBram Moolenaar        call assert_report('should not get here')
28729470a4d8SBram Moolenaar      endtry
28739470a4d8SBram Moolenaar      call assert_report('should not get here')
28749470a4d8SBram Moolenaar    catch /^Vim:Interrupt$/
28759470a4d8SBram Moolenaar      Xpath 'b'
28769470a4d8SBram Moolenaar    endtry
28779470a4d8SBram Moolenaar  [CODE]
28789470a4d8SBram Moolenaar  let verify =<< trim [CODE]
28799470a4d8SBram Moolenaar    call assert_equal('ab', g:Xpath)
28809470a4d8SBram Moolenaar  [CODE]
28819470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
28829470a4d8SBram Moolenaarendfunc
28839470a4d8SBram Moolenaar
28849470a4d8SBram Moolenaarfunc Test_uncaught_exception_6()
28859470a4d8SBram Moolenaar  CheckEnglish
28869470a4d8SBram Moolenaar
28879470a4d8SBram Moolenaar  let test =<< trim [CODE]
28889470a4d8SBram Moolenaar    try
28899470a4d8SBram Moolenaar      Xpath 'a'
28909470a4d8SBram Moolenaar      let x = novar	" error E121; exception: E121
28919470a4d8SBram Moolenaar    catch /E15:/	" should not catch
28929470a4d8SBram Moolenaar      call assert_report('should not get here')
28939470a4d8SBram Moolenaar    endtry
28949470a4d8SBram Moolenaar    call assert_report('should not get here')
28959470a4d8SBram Moolenaar  [CODE]
28969470a4d8SBram Moolenaar  let verify =<< trim [CODE]
28979470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
28989470a4d8SBram Moolenaar    call assert_equal('E121: Undefined variable: novar', v:errmsg)
28999470a4d8SBram Moolenaar  [CODE]
29009470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
29019470a4d8SBram Moolenaarendfunc
29029470a4d8SBram Moolenaar
29039470a4d8SBram Moolenaarfunc Test_uncaught_exception_7()
29049470a4d8SBram Moolenaar  CheckEnglish
29059470a4d8SBram Moolenaar
29069470a4d8SBram Moolenaar  let test =<< trim [CODE]
29079470a4d8SBram Moolenaar    try
29089470a4d8SBram Moolenaar      Xpath 'a'
29099470a4d8SBram Moolenaar      " error E108/E488; exception: E488
29109470a4d8SBram Moolenaar      unlet novar #
29119470a4d8SBram Moolenaar    catch /E108:/       " should not catch
29129470a4d8SBram Moolenaar      call assert_report('should not get here')
29139470a4d8SBram Moolenaar    endtry
29149470a4d8SBram Moolenaar    call assert_report('should not get here')
29159470a4d8SBram Moolenaar  [CODE]
29169470a4d8SBram Moolenaar  let verify =<< trim [CODE]
29179470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
29189470a4d8SBram Moolenaar    call assert_equal('E488: Trailing characters: #', v:errmsg)
29199470a4d8SBram Moolenaar  [CODE]
29209470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
29219470a4d8SBram Moolenaarendfunc
29229470a4d8SBram Moolenaar
29239470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
29249470a4d8SBram Moolenaar" Test 53:  Nesting errors: :endif/:else/:elseif			    {{{1
29259470a4d8SBram Moolenaar"
29269470a4d8SBram Moolenaar"	    For nesting errors of :if conditionals the correct error messages
29279470a4d8SBram Moolenaar"	    should be given.
29289470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
29299470a4d8SBram Moolenaar
29309470a4d8SBram Moolenaarfunc Test_nested_if_else_errors()
29319470a4d8SBram Moolenaar  CheckEnglish
29329470a4d8SBram Moolenaar
29339470a4d8SBram Moolenaar  " :endif without :if
29349470a4d8SBram Moolenaar  let code =<< trim END
29359470a4d8SBram Moolenaar    endif
29369470a4d8SBram Moolenaar  END
29379470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29389470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
29399470a4d8SBram Moolenaar
29409470a4d8SBram Moolenaar  " :endif without :if
29419470a4d8SBram Moolenaar  let code =<< trim END
29429470a4d8SBram Moolenaar    while 1
29439470a4d8SBram Moolenaar      endif
29449470a4d8SBram Moolenaar    endwhile
29459470a4d8SBram Moolenaar  END
29469470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29479470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
29489470a4d8SBram Moolenaar
29499470a4d8SBram Moolenaar  " :endif without :if
29509470a4d8SBram Moolenaar  let code =<< trim END
29519470a4d8SBram Moolenaar    try
29529470a4d8SBram Moolenaar    finally
29539470a4d8SBram Moolenaar      endif
29549470a4d8SBram Moolenaar    endtry
29559470a4d8SBram Moolenaar  END
29569470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29579470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
29589470a4d8SBram Moolenaar
29599470a4d8SBram Moolenaar  " :endif without :if
29609470a4d8SBram Moolenaar  let code =<< trim END
29619470a4d8SBram Moolenaar    try
29629470a4d8SBram Moolenaar      endif
29639470a4d8SBram Moolenaar    endtry
29649470a4d8SBram Moolenaar  END
29659470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29669470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
29679470a4d8SBram Moolenaar
29689470a4d8SBram Moolenaar  " :endif without :if
29699470a4d8SBram Moolenaar  let code =<< trim END
29709470a4d8SBram Moolenaar    try
29719470a4d8SBram Moolenaar      throw "a"
29729470a4d8SBram Moolenaar    catch /a/
29739470a4d8SBram Moolenaar      endif
29749470a4d8SBram Moolenaar    endtry
29759470a4d8SBram Moolenaar  END
29769470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29779470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
29789470a4d8SBram Moolenaar
29799470a4d8SBram Moolenaar  " :else without :if
29809470a4d8SBram Moolenaar  let code =<< trim END
29819470a4d8SBram Moolenaar    else
29829470a4d8SBram Moolenaar  END
29839470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29849470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
29859470a4d8SBram Moolenaar
29869470a4d8SBram Moolenaar  " :else without :if
29879470a4d8SBram Moolenaar  let code =<< trim END
29889470a4d8SBram Moolenaar    while 1
29899470a4d8SBram Moolenaar      else
29909470a4d8SBram Moolenaar    endwhile
29919470a4d8SBram Moolenaar  END
29929470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
29939470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
29949470a4d8SBram Moolenaar
29959470a4d8SBram Moolenaar  " :else without :if
29969470a4d8SBram Moolenaar  let code =<< trim END
29979470a4d8SBram Moolenaar    try
29989470a4d8SBram Moolenaar    finally
29999470a4d8SBram Moolenaar      else
30009470a4d8SBram Moolenaar    endtry
30019470a4d8SBram Moolenaar  END
30029470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30039470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
30049470a4d8SBram Moolenaar
30059470a4d8SBram Moolenaar  " :else without :if
30069470a4d8SBram Moolenaar  let code =<< trim END
30079470a4d8SBram Moolenaar    try
30089470a4d8SBram Moolenaar      else
30099470a4d8SBram Moolenaar    endtry
30109470a4d8SBram Moolenaar  END
30119470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30129470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
30139470a4d8SBram Moolenaar
30149470a4d8SBram Moolenaar  " :else without :if
30159470a4d8SBram Moolenaar  let code =<< trim END
30169470a4d8SBram Moolenaar    try
30179470a4d8SBram Moolenaar      throw "a"
30189470a4d8SBram Moolenaar    catch /a/
30199470a4d8SBram Moolenaar      else
30209470a4d8SBram Moolenaar    endtry
30219470a4d8SBram Moolenaar  END
30229470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30239470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
30249470a4d8SBram Moolenaar
30259470a4d8SBram Moolenaar  " :elseif without :if
30269470a4d8SBram Moolenaar  let code =<< trim END
30279470a4d8SBram Moolenaar    elseif
30289470a4d8SBram Moolenaar  END
30299470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30309470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
30319470a4d8SBram Moolenaar
30329470a4d8SBram Moolenaar  " :elseif without :if
30339470a4d8SBram Moolenaar  let code =<< trim END
30349470a4d8SBram Moolenaar    while 1
30359470a4d8SBram Moolenaar      elseif
30369470a4d8SBram Moolenaar    endwhile
30379470a4d8SBram Moolenaar  END
30389470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30399470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
30409470a4d8SBram Moolenaar
30419470a4d8SBram Moolenaar  " :elseif without :if
30429470a4d8SBram Moolenaar  let code =<< trim END
30439470a4d8SBram Moolenaar    try
30449470a4d8SBram Moolenaar    finally
30459470a4d8SBram Moolenaar      elseif
30469470a4d8SBram Moolenaar    endtry
30479470a4d8SBram Moolenaar  END
30489470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30499470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
30509470a4d8SBram Moolenaar
30519470a4d8SBram Moolenaar  " :elseif without :if
30529470a4d8SBram Moolenaar  let code =<< trim END
30539470a4d8SBram Moolenaar    try
30549470a4d8SBram Moolenaar      elseif
30559470a4d8SBram Moolenaar    endtry
30569470a4d8SBram Moolenaar  END
30579470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30589470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
30599470a4d8SBram Moolenaar
30609470a4d8SBram Moolenaar  " :elseif without :if
30619470a4d8SBram Moolenaar  let code =<< trim END
30629470a4d8SBram Moolenaar    try
30639470a4d8SBram Moolenaar      throw "a"
30649470a4d8SBram Moolenaar    catch /a/
30659470a4d8SBram Moolenaar      elseif
30669470a4d8SBram Moolenaar    endtry
30679470a4d8SBram Moolenaar  END
30689470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30699470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
30709470a4d8SBram Moolenaar
30719470a4d8SBram Moolenaar  " multiple :else
30729470a4d8SBram Moolenaar  let code =<< trim END
30739470a4d8SBram Moolenaar    if 1
30749470a4d8SBram Moolenaar    else
30759470a4d8SBram Moolenaar    else
30769470a4d8SBram Moolenaar    endif
30779470a4d8SBram Moolenaar  END
30789470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30799470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E583: multiple :else')
30809470a4d8SBram Moolenaar
30819470a4d8SBram Moolenaar  " :elseif after :else
30829470a4d8SBram Moolenaar  let code =<< trim END
30839470a4d8SBram Moolenaar    if 1
30849470a4d8SBram Moolenaar    else
30859470a4d8SBram Moolenaar    elseif 1
30869470a4d8SBram Moolenaar    endif
30879470a4d8SBram Moolenaar  END
30889470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
30899470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E584: :elseif after :else')
30909470a4d8SBram Moolenaar
30919470a4d8SBram Moolenaar  call delete('Xtest')
30929470a4d8SBram Moolenaarendfunc
30939470a4d8SBram Moolenaar
30949470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
30959470a4d8SBram Moolenaar" Test 54:  Nesting errors: :while/:endwhile				    {{{1
30969470a4d8SBram Moolenaar"
30979470a4d8SBram Moolenaar"	    For nesting errors of :while conditionals the correct error messages
30989470a4d8SBram Moolenaar"	    should be given.
30999470a4d8SBram Moolenaar"
31009470a4d8SBram Moolenaar"	    This test reuses the function MESSAGES() from the previous test.
31019470a4d8SBram Moolenaar"	    This functions checks the messages in g:msgfile.
31029470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
31039470a4d8SBram Moolenaar
31049470a4d8SBram Moolenaarfunc Test_nested_while_error()
31059470a4d8SBram Moolenaar  CheckEnglish
31069470a4d8SBram Moolenaar
31079470a4d8SBram Moolenaar  " :endwhile without :while
31089470a4d8SBram Moolenaar  let code =<< trim END
31099470a4d8SBram Moolenaar    endwhile
31109470a4d8SBram Moolenaar  END
31119470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31129470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
31139470a4d8SBram Moolenaar
31149470a4d8SBram Moolenaar  " :endwhile without :while
31159470a4d8SBram Moolenaar  let code =<< trim END
31169470a4d8SBram Moolenaar    if 1
31179470a4d8SBram Moolenaar      endwhile
31189470a4d8SBram Moolenaar    endif
31199470a4d8SBram Moolenaar  END
31209470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31219470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
31229470a4d8SBram Moolenaar
31239470a4d8SBram Moolenaar  " Missing :endif
31249470a4d8SBram Moolenaar  let code =<< trim END
31259470a4d8SBram Moolenaar    while 1
31269470a4d8SBram Moolenaar      if 1
31279470a4d8SBram Moolenaar    endwhile
31289470a4d8SBram Moolenaar  END
31299470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31309470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
31319470a4d8SBram Moolenaar
31329470a4d8SBram Moolenaar  " :endwhile without :while
31339470a4d8SBram Moolenaar  let code =<< trim END
31349470a4d8SBram Moolenaar    try
31359470a4d8SBram Moolenaar    finally
31369470a4d8SBram Moolenaar      endwhile
31379470a4d8SBram Moolenaar    endtry
31389470a4d8SBram Moolenaar  END
31399470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31409470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
31419470a4d8SBram Moolenaar
31429470a4d8SBram Moolenaar  " Missing :endtry
31439470a4d8SBram Moolenaar  let code =<< trim END
31449470a4d8SBram Moolenaar    while 1
31459470a4d8SBram Moolenaar      try
31469470a4d8SBram Moolenaar      finally
31479470a4d8SBram Moolenaar    endwhile
31489470a4d8SBram Moolenaar  END
31499470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31509470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry')
31519470a4d8SBram Moolenaar
31529470a4d8SBram Moolenaar  " Missing :endtry
31539470a4d8SBram Moolenaar  let code =<< trim END
31549470a4d8SBram Moolenaar    while 1
31559470a4d8SBram Moolenaar      if 1
31569470a4d8SBram Moolenaar        try
31579470a4d8SBram Moolenaar        finally
31589470a4d8SBram Moolenaar    endwhile
31599470a4d8SBram Moolenaar  END
31609470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31619470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry')
31629470a4d8SBram Moolenaar
31639470a4d8SBram Moolenaar  " Missing :endif
31649470a4d8SBram Moolenaar  let code =<< trim END
31659470a4d8SBram Moolenaar    while 1
31669470a4d8SBram Moolenaar      try
31679470a4d8SBram Moolenaar      finally
31689470a4d8SBram Moolenaar        if 1
31699470a4d8SBram Moolenaar    endwhile
31709470a4d8SBram Moolenaar  END
31719470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31729470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
31739470a4d8SBram Moolenaar
31749470a4d8SBram Moolenaar  " :endwhile without :while
31759470a4d8SBram Moolenaar  let code =<< trim END
31769470a4d8SBram Moolenaar    try
31779470a4d8SBram Moolenaar      endwhile
31789470a4d8SBram Moolenaar    endtry
31799470a4d8SBram Moolenaar  END
31809470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31819470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
31829470a4d8SBram Moolenaar
31839470a4d8SBram Moolenaar  " :endwhile without :while
31849470a4d8SBram Moolenaar  let code =<< trim END
31859470a4d8SBram Moolenaar    while 1
31869470a4d8SBram Moolenaar      try
31879470a4d8SBram Moolenaar        endwhile
31889470a4d8SBram Moolenaar      endtry
31899470a4d8SBram Moolenaar    endwhile
31909470a4d8SBram Moolenaar  END
31919470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
31929470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
31939470a4d8SBram Moolenaar
31949470a4d8SBram Moolenaar  " :endwhile without :while
31959470a4d8SBram Moolenaar  let code =<< trim END
31969470a4d8SBram Moolenaar    try
31979470a4d8SBram Moolenaar      throw "a"
31989470a4d8SBram Moolenaar    catch /a/
31999470a4d8SBram Moolenaar      endwhile
32009470a4d8SBram Moolenaar    endtry
32019470a4d8SBram Moolenaar  END
32029470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32039470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
32049470a4d8SBram Moolenaar
32059470a4d8SBram Moolenaar  " :endwhile without :while
32069470a4d8SBram Moolenaar  let code =<< trim END
32079470a4d8SBram Moolenaar    while 1
32089470a4d8SBram Moolenaar      try
32099470a4d8SBram Moolenaar        throw "a"
32109470a4d8SBram Moolenaar      catch /a/
32119470a4d8SBram Moolenaar        endwhile
32129470a4d8SBram Moolenaar      endtry
32139470a4d8SBram Moolenaar    endwhile
32149470a4d8SBram Moolenaar  END
32159470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32169470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
32179470a4d8SBram Moolenaar
32189470a4d8SBram Moolenaar  call delete('Xtest')
32199470a4d8SBram Moolenaarendfunc
32209470a4d8SBram Moolenaar
32219470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
32229470a4d8SBram Moolenaar" Test 55:  Nesting errors: :continue/:break				    {{{1
32239470a4d8SBram Moolenaar"
32249470a4d8SBram Moolenaar"	    For nesting errors of :continue and :break commands the correct
32259470a4d8SBram Moolenaar"	    error messages should be given.
32269470a4d8SBram Moolenaar"
32279470a4d8SBram Moolenaar"	    This test reuses the function MESSAGES() from the previous test.
32289470a4d8SBram Moolenaar"	    This functions checks the messages in g:msgfile.
32299470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
32309470a4d8SBram Moolenaar
32319470a4d8SBram Moolenaarfunc Test_nested_cont_break_error()
32329470a4d8SBram Moolenaar  CheckEnglish
32339470a4d8SBram Moolenaar
32349470a4d8SBram Moolenaar  " :continue without :while
32359470a4d8SBram Moolenaar  let code =<< trim END
32369470a4d8SBram Moolenaar    continue
32379470a4d8SBram Moolenaar  END
32389470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32399470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
32409470a4d8SBram Moolenaar
32419470a4d8SBram Moolenaar  " :continue without :while
32429470a4d8SBram Moolenaar  let code =<< trim END
32439470a4d8SBram Moolenaar    if 1
32449470a4d8SBram Moolenaar      continue
32459470a4d8SBram Moolenaar    endif
32469470a4d8SBram Moolenaar  END
32479470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32489470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
32499470a4d8SBram Moolenaar
32509470a4d8SBram Moolenaar  " :continue without :while
32519470a4d8SBram Moolenaar  let code =<< trim END
32529470a4d8SBram Moolenaar    try
32539470a4d8SBram Moolenaar    finally
32549470a4d8SBram Moolenaar      continue
32559470a4d8SBram Moolenaar    endtry
32569470a4d8SBram Moolenaar  END
32579470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32589470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
32599470a4d8SBram Moolenaar
32609470a4d8SBram Moolenaar  " :continue without :while
32619470a4d8SBram Moolenaar  let code =<< trim END
32629470a4d8SBram Moolenaar    try
32639470a4d8SBram Moolenaar      continue
32649470a4d8SBram Moolenaar    endtry
32659470a4d8SBram Moolenaar  END
32669470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32679470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
32689470a4d8SBram Moolenaar
32699470a4d8SBram Moolenaar  " :continue without :while
32709470a4d8SBram Moolenaar  let code =<< trim END
32719470a4d8SBram Moolenaar    try
32729470a4d8SBram Moolenaar      throw "a"
32739470a4d8SBram Moolenaar    catch /a/
32749470a4d8SBram Moolenaar      continue
32759470a4d8SBram Moolenaar    endtry
32769470a4d8SBram Moolenaar  END
32779470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32789470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
32799470a4d8SBram Moolenaar
32809470a4d8SBram Moolenaar  " :break without :while
32819470a4d8SBram Moolenaar  let code =<< trim END
32829470a4d8SBram Moolenaar    break
32839470a4d8SBram Moolenaar  END
32849470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32859470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
32869470a4d8SBram Moolenaar
32879470a4d8SBram Moolenaar  " :break without :while
32889470a4d8SBram Moolenaar  let code =<< trim END
32899470a4d8SBram Moolenaar    if 1
32909470a4d8SBram Moolenaar      break
32919470a4d8SBram Moolenaar    endif
32929470a4d8SBram Moolenaar  END
32939470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
32949470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
32959470a4d8SBram Moolenaar
32969470a4d8SBram Moolenaar  " :break without :while
32979470a4d8SBram Moolenaar  let code =<< trim END
32989470a4d8SBram Moolenaar    try
32999470a4d8SBram Moolenaar    finally
33009470a4d8SBram Moolenaar      break
33019470a4d8SBram Moolenaar    endtry
33029470a4d8SBram Moolenaar  END
33039470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33049470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
33059470a4d8SBram Moolenaar
33069470a4d8SBram Moolenaar  " :break without :while
33079470a4d8SBram Moolenaar  let code =<< trim END
33089470a4d8SBram Moolenaar    try
33099470a4d8SBram Moolenaar      break
33109470a4d8SBram Moolenaar    endtry
33119470a4d8SBram Moolenaar  END
33129470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33139470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
33149470a4d8SBram Moolenaar
33159470a4d8SBram Moolenaar  " :break without :while
33169470a4d8SBram Moolenaar  let code =<< trim END
33179470a4d8SBram Moolenaar    try
33189470a4d8SBram Moolenaar      throw "a"
33199470a4d8SBram Moolenaar    catch /a/
33209470a4d8SBram Moolenaar      break
33219470a4d8SBram Moolenaar    endtry
33229470a4d8SBram Moolenaar  END
33239470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33249470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
33259470a4d8SBram Moolenaar
33269470a4d8SBram Moolenaar  call delete('Xtest')
33279470a4d8SBram Moolenaarendfunc
33289470a4d8SBram Moolenaar
33299470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
33309470a4d8SBram Moolenaar" Test 56:  Nesting errors: :endtry					    {{{1
33319470a4d8SBram Moolenaar"
33329470a4d8SBram Moolenaar"	    For nesting errors of :try conditionals the correct error messages
33339470a4d8SBram Moolenaar"	    should be given.
33349470a4d8SBram Moolenaar"
33359470a4d8SBram Moolenaar"	    This test reuses the function MESSAGES() from the previous test.
33369470a4d8SBram Moolenaar"	    This functions checks the messages in g:msgfile.
33379470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
33389470a4d8SBram Moolenaar
33399470a4d8SBram Moolenaarfunc Test_nested_endtry_error()
33409470a4d8SBram Moolenaar  CheckEnglish
33419470a4d8SBram Moolenaar
33429470a4d8SBram Moolenaar  " :endtry without :try
33439470a4d8SBram Moolenaar  let code =<< trim END
33449470a4d8SBram Moolenaar    endtry
33459470a4d8SBram Moolenaar  END
33469470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33479470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try')
33489470a4d8SBram Moolenaar
33499470a4d8SBram Moolenaar  " :endtry without :try
33509470a4d8SBram Moolenaar  let code =<< trim END
33519470a4d8SBram Moolenaar    if 1
33529470a4d8SBram Moolenaar      endtry
33539470a4d8SBram Moolenaar    endif
33549470a4d8SBram Moolenaar  END
33559470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33569470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try')
33579470a4d8SBram Moolenaar
33589470a4d8SBram Moolenaar  " :endtry without :try
33599470a4d8SBram Moolenaar  let code =<< trim END
33609470a4d8SBram Moolenaar    while 1
33619470a4d8SBram Moolenaar      endtry
33629470a4d8SBram Moolenaar    endwhile
33639470a4d8SBram Moolenaar  END
33649470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33659470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try')
33669470a4d8SBram Moolenaar
33679470a4d8SBram Moolenaar  " Missing :endif
33689470a4d8SBram Moolenaar  let code =<< trim END
33699470a4d8SBram Moolenaar    try
33709470a4d8SBram Moolenaar        if 1
33719470a4d8SBram Moolenaar    endtry
33729470a4d8SBram Moolenaar  END
33739470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33749470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
33759470a4d8SBram Moolenaar
33769470a4d8SBram Moolenaar  " Missing :endwhile
33779470a4d8SBram Moolenaar  let code =<< trim END
33789470a4d8SBram Moolenaar    try
33799470a4d8SBram Moolenaar      while 1
33809470a4d8SBram Moolenaar    endtry
33819470a4d8SBram Moolenaar  END
33829470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33839470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile')
33849470a4d8SBram Moolenaar
33859470a4d8SBram Moolenaar  " Missing :endif
33869470a4d8SBram Moolenaar  let code =<< trim END
33879470a4d8SBram Moolenaar    try
33889470a4d8SBram Moolenaar    finally
33899470a4d8SBram Moolenaar      if 1
33909470a4d8SBram Moolenaar    endtry
33919470a4d8SBram Moolenaar  END
33929470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
33939470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
33949470a4d8SBram Moolenaar
33959470a4d8SBram Moolenaar  " Missing :endwhile
33969470a4d8SBram Moolenaar  let code =<< trim END
33979470a4d8SBram Moolenaar    try
33989470a4d8SBram Moolenaar    finally
33999470a4d8SBram Moolenaar      while 1
34009470a4d8SBram Moolenaar    endtry
34019470a4d8SBram Moolenaar  END
34029470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
34039470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile')
34049470a4d8SBram Moolenaar
34059470a4d8SBram Moolenaar  " Missing :endif
34069470a4d8SBram Moolenaar  let code =<< trim END
34079470a4d8SBram Moolenaar    try
34089470a4d8SBram Moolenaar      throw "a"
34099470a4d8SBram Moolenaar    catch /a/
34109470a4d8SBram Moolenaar      if 1
34119470a4d8SBram Moolenaar    endtry
34129470a4d8SBram Moolenaar  END
34139470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
34149470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
34159470a4d8SBram Moolenaar
34169470a4d8SBram Moolenaar  " Missing :endwhile
34179470a4d8SBram Moolenaar  let code =<< trim END
34189470a4d8SBram Moolenaar    try
34199470a4d8SBram Moolenaar      throw "a"
34209470a4d8SBram Moolenaar    catch /a/
34219470a4d8SBram Moolenaar      while 1
34229470a4d8SBram Moolenaar    endtry
34239470a4d8SBram Moolenaar  END
34249470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
34259470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile')
34269470a4d8SBram Moolenaar
34279470a4d8SBram Moolenaar  call delete('Xtest')
34289470a4d8SBram Moolenaarendfunc
34299470a4d8SBram Moolenaar
34309470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
34319470a4d8SBram Moolenaar" Test 57:  v:exception and v:throwpoint for user exceptions		    {{{1
34329470a4d8SBram Moolenaar"
34339470a4d8SBram Moolenaar"	    v:exception evaluates to the value of the exception that was caught
34349470a4d8SBram Moolenaar"	    most recently and is not finished.  (A caught exception is finished
34359470a4d8SBram Moolenaar"	    when the next ":catch", ":finally", or ":endtry" is reached.)
34369470a4d8SBram Moolenaar"	    v:throwpoint evaluates to the script/function name and line number
34379470a4d8SBram Moolenaar"	    where that exception has been thrown.
34389470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
34399470a4d8SBram Moolenaar
34409470a4d8SBram Moolenaarfunc Test_user_exception_info()
34419470a4d8SBram Moolenaar  CheckEnglish
34429470a4d8SBram Moolenaar
34439470a4d8SBram Moolenaar  XpathINIT
34449470a4d8SBram Moolenaar  XloopINIT
34459470a4d8SBram Moolenaar
34469470a4d8SBram Moolenaar  func FuncException()
34479470a4d8SBram Moolenaar    let g:exception = v:exception
34489470a4d8SBram Moolenaar  endfunc
34499470a4d8SBram Moolenaar
34509470a4d8SBram Moolenaar  func FuncThrowpoint()
34519470a4d8SBram Moolenaar    let g:throwpoint = v:throwpoint
34529470a4d8SBram Moolenaar  endfunc
34539470a4d8SBram Moolenaar
34549470a4d8SBram Moolenaar  let scriptException  = MakeScript("FuncException")
34559470a4d8SBram Moolenaar  let scriptThrowPoint = MakeScript("FuncThrowpoint")
34569470a4d8SBram Moolenaar
34579470a4d8SBram Moolenaar  command! CmdException  let g:exception  = v:exception
34589470a4d8SBram Moolenaar  command! CmdThrowpoint let g:throwpoint = v:throwpoint
34599470a4d8SBram Moolenaar
34609470a4d8SBram Moolenaar  func T(arg, line)
34619470a4d8SBram Moolenaar    if a:line == 2
34629470a4d8SBram Moolenaar      throw a:arg		" in line 2
34639470a4d8SBram Moolenaar    elseif a:line == 4
34649470a4d8SBram Moolenaar      throw a:arg		" in line 4
34659470a4d8SBram Moolenaar    elseif a:line == 6
34669470a4d8SBram Moolenaar      throw a:arg		" in line 6
34679470a4d8SBram Moolenaar    elseif a:line == 8
34689470a4d8SBram Moolenaar      throw a:arg		" in line 8
34699470a4d8SBram Moolenaar    endif
34709470a4d8SBram Moolenaar  endfunc
34719470a4d8SBram Moolenaar
34729470a4d8SBram Moolenaar  func G(arg, line)
34739470a4d8SBram Moolenaar    call T(a:arg, a:line)
34749470a4d8SBram Moolenaar  endfunc
34759470a4d8SBram Moolenaar
34769470a4d8SBram Moolenaar  func F(arg, line)
34779470a4d8SBram Moolenaar    call G(a:arg, a:line)
34789470a4d8SBram Moolenaar  endfunc
34799470a4d8SBram Moolenaar
34809470a4d8SBram Moolenaar  let scriptT = MakeScript("T")
34819470a4d8SBram Moolenaar  let scriptG = MakeScript("G", scriptT)
34829470a4d8SBram Moolenaar  let scriptF = MakeScript("F", scriptG)
34839470a4d8SBram Moolenaar
34849470a4d8SBram Moolenaar  try
34859470a4d8SBram Moolenaar    Xpath 'a'
34869470a4d8SBram Moolenaar    call F("oops", 2)
34879470a4d8SBram Moolenaar  catch /.*/
34889470a4d8SBram Moolenaar    Xpath 'b'
34899470a4d8SBram Moolenaar    let exception  = v:exception
34909470a4d8SBram Moolenaar    let throwpoint = v:throwpoint
34919470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
34929470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
34939470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
34949470a4d8SBram Moolenaar
34959470a4d8SBram Moolenaar    exec "let exception  = v:exception"
34969470a4d8SBram Moolenaar    exec "let throwpoint = v:throwpoint"
34979470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
34989470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
34999470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
35009470a4d8SBram Moolenaar
35019470a4d8SBram Moolenaar    CmdException
35029470a4d8SBram Moolenaar    CmdThrowpoint
35039470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
35049470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
35059470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
35069470a4d8SBram Moolenaar
35079470a4d8SBram Moolenaar    call FuncException()
35089470a4d8SBram Moolenaar    call FuncThrowpoint()
35099470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
35109470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
35119470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
35129470a4d8SBram Moolenaar
35139470a4d8SBram Moolenaar    exec "source" scriptException
35149470a4d8SBram Moolenaar    exec "source" scriptThrowPoint
35159470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
35169470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
35179470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
35189470a4d8SBram Moolenaar
35199470a4d8SBram Moolenaar    try
35209470a4d8SBram Moolenaar      Xpath 'c'
35219470a4d8SBram Moolenaar      call G("arrgh", 4)
35229470a4d8SBram Moolenaar    catch /.*/
35239470a4d8SBram Moolenaar      Xpath 'd'
35249470a4d8SBram Moolenaar      let exception  = v:exception
35259470a4d8SBram Moolenaar      let throwpoint = v:throwpoint
35269470a4d8SBram Moolenaar      call assert_equal("arrgh", v:exception)
35279470a4d8SBram Moolenaar      call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
35289470a4d8SBram Moolenaar      call assert_match('\<4\>', v:throwpoint)
35299470a4d8SBram Moolenaar
35309470a4d8SBram Moolenaar      try
35319470a4d8SBram Moolenaar        Xpath 'e'
35329470a4d8SBram Moolenaar        let g:arg = "autsch"
35339470a4d8SBram Moolenaar        let g:line = 6
35349470a4d8SBram Moolenaar        exec "source" scriptF
35359470a4d8SBram Moolenaar      catch /.*/
35369470a4d8SBram Moolenaar        Xpath 'f'
35379470a4d8SBram Moolenaar        let exception  = v:exception
35389470a4d8SBram Moolenaar        let throwpoint = v:throwpoint
35399470a4d8SBram Moolenaar        call assert_equal("autsch", v:exception)
35409470a4d8SBram Moolenaar        call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
35419470a4d8SBram Moolenaar        call assert_match('\<6\>', v:throwpoint)
35429470a4d8SBram Moolenaar      finally
35439470a4d8SBram Moolenaar        Xpath 'g'
35449470a4d8SBram Moolenaar        let exception  = v:exception
35459470a4d8SBram Moolenaar        let throwpoint = v:throwpoint
35469470a4d8SBram Moolenaar        call assert_equal("arrgh", v:exception)
35479470a4d8SBram Moolenaar        call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
35489470a4d8SBram Moolenaar        call assert_match('\<4\>', v:throwpoint)
35499470a4d8SBram Moolenaar        try
35509470a4d8SBram Moolenaar          Xpath 'h'
35519470a4d8SBram Moolenaar          let g:arg = "brrrr"
35529470a4d8SBram Moolenaar          let g:line = 8
35539470a4d8SBram Moolenaar          exec "source" scriptG
35549470a4d8SBram Moolenaar        catch /.*/
35559470a4d8SBram Moolenaar          Xpath 'i'
35569470a4d8SBram Moolenaar          let exception  = v:exception
35579470a4d8SBram Moolenaar          let throwpoint = v:throwpoint
35589470a4d8SBram Moolenaar          " Resolve scriptT for matching it against v:throwpoint.
35599470a4d8SBram Moolenaar          call assert_equal("brrrr", v:exception)
35609470a4d8SBram Moolenaar          call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
35619470a4d8SBram Moolenaar          call assert_match('\<8\>', v:throwpoint)
35629470a4d8SBram Moolenaar        finally
35639470a4d8SBram Moolenaar          Xpath 'j'
35649470a4d8SBram Moolenaar          let exception  = v:exception
35659470a4d8SBram Moolenaar          let throwpoint = v:throwpoint
35669470a4d8SBram Moolenaar          call assert_equal("arrgh", v:exception)
35679470a4d8SBram Moolenaar          call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
35689470a4d8SBram Moolenaar          call assert_match('\<4\>', v:throwpoint)
35699470a4d8SBram Moolenaar        endtry
35709470a4d8SBram Moolenaar        Xpath 'k'
35719470a4d8SBram Moolenaar        let exception  = v:exception
35729470a4d8SBram Moolenaar        let throwpoint = v:throwpoint
35739470a4d8SBram Moolenaar        call assert_equal("arrgh", v:exception)
35749470a4d8SBram Moolenaar        call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
35759470a4d8SBram Moolenaar        call assert_match('\<4\>', v:throwpoint)
35769470a4d8SBram Moolenaar      endtry
35779470a4d8SBram Moolenaar      Xpath 'l'
35789470a4d8SBram Moolenaar      let exception  = v:exception
35799470a4d8SBram Moolenaar      let throwpoint = v:throwpoint
35809470a4d8SBram Moolenaar      call assert_equal("arrgh", v:exception)
35819470a4d8SBram Moolenaar      call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
35829470a4d8SBram Moolenaar      call assert_match('\<4\>', v:throwpoint)
35839470a4d8SBram Moolenaar    finally
35849470a4d8SBram Moolenaar      Xpath 'm'
35859470a4d8SBram Moolenaar      let exception  = v:exception
35869470a4d8SBram Moolenaar      let throwpoint = v:throwpoint
35879470a4d8SBram Moolenaar      call assert_equal("oops", v:exception)
35889470a4d8SBram Moolenaar      call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
35899470a4d8SBram Moolenaar      call assert_match('\<2\>', v:throwpoint)
35909470a4d8SBram Moolenaar    endtry
35919470a4d8SBram Moolenaar    Xpath 'n'
35929470a4d8SBram Moolenaar    let exception  = v:exception
35939470a4d8SBram Moolenaar    let throwpoint = v:throwpoint
35949470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
35959470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
35969470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
35979470a4d8SBram Moolenaar  finally
35989470a4d8SBram Moolenaar    Xpath 'o'
35999470a4d8SBram Moolenaar    let exception  = v:exception
36009470a4d8SBram Moolenaar    let throwpoint = v:throwpoint
36019470a4d8SBram Moolenaar    call assert_equal("", v:exception)
36029470a4d8SBram Moolenaar    call assert_match('^$', v:throwpoint)
36039470a4d8SBram Moolenaar    call assert_match('^$', v:throwpoint)
36049470a4d8SBram Moolenaar  endtry
36059470a4d8SBram Moolenaar
36069470a4d8SBram Moolenaar  call assert_equal('abcdefghijklmno', g:Xpath)
36079470a4d8SBram Moolenaar
36089470a4d8SBram Moolenaar  unlet exception throwpoint
36099470a4d8SBram Moolenaar  delfunction FuncException
36109470a4d8SBram Moolenaar  delfunction FuncThrowpoint
36119470a4d8SBram Moolenaar  call delete(scriptException)
36129470a4d8SBram Moolenaar  call delete(scriptThrowPoint)
36139470a4d8SBram Moolenaar  unlet scriptException scriptThrowPoint
36149470a4d8SBram Moolenaar  delcommand CmdException
36159470a4d8SBram Moolenaar  delcommand CmdThrowpoint
36169470a4d8SBram Moolenaar  delfunction T
36179470a4d8SBram Moolenaar  delfunction G
36189470a4d8SBram Moolenaar  delfunction F
36199470a4d8SBram Moolenaar  call delete(scriptT)
36209470a4d8SBram Moolenaar  call delete(scriptG)
36219470a4d8SBram Moolenaar  call delete(scriptF)
36229470a4d8SBram Moolenaar  unlet scriptT scriptG scriptF
36239470a4d8SBram Moolenaarendfunc
36249470a4d8SBram Moolenaar
36259470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
36269470a4d8SBram Moolenaar"
36279470a4d8SBram Moolenaar" Test 58:  v:exception and v:throwpoint for error/interrupt exceptions	    {{{1
36289470a4d8SBram Moolenaar"
36299470a4d8SBram Moolenaar"	    v:exception and v:throwpoint work also for error and interrupt
36309470a4d8SBram Moolenaar"	    exceptions.
36319470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
36329470a4d8SBram Moolenaar
36339470a4d8SBram Moolenaarfunc Test_execption_info_for_error()
36349470a4d8SBram Moolenaar  CheckEnglish
36359470a4d8SBram Moolenaar
36369470a4d8SBram Moolenaar  let test =<< trim [CODE]
36379470a4d8SBram Moolenaar    func T(line)
36389470a4d8SBram Moolenaar      if a:line == 2
36399470a4d8SBram Moolenaar        delfunction T		" error (function in use) in line 2
36409470a4d8SBram Moolenaar      elseif a:line == 4
36419470a4d8SBram Moolenaar        call interrupt()
36429470a4d8SBram Moolenaar      endif
36439470a4d8SBram Moolenaar    endfunc
36449470a4d8SBram Moolenaar
36459470a4d8SBram Moolenaar    while 1
36469470a4d8SBram Moolenaar      try
36479470a4d8SBram Moolenaar        Xpath 'a'
36489470a4d8SBram Moolenaar        call T(2)
36499470a4d8SBram Moolenaar        call assert_report('should not get here')
36509470a4d8SBram Moolenaar      catch /.*/
36519470a4d8SBram Moolenaar        Xpath 'b'
36529470a4d8SBram Moolenaar        if v:exception !~ 'Vim(delfunction):'
36539470a4d8SBram Moolenaar          call assert_report('should not get here')
36549470a4d8SBram Moolenaar        endif
36559470a4d8SBram Moolenaar        if v:throwpoint !~ '\<T\>'
36569470a4d8SBram Moolenaar          call assert_report('should not get here')
36579470a4d8SBram Moolenaar        endif
36589470a4d8SBram Moolenaar        if v:throwpoint !~ '\<2\>'
36599470a4d8SBram Moolenaar          call assert_report('should not get here')
36609470a4d8SBram Moolenaar        endif
36619470a4d8SBram Moolenaar      finally
36629470a4d8SBram Moolenaar        Xpath 'c'
36639470a4d8SBram Moolenaar        if v:exception != ""
36649470a4d8SBram Moolenaar          call assert_report('should not get here')
36659470a4d8SBram Moolenaar        endif
36669470a4d8SBram Moolenaar        if v:throwpoint != ""
36679470a4d8SBram Moolenaar          call assert_report('should not get here')
36689470a4d8SBram Moolenaar        endif
36699470a4d8SBram Moolenaar        break
36709470a4d8SBram Moolenaar      endtry
36719470a4d8SBram Moolenaar    endwhile
36729470a4d8SBram Moolenaar
36739470a4d8SBram Moolenaar    Xpath 'd'
36749470a4d8SBram Moolenaar    if v:exception != ""
36759470a4d8SBram Moolenaar      call assert_report('should not get here')
36769470a4d8SBram Moolenaar    endif
36779470a4d8SBram Moolenaar    if v:throwpoint != ""
36789470a4d8SBram Moolenaar      call assert_report('should not get here')
36799470a4d8SBram Moolenaar    endif
36809470a4d8SBram Moolenaar
36819470a4d8SBram Moolenaar    while 1
36829470a4d8SBram Moolenaar      try
36839470a4d8SBram Moolenaar        Xpath 'e'
36849470a4d8SBram Moolenaar        call T(4)
36859470a4d8SBram Moolenaar        call assert_report('should not get here')
36869470a4d8SBram Moolenaar      catch /.*/
36879470a4d8SBram Moolenaar        Xpath 'f'
36889470a4d8SBram Moolenaar        if v:exception != 'Vim:Interrupt'
36899470a4d8SBram Moolenaar          call assert_report('should not get here')
36909470a4d8SBram Moolenaar        endif
36919470a4d8SBram Moolenaar        if v:throwpoint !~ 'function T'
36929470a4d8SBram Moolenaar          call assert_report('should not get here')
36939470a4d8SBram Moolenaar        endif
36949470a4d8SBram Moolenaar        if v:throwpoint !~ '\<4\>'
36959470a4d8SBram Moolenaar          call assert_report('should not get here')
36969470a4d8SBram Moolenaar        endif
36979470a4d8SBram Moolenaar      finally
36989470a4d8SBram Moolenaar        Xpath 'g'
36999470a4d8SBram Moolenaar        if v:exception != ""
37009470a4d8SBram Moolenaar          call assert_report('should not get here')
37019470a4d8SBram Moolenaar        endif
37029470a4d8SBram Moolenaar        if v:throwpoint != ""
37039470a4d8SBram Moolenaar          call assert_report('should not get here')
37049470a4d8SBram Moolenaar        endif
37059470a4d8SBram Moolenaar        break
37069470a4d8SBram Moolenaar      endtry
37079470a4d8SBram Moolenaar    endwhile
37089470a4d8SBram Moolenaar
37099470a4d8SBram Moolenaar    Xpath 'h'
37109470a4d8SBram Moolenaar    if v:exception != ""
37119470a4d8SBram Moolenaar      call assert_report('should not get here')
37129470a4d8SBram Moolenaar    endif
37139470a4d8SBram Moolenaar    if v:throwpoint != ""
37149470a4d8SBram Moolenaar      call assert_report('should not get here')
37159470a4d8SBram Moolenaar    endif
37169470a4d8SBram Moolenaar  [CODE]
37179470a4d8SBram Moolenaar  let verify =<< trim [CODE]
37189470a4d8SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
37199470a4d8SBram Moolenaar  [CODE]
37209470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
37219470a4d8SBram Moolenaarendfunc
37229470a4d8SBram Moolenaar
37239470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3724*efb64829SBram Moolenaar"
3725*efb64829SBram Moolenaar" Test 59:  v:exception and v:throwpoint when discarding exceptions	    {{{1
3726*efb64829SBram Moolenaar"
3727*efb64829SBram Moolenaar"	    When a :catch clause is left by a ":break" etc or an error or
3728*efb64829SBram Moolenaar"	    interrupt exception, v:exception and v:throwpoint are reset.  They
3729*efb64829SBram Moolenaar"	    are not affected by an exception that is discarded before being
3730*efb64829SBram Moolenaar"	    caught.
3731*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
3732*efb64829SBram Moolenaarfunc Test_exception_info_on_discard()
3733*efb64829SBram Moolenaar  CheckEnglish
3734*efb64829SBram Moolenaar
3735*efb64829SBram Moolenaar  let test =<< trim [CODE]
3736*efb64829SBram Moolenaar    let sfile = expand("<sfile>")
3737*efb64829SBram Moolenaar
3738*efb64829SBram Moolenaar    while 1
3739*efb64829SBram Moolenaar      try
3740*efb64829SBram Moolenaar        throw "x1"
3741*efb64829SBram Moolenaar      catch /.*/
3742*efb64829SBram Moolenaar        break
3743*efb64829SBram Moolenaar      endtry
3744*efb64829SBram Moolenaar    endwhile
3745*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3746*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3747*efb64829SBram Moolenaar
3748*efb64829SBram Moolenaar    while 1
3749*efb64829SBram Moolenaar      try
3750*efb64829SBram Moolenaar        throw "x2"
3751*efb64829SBram Moolenaar      catch /.*/
3752*efb64829SBram Moolenaar        break
3753*efb64829SBram Moolenaar      finally
3754*efb64829SBram Moolenaar        call assert_equal('', v:exception)
3755*efb64829SBram Moolenaar        call assert_equal('', v:throwpoint)
3756*efb64829SBram Moolenaar      endtry
3757*efb64829SBram Moolenaar      break
3758*efb64829SBram Moolenaar    endwhile
3759*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3760*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3761*efb64829SBram Moolenaar
3762*efb64829SBram Moolenaar    while 1
3763*efb64829SBram Moolenaar      try
3764*efb64829SBram Moolenaar        let errcaught = 0
3765*efb64829SBram Moolenaar        try
3766*efb64829SBram Moolenaar          try
3767*efb64829SBram Moolenaar            throw "x3"
3768*efb64829SBram Moolenaar          catch /.*/
3769*efb64829SBram Moolenaar            let lnum = expand("<sflnum>")
3770*efb64829SBram Moolenaar            asdf
3771*efb64829SBram Moolenaar          endtry
3772*efb64829SBram Moolenaar        catch /.*/
3773*efb64829SBram Moolenaar          let errcaught = 1
3774*efb64829SBram Moolenaar          call assert_match('Vim:E492: Not an editor command:', v:exception)
3775*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 1), v:throwpoint)
3776*efb64829SBram Moolenaar        endtry
3777*efb64829SBram Moolenaar      finally
3778*efb64829SBram Moolenaar        call assert_equal(1, errcaught)
3779*efb64829SBram Moolenaar        break
3780*efb64829SBram Moolenaar      endtry
3781*efb64829SBram Moolenaar    endwhile
3782*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3783*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3784*efb64829SBram Moolenaar
3785*efb64829SBram Moolenaar    Xpath 'a'
3786*efb64829SBram Moolenaar
3787*efb64829SBram Moolenaar    while 1
3788*efb64829SBram Moolenaar      try
3789*efb64829SBram Moolenaar        let intcaught = 0
3790*efb64829SBram Moolenaar        try
3791*efb64829SBram Moolenaar          try
3792*efb64829SBram Moolenaar            throw "x4"
3793*efb64829SBram Moolenaar          catch /.*/
3794*efb64829SBram Moolenaar            let lnum = expand("<sflnum>")
3795*efb64829SBram Moolenaar            call interrupt()
3796*efb64829SBram Moolenaar          endtry
3797*efb64829SBram Moolenaar        catch /.*/
3798*efb64829SBram Moolenaar          let intcaught = 1
3799*efb64829SBram Moolenaar          call assert_match('Vim:Interrupt', v:exception)
3800*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 1), v:throwpoint)
3801*efb64829SBram Moolenaar        endtry
3802*efb64829SBram Moolenaar      finally
3803*efb64829SBram Moolenaar        call assert_equal(1, intcaught)
3804*efb64829SBram Moolenaar        break
3805*efb64829SBram Moolenaar      endtry
3806*efb64829SBram Moolenaar    endwhile
3807*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3808*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3809*efb64829SBram Moolenaar
3810*efb64829SBram Moolenaar    Xpath 'b'
3811*efb64829SBram Moolenaar
3812*efb64829SBram Moolenaar    while 1
3813*efb64829SBram Moolenaar      try
3814*efb64829SBram Moolenaar        let errcaught = 0
3815*efb64829SBram Moolenaar        try
3816*efb64829SBram Moolenaar          try
3817*efb64829SBram Moolenaar            if 1
3818*efb64829SBram Moolenaar              let lnum = expand("<sflnum>")
3819*efb64829SBram Moolenaar              throw "x5"
3820*efb64829SBram Moolenaar            " missing endif
3821*efb64829SBram Moolenaar          catch /.*/
3822*efb64829SBram Moolenaar            call assert_report('should not get here')
3823*efb64829SBram Moolenaar          endtry
3824*efb64829SBram Moolenaar        catch /.*/
3825*efb64829SBram Moolenaar          let errcaught = 1
3826*efb64829SBram Moolenaar          call assert_match('Vim(catch):E171: Missing :endif:', v:exception)
3827*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 3), v:throwpoint)
3828*efb64829SBram Moolenaar        endtry
3829*efb64829SBram Moolenaar      finally
3830*efb64829SBram Moolenaar        call assert_equal(1, errcaught)
3831*efb64829SBram Moolenaar        break
3832*efb64829SBram Moolenaar      endtry
3833*efb64829SBram Moolenaar    endwhile
3834*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3835*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3836*efb64829SBram Moolenaar
3837*efb64829SBram Moolenaar    Xpath 'c'
3838*efb64829SBram Moolenaar
3839*efb64829SBram Moolenaar    try
3840*efb64829SBram Moolenaar      while 1
3841*efb64829SBram Moolenaar        try
3842*efb64829SBram Moolenaar          throw "x6"
3843*efb64829SBram Moolenaar        finally
3844*efb64829SBram Moolenaar          break
3845*efb64829SBram Moolenaar        endtry
3846*efb64829SBram Moolenaar        break
3847*efb64829SBram Moolenaar      endwhile
3848*efb64829SBram Moolenaar    catch /.*/
3849*efb64829SBram Moolenaar      call assert_report('should not get here')
3850*efb64829SBram Moolenaar    endtry
3851*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3852*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3853*efb64829SBram Moolenaar
3854*efb64829SBram Moolenaar    try
3855*efb64829SBram Moolenaar      while 1
3856*efb64829SBram Moolenaar        try
3857*efb64829SBram Moolenaar          throw "x7"
3858*efb64829SBram Moolenaar        finally
3859*efb64829SBram Moolenaar          break
3860*efb64829SBram Moolenaar        endtry
3861*efb64829SBram Moolenaar        break
3862*efb64829SBram Moolenaar      endwhile
3863*efb64829SBram Moolenaar    catch /.*/
3864*efb64829SBram Moolenaar      call assert_report('should not get here')
3865*efb64829SBram Moolenaar    finally
3866*efb64829SBram Moolenaar      call assert_equal('', v:exception)
3867*efb64829SBram Moolenaar      call assert_equal('', v:throwpoint)
3868*efb64829SBram Moolenaar    endtry
3869*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3870*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3871*efb64829SBram Moolenaar
3872*efb64829SBram Moolenaar    while 1
3873*efb64829SBram Moolenaar      try
3874*efb64829SBram Moolenaar        let errcaught = 0
3875*efb64829SBram Moolenaar        try
3876*efb64829SBram Moolenaar          try
3877*efb64829SBram Moolenaar            throw "x8"
3878*efb64829SBram Moolenaar          finally
3879*efb64829SBram Moolenaar            let lnum = expand("<sflnum>")
3880*efb64829SBram Moolenaar            asdf
3881*efb64829SBram Moolenaar          endtry
3882*efb64829SBram Moolenaar        catch /.*/
3883*efb64829SBram Moolenaar          let errcaught = 1
3884*efb64829SBram Moolenaar          call assert_match('Vim:E492: Not an editor command:', v:exception)
3885*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 1), v:throwpoint)
3886*efb64829SBram Moolenaar        endtry
3887*efb64829SBram Moolenaar      finally
3888*efb64829SBram Moolenaar        call assert_equal(1, errcaught)
3889*efb64829SBram Moolenaar        break
3890*efb64829SBram Moolenaar      endtry
3891*efb64829SBram Moolenaar    endwhile
3892*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3893*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3894*efb64829SBram Moolenaar
3895*efb64829SBram Moolenaar    Xpath 'd'
3896*efb64829SBram Moolenaar
3897*efb64829SBram Moolenaar    while 1
3898*efb64829SBram Moolenaar      try
3899*efb64829SBram Moolenaar        let intcaught = 0
3900*efb64829SBram Moolenaar        try
3901*efb64829SBram Moolenaar          try
3902*efb64829SBram Moolenaar            throw "x9"
3903*efb64829SBram Moolenaar          finally
3904*efb64829SBram Moolenaar            let lnum = expand("<sflnum>")
3905*efb64829SBram Moolenaar            call interrupt()
3906*efb64829SBram Moolenaar          endtry
3907*efb64829SBram Moolenaar        catch /.*/
3908*efb64829SBram Moolenaar          let intcaught = 1
3909*efb64829SBram Moolenaar          call assert_match('Vim:Interrupt', v:exception)
3910*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 1), v:throwpoint)
3911*efb64829SBram Moolenaar        endtry
3912*efb64829SBram Moolenaar      finally
3913*efb64829SBram Moolenaar        call assert_equal(1, intcaught)
3914*efb64829SBram Moolenaar        break
3915*efb64829SBram Moolenaar      endtry
3916*efb64829SBram Moolenaar    endwhile
3917*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3918*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3919*efb64829SBram Moolenaar
3920*efb64829SBram Moolenaar    Xpath 'e'
3921*efb64829SBram Moolenaar
3922*efb64829SBram Moolenaar    while 1
3923*efb64829SBram Moolenaar      try
3924*efb64829SBram Moolenaar        let errcaught = 0
3925*efb64829SBram Moolenaar        try
3926*efb64829SBram Moolenaar          try
3927*efb64829SBram Moolenaar            if 1
3928*efb64829SBram Moolenaar              let lnum = expand("<sflnum>")
3929*efb64829SBram Moolenaar              throw "x10"
3930*efb64829SBram Moolenaar            " missing endif
3931*efb64829SBram Moolenaar          finally
3932*efb64829SBram Moolenaar            call assert_equal('', v:exception)
3933*efb64829SBram Moolenaar            call assert_equal('', v:throwpoint)
3934*efb64829SBram Moolenaar          endtry
3935*efb64829SBram Moolenaar        catch /.*/
3936*efb64829SBram Moolenaar          let errcaught = 1
3937*efb64829SBram Moolenaar          call assert_match('Vim(finally):E171: Missing :endif:', v:exception)
3938*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 3), v:throwpoint)
3939*efb64829SBram Moolenaar        endtry
3940*efb64829SBram Moolenaar      finally
3941*efb64829SBram Moolenaar        call assert_equal(1, errcaught)
3942*efb64829SBram Moolenaar        break
3943*efb64829SBram Moolenaar      endtry
3944*efb64829SBram Moolenaar    endwhile
3945*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3946*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3947*efb64829SBram Moolenaar
3948*efb64829SBram Moolenaar    Xpath 'f'
3949*efb64829SBram Moolenaar
3950*efb64829SBram Moolenaar    while 1
3951*efb64829SBram Moolenaar      try
3952*efb64829SBram Moolenaar        let errcaught = 0
3953*efb64829SBram Moolenaar        try
3954*efb64829SBram Moolenaar          try
3955*efb64829SBram Moolenaar            if 1
3956*efb64829SBram Moolenaar              let lnum = expand("<sflnum>")
3957*efb64829SBram Moolenaar              throw "x11"
3958*efb64829SBram Moolenaar            " missing endif
3959*efb64829SBram Moolenaar          endtry
3960*efb64829SBram Moolenaar        catch /.*/
3961*efb64829SBram Moolenaar          let errcaught = 1
3962*efb64829SBram Moolenaar          call assert_match('Vim(endtry):E171: Missing :endif:', v:exception)
3963*efb64829SBram Moolenaar          call assert_match('line ' .. (lnum + 3), v:throwpoint)
3964*efb64829SBram Moolenaar        endtry
3965*efb64829SBram Moolenaar      finally
3966*efb64829SBram Moolenaar        call assert_equal(1, errcaught)
3967*efb64829SBram Moolenaar        break
3968*efb64829SBram Moolenaar      endtry
3969*efb64829SBram Moolenaar    endwhile
3970*efb64829SBram Moolenaar    call assert_equal('', v:exception)
3971*efb64829SBram Moolenaar    call assert_equal('', v:throwpoint)
3972*efb64829SBram Moolenaar
3973*efb64829SBram Moolenaar    Xpath 'g'
3974*efb64829SBram Moolenaar  [CODE]
3975*efb64829SBram Moolenaar  let verify =<< trim [CODE]
3976*efb64829SBram Moolenaar    call assert_equal('abcdefg', g:Xpath)
3977*efb64829SBram Moolenaar  [CODE]
3978*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
3979*efb64829SBram Moolenaarendfunc
3980*efb64829SBram Moolenaar
3981*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
3982*efb64829SBram Moolenaar"
3983*efb64829SBram Moolenaar" Test 60:  (Re)throwing v:exception; :echoerr.				    {{{1
3984*efb64829SBram Moolenaar"
3985*efb64829SBram Moolenaar"	    A user exception can be rethrown after catching by throwing
3986*efb64829SBram Moolenaar"	    v:exception.  An error or interrupt exception cannot be rethrown
3987*efb64829SBram Moolenaar"	    because Vim exceptions cannot be faked.  A Vim exception using the
3988*efb64829SBram Moolenaar"	    value of v:exception can, however, be triggered by the :echoerr
3989*efb64829SBram Moolenaar"	    command.
3990*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
3991*efb64829SBram Moolenaar
3992*efb64829SBram Moolenaarfunc Test_rethrow_exception_1()
3993*efb64829SBram Moolenaar  XpathINIT
3994*efb64829SBram Moolenaar  try
3995*efb64829SBram Moolenaar    try
3996*efb64829SBram Moolenaar      Xpath 'a'
3997*efb64829SBram Moolenaar      throw "oops"
3998*efb64829SBram Moolenaar    catch /oops/
3999*efb64829SBram Moolenaar      Xpath 'b'
4000*efb64829SBram Moolenaar      throw v:exception	" rethrow user exception
4001*efb64829SBram Moolenaar    catch /.*/
4002*efb64829SBram Moolenaar      call assert_report('should not get here')
4003*efb64829SBram Moolenaar    endtry
4004*efb64829SBram Moolenaar  catch /^oops$/			" catches rethrown user exception
4005*efb64829SBram Moolenaar    Xpath 'c'
4006*efb64829SBram Moolenaar  catch /.*/
4007*efb64829SBram Moolenaar    call assert_report('should not get here')
4008*efb64829SBram Moolenaar  endtry
4009*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4010*efb64829SBram Moolenaarendfunc
4011*efb64829SBram Moolenaar
4012*efb64829SBram Moolenaarfunc Test_rethrow_exception_2()
4013*efb64829SBram Moolenaar  XpathINIT
4014*efb64829SBram Moolenaar  try
4015*efb64829SBram Moolenaar    let caught = 0
4016*efb64829SBram Moolenaar    try
4017*efb64829SBram Moolenaar      Xpath 'a'
4018*efb64829SBram Moolenaar      write /n/o/n/w/r/i/t/a/b/l/e/_/f/i/l/e
4019*efb64829SBram Moolenaar      call assert_report('should not get here')
4020*efb64829SBram Moolenaar    catch /^Vim(write):/
4021*efb64829SBram Moolenaar      let caught = 1
4022*efb64829SBram Moolenaar      throw v:exception	" throw error: cannot fake Vim exception
4023*efb64829SBram Moolenaar    catch /.*/
4024*efb64829SBram Moolenaar      call assert_report('should not get here')
4025*efb64829SBram Moolenaar    finally
4026*efb64829SBram Moolenaar      Xpath 'b'
4027*efb64829SBram Moolenaar      call assert_equal(1, caught)
4028*efb64829SBram Moolenaar    endtry
4029*efb64829SBram Moolenaar  catch /^Vim(throw):/	" catches throw error
4030*efb64829SBram Moolenaar    let caught = caught + 1
4031*efb64829SBram Moolenaar  catch /.*/
4032*efb64829SBram Moolenaar    call assert_report('should not get here')
4033*efb64829SBram Moolenaar  finally
4034*efb64829SBram Moolenaar    Xpath 'c'
4035*efb64829SBram Moolenaar    call assert_equal(2, caught)
4036*efb64829SBram Moolenaar  endtry
4037*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4038*efb64829SBram Moolenaarendfunc
4039*efb64829SBram Moolenaar
4040*efb64829SBram Moolenaarfunc Test_rethrow_exception_3()
4041*efb64829SBram Moolenaar  XpathINIT
4042*efb64829SBram Moolenaar  try
4043*efb64829SBram Moolenaar    let caught = 0
4044*efb64829SBram Moolenaar    try
4045*efb64829SBram Moolenaar      Xpath 'a'
4046*efb64829SBram Moolenaar      asdf
4047*efb64829SBram Moolenaar    catch /^Vim/		" catch error exception
4048*efb64829SBram Moolenaar      let caught = 1
4049*efb64829SBram Moolenaar      " Trigger Vim error exception with value specified after :echoerr
4050*efb64829SBram Moolenaar      let value = substitute(v:exception, '^Vim\((.*)\)\=:', '', "")
4051*efb64829SBram Moolenaar      echoerr value
4052*efb64829SBram Moolenaar    catch /.*/
4053*efb64829SBram Moolenaar      call assert_report('should not get here')
4054*efb64829SBram Moolenaar    finally
4055*efb64829SBram Moolenaar      Xpath 'b'
4056*efb64829SBram Moolenaar      call assert_equal(1, caught)
4057*efb64829SBram Moolenaar    endtry
4058*efb64829SBram Moolenaar  catch /^Vim(echoerr):/
4059*efb64829SBram Moolenaar    let caught = caught + 1
4060*efb64829SBram Moolenaar    call assert_match(value, v:exception)
4061*efb64829SBram Moolenaar  catch /.*/
4062*efb64829SBram Moolenaar    call assert_report('should not get here')
4063*efb64829SBram Moolenaar  finally
4064*efb64829SBram Moolenaar    Xpath 'c'
4065*efb64829SBram Moolenaar    call assert_equal(2, caught)
4066*efb64829SBram Moolenaar  endtry
4067*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4068*efb64829SBram Moolenaarendfunc
4069*efb64829SBram Moolenaar
4070*efb64829SBram Moolenaarfunc Test_rethrow_exception_3()
4071*efb64829SBram Moolenaar  XpathINIT
4072*efb64829SBram Moolenaar  try
4073*efb64829SBram Moolenaar    let errcaught = 0
4074*efb64829SBram Moolenaar    try
4075*efb64829SBram Moolenaar      Xpath 'a'
4076*efb64829SBram Moolenaar      let intcaught = 0
4077*efb64829SBram Moolenaar      call interrupt()
4078*efb64829SBram Moolenaar    catch /^Vim:/		" catch interrupt exception
4079*efb64829SBram Moolenaar      let intcaught = 1
4080*efb64829SBram Moolenaar      " Trigger Vim error exception with value specified after :echoerr
4081*efb64829SBram Moolenaar      echoerr substitute(v:exception, '^Vim\((.*)\)\=:', '', "")
4082*efb64829SBram Moolenaar    catch /.*/
4083*efb64829SBram Moolenaar      call assert_report('should not get here')
4084*efb64829SBram Moolenaar    finally
4085*efb64829SBram Moolenaar      Xpath 'b'
4086*efb64829SBram Moolenaar      call assert_equal(1, intcaught)
4087*efb64829SBram Moolenaar    endtry
4088*efb64829SBram Moolenaar  catch /^Vim(echoerr):/
4089*efb64829SBram Moolenaar    let errcaught = 1
4090*efb64829SBram Moolenaar    call assert_match('Interrupt', v:exception)
4091*efb64829SBram Moolenaar  finally
4092*efb64829SBram Moolenaar    Xpath 'c'
4093*efb64829SBram Moolenaar    call assert_equal(1, errcaught)
4094*efb64829SBram Moolenaar  endtry
4095*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4096*efb64829SBram Moolenaarendfunc
4097*efb64829SBram Moolenaar
4098*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
40999470a4d8SBram Moolenaar" Test 61:  Catching interrupt exceptions				    {{{1
41009470a4d8SBram Moolenaar"
41019470a4d8SBram Moolenaar"	    When an interrupt occurs inside a :try/:endtry region, an
41029470a4d8SBram Moolenaar"	    interrupt exception is thrown and can be caught.  Its value is
41039470a4d8SBram Moolenaar"	    "Vim:Interrupt".  If the interrupt occurs after an error or a :throw
41049470a4d8SBram Moolenaar"	    but before a matching :catch is reached, all following :catches of
41059470a4d8SBram Moolenaar"	    that try block are ignored, but the interrupt exception can be
41069470a4d8SBram Moolenaar"	    caught by the next surrounding try conditional.  An interrupt is
41079470a4d8SBram Moolenaar"	    ignored when there is a previous interrupt that has not been caught
41089470a4d8SBram Moolenaar"	    or causes a :finally clause to be executed.
41099470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
41109470a4d8SBram Moolenaar
41119470a4d8SBram Moolenaarfunc Test_catch_intr_exception()
41129470a4d8SBram Moolenaar  let test =<< trim [CODE]
41139470a4d8SBram Moolenaar    while 1
41149470a4d8SBram Moolenaar      try
41159470a4d8SBram Moolenaar        try
41169470a4d8SBram Moolenaar          Xpath 'a'
41179470a4d8SBram Moolenaar          call interrupt()
41189470a4d8SBram Moolenaar          call assert_report('should not get here')
41199470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
41209470a4d8SBram Moolenaar          Xpath 'b'
41219470a4d8SBram Moolenaar        finally
41229470a4d8SBram Moolenaar          Xpath 'c'
41239470a4d8SBram Moolenaar        endtry
41249470a4d8SBram Moolenaar      catch /.*/
41259470a4d8SBram Moolenaar        call assert_report('should not get here')
41269470a4d8SBram Moolenaar      finally
41279470a4d8SBram Moolenaar        Xpath 'd'
41289470a4d8SBram Moolenaar        break
41299470a4d8SBram Moolenaar      endtry
41309470a4d8SBram Moolenaar    endwhile
41319470a4d8SBram Moolenaar
41329470a4d8SBram Moolenaar    while 1
41339470a4d8SBram Moolenaar      try
41349470a4d8SBram Moolenaar        try
41359470a4d8SBram Moolenaar          try
41369470a4d8SBram Moolenaar            Xpath 'e'
41379470a4d8SBram Moolenaar            asdf
41389470a4d8SBram Moolenaar            call assert_report('should not get here')
41399470a4d8SBram Moolenaar          catch /do_not_catch/
41409470a4d8SBram Moolenaar            call assert_report('should not get here')
41419470a4d8SBram Moolenaar          catch /.*/
41429470a4d8SBram Moolenaar            Xpath 'f'
41439470a4d8SBram Moolenaar            call interrupt()
41449470a4d8SBram Moolenaar            call assert_report('should not get here')
41459470a4d8SBram Moolenaar          catch /.*/
41469470a4d8SBram Moolenaar            call assert_report('should not get here')
41479470a4d8SBram Moolenaar          finally
41489470a4d8SBram Moolenaar            Xpath 'g'
41499470a4d8SBram Moolenaar            call interrupt()
41509470a4d8SBram Moolenaar            call assert_report('should not get here')
41519470a4d8SBram Moolenaar          endtry
41529470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
41539470a4d8SBram Moolenaar          Xpath 'h'
41549470a4d8SBram Moolenaar        finally
41559470a4d8SBram Moolenaar          Xpath 'i'
41569470a4d8SBram Moolenaar        endtry
41579470a4d8SBram Moolenaar      catch /.*/
41589470a4d8SBram Moolenaar        call assert_report('should not get here')
41599470a4d8SBram Moolenaar      finally
41609470a4d8SBram Moolenaar        Xpath 'j'
41619470a4d8SBram Moolenaar        break
41629470a4d8SBram Moolenaar      endtry
41639470a4d8SBram Moolenaar    endwhile
41649470a4d8SBram Moolenaar
41659470a4d8SBram Moolenaar    while 1
41669470a4d8SBram Moolenaar      try
41679470a4d8SBram Moolenaar        try
41689470a4d8SBram Moolenaar          try
41699470a4d8SBram Moolenaar            Xpath 'k'
41709470a4d8SBram Moolenaar            throw "x"
41719470a4d8SBram Moolenaar            call assert_report('should not get here')
41729470a4d8SBram Moolenaar          catch /do_not_catch/
41739470a4d8SBram Moolenaar            call assert_report('should not get here')
41749470a4d8SBram Moolenaar          catch /x/
41759470a4d8SBram Moolenaar            Xpath 'l'
41769470a4d8SBram Moolenaar            call interrupt()
41779470a4d8SBram Moolenaar            call assert_report('should not get here')
41789470a4d8SBram Moolenaar          catch /.*/
41799470a4d8SBram Moolenaar            call assert_report('should not get here')
41809470a4d8SBram Moolenaar          endtry
41819470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
41829470a4d8SBram Moolenaar          Xpath 'm'
41839470a4d8SBram Moolenaar        finally
41849470a4d8SBram Moolenaar          Xpath 'n'
41859470a4d8SBram Moolenaar        endtry
41869470a4d8SBram Moolenaar      catch /.*/
41879470a4d8SBram Moolenaar        call assert_report('should not get here')
41889470a4d8SBram Moolenaar      finally
41899470a4d8SBram Moolenaar        Xpath 'o'
41909470a4d8SBram Moolenaar        break
41919470a4d8SBram Moolenaar      endtry
41929470a4d8SBram Moolenaar    endwhile
41939470a4d8SBram Moolenaar
41949470a4d8SBram Moolenaar    while 1
41959470a4d8SBram Moolenaar      try
41969470a4d8SBram Moolenaar        try
41979470a4d8SBram Moolenaar          Xpath 'p'
41989470a4d8SBram Moolenaar          call interrupt()
41999470a4d8SBram Moolenaar          call assert_report('should not get here')
42009470a4d8SBram Moolenaar        catch /do_not_catch/
42019470a4d8SBram Moolenaar          call interrupt()
42029470a4d8SBram Moolenaar          call assert_report('should not get here')
42039470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
42049470a4d8SBram Moolenaar          Xpath 'q'
42059470a4d8SBram Moolenaar        finally
42069470a4d8SBram Moolenaar          Xpath 'r'
42079470a4d8SBram Moolenaar        endtry
42089470a4d8SBram Moolenaar      catch /.*/
42099470a4d8SBram Moolenaar        call assert_report('should not get here')
42109470a4d8SBram Moolenaar      finally
42119470a4d8SBram Moolenaar        Xpath 's'
42129470a4d8SBram Moolenaar        break
42139470a4d8SBram Moolenaar      endtry
42149470a4d8SBram Moolenaar    endwhile
42159470a4d8SBram Moolenaar
42169470a4d8SBram Moolenaar    Xpath 't'
42179470a4d8SBram Moolenaar  [CODE]
42189470a4d8SBram Moolenaar  let verify =<< trim [CODE]
42199470a4d8SBram Moolenaar    call assert_equal('abcdefghijklmnopqrst', g:Xpath)
42209470a4d8SBram Moolenaar  [CODE]
42219470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
42229470a4d8SBram Moolenaarendfunc
42239470a4d8SBram Moolenaar
42249470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
4225*efb64829SBram Moolenaar" Test 62:  Catching error exceptions					    {{{1
4226*efb64829SBram Moolenaar"
4227*efb64829SBram Moolenaar"	    An error inside a :try/:endtry region is converted to an exception
4228*efb64829SBram Moolenaar"	    and can be caught.  The error exception has a "Vim(cmdname):" prefix
4229*efb64829SBram Moolenaar"	    where cmdname is the name of the failing command, or a "Vim:" prefix
4230*efb64829SBram Moolenaar"	    if no command name is known.  The "Vim" prefixes cannot be faked.
4231*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4232*efb64829SBram Moolenaar
4233*efb64829SBram Moolenaarfunc Test_catch_err_exception_1()
4234*efb64829SBram Moolenaar  XpathINIT
4235*efb64829SBram Moolenaar  while 1
4236*efb64829SBram Moolenaar    try
4237*efb64829SBram Moolenaar      try
4238*efb64829SBram Moolenaar        let caught = 0
4239*efb64829SBram Moolenaar        unlet novar
4240*efb64829SBram Moolenaar      catch /^Vim(unlet):/
4241*efb64829SBram Moolenaar        Xpath 'a'
4242*efb64829SBram Moolenaar        let caught = 1
4243*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim(unlet):', '', "")
4244*efb64829SBram Moolenaar      finally
4245*efb64829SBram Moolenaar        Xpath 'b'
4246*efb64829SBram Moolenaar        call assert_equal(1, caught)
4247*efb64829SBram Moolenaar        call assert_match('E108: No such variable: "novar"', v:errmsg)
4248*efb64829SBram Moolenaar      endtry
4249*efb64829SBram Moolenaar    catch /.*/
4250*efb64829SBram Moolenaar      call assert_report('should not get here')
4251*efb64829SBram Moolenaar    finally
4252*efb64829SBram Moolenaar      Xpath 'c'
4253*efb64829SBram Moolenaar      break
4254*efb64829SBram Moolenaar    endtry
4255*efb64829SBram Moolenaar    call assert_report('should not get here')
4256*efb64829SBram Moolenaar  endwhile
4257*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4258*efb64829SBram Moolenaarendfunc
4259*efb64829SBram Moolenaar
4260*efb64829SBram Moolenaarfunc Test_catch_err_exception_2()
4261*efb64829SBram Moolenaar  XpathINIT
4262*efb64829SBram Moolenaar  while 1
4263*efb64829SBram Moolenaar    try
4264*efb64829SBram Moolenaar      try
4265*efb64829SBram Moolenaar        let caught = 0
4266*efb64829SBram Moolenaar        throw novar			" error in :throw
4267*efb64829SBram Moolenaar      catch /^Vim(throw):/
4268*efb64829SBram Moolenaar        Xpath 'a'
4269*efb64829SBram Moolenaar        let caught = 1
4270*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim(throw):', '', "")
4271*efb64829SBram Moolenaar      finally
4272*efb64829SBram Moolenaar        Xpath 'b'
4273*efb64829SBram Moolenaar        call assert_equal(1, caught)
4274*efb64829SBram Moolenaar        call assert_match('E121: Undefined variable: novar', v:errmsg)
4275*efb64829SBram Moolenaar      endtry
4276*efb64829SBram Moolenaar    catch /.*/
4277*efb64829SBram Moolenaar      call assert_report('should not get here')
4278*efb64829SBram Moolenaar    finally
4279*efb64829SBram Moolenaar      Xpath 'c'
4280*efb64829SBram Moolenaar      break
4281*efb64829SBram Moolenaar    endtry
4282*efb64829SBram Moolenaar    call assert_report('should not get here')
4283*efb64829SBram Moolenaar  endwhile
4284*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4285*efb64829SBram Moolenaarendfunc
4286*efb64829SBram Moolenaar
4287*efb64829SBram Moolenaarfunc Test_catch_err_exception_3()
4288*efb64829SBram Moolenaar  XpathINIT
4289*efb64829SBram Moolenaar  while 1
4290*efb64829SBram Moolenaar    try
4291*efb64829SBram Moolenaar      try
4292*efb64829SBram Moolenaar        let caught = 0
4293*efb64829SBram Moolenaar        throw "Vim:faked"		" error: cannot fake Vim exception
4294*efb64829SBram Moolenaar      catch /^Vim(throw):/
4295*efb64829SBram Moolenaar        Xpath 'a'
4296*efb64829SBram Moolenaar        let caught = 1
4297*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim(throw):', '', "")
4298*efb64829SBram Moolenaar      finally
4299*efb64829SBram Moolenaar        Xpath 'b'
4300*efb64829SBram Moolenaar        call assert_equal(1, caught)
4301*efb64829SBram Moolenaar        call assert_match("E608: Cannot :throw exceptions with 'Vim' prefix",
4302*efb64829SBram Moolenaar              \ v:errmsg)
4303*efb64829SBram Moolenaar      endtry
4304*efb64829SBram Moolenaar    catch /.*/
4305*efb64829SBram Moolenaar      call assert_report('should not get here')
4306*efb64829SBram Moolenaar    finally
4307*efb64829SBram Moolenaar      Xpath 'c'
4308*efb64829SBram Moolenaar      break
4309*efb64829SBram Moolenaar    endtry
4310*efb64829SBram Moolenaar    call assert_report('should not get here')
4311*efb64829SBram Moolenaar  endwhile
4312*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4313*efb64829SBram Moolenaarendfunc
4314*efb64829SBram Moolenaar
4315*efb64829SBram Moolenaarfunc Test_catch_err_exception_4()
4316*efb64829SBram Moolenaar  XpathINIT
4317*efb64829SBram Moolenaar  func F()
4318*efb64829SBram Moolenaar    while 1
4319*efb64829SBram Moolenaar    " Missing :endwhile
4320*efb64829SBram Moolenaar  endfunc
4321*efb64829SBram Moolenaar
4322*efb64829SBram Moolenaar  while 1
4323*efb64829SBram Moolenaar    try
4324*efb64829SBram Moolenaar      try
4325*efb64829SBram Moolenaar        let caught = 0
4326*efb64829SBram Moolenaar        call F()
4327*efb64829SBram Moolenaar      catch /^Vim(endfunction):/
4328*efb64829SBram Moolenaar        Xpath 'a'
4329*efb64829SBram Moolenaar        let caught = 1
4330*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim(endfunction):', '', "")
4331*efb64829SBram Moolenaar      finally
4332*efb64829SBram Moolenaar        Xpath 'b'
4333*efb64829SBram Moolenaar        call assert_equal(1, caught)
4334*efb64829SBram Moolenaar        call assert_match("E170: Missing :endwhile", v:errmsg)
4335*efb64829SBram Moolenaar      endtry
4336*efb64829SBram Moolenaar    catch /.*/
4337*efb64829SBram Moolenaar      call assert_report('should not get here')
4338*efb64829SBram Moolenaar    finally
4339*efb64829SBram Moolenaar      Xpath 'c'
4340*efb64829SBram Moolenaar      break
4341*efb64829SBram Moolenaar    endtry
4342*efb64829SBram Moolenaar    call assert_report('should not get here')
4343*efb64829SBram Moolenaar  endwhile
4344*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4345*efb64829SBram Moolenaar  delfunc F
4346*efb64829SBram Moolenaarendfunc
4347*efb64829SBram Moolenaar
4348*efb64829SBram Moolenaarfunc Test_catch_err_exception_5()
4349*efb64829SBram Moolenaar  XpathINIT
4350*efb64829SBram Moolenaar  func F()
4351*efb64829SBram Moolenaar    while 1
4352*efb64829SBram Moolenaar    " Missing :endwhile
4353*efb64829SBram Moolenaar  endfunc
4354*efb64829SBram Moolenaar
4355*efb64829SBram Moolenaar  while 1
4356*efb64829SBram Moolenaar    try
4357*efb64829SBram Moolenaar      try
4358*efb64829SBram Moolenaar        let caught = 0
4359*efb64829SBram Moolenaar        ExecAsScript F
4360*efb64829SBram Moolenaar      catch /^Vim:/
4361*efb64829SBram Moolenaar        Xpath 'a'
4362*efb64829SBram Moolenaar        let caught = 1
4363*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim:', '', "")
4364*efb64829SBram Moolenaar      finally
4365*efb64829SBram Moolenaar        Xpath 'b'
4366*efb64829SBram Moolenaar        call assert_equal(1, caught)
4367*efb64829SBram Moolenaar        call assert_match("E170: Missing :endwhile", v:errmsg)
4368*efb64829SBram Moolenaar      endtry
4369*efb64829SBram Moolenaar    catch /.*/
4370*efb64829SBram Moolenaar      call assert_report('should not get here')
4371*efb64829SBram Moolenaar    finally
4372*efb64829SBram Moolenaar      Xpath 'c'
4373*efb64829SBram Moolenaar      break
4374*efb64829SBram Moolenaar    endtry
4375*efb64829SBram Moolenaar    call assert_report('should not get here')
4376*efb64829SBram Moolenaar  endwhile
4377*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4378*efb64829SBram Moolenaar  delfunc F
4379*efb64829SBram Moolenaarendfunc
4380*efb64829SBram Moolenaar
4381*efb64829SBram Moolenaarfunc Test_catch_err_exception_6()
4382*efb64829SBram Moolenaar  XpathINIT
4383*efb64829SBram Moolenaar  func G()
4384*efb64829SBram Moolenaar    call G()
4385*efb64829SBram Moolenaar  endfunc
4386*efb64829SBram Moolenaar
4387*efb64829SBram Moolenaar  while 1
4388*efb64829SBram Moolenaar    try
4389*efb64829SBram Moolenaar      let mfd_save = &mfd
4390*efb64829SBram Moolenaar      set mfd=3
4391*efb64829SBram Moolenaar      try
4392*efb64829SBram Moolenaar        let caught = 0
4393*efb64829SBram Moolenaar        call G()
4394*efb64829SBram Moolenaar      catch /^Vim(call):/
4395*efb64829SBram Moolenaar        Xpath 'a'
4396*efb64829SBram Moolenaar        let caught = 1
4397*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim(call):', '', "")
4398*efb64829SBram Moolenaar      finally
4399*efb64829SBram Moolenaar        Xpath 'b'
4400*efb64829SBram Moolenaar        call assert_equal(1, caught)
4401*efb64829SBram Moolenaar        call assert_match("E132: Function call depth is higher than 'maxfuncdepth'", v:errmsg)
4402*efb64829SBram Moolenaar      endtry
4403*efb64829SBram Moolenaar    catch /.*/
4404*efb64829SBram Moolenaar      call assert_report('should not get here')
4405*efb64829SBram Moolenaar    finally
4406*efb64829SBram Moolenaar      Xpath 'c'
4407*efb64829SBram Moolenaar      let &mfd = mfd_save
4408*efb64829SBram Moolenaar      break
4409*efb64829SBram Moolenaar    endtry
4410*efb64829SBram Moolenaar    call assert_report('should not get here')
4411*efb64829SBram Moolenaar  endwhile
4412*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4413*efb64829SBram Moolenaar  delfunc G
4414*efb64829SBram Moolenaarendfunc
4415*efb64829SBram Moolenaar
4416*efb64829SBram Moolenaarfunc Test_catch_err_exception_7()
4417*efb64829SBram Moolenaar  XpathINIT
4418*efb64829SBram Moolenaar  func H()
4419*efb64829SBram Moolenaar    return H()
4420*efb64829SBram Moolenaar  endfunc
4421*efb64829SBram Moolenaar
4422*efb64829SBram Moolenaar  while 1
4423*efb64829SBram Moolenaar    try
4424*efb64829SBram Moolenaar      let mfd_save = &mfd
4425*efb64829SBram Moolenaar      set mfd=3
4426*efb64829SBram Moolenaar      try
4427*efb64829SBram Moolenaar        let caught = 0
4428*efb64829SBram Moolenaar        call H()
4429*efb64829SBram Moolenaar      catch /^Vim(return):/
4430*efb64829SBram Moolenaar        Xpath 'a'
4431*efb64829SBram Moolenaar        let caught = 1
4432*efb64829SBram Moolenaar        let v:errmsg = substitute(v:exception, '^Vim(return):', '', "")
4433*efb64829SBram Moolenaar      finally
4434*efb64829SBram Moolenaar        Xpath 'b'
4435*efb64829SBram Moolenaar        call assert_equal(1, caught)
4436*efb64829SBram Moolenaar        call assert_match("E132: Function call depth is higher than 'maxfuncdepth'", v:errmsg)
4437*efb64829SBram Moolenaar      endtry
4438*efb64829SBram Moolenaar    catch /.*/
4439*efb64829SBram Moolenaar      call assert_report('should not get here')
4440*efb64829SBram Moolenaar    finally
4441*efb64829SBram Moolenaar      Xpath 'c'
4442*efb64829SBram Moolenaar      let &mfd = mfd_save
4443*efb64829SBram Moolenaar      break		" discard error for $VIMNOERRTHROW
4444*efb64829SBram Moolenaar    endtry
4445*efb64829SBram Moolenaar    call assert_report('should not get here')
4446*efb64829SBram Moolenaar  endwhile
4447*efb64829SBram Moolenaar
4448*efb64829SBram Moolenaar  call assert_equal('abc', g:Xpath)
4449*efb64829SBram Moolenaar  delfunc H
4450*efb64829SBram Moolenaarendfunc
4451*efb64829SBram Moolenaar
4452*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4453*efb64829SBram Moolenaar" Test 63:  Suppressing error exceptions by :silent!.			    {{{1
4454*efb64829SBram Moolenaar"
4455*efb64829SBram Moolenaar"	    A :silent! command inside a :try/:endtry region suppresses the
4456*efb64829SBram Moolenaar"	    conversion of errors to an exception and the immediate abortion on
4457*efb64829SBram Moolenaar"	    error.  When the commands executed by the :silent! themselves open
4458*efb64829SBram Moolenaar"	    a new :try/:endtry region, conversion of errors to exception and
4459*efb64829SBram Moolenaar"	    immediate abortion is switched on again - until the next :silent!
4460*efb64829SBram Moolenaar"	    etc.  The :silent! has the effect of setting v:errmsg to the error
4461*efb64829SBram Moolenaar"	    message text (without displaying it) and continuing with the next
4462*efb64829SBram Moolenaar"	    script line.
4463*efb64829SBram Moolenaar"
4464*efb64829SBram Moolenaar"	    When a command triggering autocommands is executed by :silent!
4465*efb64829SBram Moolenaar"	    inside a :try/:endtry, the autocommand execution is not suppressed
4466*efb64829SBram Moolenaar"	    on error.
4467*efb64829SBram Moolenaar"
4468*efb64829SBram Moolenaar"	    This test reuses the function MSG() from the previous test.
4469*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4470*efb64829SBram Moolenaar
4471*efb64829SBram Moolenaarfunc Test_silent_exception()
4472*efb64829SBram Moolenaar  XpathINIT
4473*efb64829SBram Moolenaar  XloopINIT
4474*efb64829SBram Moolenaar  let g:taken = ""
4475*efb64829SBram Moolenaar
4476*efb64829SBram Moolenaar  func S(n) abort
4477*efb64829SBram Moolenaar    XloopNEXT
4478*efb64829SBram Moolenaar    let g:taken = g:taken . "E" . a:n
4479*efb64829SBram Moolenaar    let v:errmsg = ""
4480*efb64829SBram Moolenaar    exec "asdf" . a:n
4481*efb64829SBram Moolenaar
4482*efb64829SBram Moolenaar    " Check that ":silent!" continues:
4483*efb64829SBram Moolenaar    Xloop 'a'
4484*efb64829SBram Moolenaar
4485*efb64829SBram Moolenaar    " Check that ":silent!" sets "v:errmsg":
4486*efb64829SBram Moolenaar    call assert_match("E492: Not an editor command", v:errmsg)
4487*efb64829SBram Moolenaar  endfunc
4488*efb64829SBram Moolenaar
4489*efb64829SBram Moolenaar  func Foo()
4490*efb64829SBram Moolenaar    while 1
4491*efb64829SBram Moolenaar      try
4492*efb64829SBram Moolenaar        try
4493*efb64829SBram Moolenaar          let caught = 0
4494*efb64829SBram Moolenaar          " This is not silent:
4495*efb64829SBram Moolenaar          call S(3)
4496*efb64829SBram Moolenaar        catch /^Vim:/
4497*efb64829SBram Moolenaar          Xpath 'b'
4498*efb64829SBram Moolenaar          let caught = 1
4499*efb64829SBram Moolenaar          let errmsg3 = substitute(v:exception, '^Vim:', '', "")
4500*efb64829SBram Moolenaar          silent! call S(4)
4501*efb64829SBram Moolenaar        finally
4502*efb64829SBram Moolenaar          call assert_equal(1, caught)
4503*efb64829SBram Moolenaar          Xpath 'c'
4504*efb64829SBram Moolenaar          call assert_match("E492: Not an editor command", errmsg3)
4505*efb64829SBram Moolenaar          silent! call S(5)
4506*efb64829SBram Moolenaar          " Break out of try conditionals that cover ":silent!".  This also
4507*efb64829SBram Moolenaar          " discards the aborting error when $VIMNOERRTHROW is non-zero.
4508*efb64829SBram Moolenaar          break
4509*efb64829SBram Moolenaar        endtry
4510*efb64829SBram Moolenaar      catch /.*/
4511*efb64829SBram Moolenaar        call assert_report('should not get here')
4512*efb64829SBram Moolenaar      endtry
4513*efb64829SBram Moolenaar    endwhile
4514*efb64829SBram Moolenaar    " This is a double ":silent!" (see caller).
4515*efb64829SBram Moolenaar    silent! call S(6)
4516*efb64829SBram Moolenaar  endfunc
4517*efb64829SBram Moolenaar
4518*efb64829SBram Moolenaar  func Bar()
4519*efb64829SBram Moolenaar    try
4520*efb64829SBram Moolenaar      silent! call S(2)
4521*efb64829SBram Moolenaar      silent! execute "call Foo() | call S(7)"
4522*efb64829SBram Moolenaar      silent! call S(8)
4523*efb64829SBram Moolenaar    endtry	" normal end of try cond that covers ":silent!"
4524*efb64829SBram Moolenaar    " This has a ":silent!" from the caller:
4525*efb64829SBram Moolenaar    call S(9)
4526*efb64829SBram Moolenaar  endfunc
4527*efb64829SBram Moolenaar
4528*efb64829SBram Moolenaar  silent! call S(1)
4529*efb64829SBram Moolenaar  silent! call Bar()
4530*efb64829SBram Moolenaar  silent! call S(10)
4531*efb64829SBram Moolenaar
4532*efb64829SBram Moolenaar  call assert_equal("E1E2E3E4E5E6E7E8E9E10", g:taken)
4533*efb64829SBram Moolenaar
4534*efb64829SBram Moolenaar  augroup TMP
4535*efb64829SBram Moolenaar    au!
4536*efb64829SBram Moolenaar    autocmd BufWritePost * Xpath 'd'
4537*efb64829SBram Moolenaar  augroup END
4538*efb64829SBram Moolenaar
4539*efb64829SBram Moolenaar  Xpath 'e'
4540*efb64829SBram Moolenaar  silent! write /i/m/p/o/s/s/i/b/l/e
4541*efb64829SBram Moolenaar  Xpath 'f'
4542*efb64829SBram Moolenaar
4543*efb64829SBram Moolenaar  call assert_equal('a2a3ba5ca6a7a8a9a10a11edf', g:Xpath)
4544*efb64829SBram Moolenaar
4545*efb64829SBram Moolenaar  augroup TMP
4546*efb64829SBram Moolenaar    au!
4547*efb64829SBram Moolenaar  augroup END
4548*efb64829SBram Moolenaar  augroup! TMP
4549*efb64829SBram Moolenaar  delfunction S
4550*efb64829SBram Moolenaar  delfunction Foo
4551*efb64829SBram Moolenaar  delfunction Bar
4552*efb64829SBram Moolenaarendfunc
4553*efb64829SBram Moolenaar
4554*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4555*efb64829SBram Moolenaar" Test 64:  Error exceptions after error, interrupt or :throw		    {{{1
4556*efb64829SBram Moolenaar"
4557*efb64829SBram Moolenaar"	    When an error occurs after an interrupt or a :throw but before
4558*efb64829SBram Moolenaar"	    a matching :catch is reached, all following :catches of that try
4559*efb64829SBram Moolenaar"	    block are ignored, but the error exception can be caught by the next
4560*efb64829SBram Moolenaar"	    surrounding try conditional.  Any previous error exception is
4561*efb64829SBram Moolenaar"	    discarded.  An error is ignored when there is a previous error that
4562*efb64829SBram Moolenaar"	    has not been caught.
4563*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4564*efb64829SBram Moolenaar
4565*efb64829SBram Moolenaarfunc Test_exception_after_error_1()
4566*efb64829SBram Moolenaar  XpathINIT
4567*efb64829SBram Moolenaar  while 1
4568*efb64829SBram Moolenaar    try
4569*efb64829SBram Moolenaar      try
4570*efb64829SBram Moolenaar        Xpath 'a'
4571*efb64829SBram Moolenaar        let caught = 0
4572*efb64829SBram Moolenaar        while 1
4573*efb64829SBram Moolenaar          if 1
4574*efb64829SBram Moolenaar          " Missing :endif
4575*efb64829SBram Moolenaar        endwhile	" throw error exception
4576*efb64829SBram Moolenaar      catch /^Vim(/
4577*efb64829SBram Moolenaar        Xpath 'b'
4578*efb64829SBram Moolenaar        let caught = 1
4579*efb64829SBram Moolenaar      finally
4580*efb64829SBram Moolenaar        Xpath 'c'
4581*efb64829SBram Moolenaar        call assert_equal(1, caught)
4582*efb64829SBram Moolenaar      endtry
4583*efb64829SBram Moolenaar    catch /.*/
4584*efb64829SBram Moolenaar      call assert_report('should not get here')
4585*efb64829SBram Moolenaar    finally
4586*efb64829SBram Moolenaar      Xpath 'd'
4587*efb64829SBram Moolenaar      break
4588*efb64829SBram Moolenaar    endtry
4589*efb64829SBram Moolenaar    call assert_report('should not get here')
4590*efb64829SBram Moolenaar  endwhile
4591*efb64829SBram Moolenaar  call assert_equal('abcd', g:Xpath)
4592*efb64829SBram Moolenaarendfunc
4593*efb64829SBram Moolenaar
4594*efb64829SBram Moolenaarfunc Test_exception_after_error_2()
4595*efb64829SBram Moolenaar  XpathINIT
4596*efb64829SBram Moolenaar  while 1
4597*efb64829SBram Moolenaar    try
4598*efb64829SBram Moolenaar      try
4599*efb64829SBram Moolenaar        Xpath 'a'
4600*efb64829SBram Moolenaar        let caught = 0
4601*efb64829SBram Moolenaar        try
4602*efb64829SBram Moolenaar          if 1
4603*efb64829SBram Moolenaar          " Missing :endif
4604*efb64829SBram Moolenaar        catch /.*/	" throw error exception
4605*efb64829SBram Moolenaar          call assert_report('should not get here')
4606*efb64829SBram Moolenaar        catch /.*/
4607*efb64829SBram Moolenaar          call assert_report('should not get here')
4608*efb64829SBram Moolenaar        endtry
4609*efb64829SBram Moolenaar      catch /^Vim(/
4610*efb64829SBram Moolenaar        Xpath 'b'
4611*efb64829SBram Moolenaar        let caught = 1
4612*efb64829SBram Moolenaar      finally
4613*efb64829SBram Moolenaar        Xpath 'c'
4614*efb64829SBram Moolenaar        call assert_equal(1, caught)
4615*efb64829SBram Moolenaar      endtry
4616*efb64829SBram Moolenaar    catch /.*/
4617*efb64829SBram Moolenaar      call assert_report('should not get here')
4618*efb64829SBram Moolenaar    finally
4619*efb64829SBram Moolenaar      Xpath 'd'
4620*efb64829SBram Moolenaar      break
4621*efb64829SBram Moolenaar    endtry
4622*efb64829SBram Moolenaar    call assert_report('should not get here')
4623*efb64829SBram Moolenaar  endwhile
4624*efb64829SBram Moolenaar  call assert_equal('abcd', g:Xpath)
4625*efb64829SBram Moolenaarendfunc
4626*efb64829SBram Moolenaar
4627*efb64829SBram Moolenaarfunc Test_exception_after_error_3()
4628*efb64829SBram Moolenaar  XpathINIT
4629*efb64829SBram Moolenaar  while 1
4630*efb64829SBram Moolenaar    try
4631*efb64829SBram Moolenaar      try
4632*efb64829SBram Moolenaar        let caught = 0
4633*efb64829SBram Moolenaar        try
4634*efb64829SBram Moolenaar          Xpath 'a'
4635*efb64829SBram Moolenaar          call interrupt()
4636*efb64829SBram Moolenaar        catch /do_not_catch/
4637*efb64829SBram Moolenaar          call assert_report('should not get here')
4638*efb64829SBram Moolenaar          if 1
4639*efb64829SBram Moolenaar          " Missing :endif
4640*efb64829SBram Moolenaar        catch /.*/	" throw error exception
4641*efb64829SBram Moolenaar          call assert_report('should not get here')
4642*efb64829SBram Moolenaar        catch /.*/
4643*efb64829SBram Moolenaar          call assert_report('should not get here')
4644*efb64829SBram Moolenaar        endtry
4645*efb64829SBram Moolenaar      catch /^Vim(/
4646*efb64829SBram Moolenaar        Xpath 'b'
4647*efb64829SBram Moolenaar        let caught = 1
4648*efb64829SBram Moolenaar      finally
4649*efb64829SBram Moolenaar        Xpath 'c'
4650*efb64829SBram Moolenaar        call assert_equal(1, caught)
4651*efb64829SBram Moolenaar      endtry
4652*efb64829SBram Moolenaar    catch /.*/
4653*efb64829SBram Moolenaar      call assert_report('should not get here')
4654*efb64829SBram Moolenaar    finally
4655*efb64829SBram Moolenaar      Xpath 'd'
4656*efb64829SBram Moolenaar      break
4657*efb64829SBram Moolenaar    endtry
4658*efb64829SBram Moolenaar    call assert_report('should not get here')
4659*efb64829SBram Moolenaar  endwhile
4660*efb64829SBram Moolenaar  call assert_equal('abcd', g:Xpath)
4661*efb64829SBram Moolenaarendfunc
4662*efb64829SBram Moolenaar
4663*efb64829SBram Moolenaarfunc Test_exception_after_error_4()
4664*efb64829SBram Moolenaar  XpathINIT
4665*efb64829SBram Moolenaar  while 1
4666*efb64829SBram Moolenaar    try
4667*efb64829SBram Moolenaar      try
4668*efb64829SBram Moolenaar        let caught = 0
4669*efb64829SBram Moolenaar        try
4670*efb64829SBram Moolenaar          Xpath 'a'
4671*efb64829SBram Moolenaar          throw "x"
4672*efb64829SBram Moolenaar        catch /do_not_catch/
4673*efb64829SBram Moolenaar          call assert_report('should not get here')
4674*efb64829SBram Moolenaar          if 1
4675*efb64829SBram Moolenaar          " Missing :endif
4676*efb64829SBram Moolenaar        catch /x/	" throw error exception
4677*efb64829SBram Moolenaar          call assert_report('should not get here')
4678*efb64829SBram Moolenaar        catch /.*/
4679*efb64829SBram Moolenaar          call assert_report('should not get here')
4680*efb64829SBram Moolenaar        endtry
4681*efb64829SBram Moolenaar      catch /^Vim(/
4682*efb64829SBram Moolenaar        Xpath 'b'
4683*efb64829SBram Moolenaar        let caught = 1
4684*efb64829SBram Moolenaar      finally
4685*efb64829SBram Moolenaar        Xpath 'c'
4686*efb64829SBram Moolenaar        call assert_equal(1, caught)
4687*efb64829SBram Moolenaar      endtry
4688*efb64829SBram Moolenaar    catch /.*/
4689*efb64829SBram Moolenaar      call assert_report('should not get here')
4690*efb64829SBram Moolenaar    finally
4691*efb64829SBram Moolenaar      Xpath 'd'
4692*efb64829SBram Moolenaar      break
4693*efb64829SBram Moolenaar    endtry
4694*efb64829SBram Moolenaar    call assert_report('should not get here')
4695*efb64829SBram Moolenaar  endwhile
4696*efb64829SBram Moolenaar  call assert_equal('abcd', g:Xpath)
4697*efb64829SBram Moolenaarendfunc
4698*efb64829SBram Moolenaar
4699*efb64829SBram Moolenaarfunc Test_exception_after_error_5()
4700*efb64829SBram Moolenaar  XpathINIT
4701*efb64829SBram Moolenaar  while 1
4702*efb64829SBram Moolenaar    try
4703*efb64829SBram Moolenaar      try
4704*efb64829SBram Moolenaar        let caught = 0
4705*efb64829SBram Moolenaar        Xpath 'a'
4706*efb64829SBram Moolenaar        endif		" :endif without :if; throw error exception
4707*efb64829SBram Moolenaar        if 1
4708*efb64829SBram Moolenaar        " Missing :endif
4709*efb64829SBram Moolenaar      catch /do_not_catch/ " ignore new error
4710*efb64829SBram Moolenaar        call assert_report('should not get here')
4711*efb64829SBram Moolenaar      catch /^Vim(endif):/
4712*efb64829SBram Moolenaar        Xpath 'b'
4713*efb64829SBram Moolenaar        let caught = 1
4714*efb64829SBram Moolenaar      catch /^Vim(/
4715*efb64829SBram Moolenaar        call assert_report('should not get here')
4716*efb64829SBram Moolenaar      finally
4717*efb64829SBram Moolenaar        Xpath 'c'
4718*efb64829SBram Moolenaar        call assert_equal(1, caught)
4719*efb64829SBram Moolenaar      endtry
4720*efb64829SBram Moolenaar    catch /.*/
4721*efb64829SBram Moolenaar      call assert_report('should not get here')
4722*efb64829SBram Moolenaar    finally
4723*efb64829SBram Moolenaar      Xpath 'd'
4724*efb64829SBram Moolenaar      break
4725*efb64829SBram Moolenaar    endtry
4726*efb64829SBram Moolenaar    call assert_report('should not get here')
4727*efb64829SBram Moolenaar  endwhile
4728*efb64829SBram Moolenaar  call assert_equal('abcd', g:Xpath)
4729*efb64829SBram Moolenaarendfunc
4730*efb64829SBram Moolenaar
4731*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
47329470a4d8SBram Moolenaar" Test 65:  Errors in the /pattern/ argument of a :catch		    {{{1
47339470a4d8SBram Moolenaar"
47349470a4d8SBram Moolenaar"	    On an error in the /pattern/ argument of a :catch, the :catch does
47359470a4d8SBram Moolenaar"	    not match.  Any following :catches of the same :try/:endtry don't
47369470a4d8SBram Moolenaar"	    match either.  Finally clauses are executed.
47379470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
47389470a4d8SBram Moolenaar
47399470a4d8SBram Moolenaarfunc Test_catch_pattern_error()
47409470a4d8SBram Moolenaar  CheckEnglish
47419470a4d8SBram Moolenaar  XpathINIT
47429470a4d8SBram Moolenaar
47439470a4d8SBram Moolenaar  try
47449470a4d8SBram Moolenaar    try
47459470a4d8SBram Moolenaar      Xpath 'a'
47469470a4d8SBram Moolenaar      throw "oops"
47479470a4d8SBram Moolenaar    catch /^oops$/
47489470a4d8SBram Moolenaar      Xpath 'b'
47499470a4d8SBram Moolenaar    catch /\)/		" not checked; exception has already been caught
47509470a4d8SBram Moolenaar      call assert_report('should not get here')
47519470a4d8SBram Moolenaar    endtry
47529470a4d8SBram Moolenaar    Xpath 'c'
47539470a4d8SBram Moolenaar  catch /.*/
47549470a4d8SBram Moolenaar    call assert_report('should not get here')
47559470a4d8SBram Moolenaar  endtry
47569470a4d8SBram Moolenaar  call assert_equal('abc', g:Xpath)
47579470a4d8SBram Moolenaar
47589470a4d8SBram Moolenaar  XpathINIT
47599470a4d8SBram Moolenaar  func F()
47609470a4d8SBram Moolenaar    try
47619470a4d8SBram Moolenaar      try
47629470a4d8SBram Moolenaar        try
47639470a4d8SBram Moolenaar          Xpath 'a'
47649470a4d8SBram Moolenaar          throw "ab"
47659470a4d8SBram Moolenaar        catch /abc/	" does not catch
47669470a4d8SBram Moolenaar          call assert_report('should not get here')
47679470a4d8SBram Moolenaar        catch /\)/	" error; discards exception
47689470a4d8SBram Moolenaar          call assert_report('should not get here')
47699470a4d8SBram Moolenaar        catch /.*/	" not checked
47709470a4d8SBram Moolenaar          call assert_report('should not get here')
47719470a4d8SBram Moolenaar        finally
47729470a4d8SBram Moolenaar          Xpath 'b'
47739470a4d8SBram Moolenaar        endtry
47749470a4d8SBram Moolenaar        call assert_report('should not get here')
47759470a4d8SBram Moolenaar      catch /^ab$/	" checked, but original exception is discarded
47769470a4d8SBram Moolenaar        call assert_report('should not get here')
47779470a4d8SBram Moolenaar      catch /^Vim(catch):/
47789470a4d8SBram Moolenaar        Xpath 'c'
47799470a4d8SBram Moolenaar        call assert_match('Vim(catch):E475: Invalid argument:', v:exception)
47809470a4d8SBram Moolenaar      finally
47819470a4d8SBram Moolenaar        Xpath 'd'
47829470a4d8SBram Moolenaar      endtry
47839470a4d8SBram Moolenaar      Xpath 'e'
47849470a4d8SBram Moolenaar    catch /.*/
47859470a4d8SBram Moolenaar      call assert_report('should not get here')
47869470a4d8SBram Moolenaar    endtry
47879470a4d8SBram Moolenaar    Xpath 'f'
47889470a4d8SBram Moolenaar  endfunc
47899470a4d8SBram Moolenaar
47909470a4d8SBram Moolenaar  call F()
47919470a4d8SBram Moolenaar  call assert_equal('abcdef', g:Xpath)
47929470a4d8SBram Moolenaar
47939470a4d8SBram Moolenaar  delfunc F
47949470a4d8SBram Moolenaarendfunc
47959470a4d8SBram Moolenaar
47969470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
4797*efb64829SBram Moolenaar" Test 66:  Stop range :call on error, interrupt, or :throw		    {{{1
4798*efb64829SBram Moolenaar"
4799*efb64829SBram Moolenaar"	    When a function which is multiply called for a range since it
4800*efb64829SBram Moolenaar"	    doesn't handle the range itself has an error in a command
4801*efb64829SBram Moolenaar"	    dynamically enclosed by :try/:endtry or gets an interrupt or
4802*efb64829SBram Moolenaar"	    executes a :throw, no more calls for the remaining lines in the
4803*efb64829SBram Moolenaar"	    range are made.  On an error in a command not dynamically enclosed
4804*efb64829SBram Moolenaar"	    by :try/:endtry, the function is executed again for the remaining
4805*efb64829SBram Moolenaar"	    lines in the range.
4806*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4807*efb64829SBram Moolenaar
4808*efb64829SBram Moolenaarfunc Test_stop_range_on_error()
4809*efb64829SBram Moolenaar  let test =<< trim [CODE]
4810*efb64829SBram Moolenaar    let file = tempname()
4811*efb64829SBram Moolenaar    exec "edit" file
4812*efb64829SBram Moolenaar    call setline(1, ['line 1', 'line 2', 'line 3'])
4813*efb64829SBram Moolenaar    let taken = ""
4814*efb64829SBram Moolenaar    let expected = "G1EF1E(1)F1E(2)F1E(3)G2EF2E(1)G3IF3I(1)G4TF4T(1)G5AF5A(1)"
4815*efb64829SBram Moolenaar
4816*efb64829SBram Moolenaar    func F(reason, n) abort
4817*efb64829SBram Moolenaar      let g:taken = g:taken .. "F" .. a:n ..
4818*efb64829SBram Moolenaar                          \ substitute(a:reason, '\(\l\).*', '\u\1', "") ..
4819*efb64829SBram Moolenaar                          \ "(" .. line(".") .. ")"
4820*efb64829SBram Moolenaar
4821*efb64829SBram Moolenaar      if a:reason == "error"
4822*efb64829SBram Moolenaar        asdf
4823*efb64829SBram Moolenaar      elseif a:reason == "interrupt"
4824*efb64829SBram Moolenaar        call interrupt()
4825*efb64829SBram Moolenaar      elseif a:reason == "throw"
4826*efb64829SBram Moolenaar        throw "xyz"
4827*efb64829SBram Moolenaar      elseif a:reason == "aborting error"
4828*efb64829SBram Moolenaar        XloopNEXT
4829*efb64829SBram Moolenaar        call assert_equal(g:taken, g:expected)
4830*efb64829SBram Moolenaar        try
4831*efb64829SBram Moolenaar          bwipeout!
4832*efb64829SBram Moolenaar          call delete(g:file)
4833*efb64829SBram Moolenaar          asdf
4834*efb64829SBram Moolenaar        endtry
4835*efb64829SBram Moolenaar      endif
4836*efb64829SBram Moolenaar    endfunc
4837*efb64829SBram Moolenaar
4838*efb64829SBram Moolenaar    func G(reason, n)
4839*efb64829SBram Moolenaar      let g:taken = g:taken .. "G" .. a:n ..
4840*efb64829SBram Moolenaar                              \ substitute(a:reason, '\(\l\).*', '\u\1', "")
4841*efb64829SBram Moolenaar      1,3call F(a:reason, a:n)
4842*efb64829SBram Moolenaar    endfunc
4843*efb64829SBram Moolenaar
4844*efb64829SBram Moolenaar    Xpath 'a'
4845*efb64829SBram Moolenaar    call G("error", 1)
4846*efb64829SBram Moolenaar    try
4847*efb64829SBram Moolenaar      Xpath 'b'
4848*efb64829SBram Moolenaar      try
4849*efb64829SBram Moolenaar        call G("error", 2)
4850*efb64829SBram Moolenaar        call assert_report('should not get here')
4851*efb64829SBram Moolenaar      finally
4852*efb64829SBram Moolenaar        Xpath 'c'
4853*efb64829SBram Moolenaar        try
4854*efb64829SBram Moolenaar          call G("interrupt", 3)
4855*efb64829SBram Moolenaar          call assert_report('should not get here')
4856*efb64829SBram Moolenaar        finally
4857*efb64829SBram Moolenaar          Xpath 'd'
4858*efb64829SBram Moolenaar          try
4859*efb64829SBram Moolenaar            call G("throw", 4)
4860*efb64829SBram Moolenaar            call assert_report('should not get here')
4861*efb64829SBram Moolenaar          endtry
4862*efb64829SBram Moolenaar        endtry
4863*efb64829SBram Moolenaar      endtry
4864*efb64829SBram Moolenaar    catch /xyz/
4865*efb64829SBram Moolenaar      Xpath 'e'
4866*efb64829SBram Moolenaar    catch /.*/
4867*efb64829SBram Moolenaar      call assert_report('should not get here')
4868*efb64829SBram Moolenaar    endtry
4869*efb64829SBram Moolenaar    Xpath 'f'
4870*efb64829SBram Moolenaar    call G("aborting error", 5)
4871*efb64829SBram Moolenaar    call assert_report('should not get here')
4872*efb64829SBram Moolenaar  [CODE]
4873*efb64829SBram Moolenaar  let verify =<< trim [CODE]
4874*efb64829SBram Moolenaar    call assert_equal('abcdef', g:Xpath)
4875*efb64829SBram Moolenaar  [CODE]
4876*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
4877*efb64829SBram Moolenaarendfunc
4878*efb64829SBram Moolenaar
4879*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4880*efb64829SBram Moolenaar" Test 67:  :throw across :call command					    {{{1
4881*efb64829SBram Moolenaar"
4882*efb64829SBram Moolenaar"	    On a call command, an exception might be thrown when evaluating the
4883*efb64829SBram Moolenaar"	    function name, during evaluation of the arguments, or when the
4884*efb64829SBram Moolenaar"	    function is being executed.  The exception can be caught by the
4885*efb64829SBram Moolenaar"	    caller.
4886*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
4887*efb64829SBram Moolenaar
4888*efb64829SBram Moolenaarfunc THROW(x, n)
4889*efb64829SBram Moolenaar  if a:n == 1
4890*efb64829SBram Moolenaar    Xpath 'A'
4891*efb64829SBram Moolenaar  elseif a:n == 2
4892*efb64829SBram Moolenaar    Xpath 'B'
4893*efb64829SBram Moolenaar  elseif a:n == 3
4894*efb64829SBram Moolenaar    Xpath 'C'
4895*efb64829SBram Moolenaar  endif
4896*efb64829SBram Moolenaar  throw a:x
4897*efb64829SBram Moolenaarendfunc
4898*efb64829SBram Moolenaar
4899*efb64829SBram Moolenaarfunc NAME(x, n)
4900*efb64829SBram Moolenaar  if a:n == 1
4901*efb64829SBram Moolenaar    call assert_report('should not get here')
4902*efb64829SBram Moolenaar  elseif a:n == 2
4903*efb64829SBram Moolenaar    Xpath 'D'
4904*efb64829SBram Moolenaar  elseif a:n == 3
4905*efb64829SBram Moolenaar    Xpath 'E'
4906*efb64829SBram Moolenaar  elseif a:n == 4
4907*efb64829SBram Moolenaar    Xpath 'F'
4908*efb64829SBram Moolenaar  endif
4909*efb64829SBram Moolenaar  return a:x
4910*efb64829SBram Moolenaarendfunc
4911*efb64829SBram Moolenaar
4912*efb64829SBram Moolenaarfunc ARG(x, n)
4913*efb64829SBram Moolenaar  if a:n == 1
4914*efb64829SBram Moolenaar    call assert_report('should not get here')
4915*efb64829SBram Moolenaar  elseif a:n == 2
4916*efb64829SBram Moolenaar    call assert_report('should not get here')
4917*efb64829SBram Moolenaar  elseif a:n == 3
4918*efb64829SBram Moolenaar    Xpath 'G'
4919*efb64829SBram Moolenaar  elseif a:n == 4
4920*efb64829SBram Moolenaar    Xpath 'I'
4921*efb64829SBram Moolenaar  endif
4922*efb64829SBram Moolenaar  return a:x
4923*efb64829SBram Moolenaarendfunc
4924*efb64829SBram Moolenaar
4925*efb64829SBram Moolenaarfunc Test_throw_across_call_cmd()
4926*efb64829SBram Moolenaar  XpathINIT
4927*efb64829SBram Moolenaar
4928*efb64829SBram Moolenaar  func F(x, n)
4929*efb64829SBram Moolenaar    if a:n == 2
4930*efb64829SBram Moolenaar      call assert_report('should not get here')
4931*efb64829SBram Moolenaar    elseif a:n == 4
4932*efb64829SBram Moolenaar      Xpath 'a'
4933*efb64829SBram Moolenaar    endif
4934*efb64829SBram Moolenaar  endfunc
4935*efb64829SBram Moolenaar
4936*efb64829SBram Moolenaar  while 1
4937*efb64829SBram Moolenaar    try
4938*efb64829SBram Moolenaar      let v:errmsg = ""
4939*efb64829SBram Moolenaar
4940*efb64829SBram Moolenaar      while 1
4941*efb64829SBram Moolenaar        try
4942*efb64829SBram Moolenaar          Xpath 'b'
4943*efb64829SBram Moolenaar          call {NAME(THROW("name", 1), 1)}(ARG(4711, 1), 1)
4944*efb64829SBram Moolenaar          call assert_report('should not get here')
4945*efb64829SBram Moolenaar        catch /^name$/
4946*efb64829SBram Moolenaar          Xpath 'c'
4947*efb64829SBram Moolenaar        catch /.*/
4948*efb64829SBram Moolenaar          call assert_report('should not get here')
4949*efb64829SBram Moolenaar        finally
4950*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
4951*efb64829SBram Moolenaar          let v:errmsg = ""
4952*efb64829SBram Moolenaar          break
4953*efb64829SBram Moolenaar        endtry
4954*efb64829SBram Moolenaar      endwhile
4955*efb64829SBram Moolenaar
4956*efb64829SBram Moolenaar      while 1
4957*efb64829SBram Moolenaar        try
4958*efb64829SBram Moolenaar          Xpath 'd'
4959*efb64829SBram Moolenaar          call {NAME("F", 2)}(ARG(THROW("arg", 2), 2), 2)
4960*efb64829SBram Moolenaar          call assert_report('should not get here')
4961*efb64829SBram Moolenaar        catch /^arg$/
4962*efb64829SBram Moolenaar          Xpath 'e'
4963*efb64829SBram Moolenaar        catch /.*/
4964*efb64829SBram Moolenaar          call assert_report('should not get here')
4965*efb64829SBram Moolenaar        finally
4966*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
4967*efb64829SBram Moolenaar          let v:errmsg = ""
4968*efb64829SBram Moolenaar          break
4969*efb64829SBram Moolenaar        endtry
4970*efb64829SBram Moolenaar      endwhile
4971*efb64829SBram Moolenaar
4972*efb64829SBram Moolenaar      while 1
4973*efb64829SBram Moolenaar        try
4974*efb64829SBram Moolenaar          Xpath 'f'
4975*efb64829SBram Moolenaar          call {NAME("THROW", 3)}(ARG("call", 3), 3)
4976*efb64829SBram Moolenaar          call assert_report('should not get here')
4977*efb64829SBram Moolenaar        catch /^call$/
4978*efb64829SBram Moolenaar          Xpath 'g'
4979*efb64829SBram Moolenaar        catch /^0$/	    " default return value
4980*efb64829SBram Moolenaar          call assert_report('should not get here')
4981*efb64829SBram Moolenaar        catch /.*/
4982*efb64829SBram Moolenaar          call assert_report('should not get here')
4983*efb64829SBram Moolenaar        finally
4984*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
4985*efb64829SBram Moolenaar          let v:errmsg = ""
4986*efb64829SBram Moolenaar          break
4987*efb64829SBram Moolenaar        endtry
4988*efb64829SBram Moolenaar      endwhile
4989*efb64829SBram Moolenaar
4990*efb64829SBram Moolenaar      while 1
4991*efb64829SBram Moolenaar        try
4992*efb64829SBram Moolenaar          Xpath 'h'
4993*efb64829SBram Moolenaar          call {NAME("F", 4)}(ARG(4711, 4), 4)
4994*efb64829SBram Moolenaar          Xpath 'i'
4995*efb64829SBram Moolenaar        catch /.*/
4996*efb64829SBram Moolenaar          call assert_report('should not get here')
4997*efb64829SBram Moolenaar        finally
4998*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
4999*efb64829SBram Moolenaar          let v:errmsg = ""
5000*efb64829SBram Moolenaar          break
5001*efb64829SBram Moolenaar        endtry
5002*efb64829SBram Moolenaar      endwhile
5003*efb64829SBram Moolenaar
5004*efb64829SBram Moolenaar    catch /^0$/	    " default return value
5005*efb64829SBram Moolenaar      call assert_report('should not get here')
5006*efb64829SBram Moolenaar    catch /.*/
5007*efb64829SBram Moolenaar      call assert_report('should not get here')
5008*efb64829SBram Moolenaar    finally
5009*efb64829SBram Moolenaar      call assert_equal("", v:errmsg)
5010*efb64829SBram Moolenaar      let v:errmsg = ""
5011*efb64829SBram Moolenaar      break
5012*efb64829SBram Moolenaar    endtry
5013*efb64829SBram Moolenaar  endwhile
5014*efb64829SBram Moolenaar
5015*efb64829SBram Moolenaar  call assert_equal('bAcdDBefEGCghFIai', g:Xpath)
5016*efb64829SBram Moolenaar  delfunction F
5017*efb64829SBram Moolenaarendfunc
5018*efb64829SBram Moolenaar
5019*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5020*efb64829SBram Moolenaar" Test 68:  :throw across function calls in expressions			    {{{1
5021*efb64829SBram Moolenaar"
5022*efb64829SBram Moolenaar"	    On a function call within an expression, an exception might be
5023*efb64829SBram Moolenaar"	    thrown when evaluating the function name, during evaluation of the
5024*efb64829SBram Moolenaar"	    arguments, or when the function is being executed.  The exception
5025*efb64829SBram Moolenaar"	    can be caught by the caller.
5026*efb64829SBram Moolenaar"
5027*efb64829SBram Moolenaar"	    This test reuses the functions THROW(), NAME(), and ARG() from the
5028*efb64829SBram Moolenaar"	    previous test.
5029*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5030*efb64829SBram Moolenaar
5031*efb64829SBram Moolenaarfunc Test_throw_across_call_expr()
5032*efb64829SBram Moolenaar  XpathINIT
5033*efb64829SBram Moolenaar
5034*efb64829SBram Moolenaar  func F(x, n)
5035*efb64829SBram Moolenaar    if a:n == 2
5036*efb64829SBram Moolenaar      call assert_report('should not get here')
5037*efb64829SBram Moolenaar    elseif a:n == 4
5038*efb64829SBram Moolenaar      Xpath 'a'
5039*efb64829SBram Moolenaar    endif
5040*efb64829SBram Moolenaar    return a:x
5041*efb64829SBram Moolenaar  endfunction
5042*efb64829SBram Moolenaar
5043*efb64829SBram Moolenaar  while 1
5044*efb64829SBram Moolenaar    try
5045*efb64829SBram Moolenaar      let error = 0
5046*efb64829SBram Moolenaar      let v:errmsg = ""
5047*efb64829SBram Moolenaar
5048*efb64829SBram Moolenaar      while 1
5049*efb64829SBram Moolenaar        try
5050*efb64829SBram Moolenaar          Xpath 'b'
5051*efb64829SBram Moolenaar          let var1 = {NAME(THROW("name", 1), 1)}(ARG(4711, 1), 1)
5052*efb64829SBram Moolenaar          call assert_report('should not get here')
5053*efb64829SBram Moolenaar        catch /^name$/
5054*efb64829SBram Moolenaar          Xpath 'c'
5055*efb64829SBram Moolenaar        catch /.*/
5056*efb64829SBram Moolenaar          call assert_report('should not get here')
5057*efb64829SBram Moolenaar        finally
5058*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5059*efb64829SBram Moolenaar          let v:errmsg = ""
5060*efb64829SBram Moolenaar          break
5061*efb64829SBram Moolenaar        endtry
5062*efb64829SBram Moolenaar      endwhile
5063*efb64829SBram Moolenaar      call assert_true(!exists('var1'))
5064*efb64829SBram Moolenaar
5065*efb64829SBram Moolenaar      while 1
5066*efb64829SBram Moolenaar        try
5067*efb64829SBram Moolenaar          Xpath 'd'
5068*efb64829SBram Moolenaar          let var2 = {NAME("F", 2)}(ARG(THROW("arg", 2), 2), 2)
5069*efb64829SBram Moolenaar          call assert_report('should not get here')
5070*efb64829SBram Moolenaar        catch /^arg$/
5071*efb64829SBram Moolenaar          Xpath 'e'
5072*efb64829SBram Moolenaar        catch /.*/
5073*efb64829SBram Moolenaar          call assert_report('should not get here')
5074*efb64829SBram Moolenaar        finally
5075*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5076*efb64829SBram Moolenaar          let v:errmsg = ""
5077*efb64829SBram Moolenaar          break
5078*efb64829SBram Moolenaar        endtry
5079*efb64829SBram Moolenaar      endwhile
5080*efb64829SBram Moolenaar      call assert_true(!exists('var2'))
5081*efb64829SBram Moolenaar
5082*efb64829SBram Moolenaar      while 1
5083*efb64829SBram Moolenaar        try
5084*efb64829SBram Moolenaar          Xpath 'f'
5085*efb64829SBram Moolenaar          let var3 = {NAME("THROW", 3)}(ARG("call", 3), 3)
5086*efb64829SBram Moolenaar          call assert_report('should not get here')
5087*efb64829SBram Moolenaar        catch /^call$/
5088*efb64829SBram Moolenaar          Xpath 'g'
5089*efb64829SBram Moolenaar        catch /^0$/	    " default return value
5090*efb64829SBram Moolenaar          call assert_report('should not get here')
5091*efb64829SBram Moolenaar        catch /.*/
5092*efb64829SBram Moolenaar          call assert_report('should not get here')
5093*efb64829SBram Moolenaar        finally
5094*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5095*efb64829SBram Moolenaar          let v:errmsg = ""
5096*efb64829SBram Moolenaar          break
5097*efb64829SBram Moolenaar        endtry
5098*efb64829SBram Moolenaar      endwhile
5099*efb64829SBram Moolenaar      call assert_true(!exists('var3'))
5100*efb64829SBram Moolenaar
5101*efb64829SBram Moolenaar      while 1
5102*efb64829SBram Moolenaar        try
5103*efb64829SBram Moolenaar          Xpath 'h'
5104*efb64829SBram Moolenaar          let var4 = {NAME("F", 4)}(ARG(4711, 4), 4)
5105*efb64829SBram Moolenaar          Xpath 'i'
5106*efb64829SBram Moolenaar        catch /.*/
5107*efb64829SBram Moolenaar          call assert_report('should not get here')
5108*efb64829SBram Moolenaar        finally
5109*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5110*efb64829SBram Moolenaar          let v:errmsg = ""
5111*efb64829SBram Moolenaar          break
5112*efb64829SBram Moolenaar        endtry
5113*efb64829SBram Moolenaar      endwhile
5114*efb64829SBram Moolenaar      call assert_true(exists('var4') && var4 == 4711)
5115*efb64829SBram Moolenaar
5116*efb64829SBram Moolenaar    catch /^0$/	    " default return value
5117*efb64829SBram Moolenaar      call assert_report('should not get here')
5118*efb64829SBram Moolenaar    catch /.*/
5119*efb64829SBram Moolenaar      call assert_report('should not get here')
5120*efb64829SBram Moolenaar    finally
5121*efb64829SBram Moolenaar      call assert_equal("", v:errmsg)
5122*efb64829SBram Moolenaar      break
5123*efb64829SBram Moolenaar    endtry
5124*efb64829SBram Moolenaar  endwhile
5125*efb64829SBram Moolenaar
5126*efb64829SBram Moolenaar  call assert_equal('bAcdDBefEGCghFIai', g:Xpath)
5127*efb64829SBram Moolenaar  delfunc F
5128*efb64829SBram Moolenaarendfunc
5129*efb64829SBram Moolenaar
5130*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5131*efb64829SBram Moolenaar" Test 76:  Errors, interrupts, :throw during expression evaluation	    {{{1
5132*efb64829SBram Moolenaar"
5133*efb64829SBram Moolenaar"	    When a function call made during expression evaluation is aborted
5134*efb64829SBram Moolenaar"	    due to an error inside a :try/:endtry region or due to an interrupt
5135*efb64829SBram Moolenaar"	    or a :throw, the expression evaluation is aborted as well.	No
5136*efb64829SBram Moolenaar"	    message is displayed for the cancelled expression evaluation.  On an
5137*efb64829SBram Moolenaar"	    error not inside :try/:endtry, the expression evaluation continues.
5138*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5139*efb64829SBram Moolenaar
5140*efb64829SBram Moolenaarfunc Test_expr_eval_error()
5141*efb64829SBram Moolenaar  let test =<< trim [CODE]
5142*efb64829SBram Moolenaar    let taken = ""
5143*efb64829SBram Moolenaar
5144*efb64829SBram Moolenaar    func ERR(n)
5145*efb64829SBram Moolenaar      let g:taken = g:taken .. "E" .. a:n
5146*efb64829SBram Moolenaar      asdf
5147*efb64829SBram Moolenaar    endfunc
5148*efb64829SBram Moolenaar
5149*efb64829SBram Moolenaar    func ERRabort(n) abort
5150*efb64829SBram Moolenaar      let g:taken = g:taken .. "A" .. a:n
5151*efb64829SBram Moolenaar      asdf
5152*efb64829SBram Moolenaar    endfunc	" returns -1; may cause follow-up msg for illegal var/func name
5153*efb64829SBram Moolenaar
5154*efb64829SBram Moolenaar    func WRAP(n, arg)
5155*efb64829SBram Moolenaar      let g:taken = g:taken .. "W" .. a:n
5156*efb64829SBram Moolenaar      let g:saved_errmsg = v:errmsg
5157*efb64829SBram Moolenaar      return arg
5158*efb64829SBram Moolenaar    endfunc
5159*efb64829SBram Moolenaar
5160*efb64829SBram Moolenaar    func INT(n)
5161*efb64829SBram Moolenaar      let g:taken = g:taken .. "I" .. a:n
5162*efb64829SBram Moolenaar      call interrupt()
5163*efb64829SBram Moolenaar    endfunc
5164*efb64829SBram Moolenaar
5165*efb64829SBram Moolenaar    func THR(n)
5166*efb64829SBram Moolenaar      let g:taken = g:taken .. "T" .. a:n
5167*efb64829SBram Moolenaar      throw "should not be caught"
5168*efb64829SBram Moolenaar    endfunc
5169*efb64829SBram Moolenaar
5170*efb64829SBram Moolenaar    func CONT(n)
5171*efb64829SBram Moolenaar      let g:taken = g:taken .. "C" .. a:n
5172*efb64829SBram Moolenaar    endfunc
5173*efb64829SBram Moolenaar
5174*efb64829SBram Moolenaar    func MSG(n)
5175*efb64829SBram Moolenaar      let g:taken = g:taken .. "M" .. a:n
5176*efb64829SBram Moolenaar      let errmsg = (a:n >= 37 && a:n <= 44) ? g:saved_errmsg : v:errmsg
5177*efb64829SBram Moolenaar      let msgptn = (a:n >= 10 && a:n <= 27) ? "^$" : "asdf"
5178*efb64829SBram Moolenaar      call assert_match(msgptn, errmsg)
5179*efb64829SBram Moolenaar      let v:errmsg = ""
5180*efb64829SBram Moolenaar      let g:saved_errmsg = ""
5181*efb64829SBram Moolenaar    endfunc
5182*efb64829SBram Moolenaar
5183*efb64829SBram Moolenaar    let v:errmsg = ""
5184*efb64829SBram Moolenaar
5185*efb64829SBram Moolenaar    try
5186*efb64829SBram Moolenaar      let t = 1
5187*efb64829SBram Moolenaar      while t <= 9
5188*efb64829SBram Moolenaar        Xloop 'a'
5189*efb64829SBram Moolenaar        try
5190*efb64829SBram Moolenaar          if t == 1
5191*efb64829SBram Moolenaar            let v{ERR(t) + CONT(t)} = 0
5192*efb64829SBram Moolenaar          elseif t == 2
5193*efb64829SBram Moolenaar            let v{ERR(t) + CONT(t)}
5194*efb64829SBram Moolenaar          elseif t == 3
5195*efb64829SBram Moolenaar            let var = exists('v{ERR(t) + CONT(t)}')
5196*efb64829SBram Moolenaar          elseif t == 4
5197*efb64829SBram Moolenaar            unlet v{ERR(t) + CONT(t)}
5198*efb64829SBram Moolenaar          elseif t == 5
5199*efb64829SBram Moolenaar            function F{ERR(t) + CONT(t)}()
5200*efb64829SBram Moolenaar            endfunction
5201*efb64829SBram Moolenaar          elseif t == 6
5202*efb64829SBram Moolenaar            function F{ERR(t) + CONT(t)}
5203*efb64829SBram Moolenaar          elseif t == 7
5204*efb64829SBram Moolenaar            let var = exists('*F{ERR(t) + CONT(t)}')
5205*efb64829SBram Moolenaar          elseif t == 8
5206*efb64829SBram Moolenaar            delfunction F{ERR(t) + CONT(t)}
5207*efb64829SBram Moolenaar          elseif t == 9
5208*efb64829SBram Moolenaar            let var = ERR(t) + CONT(t)
5209*efb64829SBram Moolenaar          endif
5210*efb64829SBram Moolenaar        catch /asdf/
5211*efb64829SBram Moolenaar          " v:errmsg is not set when the error message is converted to an
5212*efb64829SBram Moolenaar          " exception.  Set it to the original error message.
5213*efb64829SBram Moolenaar          let v:errmsg = substitute(v:exception, '^Vim:', '', "")
5214*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5215*efb64829SBram Moolenaar          " An error exception has been thrown after the original error.
5216*efb64829SBram Moolenaar          let v:errmsg = ""
5217*efb64829SBram Moolenaar        finally
5218*efb64829SBram Moolenaar          call MSG(t)
5219*efb64829SBram Moolenaar          let t = t + 1
5220*efb64829SBram Moolenaar          XloopNEXT
5221*efb64829SBram Moolenaar          continue	" discard an aborting error
5222*efb64829SBram Moolenaar        endtry
5223*efb64829SBram Moolenaar      endwhile
5224*efb64829SBram Moolenaar    catch /.*/
5225*efb64829SBram Moolenaar      call assert_report('should not get here')
5226*efb64829SBram Moolenaar    endtry
5227*efb64829SBram Moolenaar
5228*efb64829SBram Moolenaar    try
5229*efb64829SBram Moolenaar      let t = 10
5230*efb64829SBram Moolenaar      while t <= 18
5231*efb64829SBram Moolenaar        Xloop 'b'
5232*efb64829SBram Moolenaar        try
5233*efb64829SBram Moolenaar          if t == 10
5234*efb64829SBram Moolenaar            let v{INT(t) + CONT(t)} = 0
5235*efb64829SBram Moolenaar          elseif t == 11
5236*efb64829SBram Moolenaar            let v{INT(t) + CONT(t)}
5237*efb64829SBram Moolenaar          elseif t == 12
5238*efb64829SBram Moolenaar            let var = exists('v{INT(t) + CONT(t)}')
5239*efb64829SBram Moolenaar          elseif t == 13
5240*efb64829SBram Moolenaar            unlet v{INT(t) + CONT(t)}
5241*efb64829SBram Moolenaar          elseif t == 14
5242*efb64829SBram Moolenaar            function F{INT(t) + CONT(t)}()
5243*efb64829SBram Moolenaar            endfunction
5244*efb64829SBram Moolenaar          elseif t == 15
5245*efb64829SBram Moolenaar            function F{INT(t) + CONT(t)}
5246*efb64829SBram Moolenaar          elseif t == 16
5247*efb64829SBram Moolenaar            let var = exists('*F{INT(t) + CONT(t)}')
5248*efb64829SBram Moolenaar          elseif t == 17
5249*efb64829SBram Moolenaar            delfunction F{INT(t) + CONT(t)}
5250*efb64829SBram Moolenaar          elseif t == 18
5251*efb64829SBram Moolenaar            let var = INT(t) + CONT(t)
5252*efb64829SBram Moolenaar          endif
5253*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:\(Interrupt\)\@!/
5254*efb64829SBram Moolenaar          " An error exception has been triggered after the interrupt.
5255*efb64829SBram Moolenaar          let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "")
5256*efb64829SBram Moolenaar        finally
5257*efb64829SBram Moolenaar          call MSG(t)
5258*efb64829SBram Moolenaar          let t = t + 1
5259*efb64829SBram Moolenaar          XloopNEXT
5260*efb64829SBram Moolenaar          continue	" discard interrupt
5261*efb64829SBram Moolenaar        endtry
5262*efb64829SBram Moolenaar      endwhile
5263*efb64829SBram Moolenaar    catch /.*/
5264*efb64829SBram Moolenaar      call assert_report('should not get here')
5265*efb64829SBram Moolenaar    endtry
5266*efb64829SBram Moolenaar
5267*efb64829SBram Moolenaar    try
5268*efb64829SBram Moolenaar      let t = 19
5269*efb64829SBram Moolenaar      while t <= 27
5270*efb64829SBram Moolenaar        Xloop 'c'
5271*efb64829SBram Moolenaar        try
5272*efb64829SBram Moolenaar          if t == 19
5273*efb64829SBram Moolenaar            let v{THR(t) + CONT(t)} = 0
5274*efb64829SBram Moolenaar          elseif t == 20
5275*efb64829SBram Moolenaar            let v{THR(t) + CONT(t)}
5276*efb64829SBram Moolenaar          elseif t == 21
5277*efb64829SBram Moolenaar            let var = exists('v{THR(t) + CONT(t)}')
5278*efb64829SBram Moolenaar          elseif t == 22
5279*efb64829SBram Moolenaar            unlet v{THR(t) + CONT(t)}
5280*efb64829SBram Moolenaar          elseif t == 23
5281*efb64829SBram Moolenaar            function F{THR(t) + CONT(t)}()
5282*efb64829SBram Moolenaar            endfunction
5283*efb64829SBram Moolenaar          elseif t == 24
5284*efb64829SBram Moolenaar            function F{THR(t) + CONT(t)}
5285*efb64829SBram Moolenaar          elseif t == 25
5286*efb64829SBram Moolenaar            let var = exists('*F{THR(t) + CONT(t)}')
5287*efb64829SBram Moolenaar          elseif t == 26
5288*efb64829SBram Moolenaar            delfunction F{THR(t) + CONT(t)}
5289*efb64829SBram Moolenaar          elseif t == 27
5290*efb64829SBram Moolenaar            let var = THR(t) + CONT(t)
5291*efb64829SBram Moolenaar          endif
5292*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5293*efb64829SBram Moolenaar          " An error exception has been triggered after the :throw.
5294*efb64829SBram Moolenaar          let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "")
5295*efb64829SBram Moolenaar        finally
5296*efb64829SBram Moolenaar          call MSG(t)
5297*efb64829SBram Moolenaar          let t = t + 1
5298*efb64829SBram Moolenaar          XloopNEXT
5299*efb64829SBram Moolenaar          continue	" discard exception
5300*efb64829SBram Moolenaar        endtry
5301*efb64829SBram Moolenaar      endwhile
5302*efb64829SBram Moolenaar    catch /.*/
5303*efb64829SBram Moolenaar      call assert_report('should not get here')
5304*efb64829SBram Moolenaar    endtry
5305*efb64829SBram Moolenaar
5306*efb64829SBram Moolenaar    let v{ERR(28) + CONT(28)} = 0
5307*efb64829SBram Moolenaar    call MSG(28)
5308*efb64829SBram Moolenaar    let v{ERR(29) + CONT(29)}
5309*efb64829SBram Moolenaar    call MSG(29)
5310*efb64829SBram Moolenaar    let var = exists('v{ERR(30) + CONT(30)}')
5311*efb64829SBram Moolenaar    call MSG(30)
5312*efb64829SBram Moolenaar    unlet v{ERR(31) + CONT(31)}
5313*efb64829SBram Moolenaar    call MSG(31)
5314*efb64829SBram Moolenaar    function F{ERR(32) + CONT(32)}()
5315*efb64829SBram Moolenaar    endfunction
5316*efb64829SBram Moolenaar    call MSG(32)
5317*efb64829SBram Moolenaar    function F{ERR(33) + CONT(33)}
5318*efb64829SBram Moolenaar    call MSG(33)
5319*efb64829SBram Moolenaar    let var = exists('*F{ERR(34) + CONT(34)}')
5320*efb64829SBram Moolenaar    call MSG(34)
5321*efb64829SBram Moolenaar    delfunction F{ERR(35) + CONT(35)}
5322*efb64829SBram Moolenaar    call MSG(35)
5323*efb64829SBram Moolenaar    let var = ERR(36) + CONT(36)
5324*efb64829SBram Moolenaar    call MSG(36)
5325*efb64829SBram Moolenaar
5326*efb64829SBram Moolenaar    let saved_errmsg = ""
5327*efb64829SBram Moolenaar
5328*efb64829SBram Moolenaar    let v{WRAP(37, ERRabort(37)) + CONT(37)} = 0
5329*efb64829SBram Moolenaar    call MSG(37)
5330*efb64829SBram Moolenaar    let v{WRAP(38, ERRabort(38)) + CONT(38)}
5331*efb64829SBram Moolenaar    call MSG(38)
5332*efb64829SBram Moolenaar    let var = exists('v{WRAP(39, ERRabort(39)) + CONT(39)}')
5333*efb64829SBram Moolenaar    call MSG(39)
5334*efb64829SBram Moolenaar    unlet v{WRAP(40, ERRabort(40)) + CONT(40)}
5335*efb64829SBram Moolenaar    call MSG(40)
5336*efb64829SBram Moolenaar    function F{WRAP(41, ERRabort(41)) + CONT(41)}()
5337*efb64829SBram Moolenaar    endfunction
5338*efb64829SBram Moolenaar    call MSG(41)
5339*efb64829SBram Moolenaar    function F{WRAP(42, ERRabort(42)) + CONT(42)}
5340*efb64829SBram Moolenaar    call MSG(42)
5341*efb64829SBram Moolenaar    let var = exists('*F{WRAP(43, ERRabort(43)) + CONT(43)}')
5342*efb64829SBram Moolenaar    call MSG(43)
5343*efb64829SBram Moolenaar    delfunction F{WRAP(44, ERRabort(44)) + CONT(44)}
5344*efb64829SBram Moolenaar    call MSG(44)
5345*efb64829SBram Moolenaar    let var = ERRabort(45) + CONT(45)
5346*efb64829SBram Moolenaar    call MSG(45)
5347*efb64829SBram Moolenaar    Xpath 'd'
5348*efb64829SBram Moolenaar
5349*efb64829SBram Moolenaar    let expected = ""
5350*efb64829SBram Moolenaar          \ .. "E1M1E2M2E3M3E4M4E5M5E6M6E7M7E8M8E9M9"
5351*efb64829SBram Moolenaar          \ .. "I10M10I11M11I12M12I13M13I14M14I15M15I16M16I17M17I18M18"
5352*efb64829SBram Moolenaar          \ .. "T19M19T20M20T21M21T22M22T23M23T24M24T25M25T26M26T27M27"
5353*efb64829SBram Moolenaar          \ .. "E28C28M28E29C29M29E30C30M30E31C31M31E32C32M32E33C33M33"
5354*efb64829SBram Moolenaar          \ .. "E34C34M34E35C35M35E36C36M36"
5355*efb64829SBram Moolenaar          \ .. "A37W37C37M37A38W38C38M38A39W39C39M39A40W40C40M40A41W41C41M41"
5356*efb64829SBram Moolenaar          \ .. "A42W42C42M42A43W43C43M43A44W44C44M44A45C45M45"
5357*efb64829SBram Moolenaar    call assert_equal(expected, taken)
5358*efb64829SBram Moolenaar  [CODE]
5359*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5360*efb64829SBram Moolenaar    let expected = "a1a2a3a4a5a6a7a8a9"
5361*efb64829SBram Moolenaar                      \ .. "b10b11b12b13b14b15b16b17b18"
5362*efb64829SBram Moolenaar                      \ .. "c19c20c21c22c23c24c25c26c27d"
5363*efb64829SBram Moolenaar    call assert_equal(expected, g:Xpath)
5364*efb64829SBram Moolenaar  [CODE]
5365*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5366*efb64829SBram Moolenaarendfunc
5367*efb64829SBram Moolenaar
5368*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5369*efb64829SBram Moolenaar" Test 77:  Errors, interrupts, :throw in name{brace-expression}	    {{{1
5370*efb64829SBram Moolenaar"
5371*efb64829SBram Moolenaar"	    When a function call made during evaluation of an expression in
5372*efb64829SBram Moolenaar"	    braces as part of a function name after ":function" is aborted due
5373*efb64829SBram Moolenaar"	    to an error inside a :try/:endtry region or due to an interrupt or
5374*efb64829SBram Moolenaar"	    a :throw, the expression evaluation is aborted as well, and the
5375*efb64829SBram Moolenaar"	    function definition is ignored, skipping all commands to the
5376*efb64829SBram Moolenaar"	    ":endfunction".  On an error not inside :try/:endtry, the expression
5377*efb64829SBram Moolenaar"	    evaluation continues and the function gets defined, and can be
5378*efb64829SBram Moolenaar"	    called and deleted.
5379*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5380*efb64829SBram Moolenaarfunc Test_brace_expr_error()
5381*efb64829SBram Moolenaar  let test =<< trim [CODE]
5382*efb64829SBram Moolenaar    func ERR() abort
5383*efb64829SBram Moolenaar      Xloop 'a'
5384*efb64829SBram Moolenaar      asdf
5385*efb64829SBram Moolenaar    endfunc					" returns -1
5386*efb64829SBram Moolenaar
5387*efb64829SBram Moolenaar    func OK()
5388*efb64829SBram Moolenaar      Xloop 'b'
5389*efb64829SBram Moolenaar      let v:errmsg = ""
5390*efb64829SBram Moolenaar      return 0
5391*efb64829SBram Moolenaar    endfunc
5392*efb64829SBram Moolenaar
5393*efb64829SBram Moolenaar    let v:errmsg = ""
5394*efb64829SBram Moolenaar
5395*efb64829SBram Moolenaar    Xpath 'c'
5396*efb64829SBram Moolenaar    func F{1 + ERR() + OK()}(arg)
5397*efb64829SBram Moolenaar      " F0 should be defined.
5398*efb64829SBram Moolenaar      if exists("a:arg") && a:arg == "calling"
5399*efb64829SBram Moolenaar        Xpath 'd'
5400*efb64829SBram Moolenaar      else
5401*efb64829SBram Moolenaar        call assert_report('should not get here')
5402*efb64829SBram Moolenaar      endif
5403*efb64829SBram Moolenaar    endfunction
5404*efb64829SBram Moolenaar    call assert_equal("", v:errmsg)
5405*efb64829SBram Moolenaar    XloopNEXT
5406*efb64829SBram Moolenaar
5407*efb64829SBram Moolenaar    Xpath 'e'
5408*efb64829SBram Moolenaar    call F{1 + ERR() + OK()}("calling")
5409*efb64829SBram Moolenaar    call assert_equal("", v:errmsg)
5410*efb64829SBram Moolenaar    XloopNEXT
5411*efb64829SBram Moolenaar
5412*efb64829SBram Moolenaar    Xpath 'f'
5413*efb64829SBram Moolenaar    delfunction F{1 + ERR() + OK()}
5414*efb64829SBram Moolenaar    call assert_equal("", v:errmsg)
5415*efb64829SBram Moolenaar    XloopNEXT
5416*efb64829SBram Moolenaar
5417*efb64829SBram Moolenaar    try
5418*efb64829SBram Moolenaar      while 1
5419*efb64829SBram Moolenaar        try
5420*efb64829SBram Moolenaar          Xpath 'g'
5421*efb64829SBram Moolenaar          func G{1 + ERR() + OK()}(arg)
5422*efb64829SBram Moolenaar            " G0 should not be defined, and the function body should be
5423*efb64829SBram Moolenaar            " skipped.
5424*efb64829SBram Moolenaar            call assert_report('should not get here')
5425*efb64829SBram Moolenaar            " Use an unmatched ":finally" to check whether the body is
5426*efb64829SBram Moolenaar            " skipped when an error occurs in ERR().  This works whether or
5427*efb64829SBram Moolenaar            " not the exception is converted to an exception.
5428*efb64829SBram Moolenaar            finally
5429*efb64829SBram Moolenaar              call assert_report('should not get here')
5430*efb64829SBram Moolenaar            endtry
5431*efb64829SBram Moolenaar          try
5432*efb64829SBram Moolenaar            call assert_report('should not get here')
5433*efb64829SBram Moolenaar          endfunction
5434*efb64829SBram Moolenaar
5435*efb64829SBram Moolenaar          call assert_report('should not get here')
5436*efb64829SBram Moolenaar        catch /asdf/
5437*efb64829SBram Moolenaar          " Jumped to when the function is not defined and the body is
5438*efb64829SBram Moolenaar          " skipped.
5439*efb64829SBram Moolenaar          Xpath 'h'
5440*efb64829SBram Moolenaar        catch /.*/
5441*efb64829SBram Moolenaar          call assert_report('should not get here')
5442*efb64829SBram Moolenaar        finally
5443*efb64829SBram Moolenaar          Xpath 'i'
5444*efb64829SBram Moolenaar          break
5445*efb64829SBram Moolenaar        endtry			" jumped to when the body is not skipped
5446*efb64829SBram Moolenaar      endwhile
5447*efb64829SBram Moolenaar    catch /.*/
5448*efb64829SBram Moolenaar      call assert_report('should not get here')
5449*efb64829SBram Moolenaar    endtry
5450*efb64829SBram Moolenaar  [CODE]
5451*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5452*efb64829SBram Moolenaar    call assert_equal('ca1b1ea2b2dfa3b3ga4hi', g:Xpath)
5453*efb64829SBram Moolenaar  [CODE]
5454*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5455*efb64829SBram Moolenaarendfunc
5456*efb64829SBram Moolenaar
5457*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5458*efb64829SBram Moolenaar" Test 78:  Messages on parsing errors in expression evaluation		    {{{1
5459*efb64829SBram Moolenaar"
5460*efb64829SBram Moolenaar"	    When an expression evaluation detects a parsing error, an error
5461*efb64829SBram Moolenaar"	    message is given and converted to an exception, and the expression
5462*efb64829SBram Moolenaar"	    evaluation is aborted.
5463*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5464*efb64829SBram Moolenaarfunc Test_expr_eval_error_msg()
5465*efb64829SBram Moolenaar  CheckEnglish
5466*efb64829SBram Moolenaar
5467*efb64829SBram Moolenaar  let test =<< trim [CODE]
5468*efb64829SBram Moolenaar    let taken = ""
5469*efb64829SBram Moolenaar
5470*efb64829SBram Moolenaar    func F(n)
5471*efb64829SBram Moolenaar      let g:taken = g:taken . "F" . a:n
5472*efb64829SBram Moolenaar    endfunc
5473*efb64829SBram Moolenaar
5474*efb64829SBram Moolenaar    func MSG(n, enr, emsg)
5475*efb64829SBram Moolenaar      let g:taken = g:taken . "M" . a:n
5476*efb64829SBram Moolenaar      call assert_match('^' .. a:enr .. ':', v:errmsg)
5477*efb64829SBram Moolenaar      call assert_match(a:emsg, v:errmsg)
5478*efb64829SBram Moolenaar    endfunc
5479*efb64829SBram Moolenaar
5480*efb64829SBram Moolenaar    func CONT(n)
5481*efb64829SBram Moolenaar      let g:taken = g:taken . "C" . a:n
5482*efb64829SBram Moolenaar    endfunc
5483*efb64829SBram Moolenaar
5484*efb64829SBram Moolenaar    let v:errmsg = ""
5485*efb64829SBram Moolenaar    try
5486*efb64829SBram Moolenaar      let t = 1
5487*efb64829SBram Moolenaar      while t <= 14
5488*efb64829SBram Moolenaar        let g:taken = g:taken . "T" . t
5489*efb64829SBram Moolenaar        let v:errmsg = ""
5490*efb64829SBram Moolenaar        try
5491*efb64829SBram Moolenaar          if t == 1
5492*efb64829SBram Moolenaar            let v{novar + CONT(t)} = 0
5493*efb64829SBram Moolenaar          elseif t == 2
5494*efb64829SBram Moolenaar            let v{novar + CONT(t)}
5495*efb64829SBram Moolenaar          elseif t == 3
5496*efb64829SBram Moolenaar            let var = exists('v{novar + CONT(t)}')
5497*efb64829SBram Moolenaar          elseif t == 4
5498*efb64829SBram Moolenaar            unlet v{novar + CONT(t)}
5499*efb64829SBram Moolenaar          elseif t == 5
5500*efb64829SBram Moolenaar            function F{novar + CONT(t)}()
5501*efb64829SBram Moolenaar            endfunction
5502*efb64829SBram Moolenaar          elseif t == 6
5503*efb64829SBram Moolenaar            function F{novar + CONT(t)}
5504*efb64829SBram Moolenaar          elseif t == 7
5505*efb64829SBram Moolenaar            let var = exists('*F{novar + CONT(t)}')
5506*efb64829SBram Moolenaar          elseif t == 8
5507*efb64829SBram Moolenaar            delfunction F{novar + CONT(t)}
5508*efb64829SBram Moolenaar          elseif t == 9
5509*efb64829SBram Moolenaar            echo novar + CONT(t)
5510*efb64829SBram Moolenaar          elseif t == 10
5511*efb64829SBram Moolenaar            echo v{novar + CONT(t)}
5512*efb64829SBram Moolenaar          elseif t == 11
5513*efb64829SBram Moolenaar            echo F{novar + CONT(t)}
5514*efb64829SBram Moolenaar          elseif t == 12
5515*efb64829SBram Moolenaar            let var = novar + CONT(t)
5516*efb64829SBram Moolenaar          elseif t == 13
5517*efb64829SBram Moolenaar            let var = v{novar + CONT(t)}
5518*efb64829SBram Moolenaar          elseif t == 14
5519*efb64829SBram Moolenaar            let var = F{novar + CONT(t)}()
5520*efb64829SBram Moolenaar          endif
5521*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5522*efb64829SBram Moolenaar          Xloop 'a'
5523*efb64829SBram Moolenaar          " v:errmsg is not set when the error message is converted to an
5524*efb64829SBram Moolenaar          " exception.  Set it to the original error message.
5525*efb64829SBram Moolenaar          let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "")
5526*efb64829SBram Moolenaar        finally
5527*efb64829SBram Moolenaar          Xloop 'b'
5528*efb64829SBram Moolenaar          if t <= 8 && t != 3 && t != 7
5529*efb64829SBram Moolenaar            call MSG(t, 'E475', 'Invalid argument\>')
5530*efb64829SBram Moolenaar          else
5531*efb64829SBram Moolenaar            call MSG(t, 'E121', "Undefined variable")
5532*efb64829SBram Moolenaar          endif
5533*efb64829SBram Moolenaar          let t = t + 1
5534*efb64829SBram Moolenaar          XloopNEXT
5535*efb64829SBram Moolenaar          continue	" discard an aborting error
5536*efb64829SBram Moolenaar        endtry
5537*efb64829SBram Moolenaar      endwhile
5538*efb64829SBram Moolenaar    catch /.*/
5539*efb64829SBram Moolenaar      call assert_report('should not get here')
5540*efb64829SBram Moolenaar    endtry
5541*efb64829SBram Moolenaar
5542*efb64829SBram Moolenaar    func T(n, expr, enr, emsg)
5543*efb64829SBram Moolenaar      try
5544*efb64829SBram Moolenaar        let g:taken = g:taken . "T" . a:n
5545*efb64829SBram Moolenaar        let v:errmsg = ""
5546*efb64829SBram Moolenaar        try
5547*efb64829SBram Moolenaar          execute "let var = " . a:expr
5548*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5549*efb64829SBram Moolenaar          Xloop 'c'
5550*efb64829SBram Moolenaar          " v:errmsg is not set when the error message is converted to an
5551*efb64829SBram Moolenaar          " exception.  Set it to the original error message.
5552*efb64829SBram Moolenaar          let v:errmsg = substitute(v:exception, '^Vim\((\a\+)\)\=:', '', "")
5553*efb64829SBram Moolenaar        finally
5554*efb64829SBram Moolenaar          Xloop 'd'
5555*efb64829SBram Moolenaar          call MSG(a:n, a:enr, a:emsg)
5556*efb64829SBram Moolenaar          XloopNEXT
5557*efb64829SBram Moolenaar          " Discard an aborting error:
5558*efb64829SBram Moolenaar          return
5559*efb64829SBram Moolenaar        endtry
5560*efb64829SBram Moolenaar      catch /.*/
5561*efb64829SBram Moolenaar        call assert_report('should not get here')
5562*efb64829SBram Moolenaar      endtry
5563*efb64829SBram Moolenaar    endfunc
5564*efb64829SBram Moolenaar
5565*efb64829SBram Moolenaar    call T(15, 'Nofunc() + CONT(15)',	'E117',	"Unknown function")
5566*efb64829SBram Moolenaar    call T(16, 'F(1 2 + CONT(16))',	'E116',	"Invalid arguments")
5567*efb64829SBram Moolenaar    call T(17, 'F(1, 2) + CONT(17)',	'E118',	"Too many arguments")
5568*efb64829SBram Moolenaar    call T(18, 'F() + CONT(18)',	'E119',	"Not enough arguments")
5569*efb64829SBram Moolenaar    call T(19, '{(1} + CONT(19)',	'E110',	"Missing ')'")
5570*efb64829SBram Moolenaar    call T(20, '("abc"[1) + CONT(20)',	'E111',	"Missing ']'")
5571*efb64829SBram Moolenaar    call T(21, '(1 +) + CONT(21)',	'E15',	"Invalid expression")
5572*efb64829SBram Moolenaar    call T(22, '1 2 + CONT(22)',	'E15',	"Invalid expression")
5573*efb64829SBram Moolenaar    call T(23, '(1 ? 2) + CONT(23)',	'E109',	"Missing ':' after '?'")
5574*efb64829SBram Moolenaar    call T(24, '("abc) + CONT(24)',	'E114',	"Missing quote")
5575*efb64829SBram Moolenaar    call T(25, "('abc) + CONT(25)",	'E115',	"Missing quote")
5576*efb64829SBram Moolenaar    call T(26, '& + CONT(26)',		'E112', "Option name missing")
5577*efb64829SBram Moolenaar    call T(27, '&asdf + CONT(27)',	'E113', "Unknown option")
5578*efb64829SBram Moolenaar
5579*efb64829SBram Moolenaar    let expected = ""
5580*efb64829SBram Moolenaar      \ .. "T1M1T2M2T3M3T4M4T5M5T6M6T7M7T8M8T9M9T10M10T11M11T12M12T13M13T14M14"
5581*efb64829SBram Moolenaar      \ .. "T15M15T16M16T17M17T18M18T19M19T20M20T21M21T22M22T23M23T24M24T25M25"
5582*efb64829SBram Moolenaar      \ .. "T26M26T27M27"
5583*efb64829SBram Moolenaar
5584*efb64829SBram Moolenaar    call assert_equal(expected, taken)
5585*efb64829SBram Moolenaar  [CODE]
5586*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5587*efb64829SBram Moolenaar    let expected = "a1b1a2b2a3b3a4b4a5b5a6b6a7b7a8b8a9b9a10b10a11b11a12b12"
5588*efb64829SBram Moolenaar                  \ .. "a13b13a14b14c15d15c16d16c17d17c18d18c19d19c20d20"
5589*efb64829SBram Moolenaar                  \ .. "c21d21c22d22c23d23c24d24c25d25c26d26c27d27"
5590*efb64829SBram Moolenaar    call assert_equal(expected, g:Xpath)
5591*efb64829SBram Moolenaar  [CODE]
5592*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5593*efb64829SBram Moolenaarendfunc
5594*efb64829SBram Moolenaar
5595*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5596*efb64829SBram Moolenaar" Test 79:  Throwing one of several errors for the same command		    {{{1
5597*efb64829SBram Moolenaar"
5598*efb64829SBram Moolenaar"	    When several errors appear in a row (for instance during expression
5599*efb64829SBram Moolenaar"	    evaluation), the first as the most specific one is used when
5600*efb64829SBram Moolenaar"	    throwing an error exception.  If, however, a syntax error is
5601*efb64829SBram Moolenaar"	    detected afterwards, this one is used for the error exception.
5602*efb64829SBram Moolenaar"	    On a syntax error, the next command is not executed, on a normal
5603*efb64829SBram Moolenaar"	    error, however, it is (relevant only in a function without the
5604*efb64829SBram Moolenaar"	    "abort" flag).  v:errmsg is not set.
5605*efb64829SBram Moolenaar"
5606*efb64829SBram Moolenaar"	    If throwing error exceptions is configured off, v:errmsg is always
5607*efb64829SBram Moolenaar"	    set to the latest error message, that is, to the more general
5608*efb64829SBram Moolenaar"	    message or the syntax error, respectively.
5609*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5610*efb64829SBram Moolenaarfunc Test_throw_multi_error()
5611*efb64829SBram Moolenaar  CheckEnglish
5612*efb64829SBram Moolenaar
5613*efb64829SBram Moolenaar  let test =<< trim [CODE]
5614*efb64829SBram Moolenaar    func NEXT(cmd)
5615*efb64829SBram Moolenaar      exec a:cmd . " | Xloop 'a'"
5616*efb64829SBram Moolenaar    endfun
5617*efb64829SBram Moolenaar
5618*efb64829SBram Moolenaar    call NEXT('echo novar')			" (checks nextcmd)
5619*efb64829SBram Moolenaar    XloopNEXT
5620*efb64829SBram Moolenaar    call NEXT('let novar #')			" (skips nextcmd)
5621*efb64829SBram Moolenaar    XloopNEXT
5622*efb64829SBram Moolenaar    call NEXT('unlet novar #')			" (skips nextcmd)
5623*efb64829SBram Moolenaar    XloopNEXT
5624*efb64829SBram Moolenaar    call NEXT('let {novar}')			" (skips nextcmd)
5625*efb64829SBram Moolenaar    XloopNEXT
5626*efb64829SBram Moolenaar    call NEXT('unlet{ novar}')			" (skips nextcmd)
5627*efb64829SBram Moolenaar
5628*efb64829SBram Moolenaar    call assert_equal('a1', g:Xpath)
5629*efb64829SBram Moolenaar    XpathINIT
5630*efb64829SBram Moolenaar    XloopINIT
5631*efb64829SBram Moolenaar
5632*efb64829SBram Moolenaar    func EXEC(cmd)
5633*efb64829SBram Moolenaar      exec a:cmd
5634*efb64829SBram Moolenaar    endfunc
5635*efb64829SBram Moolenaar
5636*efb64829SBram Moolenaar    try
5637*efb64829SBram Moolenaar      while 1				" dummy loop
5638*efb64829SBram Moolenaar        try
5639*efb64829SBram Moolenaar          let v:errmsg = ""
5640*efb64829SBram Moolenaar          call EXEC('echo novar')	" normal error
5641*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5642*efb64829SBram Moolenaar          Xpath 'b'
5643*efb64829SBram Moolenaar          call assert_match('E121: Undefined variable: novar', v:exception)
5644*efb64829SBram Moolenaar        finally
5645*efb64829SBram Moolenaar          Xpath 'c'
5646*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5647*efb64829SBram Moolenaar          break
5648*efb64829SBram Moolenaar        endtry
5649*efb64829SBram Moolenaar      endwhile
5650*efb64829SBram Moolenaar
5651*efb64829SBram Moolenaar      Xpath 'd'
5652*efb64829SBram Moolenaar      let cmd = "let"
5653*efb64829SBram Moolenaar      while cmd != ""
5654*efb64829SBram Moolenaar        try
5655*efb64829SBram Moolenaar          let v:errmsg = ""
5656*efb64829SBram Moolenaar          call EXEC(cmd . ' novar #')		" normal plus syntax error
5657*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5658*efb64829SBram Moolenaar          Xloop 'e'
5659*efb64829SBram Moolenaar          call assert_match('E488: Trailing characters', v:exception)
5660*efb64829SBram Moolenaar        finally
5661*efb64829SBram Moolenaar          Xloop 'f'
5662*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5663*efb64829SBram Moolenaar          if cmd == "let"
5664*efb64829SBram Moolenaar            let cmd = "unlet"
5665*efb64829SBram Moolenaar          else
5666*efb64829SBram Moolenaar            let cmd = ""
5667*efb64829SBram Moolenaar          endif
5668*efb64829SBram Moolenaar          XloopNEXT
5669*efb64829SBram Moolenaar          continue
5670*efb64829SBram Moolenaar        endtry
5671*efb64829SBram Moolenaar      endwhile
5672*efb64829SBram Moolenaar
5673*efb64829SBram Moolenaar      Xpath 'g'
5674*efb64829SBram Moolenaar      let cmd = "let"
5675*efb64829SBram Moolenaar      while cmd != ""
5676*efb64829SBram Moolenaar        try
5677*efb64829SBram Moolenaar          let v:errmsg = ""
5678*efb64829SBram Moolenaar          call EXEC(cmd . ' {novar}')		" normal plus syntax error
5679*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5680*efb64829SBram Moolenaar          Xloop 'h'
5681*efb64829SBram Moolenaar          call assert_match('E475: Invalid argument: {novar}', v:exception)
5682*efb64829SBram Moolenaar        finally
5683*efb64829SBram Moolenaar          Xloop 'i'
5684*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5685*efb64829SBram Moolenaar          if cmd == "let"
5686*efb64829SBram Moolenaar            let cmd = "unlet"
5687*efb64829SBram Moolenaar          else
5688*efb64829SBram Moolenaar            let cmd = ""
5689*efb64829SBram Moolenaar          endif
5690*efb64829SBram Moolenaar          XloopNEXT
5691*efb64829SBram Moolenaar          continue
5692*efb64829SBram Moolenaar        endtry
5693*efb64829SBram Moolenaar      endwhile
5694*efb64829SBram Moolenaar    catch /.*/
5695*efb64829SBram Moolenaar      call assert_report('should not get here')
5696*efb64829SBram Moolenaar    endtry
5697*efb64829SBram Moolenaar    Xpath 'j'
5698*efb64829SBram Moolenaar  [CODE]
5699*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5700*efb64829SBram Moolenaar    call assert_equal('bcde1f1e2f2gh3i3h4i4j', g:Xpath)
5701*efb64829SBram Moolenaar  [CODE]
5702*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5703*efb64829SBram Moolenaarendfunc
5704*efb64829SBram Moolenaar
5705*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5706*efb64829SBram Moolenaar" Test 80:  Syntax error in expression for illegal :elseif		    {{{1
5707*efb64829SBram Moolenaar"
5708*efb64829SBram Moolenaar"	    If there is a syntax error in the expression after an illegal
5709*efb64829SBram Moolenaar"	    :elseif, an error message is given (or an error exception thrown)
5710*efb64829SBram Moolenaar"	    for the illegal :elseif rather than the expression error.
5711*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5712*efb64829SBram Moolenaarfunc Test_if_syntax_error()
5713*efb64829SBram Moolenaar  CheckEnglish
5714*efb64829SBram Moolenaar
5715*efb64829SBram Moolenaar  let test =<< trim [CODE]
5716*efb64829SBram Moolenaar    let v:errmsg = ""
5717*efb64829SBram Moolenaar    if 0
5718*efb64829SBram Moolenaar    else
5719*efb64829SBram Moolenaar    elseif 1 ||| 2
5720*efb64829SBram Moolenaar    endif
5721*efb64829SBram Moolenaar    Xpath 'a'
5722*efb64829SBram Moolenaar    call assert_match('E584: :elseif after :else', v:errmsg)
5723*efb64829SBram Moolenaar
5724*efb64829SBram Moolenaar    let v:errmsg = ""
5725*efb64829SBram Moolenaar    if 1
5726*efb64829SBram Moolenaar    else
5727*efb64829SBram Moolenaar    elseif 1 ||| 2
5728*efb64829SBram Moolenaar    endif
5729*efb64829SBram Moolenaar    Xpath 'b'
5730*efb64829SBram Moolenaar    call assert_match('E584: :elseif after :else', v:errmsg)
5731*efb64829SBram Moolenaar
5732*efb64829SBram Moolenaar    let v:errmsg = ""
5733*efb64829SBram Moolenaar    elseif 1 ||| 2
5734*efb64829SBram Moolenaar    Xpath 'c'
5735*efb64829SBram Moolenaar    call assert_match('E582: :elseif without :if', v:errmsg)
5736*efb64829SBram Moolenaar
5737*efb64829SBram Moolenaar    let v:errmsg = ""
5738*efb64829SBram Moolenaar    while 1
5739*efb64829SBram Moolenaar      elseif 1 ||| 2
5740*efb64829SBram Moolenaar    endwhile
5741*efb64829SBram Moolenaar    Xpath 'd'
5742*efb64829SBram Moolenaar    call assert_match('E582: :elseif without :if', v:errmsg)
5743*efb64829SBram Moolenaar
5744*efb64829SBram Moolenaar    while 1
5745*efb64829SBram Moolenaar      try
5746*efb64829SBram Moolenaar        try
5747*efb64829SBram Moolenaar          let v:errmsg = ""
5748*efb64829SBram Moolenaar          if 0
5749*efb64829SBram Moolenaar          else
5750*efb64829SBram Moolenaar          elseif 1 ||| 2
5751*efb64829SBram Moolenaar          endif
5752*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5753*efb64829SBram Moolenaar          Xpath 'e'
5754*efb64829SBram Moolenaar          call assert_match('E584: :elseif after :else', v:exception)
5755*efb64829SBram Moolenaar        finally
5756*efb64829SBram Moolenaar          Xpath 'f'
5757*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5758*efb64829SBram Moolenaar        endtry
5759*efb64829SBram Moolenaar      catch /.*/
5760*efb64829SBram Moolenaar      call assert_report('should not get here')
5761*efb64829SBram Moolenaar      finally
5762*efb64829SBram Moolenaar        Xpath 'g'
5763*efb64829SBram Moolenaar        break
5764*efb64829SBram Moolenaar      endtry
5765*efb64829SBram Moolenaar    endwhile
5766*efb64829SBram Moolenaar
5767*efb64829SBram Moolenaar    while 1
5768*efb64829SBram Moolenaar      try
5769*efb64829SBram Moolenaar        try
5770*efb64829SBram Moolenaar          let v:errmsg = ""
5771*efb64829SBram Moolenaar          if 1
5772*efb64829SBram Moolenaar          else
5773*efb64829SBram Moolenaar          elseif 1 ||| 2
5774*efb64829SBram Moolenaar          endif
5775*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5776*efb64829SBram Moolenaar          Xpath 'h'
5777*efb64829SBram Moolenaar          call assert_match('E584: :elseif after :else', v:exception)
5778*efb64829SBram Moolenaar        finally
5779*efb64829SBram Moolenaar          Xpath 'i'
5780*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5781*efb64829SBram Moolenaar        endtry
5782*efb64829SBram Moolenaar      catch /.*/
5783*efb64829SBram Moolenaar        call assert_report('should not get here')
5784*efb64829SBram Moolenaar      finally
5785*efb64829SBram Moolenaar        Xpath 'j'
5786*efb64829SBram Moolenaar        break
5787*efb64829SBram Moolenaar      endtry
5788*efb64829SBram Moolenaar    endwhile
5789*efb64829SBram Moolenaar
5790*efb64829SBram Moolenaar    while 1
5791*efb64829SBram Moolenaar      try
5792*efb64829SBram Moolenaar        try
5793*efb64829SBram Moolenaar          let v:errmsg = ""
5794*efb64829SBram Moolenaar          elseif 1 ||| 2
5795*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5796*efb64829SBram Moolenaar          Xpath 'k'
5797*efb64829SBram Moolenaar          call assert_match('E582: :elseif without :if', v:exception)
5798*efb64829SBram Moolenaar        finally
5799*efb64829SBram Moolenaar          Xpath 'l'
5800*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5801*efb64829SBram Moolenaar        endtry
5802*efb64829SBram Moolenaar      catch /.*/
5803*efb64829SBram Moolenaar        call assert_report('should not get here')
5804*efb64829SBram Moolenaar      finally
5805*efb64829SBram Moolenaar        Xpath 'm'
5806*efb64829SBram Moolenaar        break
5807*efb64829SBram Moolenaar      endtry
5808*efb64829SBram Moolenaar    endwhile
5809*efb64829SBram Moolenaar
5810*efb64829SBram Moolenaar    while 1
5811*efb64829SBram Moolenaar      try
5812*efb64829SBram Moolenaar        try
5813*efb64829SBram Moolenaar          let v:errmsg = ""
5814*efb64829SBram Moolenaar          while 1
5815*efb64829SBram Moolenaar              elseif 1 ||| 2
5816*efb64829SBram Moolenaar          endwhile
5817*efb64829SBram Moolenaar        catch /^Vim\((\a\+)\)\=:/
5818*efb64829SBram Moolenaar          Xpath 'n'
5819*efb64829SBram Moolenaar          call assert_match('E582: :elseif without :if', v:exception)
5820*efb64829SBram Moolenaar        finally
5821*efb64829SBram Moolenaar          Xpath 'o'
5822*efb64829SBram Moolenaar          call assert_equal("", v:errmsg)
5823*efb64829SBram Moolenaar        endtry
5824*efb64829SBram Moolenaar      catch /.*/
5825*efb64829SBram Moolenaar        call assert_report('should not get here')
5826*efb64829SBram Moolenaar      finally
5827*efb64829SBram Moolenaar        Xpath 'p'
5828*efb64829SBram Moolenaar        break
5829*efb64829SBram Moolenaar      endtry
5830*efb64829SBram Moolenaar    endwhile
5831*efb64829SBram Moolenaar    Xpath 'q'
5832*efb64829SBram Moolenaar  [CODE]
5833*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5834*efb64829SBram Moolenaar    call assert_equal('abcdefghijklmnopq', g:Xpath)
5835*efb64829SBram Moolenaar  [CODE]
5836*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5837*efb64829SBram Moolenaarendfunc
5838*efb64829SBram Moolenaar
5839*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5840*efb64829SBram Moolenaar" Test 81:  Discarding exceptions after an error or interrupt		    {{{1
5841*efb64829SBram Moolenaar"
5842*efb64829SBram Moolenaar"	    When an exception is thrown from inside a :try conditional without
5843*efb64829SBram Moolenaar"	    :catch and :finally clauses and an error or interrupt occurs before
5844*efb64829SBram Moolenaar"	    the :endtry is reached, the exception is discarded.
5845*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
5846*efb64829SBram Moolenaar
5847*efb64829SBram Moolenaarfunc Test_discard_exception_after_error_1()
5848*efb64829SBram Moolenaar  let test =<< trim [CODE]
5849*efb64829SBram Moolenaar    try
5850*efb64829SBram Moolenaar      Xpath 'a'
5851*efb64829SBram Moolenaar      try
5852*efb64829SBram Moolenaar        Xpath 'b'
5853*efb64829SBram Moolenaar        throw "arrgh"
5854*efb64829SBram Moolenaar        call assert_report('should not get here')
5855*efb64829SBram Moolenaar        if 1
5856*efb64829SBram Moolenaar        call assert_report('should not get here')
5857*efb64829SBram Moolenaar        " error after :throw: missing :endif
5858*efb64829SBram Moolenaar      endtry
5859*efb64829SBram Moolenaar      call assert_report('should not get here')
5860*efb64829SBram Moolenaar    catch /arrgh/
5861*efb64829SBram Moolenaar      call assert_report('should not get here')
5862*efb64829SBram Moolenaar    endtry
5863*efb64829SBram Moolenaar    call assert_report('should not get here')
5864*efb64829SBram Moolenaar  [CODE]
5865*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5866*efb64829SBram Moolenaar    call assert_equal('ab', g:Xpath)
5867*efb64829SBram Moolenaar  [CODE]
5868*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5869*efb64829SBram Moolenaarendfunc
5870*efb64829SBram Moolenaar
5871*efb64829SBram Moolenaar" TODO: Not able inject an interrupt after throwing an exception
5872*efb64829SBram Moolenaarfunc Disable_Test_discard_exception_after_error_2()
5873*efb64829SBram Moolenaar  let test =<< trim [CODE]
5874*efb64829SBram Moolenaar    try
5875*efb64829SBram Moolenaar      Xpath 'a'
5876*efb64829SBram Moolenaar      try
5877*efb64829SBram Moolenaar        Xpath 'b'
5878*efb64829SBram Moolenaar        throw "arrgh"
5879*efb64829SBram Moolenaar        call interrupt()    " FIXME: throw is not interrupted here
5880*efb64829SBram Moolenaar        call assert_report('should not get here')
5881*efb64829SBram Moolenaar      endtry
5882*efb64829SBram Moolenaar      call assert_report('should not get here')
5883*efb64829SBram Moolenaar    catch /arrgh/
5884*efb64829SBram Moolenaar      call assert_report('should not get here')
5885*efb64829SBram Moolenaar    endtry
5886*efb64829SBram Moolenaar    call assert_report('should not get here')
5887*efb64829SBram Moolenaar  [CODE]
5888*efb64829SBram Moolenaar  let verify =<< trim [CODE]
5889*efb64829SBram Moolenaar    call assert_equal('ab', g:Xpath)
5890*efb64829SBram Moolenaar  [CODE]
5891*efb64829SBram Moolenaar  call RunInNewVim(test, verify)
5892*efb64829SBram Moolenaarendfunc
5893*efb64829SBram Moolenaar
5894*efb64829SBram Moolenaar"-------------------------------------------------------------------------------
58951f068233SBram Moolenaar" Test 87   using (expr) ? funcref : funcref				    {{{1
58961f068233SBram Moolenaar"
58971f068233SBram Moolenaar"	    Vim needs to correctly parse the funcref and even when it does
58981f068233SBram Moolenaar"	    not execute the funcref, it needs to consume the trailing ()
58991f068233SBram Moolenaar"-------------------------------------------------------------------------------
59001f068233SBram Moolenaar
59011f068233SBram Moolenaarfunc Add2(x1, x2)
59021f068233SBram Moolenaar  return a:x1 + a:x2
59031f068233SBram Moolenaarendfu
59041f068233SBram Moolenaar
59051f068233SBram Moolenaarfunc GetStr()
59061f068233SBram Moolenaar  return "abcdefghijklmnopqrstuvwxyp"
59071f068233SBram Moolenaarendfu
59081f068233SBram Moolenaar
59091f068233SBram Moolenaarfunc Test_funcref_with_condexpr()
59101f068233SBram Moolenaar  call assert_equal(5, function('Add2')(2,3))
59111f068233SBram Moolenaar
59121f068233SBram Moolenaar  call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3))
59131f068233SBram Moolenaar  call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3))
59141f068233SBram Moolenaar  " Make sure, GetStr() still works.
59151f068233SBram Moolenaar  call assert_equal('abcdefghijk', GetStr()[0:10])
59161f068233SBram Moolenaarendfunc
59171f068233SBram Moolenaar
5918b544f3c8SBram Moolenaar" Test 90:  Recognizing {} in variable name.			    {{{1
5919b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
5920b544f3c8SBram Moolenaar
5921b544f3c8SBram Moolenaarfunc Test_curlies()
5922b544f3c8SBram Moolenaar    let s:var = 66
5923b544f3c8SBram Moolenaar    let ns = 's'
5924b544f3c8SBram Moolenaar    call assert_equal(66, {ns}:var)
5925b544f3c8SBram Moolenaar
5926b544f3c8SBram Moolenaar    let g:a = {}
5927b544f3c8SBram Moolenaar    let g:b = 't'
5928b544f3c8SBram Moolenaar    let g:a[g:b] = 77
5929b544f3c8SBram Moolenaar    call assert_equal(77, g:a['t'])
5930b544f3c8SBram Moolenaarendfunc
5931b544f3c8SBram Moolenaar
5932b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
5933b544f3c8SBram Moolenaar" Test 91:  using type().					    {{{1
5934b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
5935b544f3c8SBram Moolenaar
5936b544f3c8SBram Moolenaarfunc Test_type()
5937b544f3c8SBram Moolenaar    call assert_equal(0, type(0))
5938b544f3c8SBram Moolenaar    call assert_equal(1, type(""))
5939b544f3c8SBram Moolenaar    call assert_equal(2, type(function("tr")))
5940b544f3c8SBram Moolenaar    call assert_equal(2, type(function("tr", [8])))
5941b544f3c8SBram Moolenaar    call assert_equal(3, type([]))
5942b544f3c8SBram Moolenaar    call assert_equal(4, type({}))
59435feabe00SBram Moolenaar    if has('float')
5944b544f3c8SBram Moolenaar      call assert_equal(5, type(0.0))
59455feabe00SBram Moolenaar    endif
5946b544f3c8SBram Moolenaar    call assert_equal(6, type(v:false))
5947b544f3c8SBram Moolenaar    call assert_equal(6, type(v:true))
5948b544f3c8SBram Moolenaar    call assert_equal(7, type(v:none))
5949b544f3c8SBram Moolenaar    call assert_equal(7, type(v:null))
5950b544f3c8SBram Moolenaar    call assert_equal(8, v:t_job)
5951b544f3c8SBram Moolenaar    call assert_equal(9, v:t_channel)
5952b544f3c8SBram Moolenaar    call assert_equal(v:t_number, type(0))
5953b544f3c8SBram Moolenaar    call assert_equal(v:t_string, type(""))
5954b544f3c8SBram Moolenaar    call assert_equal(v:t_func, type(function("tr")))
5955b544f3c8SBram Moolenaar    call assert_equal(v:t_func, type(function("tr", [8])))
5956b544f3c8SBram Moolenaar    call assert_equal(v:t_list, type([]))
5957b544f3c8SBram Moolenaar    call assert_equal(v:t_dict, type({}))
59585feabe00SBram Moolenaar    if has('float')
5959b544f3c8SBram Moolenaar      call assert_equal(v:t_float, type(0.0))
59605feabe00SBram Moolenaar    endif
5961b544f3c8SBram Moolenaar    call assert_equal(v:t_bool, type(v:false))
5962b544f3c8SBram Moolenaar    call assert_equal(v:t_bool, type(v:true))
5963b544f3c8SBram Moolenaar    call assert_equal(v:t_none, type(v:none))
5964b544f3c8SBram Moolenaar    call assert_equal(v:t_none, type(v:null))
596592b83ccfSBram Moolenaar    call assert_equal(v:t_string, type(test_null_string()))
596692b83ccfSBram Moolenaar    call assert_equal(v:t_func, type(test_null_function()))
596792b83ccfSBram Moolenaar    call assert_equal(v:t_func, type(test_null_partial()))
596892b83ccfSBram Moolenaar    call assert_equal(v:t_list, type(test_null_list()))
596992b83ccfSBram Moolenaar    call assert_equal(v:t_dict, type(test_null_dict()))
597092b83ccfSBram Moolenaar    if has('job')
597192b83ccfSBram Moolenaar      call assert_equal(v:t_job, type(test_null_job()))
597292b83ccfSBram Moolenaar    endif
597392b83ccfSBram Moolenaar    if has('channel')
597492b83ccfSBram Moolenaar      call assert_equal(v:t_channel, type(test_null_channel()))
597592b83ccfSBram Moolenaar    endif
597692b83ccfSBram Moolenaar    call assert_equal(v:t_blob, type(test_null_blob()))
5977b544f3c8SBram Moolenaar
59787c215c58SBram Moolenaar    call assert_fails("call type(test_void())", 'E685:')
59797c215c58SBram Moolenaar    call assert_fails("call type(test_unknown())", 'E685:')
5980b544f3c8SBram Moolenaar
5981b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:false)
5982b544f3c8SBram Moolenaar    call assert_equal(1, 0 + v:true)
5983b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:none)
5984b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:null)
5985b544f3c8SBram Moolenaar
5986b544f3c8SBram Moolenaar    call assert_equal('v:false', '' . v:false)
5987b544f3c8SBram Moolenaar    call assert_equal('v:true', '' . v:true)
5988b544f3c8SBram Moolenaar    call assert_equal('v:none', '' . v:none)
5989b544f3c8SBram Moolenaar    call assert_equal('v:null', '' . v:null)
5990b544f3c8SBram Moolenaar
5991b544f3c8SBram Moolenaar    call assert_true(v:false == 0)
5992b544f3c8SBram Moolenaar    call assert_false(v:false != 0)
5993b544f3c8SBram Moolenaar    call assert_true(v:true == 1)
5994b544f3c8SBram Moolenaar    call assert_false(v:true != 1)
5995b544f3c8SBram Moolenaar    call assert_false(v:true == v:false)
5996b544f3c8SBram Moolenaar    call assert_true(v:true != v:false)
5997b544f3c8SBram Moolenaar
5998b544f3c8SBram Moolenaar    call assert_true(v:null == 0)
5999b544f3c8SBram Moolenaar    call assert_false(v:null != 0)
6000b544f3c8SBram Moolenaar    call assert_true(v:none == 0)
6001b544f3c8SBram Moolenaar    call assert_false(v:none != 0)
6002b544f3c8SBram Moolenaar
6003b544f3c8SBram Moolenaar    call assert_true(v:false is v:false)
6004b544f3c8SBram Moolenaar    call assert_true(v:true is v:true)
6005b544f3c8SBram Moolenaar    call assert_true(v:none is v:none)
6006b544f3c8SBram Moolenaar    call assert_true(v:null is v:null)
6007b544f3c8SBram Moolenaar
6008b544f3c8SBram Moolenaar    call assert_false(v:false isnot v:false)
6009b544f3c8SBram Moolenaar    call assert_false(v:true isnot v:true)
6010b544f3c8SBram Moolenaar    call assert_false(v:none isnot v:none)
6011b544f3c8SBram Moolenaar    call assert_false(v:null isnot v:null)
6012b544f3c8SBram Moolenaar
6013b544f3c8SBram Moolenaar    call assert_false(v:false is 0)
6014b544f3c8SBram Moolenaar    call assert_false(v:true is 1)
6015b544f3c8SBram Moolenaar    call assert_false(v:true is v:false)
6016b544f3c8SBram Moolenaar    call assert_false(v:none is 0)
6017b544f3c8SBram Moolenaar    call assert_false(v:null is 0)
6018b544f3c8SBram Moolenaar    call assert_false(v:null is v:none)
6019b544f3c8SBram Moolenaar
6020b544f3c8SBram Moolenaar    call assert_true(v:false isnot 0)
6021b544f3c8SBram Moolenaar    call assert_true(v:true isnot 1)
6022b544f3c8SBram Moolenaar    call assert_true(v:true isnot v:false)
6023b544f3c8SBram Moolenaar    call assert_true(v:none isnot 0)
6024b544f3c8SBram Moolenaar    call assert_true(v:null isnot 0)
6025b544f3c8SBram Moolenaar    call assert_true(v:null isnot v:none)
6026b544f3c8SBram Moolenaar
6027b544f3c8SBram Moolenaar    call assert_equal(v:false, eval(string(v:false)))
6028b544f3c8SBram Moolenaar    call assert_equal(v:true, eval(string(v:true)))
6029b544f3c8SBram Moolenaar    call assert_equal(v:none, eval(string(v:none)))
6030b544f3c8SBram Moolenaar    call assert_equal(v:null, eval(string(v:null)))
6031b544f3c8SBram Moolenaar
6032b544f3c8SBram Moolenaar    call assert_equal(v:false, copy(v:false))
6033b544f3c8SBram Moolenaar    call assert_equal(v:true, copy(v:true))
6034b544f3c8SBram Moolenaar    call assert_equal(v:none, copy(v:none))
6035b544f3c8SBram Moolenaar    call assert_equal(v:null, copy(v:null))
6036b544f3c8SBram Moolenaar
6037b544f3c8SBram Moolenaar    call assert_equal([v:false], deepcopy([v:false]))
6038b544f3c8SBram Moolenaar    call assert_equal([v:true], deepcopy([v:true]))
6039b544f3c8SBram Moolenaar    call assert_equal([v:none], deepcopy([v:none]))
6040b544f3c8SBram Moolenaar    call assert_equal([v:null], deepcopy([v:null]))
6041b544f3c8SBram Moolenaar
6042b544f3c8SBram Moolenaar    call assert_true(empty(v:false))
6043b544f3c8SBram Moolenaar    call assert_false(empty(v:true))
6044b544f3c8SBram Moolenaar    call assert_true(empty(v:null))
6045b544f3c8SBram Moolenaar    call assert_true(empty(v:none))
6046b544f3c8SBram Moolenaar
6047b544f3c8SBram Moolenaar    func ChangeYourMind()
6048b544f3c8SBram Moolenaar	try
6049b544f3c8SBram Moolenaar	    return v:true
6050b544f3c8SBram Moolenaar	finally
6051b544f3c8SBram Moolenaar	    return 'something else'
6052b544f3c8SBram Moolenaar	endtry
6053b544f3c8SBram Moolenaar    endfunc
6054b544f3c8SBram Moolenaar
6055b544f3c8SBram Moolenaar    call ChangeYourMind()
6056b544f3c8SBram Moolenaarendfunc
6057b544f3c8SBram Moolenaar
6058b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6059b544f3c8SBram Moolenaar" Test 92:  skipping code					    {{{1
6060b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6061b544f3c8SBram Moolenaar
6062b544f3c8SBram Moolenaarfunc Test_skip()
6063b544f3c8SBram Moolenaar    let Fn = function('Test_type')
6064b544f3c8SBram Moolenaar    call assert_false(0 && Fn[1])
6065b544f3c8SBram Moolenaar    call assert_false(0 && string(Fn))
6066b544f3c8SBram Moolenaar    call assert_false(0 && len(Fn))
6067b544f3c8SBram Moolenaar    let l = []
6068b544f3c8SBram Moolenaar    call assert_false(0 && l[1])
6069b544f3c8SBram Moolenaar    call assert_false(0 && string(l))
6070b544f3c8SBram Moolenaar    call assert_false(0 && len(l))
6071b544f3c8SBram Moolenaar    let f = 1.0
6072b544f3c8SBram Moolenaar    call assert_false(0 && f[1])
6073b544f3c8SBram Moolenaar    call assert_false(0 && string(f))
6074b544f3c8SBram Moolenaar    call assert_false(0 && len(f))
6075b544f3c8SBram Moolenaar    let sp = v:null
6076b544f3c8SBram Moolenaar    call assert_false(0 && sp[1])
6077b544f3c8SBram Moolenaar    call assert_false(0 && string(sp))
6078b544f3c8SBram Moolenaar    call assert_false(0 && len(sp))
6079b544f3c8SBram Moolenaar
6080b544f3c8SBram Moolenaarendfunc
6081b544f3c8SBram Moolenaar
6082b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6083b544f3c8SBram Moolenaar" Test 93:  :echo and string()					    {{{1
6084b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6085b544f3c8SBram Moolenaar
6086b544f3c8SBram Moolenaarfunc Test_echo_and_string()
6087b544f3c8SBram Moolenaar    " String
6088b544f3c8SBram Moolenaar    let a = 'foo bar'
6089b544f3c8SBram Moolenaar    redir => result
6090b544f3c8SBram Moolenaar    echo a
6091b544f3c8SBram Moolenaar    echo string(a)
6092b544f3c8SBram Moolenaar    redir END
6093b544f3c8SBram Moolenaar    let l = split(result, "\n")
6094b544f3c8SBram Moolenaar    call assert_equal(["foo bar",
6095b544f3c8SBram Moolenaar		     \ "'foo bar'"], l)
6096b544f3c8SBram Moolenaar
6097b544f3c8SBram Moolenaar    " Float
6098b544f3c8SBram Moolenaar    if has('float')
6099b544f3c8SBram Moolenaar	let a = -1.2e0
6100b544f3c8SBram Moolenaar	redir => result
6101b544f3c8SBram Moolenaar	echo a
6102b544f3c8SBram Moolenaar	echo string(a)
6103b544f3c8SBram Moolenaar	redir END
6104b544f3c8SBram Moolenaar	let l = split(result, "\n")
6105b544f3c8SBram Moolenaar	call assert_equal(["-1.2",
6106b544f3c8SBram Moolenaar			 \ "-1.2"], l)
6107b544f3c8SBram Moolenaar    endif
6108b544f3c8SBram Moolenaar
6109b544f3c8SBram Moolenaar    " Funcref
6110b544f3c8SBram Moolenaar    redir => result
6111b544f3c8SBram Moolenaar    echo function('string')
6112b544f3c8SBram Moolenaar    echo string(function('string'))
6113b544f3c8SBram Moolenaar    redir END
6114b544f3c8SBram Moolenaar    let l = split(result, "\n")
6115b544f3c8SBram Moolenaar    call assert_equal(["string",
6116b544f3c8SBram Moolenaar		     \ "function('string')"], l)
6117b544f3c8SBram Moolenaar
6118b544f3c8SBram Moolenaar    " Recursive dictionary
6119b544f3c8SBram Moolenaar    let a = {}
6120b544f3c8SBram Moolenaar    let a["a"] = a
6121b544f3c8SBram Moolenaar    redir => result
6122b544f3c8SBram Moolenaar    echo a
6123b544f3c8SBram Moolenaar    echo string(a)
6124b544f3c8SBram Moolenaar    redir END
6125b544f3c8SBram Moolenaar    let l = split(result, "\n")
6126b544f3c8SBram Moolenaar    call assert_equal(["{'a': {...}}",
6127b544f3c8SBram Moolenaar		     \ "{'a': {...}}"], l)
6128b544f3c8SBram Moolenaar
6129b544f3c8SBram Moolenaar    " Recursive list
6130b544f3c8SBram Moolenaar    let a = [0]
6131b544f3c8SBram Moolenaar    let a[0] = a
6132b544f3c8SBram Moolenaar    redir => result
6133b544f3c8SBram Moolenaar    echo a
6134b544f3c8SBram Moolenaar    echo string(a)
6135b544f3c8SBram Moolenaar    redir END
6136b544f3c8SBram Moolenaar    let l = split(result, "\n")
6137b544f3c8SBram Moolenaar    call assert_equal(["[[...]]",
6138b544f3c8SBram Moolenaar		     \ "[[...]]"], l)
6139b544f3c8SBram Moolenaar
6140b544f3c8SBram Moolenaar    " Empty dictionaries in a list
6141b544f3c8SBram Moolenaar    let a = {}
6142b544f3c8SBram Moolenaar    redir => result
6143b544f3c8SBram Moolenaar    echo [a, a, a]
6144b544f3c8SBram Moolenaar    echo string([a, a, a])
6145b544f3c8SBram Moolenaar    redir END
6146b544f3c8SBram Moolenaar    let l = split(result, "\n")
6147b544f3c8SBram Moolenaar    call assert_equal(["[{}, {}, {}]",
6148b544f3c8SBram Moolenaar		     \ "[{}, {}, {}]"], l)
6149b544f3c8SBram Moolenaar
6150b544f3c8SBram Moolenaar    " Empty dictionaries in a dictionary
6151b544f3c8SBram Moolenaar    let a = {}
6152b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
6153b544f3c8SBram Moolenaar    redir => result
6154b544f3c8SBram Moolenaar    echo b
6155b544f3c8SBram Moolenaar    echo string(b)
6156b544f3c8SBram Moolenaar    redir END
6157b544f3c8SBram Moolenaar    let l = split(result, "\n")
6158b544f3c8SBram Moolenaar    call assert_equal(["{'a': {}, 'b': {}}",
6159b544f3c8SBram Moolenaar		     \ "{'a': {}, 'b': {}}"], l)
6160b544f3c8SBram Moolenaar
6161b544f3c8SBram Moolenaar    " Empty lists in a list
6162b544f3c8SBram Moolenaar    let a = []
6163b544f3c8SBram Moolenaar    redir => result
6164b544f3c8SBram Moolenaar    echo [a, a, a]
6165b544f3c8SBram Moolenaar    echo string([a, a, a])
6166b544f3c8SBram Moolenaar    redir END
6167b544f3c8SBram Moolenaar    let l = split(result, "\n")
6168b544f3c8SBram Moolenaar    call assert_equal(["[[], [], []]",
6169b544f3c8SBram Moolenaar		     \ "[[], [], []]"], l)
6170b544f3c8SBram Moolenaar
6171b544f3c8SBram Moolenaar    " Empty lists in a dictionary
6172b544f3c8SBram Moolenaar    let a = []
6173b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
6174b544f3c8SBram Moolenaar    redir => result
6175b544f3c8SBram Moolenaar    echo b
6176b544f3c8SBram Moolenaar    echo string(b)
6177b544f3c8SBram Moolenaar    redir END
6178b544f3c8SBram Moolenaar    let l = split(result, "\n")
6179b544f3c8SBram Moolenaar    call assert_equal(["{'a': [], 'b': []}",
6180b544f3c8SBram Moolenaar		     \ "{'a': [], 'b': []}"], l)
6181b544f3c8SBram Moolenaar
6182b544f3c8SBram Moolenaar    " Dictionaries in a list
6183b544f3c8SBram Moolenaar    let a = {"one": "yes", "two": "yes", "three": "yes"}
6184b544f3c8SBram Moolenaar    redir => result
6185b544f3c8SBram Moolenaar    echo [a, a, a]
6186b544f3c8SBram Moolenaar    echo string([a, a, a])
6187b544f3c8SBram Moolenaar    redir END
6188b544f3c8SBram Moolenaar    let l = split(result, "\n")
6189b544f3c8SBram Moolenaar    call assert_equal(["[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {...}, {...}]",
6190b544f3c8SBram Moolenaar		     \ "[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}]"], l)
6191b544f3c8SBram Moolenaar
6192b544f3c8SBram Moolenaar    " Dictionaries in a dictionary
6193b544f3c8SBram Moolenaar    let a = {"one": "yes", "two": "yes", "three": "yes"}
6194b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
6195b544f3c8SBram Moolenaar    redir => result
6196b544f3c8SBram Moolenaar    echo b
6197b544f3c8SBram Moolenaar    echo string(b)
6198b544f3c8SBram Moolenaar    redir END
6199b544f3c8SBram Moolenaar    let l = split(result, "\n")
6200b544f3c8SBram Moolenaar    call assert_equal(["{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {...}}",
6201b544f3c8SBram Moolenaar		     \ "{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {'one': 'yes', 'two': 'yes', 'three': 'yes'}}"], l)
6202b544f3c8SBram Moolenaar
6203b544f3c8SBram Moolenaar    " Lists in a list
6204b544f3c8SBram Moolenaar    let a = [1, 2, 3]
6205b544f3c8SBram Moolenaar    redir => result
6206b544f3c8SBram Moolenaar    echo [a, a, a]
6207b544f3c8SBram Moolenaar    echo string([a, a, a])
6208b544f3c8SBram Moolenaar    redir END
6209b544f3c8SBram Moolenaar    let l = split(result, "\n")
6210b544f3c8SBram Moolenaar    call assert_equal(["[[1, 2, 3], [...], [...]]",
6211b544f3c8SBram Moolenaar		     \ "[[1, 2, 3], [1, 2, 3], [1, 2, 3]]"], l)
6212b544f3c8SBram Moolenaar
6213b544f3c8SBram Moolenaar    " Lists in a dictionary
6214b544f3c8SBram Moolenaar    let a = [1, 2, 3]
6215b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
6216b544f3c8SBram Moolenaar    redir => result
6217b544f3c8SBram Moolenaar    echo b
6218b544f3c8SBram Moolenaar    echo string(b)
6219b544f3c8SBram Moolenaar    redir END
6220b544f3c8SBram Moolenaar    let l = split(result, "\n")
6221b544f3c8SBram Moolenaar    call assert_equal(["{'a': [1, 2, 3], 'b': [...]}",
6222b544f3c8SBram Moolenaar		     \ "{'a': [1, 2, 3], 'b': [1, 2, 3]}"], l)
6223b544f3c8SBram Moolenaar
62241363a30cSBram Moolenaar    call assert_fails('echo &:', 'E112:')
62251363a30cSBram Moolenaar    call assert_fails('echo &g:', 'E112:')
62261363a30cSBram Moolenaar    call assert_fails('echo &l:', 'E112:')
62271363a30cSBram Moolenaar
6228b544f3c8SBram Moolenaarendfunc
6229b544f3c8SBram Moolenaar
6230b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6231b544f3c8SBram Moolenaar" Test 94:  64-bit Numbers					    {{{1
6232b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6233b544f3c8SBram Moolenaar
6234b544f3c8SBram Moolenaarfunc Test_num64()
6235b544f3c8SBram Moolenaar    call assert_notequal( 4294967296, 0)
6236b544f3c8SBram Moolenaar    call assert_notequal(-4294967296, 0)
6237b544f3c8SBram Moolenaar    call assert_equal( 4294967296,  0xFFFFffff + 1)
6238b544f3c8SBram Moolenaar    call assert_equal(-4294967296, -0xFFFFffff - 1)
6239b544f3c8SBram Moolenaar
6240b544f3c8SBram Moolenaar    call assert_equal( 9223372036854775807,  1 / 0)
6241b544f3c8SBram Moolenaar    call assert_equal(-9223372036854775807, -1 / 0)
6242b544f3c8SBram Moolenaar    call assert_equal(-9223372036854775807 - 1,  0 / 0)
6243b544f3c8SBram Moolenaar
62445feabe00SBram Moolenaar    if has('float')
6245b544f3c8SBram Moolenaar      call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150))
6246b544f3c8SBram Moolenaar      call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150))
62475feabe00SBram Moolenaar    endif
6248b544f3c8SBram Moolenaar
6249b544f3c8SBram Moolenaar    let rng = range(0xFFFFffff, 0x100000001)
6250b544f3c8SBram Moolenaar    call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng)
6251b544f3c8SBram Moolenaar    call assert_equal(0x100000001, max(rng))
6252b544f3c8SBram Moolenaar    call assert_equal(0xFFFFffff, min(rng))
6253b544f3c8SBram Moolenaar    call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N'))
6254b544f3c8SBram Moolenaarendfunc
6255b544f3c8SBram Moolenaar
6256b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6257b544f3c8SBram Moolenaar" Test 95:  lines of :append, :change, :insert			    {{{1
6258b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6259b544f3c8SBram Moolenaar
6260b544f3c8SBram Moolenaarfunction! DefineFunction(name, body)
6261b544f3c8SBram Moolenaar    let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n")
6262b544f3c8SBram Moolenaar    exec func
6263b544f3c8SBram Moolenaarendfunction
6264b544f3c8SBram Moolenaar
6265b544f3c8SBram Moolenaarfunc Test_script_lines()
6266b544f3c8SBram Moolenaar    " :append
6267b544f3c8SBram Moolenaar    try
6268b544f3c8SBram Moolenaar	call DefineFunction('T_Append', [
6269b544f3c8SBram Moolenaar		    \ 'append',
6270b544f3c8SBram Moolenaar		    \ 'py <<EOS',
6271b544f3c8SBram Moolenaar		    \ '.',
6272b544f3c8SBram Moolenaar		    \ ])
6273b544f3c8SBram Moolenaar    catch
627437175409SBram Moolenaar	call assert_report("Can't define function")
6275b544f3c8SBram Moolenaar    endtry
6276b544f3c8SBram Moolenaar    try
6277b544f3c8SBram Moolenaar	call DefineFunction('T_Append', [
6278b544f3c8SBram Moolenaar		    \ 'append',
6279b544f3c8SBram Moolenaar		    \ 'abc',
6280b544f3c8SBram Moolenaar		    \ ])
628137175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
6282b544f3c8SBram Moolenaar    catch
6283b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
6284b544f3c8SBram Moolenaar    endtry
6285b544f3c8SBram Moolenaar
6286b544f3c8SBram Moolenaar    " :change
6287b544f3c8SBram Moolenaar    try
6288b544f3c8SBram Moolenaar	call DefineFunction('T_Change', [
6289b544f3c8SBram Moolenaar		    \ 'change',
6290b544f3c8SBram Moolenaar		    \ 'py <<EOS',
6291b544f3c8SBram Moolenaar		    \ '.',
6292b544f3c8SBram Moolenaar		    \ ])
6293b544f3c8SBram Moolenaar    catch
629437175409SBram Moolenaar	call assert_report("Can't define function")
6295b544f3c8SBram Moolenaar    endtry
6296b544f3c8SBram Moolenaar    try
6297b544f3c8SBram Moolenaar	call DefineFunction('T_Change', [
6298b544f3c8SBram Moolenaar		    \ 'change',
6299b544f3c8SBram Moolenaar		    \ 'abc',
6300b544f3c8SBram Moolenaar		    \ ])
630137175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
6302b544f3c8SBram Moolenaar    catch
6303b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
6304b544f3c8SBram Moolenaar    endtry
6305b544f3c8SBram Moolenaar
6306b544f3c8SBram Moolenaar    " :insert
6307b544f3c8SBram Moolenaar    try
6308b544f3c8SBram Moolenaar	call DefineFunction('T_Insert', [
6309b544f3c8SBram Moolenaar		    \ 'insert',
6310b544f3c8SBram Moolenaar		    \ 'py <<EOS',
6311b544f3c8SBram Moolenaar		    \ '.',
6312b544f3c8SBram Moolenaar		    \ ])
6313b544f3c8SBram Moolenaar    catch
631437175409SBram Moolenaar	call assert_report("Can't define function")
6315b544f3c8SBram Moolenaar    endtry
6316b544f3c8SBram Moolenaar    try
6317b544f3c8SBram Moolenaar	call DefineFunction('T_Insert', [
6318b544f3c8SBram Moolenaar		    \ 'insert',
6319b544f3c8SBram Moolenaar		    \ 'abc',
6320b544f3c8SBram Moolenaar		    \ ])
632137175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
6322b544f3c8SBram Moolenaar    catch
6323b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
6324b544f3c8SBram Moolenaar    endtry
6325b544f3c8SBram Moolenaarendfunc
6326b544f3c8SBram Moolenaar
6327b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6328478af67dSBram Moolenaar" Test 96:  line continuation						    {{{1
6329478af67dSBram Moolenaar"
6330478af67dSBram Moolenaar"	    Undefined behavior was detected by ubsan with line continuation
6331478af67dSBram Moolenaar"	    after an empty line.
6332478af67dSBram Moolenaar"-------------------------------------------------------------------------------
6333478af67dSBram Moolenaarfunc Test_script_emty_line_continuation()
6334478af67dSBram Moolenaar
6335478af67dSBram Moolenaar    \
6336478af67dSBram Moolenaarendfunc
6337478af67dSBram Moolenaar
6338478af67dSBram Moolenaar"-------------------------------------------------------------------------------
6339863e80b4SBram Moolenaar" Test 97:  bitwise functions						    {{{1
6340863e80b4SBram Moolenaar"-------------------------------------------------------------------------------
6341863e80b4SBram Moolenaarfunc Test_bitwise_functions()
6342863e80b4SBram Moolenaar    " and
6343863e80b4SBram Moolenaar    call assert_equal(127, and(127, 127))
6344863e80b4SBram Moolenaar    call assert_equal(16, and(127, 16))
6345073e4b92SBram Moolenaar    eval 127->and(16)->assert_equal(16)
6346863e80b4SBram Moolenaar    call assert_equal(0, and(127, 128))
6347863e80b4SBram Moolenaar    call assert_fails("call and([], 1)", 'E745:')
6348863e80b4SBram Moolenaar    call assert_fails("call and({}, 1)", 'E728:')
63495feabe00SBram Moolenaar    if has('float')
63505feabe00SBram Moolenaar      call assert_fails("call and(1.0, 1)", 'E805:')
6351863e80b4SBram Moolenaar      call assert_fails("call and(1, 1.0)", 'E805:')
63525feabe00SBram Moolenaar    endif
6353863e80b4SBram Moolenaar    call assert_fails("call and(1, [])", 'E745:')
6354863e80b4SBram Moolenaar    call assert_fails("call and(1, {})", 'E728:')
6355863e80b4SBram Moolenaar    " or
6356863e80b4SBram Moolenaar    call assert_equal(23, or(16, 7))
6357863e80b4SBram Moolenaar    call assert_equal(15, or(8, 7))
6358073e4b92SBram Moolenaar    eval 8->or(7)->assert_equal(15)
6359863e80b4SBram Moolenaar    call assert_equal(123, or(0, 123))
6360863e80b4SBram Moolenaar    call assert_fails("call or([], 1)", 'E745:')
6361863e80b4SBram Moolenaar    call assert_fails("call or({}, 1)", 'E728:')
63625feabe00SBram Moolenaar    if has('float')
63635feabe00SBram Moolenaar      call assert_fails("call or(1.0, 1)", 'E805:')
6364863e80b4SBram Moolenaar      call assert_fails("call or(1, 1.0)", 'E805:')
63655feabe00SBram Moolenaar    endif
6366863e80b4SBram Moolenaar    call assert_fails("call or(1, [])", 'E745:')
6367863e80b4SBram Moolenaar    call assert_fails("call or(1, {})", 'E728:')
6368863e80b4SBram Moolenaar    " xor
6369863e80b4SBram Moolenaar    call assert_equal(0, xor(127, 127))
6370863e80b4SBram Moolenaar    call assert_equal(111, xor(127, 16))
6371073e4b92SBram Moolenaar    eval 127->xor(16)->assert_equal(111)
6372863e80b4SBram Moolenaar    call assert_equal(255, xor(127, 128))
63735feabe00SBram Moolenaar    if has('float')
6374863e80b4SBram Moolenaar      call assert_fails("call xor(1.0, 1)", 'E805:')
63755feabe00SBram Moolenaar      call assert_fails("call xor(1, 1.0)", 'E805:')
63765feabe00SBram Moolenaar    endif
6377863e80b4SBram Moolenaar    call assert_fails("call xor([], 1)", 'E745:')
6378863e80b4SBram Moolenaar    call assert_fails("call xor({}, 1)", 'E728:')
6379863e80b4SBram Moolenaar    call assert_fails("call xor(1, [])", 'E745:')
6380863e80b4SBram Moolenaar    call assert_fails("call xor(1, {})", 'E728:')
6381863e80b4SBram Moolenaar    " invert
6382863e80b4SBram Moolenaar    call assert_equal(65408, and(invert(127), 65535))
6383073e4b92SBram Moolenaar    eval 127->invert()->and(65535)->assert_equal(65408)
6384863e80b4SBram Moolenaar    call assert_equal(65519, and(invert(16), 65535))
6385863e80b4SBram Moolenaar    call assert_equal(65407, and(invert(128), 65535))
63865feabe00SBram Moolenaar    if has('float')
6387863e80b4SBram Moolenaar      call assert_fails("call invert(1.0)", 'E805:')
63885feabe00SBram Moolenaar    endif
6389863e80b4SBram Moolenaar    call assert_fails("call invert([])", 'E745:')
6390863e80b4SBram Moolenaar    call assert_fails("call invert({})", 'E728:')
6391863e80b4SBram Moolenaarendfunc
6392863e80b4SBram Moolenaar
63936f9a476bSBram Moolenaar" Test using bang after user command				    {{{1
63946f9a476bSBram Moolenaarfunc Test_user_command_with_bang()
63956f9a476bSBram Moolenaar    command -bang Nieuw let nieuw = 1
63966f9a476bSBram Moolenaar    Ni!
63976f9a476bSBram Moolenaar    call assert_equal(1, nieuw)
63986f9a476bSBram Moolenaar    unlet nieuw
63996f9a476bSBram Moolenaar    delcommand Nieuw
64006f9a476bSBram Moolenaarendfunc
64016f9a476bSBram Moolenaar
6402b9adef79SBram Moolenaarfunc Test_script_expand_sfile()
6403b9adef79SBram Moolenaar  let lines =<< trim END
6404b9adef79SBram Moolenaar    func s:snr()
6405b9adef79SBram Moolenaar      return expand('<sfile>')
6406b9adef79SBram Moolenaar    endfunc
6407b9adef79SBram Moolenaar    let g:result = s:snr()
6408b9adef79SBram Moolenaar  END
6409b9adef79SBram Moolenaar  call writefile(lines, 'Xexpand')
6410b9adef79SBram Moolenaar  source Xexpand
6411b9adef79SBram Moolenaar  call assert_match('<SNR>\d\+_snr', g:result)
6412b9adef79SBram Moolenaar  source Xexpand
6413b9adef79SBram Moolenaar  call assert_match('<SNR>\d\+_snr', g:result)
6414b9adef79SBram Moolenaar
6415b9adef79SBram Moolenaar  call delete('Xexpand')
6416b9adef79SBram Moolenaar  unlet g:result
6417b9adef79SBram Moolenaarendfunc
6418b9adef79SBram Moolenaar
6419ff697e6cSBram Moolenaarfunc Test_compound_assignment_operators()
6420ff697e6cSBram Moolenaar    " Test for number
6421ff697e6cSBram Moolenaar    let x = 1
6422ff697e6cSBram Moolenaar    let x += 10
6423ff697e6cSBram Moolenaar    call assert_equal(11, x)
6424ff697e6cSBram Moolenaar    let x -= 5
6425ff697e6cSBram Moolenaar    call assert_equal(6, x)
6426ff697e6cSBram Moolenaar    let x *= 4
6427ff697e6cSBram Moolenaar    call assert_equal(24, x)
6428ff697e6cSBram Moolenaar    let x /= 3
6429ff697e6cSBram Moolenaar    call assert_equal(8, x)
6430ff697e6cSBram Moolenaar    let x %= 3
6431ff697e6cSBram Moolenaar    call assert_equal(2, x)
6432ff697e6cSBram Moolenaar    let x .= 'n'
6433ff697e6cSBram Moolenaar    call assert_equal('2n', x)
6434ff697e6cSBram Moolenaar
6435e21c1580SBram Moolenaar    " Test special cases: division or modulus with 0.
6436e21c1580SBram Moolenaar    let x = 1
6437e21c1580SBram Moolenaar    let x /= 0
6438e21c1580SBram Moolenaar    call assert_equal(0x7FFFFFFFFFFFFFFF, x)
6439e21c1580SBram Moolenaar
6440e21c1580SBram Moolenaar    let x = -1
6441e21c1580SBram Moolenaar    let x /= 0
6442e21c1580SBram Moolenaar    call assert_equal(-0x7FFFFFFFFFFFFFFF, x)
6443e21c1580SBram Moolenaar
6444e21c1580SBram Moolenaar    let x = 0
6445e21c1580SBram Moolenaar    let x /= 0
6446e21c1580SBram Moolenaar    call assert_equal(-0x7FFFFFFFFFFFFFFF - 1, x)
6447e21c1580SBram Moolenaar
6448e21c1580SBram Moolenaar    let x = 1
6449e21c1580SBram Moolenaar    let x %= 0
6450e21c1580SBram Moolenaar    call assert_equal(0, x)
6451e21c1580SBram Moolenaar
6452e21c1580SBram Moolenaar    let x = -1
6453e21c1580SBram Moolenaar    let x %= 0
6454e21c1580SBram Moolenaar    call assert_equal(0, x)
6455e21c1580SBram Moolenaar
6456e21c1580SBram Moolenaar    let x = 0
6457e21c1580SBram Moolenaar    let x %= 0
6458e21c1580SBram Moolenaar    call assert_equal(0, x)
6459e21c1580SBram Moolenaar
6460ff697e6cSBram Moolenaar    " Test for string
6461ff697e6cSBram Moolenaar    let x = 'str'
6462ff697e6cSBram Moolenaar    let x .= 'ing'
6463ff697e6cSBram Moolenaar    call assert_equal('string', x)
6464ff697e6cSBram Moolenaar    let x += 1
6465ff697e6cSBram Moolenaar    call assert_equal(1, x)
6466ff697e6cSBram Moolenaar
6467ff697e6cSBram Moolenaar    if has('float')
6468ff697e6cSBram Moolenaar      " Test for float
64695feabe00SBram Moolenaar      let x -= 1.5
64705feabe00SBram Moolenaar      call assert_equal(-0.5, x)
6471ff697e6cSBram Moolenaar      let x = 0.5
6472ff697e6cSBram Moolenaar      let x += 4.5
6473ff697e6cSBram Moolenaar      call assert_equal(5.0, x)
6474ff697e6cSBram Moolenaar      let x -= 1.5
6475ff697e6cSBram Moolenaar      call assert_equal(3.5, x)
6476ff697e6cSBram Moolenaar      let x *= 3.0
6477ff697e6cSBram Moolenaar      call assert_equal(10.5, x)
6478ff697e6cSBram Moolenaar      let x /= 2.5
6479ff697e6cSBram Moolenaar      call assert_equal(4.2, x)
6480ff697e6cSBram Moolenaar      call assert_fails('let x %= 0.5', 'E734')
6481ff697e6cSBram Moolenaar      call assert_fails('let x .= "f"', 'E734')
64828b633135SBram Moolenaar      let x = !3.14
64838b633135SBram Moolenaar      call assert_equal(0.0, x)
6484ea04a6e8SBram Moolenaar
6485ea04a6e8SBram Moolenaar      " integer and float operations
6486ea04a6e8SBram Moolenaar      let x = 1
6487ea04a6e8SBram Moolenaar      let x *= 2.1
6488ea04a6e8SBram Moolenaar      call assert_equal(2.1, x)
6489ea04a6e8SBram Moolenaar      let x = 1
6490ea04a6e8SBram Moolenaar      let x /= 0.25
6491ea04a6e8SBram Moolenaar      call assert_equal(4.0, x)
6492ea04a6e8SBram Moolenaar      let x = 1
6493ea04a6e8SBram Moolenaar      call assert_fails('let x %= 0.25', 'E734:')
6494ea04a6e8SBram Moolenaar      let x = 1
6495ea04a6e8SBram Moolenaar      call assert_fails('let x .= 0.25', 'E734:')
6496ea04a6e8SBram Moolenaar      let x = 1.0
6497ea04a6e8SBram Moolenaar      call assert_fails('let x += [1.1]', 'E734:')
6498ff697e6cSBram Moolenaar    endif
6499ff697e6cSBram Moolenaar
6500ff697e6cSBram Moolenaar    " Test for environment variable
6501ff697e6cSBram Moolenaar    let $FOO = 1
6502ff697e6cSBram Moolenaar    call assert_fails('let $FOO += 1', 'E734')
6503ff697e6cSBram Moolenaar    call assert_fails('let $FOO -= 1', 'E734')
6504ff697e6cSBram Moolenaar    call assert_fails('let $FOO *= 1', 'E734')
6505ff697e6cSBram Moolenaar    call assert_fails('let $FOO /= 1', 'E734')
6506ff697e6cSBram Moolenaar    call assert_fails('let $FOO %= 1', 'E734')
6507ff697e6cSBram Moolenaar    let $FOO .= 's'
6508ff697e6cSBram Moolenaar    call assert_equal('1s', $FOO)
6509ff697e6cSBram Moolenaar    unlet $FOO
6510ff697e6cSBram Moolenaar
6511ff697e6cSBram Moolenaar    " Test for option variable (type: number)
6512ff697e6cSBram Moolenaar    let &scrolljump = 1
6513ff697e6cSBram Moolenaar    let &scrolljump += 5
6514ff697e6cSBram Moolenaar    call assert_equal(6, &scrolljump)
6515ff697e6cSBram Moolenaar    let &scrolljump -= 2
6516ff697e6cSBram Moolenaar    call assert_equal(4, &scrolljump)
6517ff697e6cSBram Moolenaar    let &scrolljump *= 3
6518ff697e6cSBram Moolenaar    call assert_equal(12, &scrolljump)
6519ff697e6cSBram Moolenaar    let &scrolljump /= 2
6520ff697e6cSBram Moolenaar    call assert_equal(6, &scrolljump)
6521ff697e6cSBram Moolenaar    let &scrolljump %= 5
6522ff697e6cSBram Moolenaar    call assert_equal(1, &scrolljump)
6523ff697e6cSBram Moolenaar    call assert_fails('let &scrolljump .= "j"', 'E734')
6524ff697e6cSBram Moolenaar    set scrolljump&vim
6525ff697e6cSBram Moolenaar
6526ff697e6cSBram Moolenaar    " Test for register
6527ff697e6cSBram Moolenaar    let @/ = 1
6528ff697e6cSBram Moolenaar    call assert_fails('let @/ += 1', 'E734')
6529ff697e6cSBram Moolenaar    call assert_fails('let @/ -= 1', 'E734')
6530ff697e6cSBram Moolenaar    call assert_fails('let @/ *= 1', 'E734')
6531ff697e6cSBram Moolenaar    call assert_fails('let @/ /= 1', 'E734')
6532ff697e6cSBram Moolenaar    call assert_fails('let @/ %= 1', 'E734')
6533ff697e6cSBram Moolenaar    let @/ .= 's'
6534ff697e6cSBram Moolenaar    call assert_equal('1s', @/)
6535ff697e6cSBram Moolenaar    let @/ = ''
6536ff697e6cSBram Moolenaarendfunc
6537ff697e6cSBram Moolenaar
65387e0868efSBram Moolenaarfunc Test_unlet_env()
65397e0868efSBram Moolenaar  let $TESTVAR = 'yes'
65407e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
65417e0868efSBram Moolenaar  call assert_fails('lockvar $TESTVAR', 'E940')
65427e0868efSBram Moolenaar  call assert_fails('unlockvar $TESTVAR', 'E940')
65437e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
65447e0868efSBram Moolenaar  if 0
65457e0868efSBram Moolenaar    unlet $TESTVAR
65467e0868efSBram Moolenaar  endif
65477e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
65487e0868efSBram Moolenaar  unlet $TESTVAR
65497e0868efSBram Moolenaar  call assert_equal('', $TESTVAR)
65507e0868efSBram Moolenaarendfunc
65517e0868efSBram Moolenaar
6552c3e92c16SBram Moolenaarfunc Test_refcount()
6553c3e92c16SBram Moolenaar    " Immediate values
6554c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(1))
6555c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount('s'))
6556c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(v:true))
6557c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount([]))
6558c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount({}))
6559c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(0zff))
6560c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount({-> line('.')}))
6561c3e92c16SBram Moolenaar    if has('float')
6562c3e92c16SBram Moolenaar        call assert_equal(-1, test_refcount(0.1))
6563c3e92c16SBram Moolenaar    endif
6564c3e92c16SBram Moolenaar    if has('job')
6565c3e92c16SBram Moolenaar        call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .'])))
6566c3e92c16SBram Moolenaar    endif
6567c3e92c16SBram Moolenaar
6568c3e92c16SBram Moolenaar    " No refcount types
6569c3e92c16SBram Moolenaar    let x = 1
6570c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
6571c3e92c16SBram Moolenaar    let x = 's'
6572c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
6573c3e92c16SBram Moolenaar    let x = v:true
6574c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
6575c3e92c16SBram Moolenaar    if has('float')
6576c3e92c16SBram Moolenaar        let x = 0.1
6577c3e92c16SBram Moolenaar        call assert_equal(-1, test_refcount(x))
6578c3e92c16SBram Moolenaar    endif
6579c3e92c16SBram Moolenaar
6580c3e92c16SBram Moolenaar    " Check refcount
6581c3e92c16SBram Moolenaar    let x = []
6582c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(x))
6583c3e92c16SBram Moolenaar
6584c3e92c16SBram Moolenaar    let x = {}
6585ce90e36fSBram Moolenaar    call assert_equal(1, x->test_refcount())
6586c3e92c16SBram Moolenaar
6587c3e92c16SBram Moolenaar    let x = 0zff
6588c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(x))
6589c3e92c16SBram Moolenaar
6590c3e92c16SBram Moolenaar    let X = {-> line('.')}
6591c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(X))
6592c3e92c16SBram Moolenaar    let Y = X
6593c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
6594c3e92c16SBram Moolenaar
6595c3e92c16SBram Moolenaar    if has('job')
6596c3e92c16SBram Moolenaar        let job = job_start([&shell, &shellcmdflag, 'echo .'])
6597c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job))
6598c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job_getchannel(job)))
6599c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job))
6600c3e92c16SBram Moolenaar    endif
6601c3e92c16SBram Moolenaar
6602c3e92c16SBram Moolenaar    " Function arguments, copying and unassigning
6603c3e92c16SBram Moolenaar    func ExprCheck(x, i)
6604c3e92c16SBram Moolenaar        let i = a:i + 1
6605c3e92c16SBram Moolenaar        call assert_equal(i, test_refcount(a:x))
6606c3e92c16SBram Moolenaar        let Y = a:x
6607c3e92c16SBram Moolenaar        call assert_equal(i + 1, test_refcount(a:x))
6608c3e92c16SBram Moolenaar        call assert_equal(test_refcount(a:x), test_refcount(Y))
6609c3e92c16SBram Moolenaar        let Y = 0
6610c3e92c16SBram Moolenaar        call assert_equal(i, test_refcount(a:x))
6611c3e92c16SBram Moolenaar    endfunc
6612c3e92c16SBram Moolenaar    call ExprCheck([], 0)
6613c3e92c16SBram Moolenaar    call ExprCheck({}, 0)
6614c3e92c16SBram Moolenaar    call ExprCheck(0zff, 0)
6615c3e92c16SBram Moolenaar    call ExprCheck({-> line('.')}, 0)
6616c3e92c16SBram Moolenaar    if has('job')
6617c3e92c16SBram Moolenaar	call ExprCheck(job, 1)
6618c3e92c16SBram Moolenaar	call ExprCheck(job_getchannel(job), 1)
6619c3e92c16SBram Moolenaar	call job_stop(job)
6620c3e92c16SBram Moolenaar    endif
6621c3e92c16SBram Moolenaar    delfunc ExprCheck
6622c3e92c16SBram Moolenaar
6623c3e92c16SBram Moolenaar    " Regarding function
6624c3e92c16SBram Moolenaar    func Func(x) abort
6625c3e92c16SBram Moolenaar        call assert_equal(2, test_refcount(function('Func')))
6626c3e92c16SBram Moolenaar        call assert_equal(0, test_refcount(funcref('Func')))
6627c3e92c16SBram Moolenaar    endfunc
6628c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(function('Func')))
6629c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(function('Func', [1])))
6630c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(funcref('Func')))
6631c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(funcref('Func', [1])))
6632c3e92c16SBram Moolenaar    let X = function('Func')
6633c3e92c16SBram Moolenaar    let Y = X
6634c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(X))
6635c3e92c16SBram Moolenaar    let X = function('Func', [1])
6636c3e92c16SBram Moolenaar    let Y = X
6637c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
6638c3e92c16SBram Moolenaar    let X = funcref('Func')
6639c3e92c16SBram Moolenaar    let Y = X
6640c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
6641c3e92c16SBram Moolenaar    let X = funcref('Func', [1])
6642c3e92c16SBram Moolenaar    let Y = X
6643c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
6644c3e92c16SBram Moolenaar    unlet X
6645c3e92c16SBram Moolenaar    unlet Y
6646c3e92c16SBram Moolenaar    call Func(1)
6647c3e92c16SBram Moolenaar    delfunc Func
6648c3e92c16SBram Moolenaar
6649c3e92c16SBram Moolenaar    " Function with dict
6650c3e92c16SBram Moolenaar    func DictFunc() dict
6651c3e92c16SBram Moolenaar        call assert_equal(3, test_refcount(self))
6652c3e92c16SBram Moolenaar    endfunc
6653c3e92c16SBram Moolenaar    let d = {'Func': function('DictFunc')}
6654c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(d))
6655c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(d.Func))
6656c3e92c16SBram Moolenaar    call d.Func()
6657c3e92c16SBram Moolenaar    unlet d
6658c3e92c16SBram Moolenaar    delfunc DictFunc
6659c3e92c16SBram Moolenaarendfunc
6660c3e92c16SBram Moolenaar
66619f6277bdSBram Moolenaar" Test for missing :endif, :endfor, :endwhile and :endtry           {{{1
66629f6277bdSBram Moolenaarfunc Test_missing_end()
66639f6277bdSBram Moolenaar  call writefile(['if 2 > 1', 'echo ">"'], 'Xscript')
66649f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E171:')
66659f6277bdSBram Moolenaar  call writefile(['for i in range(5)', 'echo i'], 'Xscript')
66669f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E170:')
66679f6277bdSBram Moolenaar  call writefile(['while v:true', 'echo "."'], 'Xscript')
66689f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E170:')
66699f6277bdSBram Moolenaar  call writefile(['try', 'echo "."'], 'Xscript')
66709f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E600:')
66719f6277bdSBram Moolenaar  call delete('Xscript')
6672818fc9adSBram Moolenaar
6673818fc9adSBram Moolenaar  " Using endfor with :while
6674818fc9adSBram Moolenaar  let caught_e732 = 0
6675818fc9adSBram Moolenaar  try
6676818fc9adSBram Moolenaar    while v:true
6677818fc9adSBram Moolenaar    endfor
6678818fc9adSBram Moolenaar  catch /E732:/
6679818fc9adSBram Moolenaar    let caught_e732 = 1
6680818fc9adSBram Moolenaar  endtry
6681818fc9adSBram Moolenaar  call assert_equal(1, caught_e732)
6682818fc9adSBram Moolenaar
6683818fc9adSBram Moolenaar  " Using endwhile with :for
6684818fc9adSBram Moolenaar  let caught_e733 = 0
6685818fc9adSBram Moolenaar  try
6686818fc9adSBram Moolenaar    for i in range(1)
6687818fc9adSBram Moolenaar    endwhile
6688818fc9adSBram Moolenaar  catch /E733:/
6689818fc9adSBram Moolenaar    let caught_e733 = 1
6690818fc9adSBram Moolenaar  endtry
6691818fc9adSBram Moolenaar  call assert_equal(1, caught_e733)
6692818fc9adSBram Moolenaar
6693ee4e0c1eSBram Moolenaar  " Using endfunc with :if
6694ee4e0c1eSBram Moolenaar  call assert_fails('exe "if 1 | endfunc | endif"', 'E193:')
6695ee4e0c1eSBram Moolenaar
6696818fc9adSBram Moolenaar  " Missing 'in' in a :for statement
6697818fc9adSBram Moolenaar  call assert_fails('for i range(1) | endfor', 'E690:')
6698ea04a6e8SBram Moolenaar
6699ea04a6e8SBram Moolenaar  " Incorrect number of variables in for
6700ea04a6e8SBram Moolenaar  call assert_fails('for [i,] in range(3) | endfor', 'E475:')
67019f6277bdSBram Moolenaarendfunc
67029f6277bdSBram Moolenaar
67039f6277bdSBram Moolenaar" Test for deep nesting of if/for/while/try statements              {{{1
67049f6277bdSBram Moolenaarfunc Test_deep_nest()
6705494e9069SBram Moolenaar  CheckRunVimInTerminal
67069f6277bdSBram Moolenaar
67079f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
67089f6277bdSBram Moolenaar    " Deep nesting of if ... endif
67099f6277bdSBram Moolenaar    func Test1()
67109f6277bdSBram Moolenaar      let @a = join(repeat(['if v:true'], 51), "\n")
67119f6277bdSBram Moolenaar      let @a ..= "\n"
67129f6277bdSBram Moolenaar      let @a ..= join(repeat(['endif'], 51), "\n")
67139f6277bdSBram Moolenaar      @a
67149f6277bdSBram Moolenaar      let @a = ''
67159f6277bdSBram Moolenaar    endfunc
67169f6277bdSBram Moolenaar
67179f6277bdSBram Moolenaar    " Deep nesting of for ... endfor
67189f6277bdSBram Moolenaar    func Test2()
67199f6277bdSBram Moolenaar      let @a = join(repeat(['for i in [1]'], 51), "\n")
67209f6277bdSBram Moolenaar      let @a ..= "\n"
67219f6277bdSBram Moolenaar      let @a ..= join(repeat(['endfor'], 51), "\n")
67229f6277bdSBram Moolenaar      @a
67239f6277bdSBram Moolenaar      let @a = ''
67249f6277bdSBram Moolenaar    endfunc
67259f6277bdSBram Moolenaar
67269f6277bdSBram Moolenaar    " Deep nesting of while ... endwhile
67279f6277bdSBram Moolenaar    func Test3()
67289f6277bdSBram Moolenaar      let @a = join(repeat(['while v:true'], 51), "\n")
67299f6277bdSBram Moolenaar      let @a ..= "\n"
67309f6277bdSBram Moolenaar      let @a ..= join(repeat(['endwhile'], 51), "\n")
67319f6277bdSBram Moolenaar      @a
67329f6277bdSBram Moolenaar      let @a = ''
67339f6277bdSBram Moolenaar    endfunc
67349f6277bdSBram Moolenaar
67359f6277bdSBram Moolenaar    " Deep nesting of try ... endtry
67369f6277bdSBram Moolenaar    func Test4()
67379f6277bdSBram Moolenaar      let @a = join(repeat(['try'], 51), "\n")
67389f6277bdSBram Moolenaar      let @a ..= "\necho v:true\n"
67399f6277bdSBram Moolenaar      let @a ..= join(repeat(['endtry'], 51), "\n")
67409f6277bdSBram Moolenaar      @a
67419f6277bdSBram Moolenaar      let @a = ''
67429f6277bdSBram Moolenaar    endfunc
6743ee4e0c1eSBram Moolenaar
6744ee4e0c1eSBram Moolenaar    " Deep nesting of function ... endfunction
6745ee4e0c1eSBram Moolenaar    func Test5()
6746ee4e0c1eSBram Moolenaar      let @a = join(repeat(['function X()'], 51), "\n")
6747ee4e0c1eSBram Moolenaar      let @a ..= "\necho v:true\n"
6748ee4e0c1eSBram Moolenaar      let @a ..= join(repeat(['endfunction'], 51), "\n")
6749ee4e0c1eSBram Moolenaar      @a
6750ee4e0c1eSBram Moolenaar      let @a = ''
6751ee4e0c1eSBram Moolenaar    endfunc
67529f6277bdSBram Moolenaar  [SCRIPT]
67539f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
67549f6277bdSBram Moolenaar
67559f6277bdSBram Moolenaar  let buf = RunVimInTerminal('-S Xscript', {'rows': 6})
67569f6277bdSBram Moolenaar
67579f6277bdSBram Moolenaar  " Deep nesting of if ... endif
67589f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test1()\n")
67596a2c5a7dSBram Moolenaar  call TermWait(buf)
67609f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E579:', term_getline(buf, 5))})
67619f6277bdSBram Moolenaar
67629f6277bdSBram Moolenaar  " Deep nesting of for ... endfor
67639f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test2()\n")
67646a2c5a7dSBram Moolenaar  call TermWait(buf)
67659f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))})
67669f6277bdSBram Moolenaar
67679f6277bdSBram Moolenaar  " Deep nesting of while ... endwhile
67689f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test3()\n")
67696a2c5a7dSBram Moolenaar  call TermWait(buf)
67709f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))})
67719f6277bdSBram Moolenaar
67729f6277bdSBram Moolenaar  " Deep nesting of try ... endtry
67739f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test4()\n")
67746a2c5a7dSBram Moolenaar  call TermWait(buf)
67759f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E601:', term_getline(buf, 5))})
67769f6277bdSBram Moolenaar
6777ee4e0c1eSBram Moolenaar  " Deep nesting of function ... endfunction
6778ee4e0c1eSBram Moolenaar  call term_sendkeys(buf, ":call Test5()\n")
67796a2c5a7dSBram Moolenaar  call TermWait(buf)
6780ee4e0c1eSBram Moolenaar  call WaitForAssert({-> assert_match('^E1058:', term_getline(buf, 4))})
6781ee4e0c1eSBram Moolenaar  call term_sendkeys(buf, "\<C-C>\n")
67826a2c5a7dSBram Moolenaar  call TermWait(buf)
6783ee4e0c1eSBram Moolenaar
67849f6277bdSBram Moolenaar  "let l = ''
67859f6277bdSBram Moolenaar  "for i in range(1, 6)
67869f6277bdSBram Moolenaar  "  let l ..= term_getline(buf, i) . "\n"
67879f6277bdSBram Moolenaar  "endfor
67889f6277bdSBram Moolenaar  "call assert_report(l)
67899f6277bdSBram Moolenaar
67909f6277bdSBram Moolenaar  call StopVimInTerminal(buf)
67919f6277bdSBram Moolenaar  call delete('Xscript')
67929f6277bdSBram Moolenaarendfunc
67939f6277bdSBram Moolenaar
67948b633135SBram Moolenaar" Test for errors in converting to float from various types         {{{1
67958b633135SBram Moolenaarfunc Test_float_conversion_errors()
67968b633135SBram Moolenaar  if has('float')
67978b633135SBram Moolenaar    call assert_fails('let x = 4.0 % 2.0', 'E804')
67988b633135SBram Moolenaar    call assert_fails('echo 1.1[0]', 'E806')
67998b633135SBram Moolenaar    call assert_fails('echo sort([function("min"), 1], "f")', 'E891:')
68008b633135SBram Moolenaar    call assert_fails('echo 3.2 == "vim"', 'E892:')
68018b633135SBram Moolenaar    call assert_fails('echo sort([[], 1], "f")', 'E893:')
68028b633135SBram Moolenaar    call assert_fails('echo sort([{}, 1], "f")', 'E894:')
68038b633135SBram Moolenaar    call assert_fails('echo 3.2 == v:true', 'E362:')
68048b633135SBram Moolenaar    call assert_fails('echo 3.2 == v:none', 'E907:')
68058b633135SBram Moolenaar  endif
68068b633135SBram Moolenaarendfunc
68078b633135SBram Moolenaar
68088e6cbb72SBram Moolenaar" invalid function names               {{{1
680908f4157cSBram Moolenaarfunc Test_invalid_function_names()
681008f4157cSBram Moolenaar  " function name not starting with capital
681108f4157cSBram Moolenaar  let caught_e128 = 0
681208f4157cSBram Moolenaar  try
681308f4157cSBram Moolenaar    func! g:test()
681408f4157cSBram Moolenaar      echo "test"
681508f4157cSBram Moolenaar    endfunc
681608f4157cSBram Moolenaar  catch /E128:/
681708f4157cSBram Moolenaar    let caught_e128 = 1
681808f4157cSBram Moolenaar  endtry
681908f4157cSBram Moolenaar  call assert_equal(1, caught_e128)
682008f4157cSBram Moolenaar
682108f4157cSBram Moolenaar  " function name includes a colon
682208f4157cSBram Moolenaar  let caught_e884 = 0
682308f4157cSBram Moolenaar  try
682408f4157cSBram Moolenaar    func! b:test()
682508f4157cSBram Moolenaar      echo "test"
682608f4157cSBram Moolenaar    endfunc
682708f4157cSBram Moolenaar  catch /E884:/
682808f4157cSBram Moolenaar    let caught_e884 = 1
682908f4157cSBram Moolenaar  endtry
683008f4157cSBram Moolenaar  call assert_equal(1, caught_e884)
683108f4157cSBram Moolenaar
683208f4157cSBram Moolenaar  " function name folowed by #
683308f4157cSBram Moolenaar  let caught_e128 = 0
683408f4157cSBram Moolenaar  try
683508f4157cSBram Moolenaar    func! test2() "#
683608f4157cSBram Moolenaar      echo "test2"
683708f4157cSBram Moolenaar    endfunc
683808f4157cSBram Moolenaar  catch /E128:/
683908f4157cSBram Moolenaar    let caught_e128 = 1
684008f4157cSBram Moolenaar  endtry
684108f4157cSBram Moolenaar  call assert_equal(1, caught_e128)
684208f4157cSBram Moolenaar
684308f4157cSBram Moolenaar  " function name starting with/without "g:", buffer-local funcref.
684408f4157cSBram Moolenaar  function! g:Foo(n)
684508f4157cSBram Moolenaar    return 'called Foo(' . a:n . ')'
684608f4157cSBram Moolenaar  endfunction
684708f4157cSBram Moolenaar  let b:my_func = function('Foo')
684808f4157cSBram Moolenaar  call assert_equal('called Foo(1)', b:my_func(1))
684908f4157cSBram Moolenaar  call assert_equal('called Foo(2)', g:Foo(2))
685008f4157cSBram Moolenaar  call assert_equal('called Foo(3)', Foo(3))
685108f4157cSBram Moolenaar  delfunc g:Foo
685208f4157cSBram Moolenaar
685308f4157cSBram Moolenaar  " script-local function used in Funcref must exist.
685408f4157cSBram Moolenaar  let lines =<< trim END
685508f4157cSBram Moolenaar    func s:Testje()
685608f4157cSBram Moolenaar      return "foo"
685708f4157cSBram Moolenaar    endfunc
685808f4157cSBram Moolenaar    let Bar = function('s:Testje')
685908f4157cSBram Moolenaar    call assert_equal(0, exists('s:Testje'))
686008f4157cSBram Moolenaar    call assert_equal(1, exists('*s:Testje'))
686108f4157cSBram Moolenaar    call assert_equal(1, exists('Bar'))
686208f4157cSBram Moolenaar    call assert_equal(1, exists('*Bar'))
686308f4157cSBram Moolenaar  END
686408f4157cSBram Moolenaar  call writefile(lines, 'Xscript')
686508f4157cSBram Moolenaar  source Xscript
686608f4157cSBram Moolenaar  call delete('Xscript')
686708f4157cSBram Moolenaarendfunc
686808f4157cSBram Moolenaar
68698e6cbb72SBram Moolenaar" substring and variable name              {{{1
687008f4157cSBram Moolenaarfunc Test_substring_var()
687108f4157cSBram Moolenaar  let str = 'abcdef'
687208f4157cSBram Moolenaar  let n = 3
687308f4157cSBram Moolenaar  call assert_equal('def', str[n:])
687408f4157cSBram Moolenaar  call assert_equal('abcd', str[:n])
687508f4157cSBram Moolenaar  call assert_equal('d', str[n:n])
687608f4157cSBram Moolenaar  unlet n
687708f4157cSBram Moolenaar  let nn = 3
687808f4157cSBram Moolenaar  call assert_equal('def', str[nn:])
687908f4157cSBram Moolenaar  call assert_equal('abcd', str[:nn])
688008f4157cSBram Moolenaar  call assert_equal('d', str[nn:nn])
688108f4157cSBram Moolenaar  unlet nn
688208f4157cSBram Moolenaar  let b:nn = 4
688308f4157cSBram Moolenaar  call assert_equal('ef', str[b:nn:])
688408f4157cSBram Moolenaar  call assert_equal('abcde', str[:b:nn])
688508f4157cSBram Moolenaar  call assert_equal('e', str[b:nn:b:nn])
688608f4157cSBram Moolenaar  unlet b:nn
688708f4157cSBram Moolenaarendfunc
688808f4157cSBram Moolenaar
68898e6cbb72SBram Moolenaar" Test using s: with a typed command              {{{1
68908e6cbb72SBram Moolenaarfunc Test_typed_script_var()
68918e6cbb72SBram Moolenaar  CheckRunVimInTerminal
68928e6cbb72SBram Moolenaar
68938e6cbb72SBram Moolenaar  let buf = RunVimInTerminal('', {'rows': 6})
68948e6cbb72SBram Moolenaar
68958e6cbb72SBram Moolenaar  " Deep nesting of if ... endif
68968e6cbb72SBram Moolenaar  call term_sendkeys(buf, ":echo get(s:, 'foo', 'x')\n")
68978e6cbb72SBram Moolenaar  call TermWait(buf)
68988e6cbb72SBram Moolenaar  call WaitForAssert({-> assert_match('^E116:', term_getline(buf, 5))})
68998e6cbb72SBram Moolenaar
69008e6cbb72SBram Moolenaar  call StopVimInTerminal(buf)
69018e6cbb72SBram Moolenaarendfunc
69028e6cbb72SBram Moolenaar
6903863e80b4SBram Moolenaar"-------------------------------------------------------------------------------
6904b544f3c8SBram Moolenaar" Modelines								    {{{1
69051f068233SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
6906b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
6907