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