15d7ead3bSBram Moolenaar" Test various aspects of the Vim script language.
2b544f3c8SBram Moolenaar" Most of this was formerly in test49.
3b544f3c8SBram Moolenaar
48c5a278fSBram Moolenaarsource check.vim
593344c2dSBram Moolenaarsource shared.vim
6a6296200SBram Moolenaarsource script_util.vim
78c5a278fSBram Moolenaar
8b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
9b544f3c8SBram Moolenaar" Test environment							    {{{1
10b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
11b544f3c8SBram Moolenaar
12b544f3c8SBram Moolenaar" Append a message to the "messages" file
131e115360SBram Moolenaarfunc Xout(text)
14b544f3c8SBram Moolenaar    split messages
15b544f3c8SBram Moolenaar    $put =a:text
16b544f3c8SBram Moolenaar    wq
17b544f3c8SBram Moolenaarendfunc
18b544f3c8SBram Moolenaar
19b544f3c8SBram Moolenaarcom! -nargs=1	     Xout     call Xout(<args>)
20b544f3c8SBram Moolenaar
21a6296200SBram Moolenaar" Create a new instance of Vim and run the commands in 'test' and then 'verify'
22a6296200SBram Moolenaar" The commands in 'test' are expected to store the test results in the Xtest.out
23a6296200SBram Moolenaar" file. If the test passes successfully, then Xtest.out should be empty.
24a6296200SBram Moolenaarfunc RunInNewVim(test, verify)
25a6296200SBram Moolenaar  let init =<< trim END
26a6296200SBram Moolenaar    source script_util.vim
27a6296200SBram Moolenaar    XpathINIT
28a6296200SBram Moolenaar    XloopINIT
29a6296200SBram Moolenaar  END
30a6296200SBram Moolenaar  let cleanup =<< trim END
31a6296200SBram Moolenaar    call writefile(v:errors, 'Xtest.out')
32a6296200SBram Moolenaar    qall
33a6296200SBram Moolenaar  END
34a6296200SBram Moolenaar  call writefile(init, 'Xtest.vim')
35a6296200SBram Moolenaar  call writefile(a:test, 'Xtest.vim', 'a')
36a6296200SBram Moolenaar  call writefile(a:verify, 'Xverify.vim')
37a6296200SBram Moolenaar  call writefile(cleanup, 'Xverify.vim', 'a')
38a6296200SBram Moolenaar  call RunVim([], [], "-S Xtest.vim -S Xverify.vim")
39a6296200SBram Moolenaar  call assert_equal([], readfile('Xtest.out'))
40a6296200SBram Moolenaar  call delete('Xtest.out')
41a6296200SBram Moolenaar  call delete('Xtest.vim')
42a6296200SBram Moolenaar  call delete('Xverify.vim')
431e115360SBram Moolenaarendfunc
44b544f3c8SBram Moolenaar
45b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
46b544f3c8SBram Moolenaar" Test 1:   :endwhile in function					    {{{1
47b544f3c8SBram Moolenaar"
48b544f3c8SBram Moolenaar"	    Detect if a broken loop is (incorrectly) reactivated by the
49b544f3c8SBram Moolenaar"	    :endwhile.  Use a :return to prevent an endless loop, and make
50b544f3c8SBram Moolenaar"	    this test first to get a meaningful result on an error before other
51b544f3c8SBram Moolenaar"	    tests will hang.
52b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
53b544f3c8SBram Moolenaar
54a6296200SBram Moolenaarfunc T1_F()
55b544f3c8SBram Moolenaar    Xpath 'a'
56b544f3c8SBram Moolenaar    let first = 1
57b544f3c8SBram Moolenaar    while 1
58b544f3c8SBram Moolenaar	Xpath 'b'
59b544f3c8SBram Moolenaar	if first
60b544f3c8SBram Moolenaar	    Xpath 'c'
61b544f3c8SBram Moolenaar	    let first = 0
62b544f3c8SBram Moolenaar	    break
63b544f3c8SBram Moolenaar	else
64b544f3c8SBram Moolenaar	    Xpath 'd'
65b544f3c8SBram Moolenaar	    return
66b544f3c8SBram Moolenaar	endif
67b544f3c8SBram Moolenaar    endwhile
68a6296200SBram Moolenaarendfunc
69b544f3c8SBram Moolenaar
70a6296200SBram Moolenaarfunc T1_G()
71b544f3c8SBram Moolenaar    Xpath 'h'
72b544f3c8SBram Moolenaar    let first = 1
73b544f3c8SBram Moolenaar    while 1
74b544f3c8SBram Moolenaar	Xpath 'i'
75b544f3c8SBram Moolenaar	if first
76b544f3c8SBram Moolenaar	    Xpath 'j'
77b544f3c8SBram Moolenaar	    let first = 0
78b544f3c8SBram Moolenaar	    break
79b544f3c8SBram Moolenaar	else
80b544f3c8SBram Moolenaar	    Xpath 'k'
81b544f3c8SBram Moolenaar	    return
82b544f3c8SBram Moolenaar	endif
83b544f3c8SBram Moolenaar	if 1	" unmatched :if
84b544f3c8SBram Moolenaar    endwhile
85a6296200SBram Moolenaarendfunc
86b544f3c8SBram Moolenaar
87b544f3c8SBram Moolenaarfunc Test_endwhile_function()
88b544f3c8SBram Moolenaar  XpathINIT
89b544f3c8SBram Moolenaar  call T1_F()
90b544f3c8SBram Moolenaar  Xpath 'F'
91b544f3c8SBram Moolenaar
92b544f3c8SBram Moolenaar  try
93b544f3c8SBram Moolenaar    call T1_G()
94b544f3c8SBram Moolenaar  catch
95b544f3c8SBram Moolenaar    " Catch missing :endif
96b544f3c8SBram Moolenaar    call assert_true(v:exception =~ 'E171')
97b544f3c8SBram Moolenaar    Xpath 'x'
98b544f3c8SBram Moolenaar  endtry
99b544f3c8SBram Moolenaar  Xpath 'G'
100b544f3c8SBram Moolenaar
101b544f3c8SBram Moolenaar  call assert_equal('abcFhijxG', g:Xpath)
102b544f3c8SBram Moolenaarendfunc
103b544f3c8SBram Moolenaar
104b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
105b544f3c8SBram Moolenaar" Test 2:   :endwhile in script						    {{{1
106b544f3c8SBram Moolenaar"
107b544f3c8SBram Moolenaar"	    Detect if a broken loop is (incorrectly) reactivated by the
108b544f3c8SBram Moolenaar"	    :endwhile.  Use a :finish to prevent an endless loop, and place
109b544f3c8SBram Moolenaar"	    this test before others that might hang to get a meaningful result
110b544f3c8SBram Moolenaar"	    on an error.
111b544f3c8SBram Moolenaar"
112b544f3c8SBram Moolenaar"	    This test executes the bodies of the functions T1_F and T1_G from
113b544f3c8SBram Moolenaar"	    the previous test as script files (:return replaced by :finish).
114b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
115b544f3c8SBram Moolenaar
116b544f3c8SBram Moolenaarfunc Test_endwhile_script()
117b544f3c8SBram Moolenaar  XpathINIT
118b544f3c8SBram Moolenaar  ExecAsScript T1_F
119b544f3c8SBram Moolenaar  Xpath 'F'
120b544f3c8SBram Moolenaar  call DeleteTheScript()
121b544f3c8SBram Moolenaar
122b544f3c8SBram Moolenaar  try
123b544f3c8SBram Moolenaar    ExecAsScript T1_G
124b544f3c8SBram Moolenaar  catch
125b544f3c8SBram Moolenaar    " Catch missing :endif
126b544f3c8SBram Moolenaar    call assert_true(v:exception =~ 'E171')
127b544f3c8SBram Moolenaar    Xpath 'x'
128b544f3c8SBram Moolenaar  endtry
129b544f3c8SBram Moolenaar  Xpath 'G'
130b544f3c8SBram Moolenaar  call DeleteTheScript()
131b544f3c8SBram Moolenaar
132b544f3c8SBram Moolenaar  call assert_equal('abcFhijxG', g:Xpath)
133b544f3c8SBram Moolenaarendfunc
134b544f3c8SBram Moolenaar
135b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
136b544f3c8SBram Moolenaar" Test 3:   :if, :elseif, :while, :continue, :break			    {{{1
137b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
138b544f3c8SBram Moolenaar
139a6296200SBram Moolenaarfunc Test_if_while()
140b544f3c8SBram Moolenaar    XpathINIT
141b544f3c8SBram Moolenaar    if 1
142b544f3c8SBram Moolenaar	Xpath 'a'
143b544f3c8SBram Moolenaar	let loops = 3
144b544f3c8SBram Moolenaar	while loops > -1	    " main loop: loops == 3, 2, 1 (which breaks)
145b544f3c8SBram Moolenaar	    if loops <= 0
146b544f3c8SBram Moolenaar		let break_err = 1
147b544f3c8SBram Moolenaar		let loops = -1
148b544f3c8SBram Moolenaar	    else
149b544f3c8SBram Moolenaar		Xpath 'b' . loops
150b544f3c8SBram Moolenaar	    endif
151b544f3c8SBram Moolenaar	    if (loops == 2)
152b544f3c8SBram Moolenaar		while loops == 2 " dummy loop
153b544f3c8SBram Moolenaar		    Xpath 'c' . loops
154b544f3c8SBram Moolenaar		    let loops = loops - 1
155b544f3c8SBram Moolenaar		    continue    " stop dummy loop
156b544f3c8SBram Moolenaar		    Xpath 'd' . loops
157b544f3c8SBram Moolenaar		endwhile
158b544f3c8SBram Moolenaar		continue	    " continue main loop
159b544f3c8SBram Moolenaar		Xpath 'e' . loops
160b544f3c8SBram Moolenaar	    elseif (loops == 1)
161b544f3c8SBram Moolenaar		let p = 1
162b544f3c8SBram Moolenaar		while p	    " dummy loop
163b544f3c8SBram Moolenaar		    Xpath 'f' . loops
164b544f3c8SBram Moolenaar		    let p = 0
165b544f3c8SBram Moolenaar		    break	    " break dummy loop
166b544f3c8SBram Moolenaar		    Xpath 'g' . loops
167b544f3c8SBram Moolenaar		endwhile
168b544f3c8SBram Moolenaar		Xpath 'h' . loops
169b544f3c8SBram Moolenaar		unlet p
170b544f3c8SBram Moolenaar		break	    " break main loop
171b544f3c8SBram Moolenaar		Xpath 'i' . loops
172b544f3c8SBram Moolenaar	    endif
173b544f3c8SBram Moolenaar	    if (loops > 0)
174b544f3c8SBram Moolenaar		Xpath 'j' . loops
175b544f3c8SBram Moolenaar	    endif
176b544f3c8SBram Moolenaar	    while loops == 3    " dummy loop
177b544f3c8SBram Moolenaar		let loops = loops - 1
178b544f3c8SBram Moolenaar	    endwhile	    " end dummy loop
179b544f3c8SBram Moolenaar	endwhile		    " end main loop
180b544f3c8SBram Moolenaar	Xpath 'k'
181b544f3c8SBram Moolenaar    else
182b544f3c8SBram Moolenaar	Xpath 'l'
183b544f3c8SBram Moolenaar    endif
184b544f3c8SBram Moolenaar    Xpath 'm'
185b544f3c8SBram Moolenaar    if exists("break_err")
186b544f3c8SBram Moolenaar	Xpath 'm'
187b544f3c8SBram Moolenaar	unlet break_err
188b544f3c8SBram Moolenaar    endif
189b544f3c8SBram Moolenaar
190b544f3c8SBram Moolenaar    unlet loops
191b544f3c8SBram Moolenaar
192b544f3c8SBram Moolenaar    call assert_equal('ab3j3b2c2b1f1h1km', g:Xpath)
193b544f3c8SBram Moolenaarendfunc
194b544f3c8SBram Moolenaar
195b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
196b544f3c8SBram Moolenaar" Test 4:   :return							    {{{1
197b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
198b544f3c8SBram Moolenaar
199a6296200SBram Moolenaarfunc T4_F()
200b544f3c8SBram Moolenaar    if 1
201b544f3c8SBram Moolenaar	Xpath 'a'
202b544f3c8SBram Moolenaar	let loops = 3
203b544f3c8SBram Moolenaar	while loops > 0				"    3:  2:     1:
204b544f3c8SBram Moolenaar	    Xpath 'b' . loops
205b544f3c8SBram Moolenaar	    if (loops == 2)
206b544f3c8SBram Moolenaar		Xpath 'c' . loops
207b544f3c8SBram Moolenaar		return
208b544f3c8SBram Moolenaar		Xpath 'd' . loops
209b544f3c8SBram Moolenaar	    endif
210b544f3c8SBram Moolenaar	    Xpath 'e' . loops
211b544f3c8SBram Moolenaar	    let loops = loops - 1
212b544f3c8SBram Moolenaar	endwhile
213b544f3c8SBram Moolenaar	Xpath 'f'
214b544f3c8SBram Moolenaar    else
215b544f3c8SBram Moolenaar	Xpath 'g'
216b544f3c8SBram Moolenaar    endif
217a6296200SBram Moolenaarendfunc
218b544f3c8SBram Moolenaar
219a6296200SBram Moolenaarfunc Test_return()
220b544f3c8SBram Moolenaar    XpathINIT
221b544f3c8SBram Moolenaar    call T4_F()
222b544f3c8SBram Moolenaar    Xpath '4'
223b544f3c8SBram Moolenaar
224b544f3c8SBram Moolenaar    call assert_equal('ab3e3b2c24', g:Xpath)
225a6296200SBram Moolenaarendfunc
226b544f3c8SBram Moolenaar
227b544f3c8SBram Moolenaar
228b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
229b544f3c8SBram Moolenaar" Test 5:   :finish							    {{{1
230b544f3c8SBram Moolenaar"
231b544f3c8SBram Moolenaar"	    This test executes the body of the function T4_F from the previous
232b544f3c8SBram Moolenaar"	    test as a script file (:return replaced by :finish).
233b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
234b544f3c8SBram Moolenaar
235a6296200SBram Moolenaarfunc Test_finish()
236b544f3c8SBram Moolenaar    XpathINIT
237b544f3c8SBram Moolenaar    ExecAsScript T4_F
238b544f3c8SBram Moolenaar    Xpath '5'
239b544f3c8SBram Moolenaar    call DeleteTheScript()
240b544f3c8SBram Moolenaar
241b544f3c8SBram Moolenaar    call assert_equal('ab3e3b2c25', g:Xpath)
242a6296200SBram Moolenaarendfunc
243b544f3c8SBram Moolenaar
244b544f3c8SBram Moolenaar
245b544f3c8SBram Moolenaar
246b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
247b544f3c8SBram Moolenaar" Test 6:   Defining functions in :while loops				    {{{1
248b544f3c8SBram Moolenaar"
249b544f3c8SBram Moolenaar"	     Functions can be defined inside other functions.  An inner function
250b544f3c8SBram Moolenaar"	     gets defined when the outer function is executed.  Functions may
251b544f3c8SBram Moolenaar"	     also be defined inside while loops.  Expressions in braces for
252b544f3c8SBram Moolenaar"	     defining the function name are allowed.
253b544f3c8SBram Moolenaar"
254b544f3c8SBram Moolenaar"	     The functions are defined when sourcing the script, only the
255b544f3c8SBram Moolenaar"	     resulting path is checked in the test function.
256b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
257b544f3c8SBram Moolenaar
258b544f3c8SBram MoolenaarXpathINIT
259b544f3c8SBram Moolenaar
260b544f3c8SBram Moolenaar" The command CALL collects the argument of all its invocations in "calls"
261b544f3c8SBram Moolenaar" when used from a function (that is, when the global variable "calls" needs
262b544f3c8SBram Moolenaar" the "g:" prefix).  This is to check that the function code is skipped when
263b544f3c8SBram Moolenaar" the function is defined.  For inner functions, do so only if the outer
264b544f3c8SBram Moolenaar" function is not being executed.
265b544f3c8SBram Moolenaar"
266b544f3c8SBram Moolenaarlet calls = ""
267b544f3c8SBram Moolenaarcom! -nargs=1 CALL
268b544f3c8SBram Moolenaar	    \ if !exists("calls") && !exists("outer") |
269b544f3c8SBram Moolenaar	    \ let g:calls = g:calls . <args> |
270b544f3c8SBram Moolenaar	    \ endif
271b544f3c8SBram Moolenaar
272b544f3c8SBram Moolenaarlet i = 0
273b544f3c8SBram Moolenaarwhile i < 3
274b544f3c8SBram Moolenaar    let i = i + 1
275b544f3c8SBram Moolenaar    if i == 1
276b544f3c8SBram Moolenaar	Xpath 'a'
277b544f3c8SBram Moolenaar	function! F1(arg)
278b544f3c8SBram Moolenaar	    CALL a:arg
279b544f3c8SBram Moolenaar	    let outer = 1
280b544f3c8SBram Moolenaar
281b544f3c8SBram Moolenaar	    let j = 0
282b544f3c8SBram Moolenaar	    while j < 1
283b544f3c8SBram Moolenaar		Xpath 'b'
284b544f3c8SBram Moolenaar		let j = j + 1
285b544f3c8SBram Moolenaar		function! G1(arg)
286b544f3c8SBram Moolenaar		    CALL a:arg
287b544f3c8SBram Moolenaar		endfunction
288b544f3c8SBram Moolenaar		Xpath 'c'
289b544f3c8SBram Moolenaar	    endwhile
290b544f3c8SBram Moolenaar	endfunction
291b544f3c8SBram Moolenaar	Xpath 'd'
292b544f3c8SBram Moolenaar
293b544f3c8SBram Moolenaar	continue
294b544f3c8SBram Moolenaar    endif
295b544f3c8SBram Moolenaar
296b544f3c8SBram Moolenaar    Xpath 'e' . i
297b544f3c8SBram Moolenaar    function! F{i}(i, arg)
298b544f3c8SBram Moolenaar	CALL a:arg
299b544f3c8SBram Moolenaar	let outer = 1
300b544f3c8SBram Moolenaar
301b544f3c8SBram Moolenaar	if a:i == 3
302b544f3c8SBram Moolenaar	    Xpath 'f'
303b544f3c8SBram Moolenaar	endif
304b544f3c8SBram Moolenaar	let k = 0
305b544f3c8SBram Moolenaar	while k < 3
306b544f3c8SBram Moolenaar	    Xpath 'g' . k
307b544f3c8SBram Moolenaar	    let k = k + 1
308b544f3c8SBram Moolenaar	    function! G{a:i}{k}(arg)
309b544f3c8SBram Moolenaar		CALL a:arg
310b544f3c8SBram Moolenaar	    endfunction
311b544f3c8SBram Moolenaar	    Xpath 'h' . k
312b544f3c8SBram Moolenaar	endwhile
313b544f3c8SBram Moolenaar    endfunction
314b544f3c8SBram Moolenaar    Xpath 'i'
315b544f3c8SBram Moolenaar
316b544f3c8SBram Moolenaarendwhile
317b544f3c8SBram Moolenaar
318b544f3c8SBram Moolenaarif exists("*G1")
319b544f3c8SBram Moolenaar    Xpath 'j'
320b544f3c8SBram Moolenaarendif
321b544f3c8SBram Moolenaarif exists("*F1")
322b544f3c8SBram Moolenaar    call F1("F1")
323b544f3c8SBram Moolenaar    if exists("*G1")
324b544f3c8SBram Moolenaar       call G1("G1")
325b544f3c8SBram Moolenaar    endif
326b544f3c8SBram Moolenaarendif
327b544f3c8SBram Moolenaar
328b544f3c8SBram Moolenaarif exists("G21") || exists("G22") || exists("G23")
329b544f3c8SBram Moolenaar    Xpath 'k'
330b544f3c8SBram Moolenaarendif
331b544f3c8SBram Moolenaarif exists("*F2")
332b544f3c8SBram Moolenaar    call F2(2, "F2")
333b544f3c8SBram Moolenaar    if exists("*G21")
334b544f3c8SBram Moolenaar       call G21("G21")
335b544f3c8SBram Moolenaar    endif
336b544f3c8SBram Moolenaar    if exists("*G22")
337b544f3c8SBram Moolenaar       call G22("G22")
338b544f3c8SBram Moolenaar    endif
339b544f3c8SBram Moolenaar    if exists("*G23")
340b544f3c8SBram Moolenaar       call G23("G23")
341b544f3c8SBram Moolenaar    endif
342b544f3c8SBram Moolenaarendif
343b544f3c8SBram Moolenaar
344b544f3c8SBram Moolenaarif exists("G31") || exists("G32") || exists("G33")
345b544f3c8SBram Moolenaar    Xpath 'l'
346b544f3c8SBram Moolenaarendif
347b544f3c8SBram Moolenaarif exists("*F3")
348b544f3c8SBram Moolenaar    call F3(3, "F3")
349b544f3c8SBram Moolenaar    if exists("*G31")
350b544f3c8SBram Moolenaar       call G31("G31")
351b544f3c8SBram Moolenaar    endif
352b544f3c8SBram Moolenaar    if exists("*G32")
353b544f3c8SBram Moolenaar       call G32("G32")
354b544f3c8SBram Moolenaar    endif
355b544f3c8SBram Moolenaar    if exists("*G33")
356b544f3c8SBram Moolenaar       call G33("G33")
357b544f3c8SBram Moolenaar    endif
358b544f3c8SBram Moolenaarendif
359b544f3c8SBram Moolenaar
360b544f3c8SBram MoolenaarXpath 'm'
361b544f3c8SBram Moolenaar
362b544f3c8SBram Moolenaarlet g:test6_result = g:Xpath
363b544f3c8SBram Moolenaarlet g:test6_calls = calls
364b544f3c8SBram Moolenaar
365b544f3c8SBram Moolenaarunlet calls
366b544f3c8SBram Moolenaardelfunction F1
367b544f3c8SBram Moolenaardelfunction G1
368b544f3c8SBram Moolenaardelfunction F2
369b544f3c8SBram Moolenaardelfunction G21
370b544f3c8SBram Moolenaardelfunction G22
371b544f3c8SBram Moolenaardelfunction G23
372b544f3c8SBram Moolenaardelfunction G31
373b544f3c8SBram Moolenaardelfunction G32
374b544f3c8SBram Moolenaardelfunction G33
375b544f3c8SBram Moolenaar
376a6296200SBram Moolenaarfunc Test_defining_functions()
377b544f3c8SBram Moolenaar    call assert_equal('ade2ie3ibcg0h1g1h2g2h3fg0h1g1h2g2h3m', g:test6_result)
378b544f3c8SBram Moolenaar    call assert_equal('F1G1F2G21G22G23F3G31G32G33', g:test6_calls)
379b544f3c8SBram Moolenaarendfunc
380b544f3c8SBram Moolenaar
381b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
382b544f3c8SBram Moolenaar" Test 7:   Continuing on errors outside functions			    {{{1
383b544f3c8SBram Moolenaar"
384b544f3c8SBram Moolenaar"	    On an error outside a function, the script processing continues
385b544f3c8SBram Moolenaar"	    at the line following the outermost :endif or :endwhile.  When not
386b544f3c8SBram Moolenaar"	    inside an :if or :while, the script processing continues at the next
387b544f3c8SBram Moolenaar"	    line.
388b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
389b544f3c8SBram Moolenaar
390b544f3c8SBram MoolenaarXpathINIT
391b544f3c8SBram Moolenaar
392b544f3c8SBram Moolenaarif 1
393b544f3c8SBram Moolenaar    Xpath 'a'
394b544f3c8SBram Moolenaar    while 1
395b544f3c8SBram Moolenaar	Xpath 'b'
396b544f3c8SBram Moolenaar	asdf
397b544f3c8SBram Moolenaar	Xpath 'c'
398b544f3c8SBram Moolenaar	break
399b544f3c8SBram Moolenaar    endwhile | Xpath 'd'
400b544f3c8SBram Moolenaar    Xpath 'e'
401b544f3c8SBram Moolenaarendif | Xpath 'f'
402b544f3c8SBram MoolenaarXpath 'g'
403b544f3c8SBram Moolenaar
404b544f3c8SBram Moolenaarwhile 1
405b544f3c8SBram Moolenaar    Xpath 'h'
406b544f3c8SBram Moolenaar    if 1
407b544f3c8SBram Moolenaar	Xpath 'i'
408b544f3c8SBram Moolenaar	asdf
409b544f3c8SBram Moolenaar	Xpath 'j'
410b544f3c8SBram Moolenaar    endif | Xpath 'k'
411b544f3c8SBram Moolenaar    Xpath 'l'
412b544f3c8SBram Moolenaar    break
413b544f3c8SBram Moolenaarendwhile | Xpath 'm'
414b544f3c8SBram MoolenaarXpath 'n'
415b544f3c8SBram Moolenaar
416b544f3c8SBram Moolenaarasdf
417b544f3c8SBram MoolenaarXpath 'o'
418b544f3c8SBram Moolenaar
419b544f3c8SBram Moolenaarasdf | Xpath 'p'
420b544f3c8SBram MoolenaarXpath 'q'
421b544f3c8SBram Moolenaar
422b544f3c8SBram Moolenaarlet g:test7_result = g:Xpath
423b544f3c8SBram Moolenaar
424b544f3c8SBram Moolenaarfunc Test_error_in_script()
425b544f3c8SBram Moolenaar    call assert_equal('abghinoq', g:test7_result)
426b544f3c8SBram Moolenaarendfunc
427b544f3c8SBram Moolenaar
428b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
429b544f3c8SBram Moolenaar" Test 8:   Aborting and continuing on errors inside functions		    {{{1
430b544f3c8SBram Moolenaar"
431b544f3c8SBram Moolenaar"	    On an error inside a function without the "abort" attribute, the
432b544f3c8SBram Moolenaar"	    script processing continues at the next line (unless the error was
433b544f3c8SBram Moolenaar"	    in a :return command).  On an error inside a function with the
434b544f3c8SBram Moolenaar"	    "abort" attribute, the function is aborted and the script processing
435b544f3c8SBram Moolenaar"	    continues after the function call; the value -1 is returned then.
436b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
437b544f3c8SBram Moolenaar
438b544f3c8SBram MoolenaarXpathINIT
439b544f3c8SBram Moolenaar
440a6296200SBram Moolenaarfunc T8_F()
441b544f3c8SBram Moolenaar    if 1
442b544f3c8SBram Moolenaar	Xpath 'a'
443b544f3c8SBram Moolenaar	while 1
444b544f3c8SBram Moolenaar	    Xpath 'b'
445b544f3c8SBram Moolenaar	    asdf
446b544f3c8SBram Moolenaar	    Xpath 'c'
447b544f3c8SBram Moolenaar	    asdf | Xpath 'd'
448b544f3c8SBram Moolenaar	    Xpath 'e'
449b544f3c8SBram Moolenaar	    break
450b544f3c8SBram Moolenaar	endwhile
451b544f3c8SBram Moolenaar	Xpath 'f'
452b544f3c8SBram Moolenaar    endif | Xpath 'g'
453b544f3c8SBram Moolenaar    Xpath 'h'
454b544f3c8SBram Moolenaar
455b544f3c8SBram Moolenaar    while 1
456b544f3c8SBram Moolenaar	Xpath 'i'
457b544f3c8SBram Moolenaar	if 1
458b544f3c8SBram Moolenaar	    Xpath 'j'
459b544f3c8SBram Moolenaar	    asdf
460b544f3c8SBram Moolenaar	    Xpath 'k'
461b544f3c8SBram Moolenaar	    asdf | Xpath 'l'
462b544f3c8SBram Moolenaar	    Xpath 'm'
463b544f3c8SBram Moolenaar	endif
464b544f3c8SBram Moolenaar	Xpath 'n'
465b544f3c8SBram Moolenaar	break
466b544f3c8SBram Moolenaar    endwhile | Xpath 'o'
467b544f3c8SBram Moolenaar    Xpath 'p'
468b544f3c8SBram Moolenaar
469b544f3c8SBram Moolenaar    return novar		" returns (default return value 0)
470b544f3c8SBram Moolenaar    Xpath 'q'
471b544f3c8SBram Moolenaar    return 1			" not reached
472a6296200SBram Moolenaarendfunc
473b544f3c8SBram Moolenaar
474a6296200SBram Moolenaarfunc T8_G() abort
475b544f3c8SBram Moolenaar    if 1
476b544f3c8SBram Moolenaar	Xpath 'r'
477b544f3c8SBram Moolenaar	while 1
478b544f3c8SBram Moolenaar	    Xpath 's'
479b544f3c8SBram Moolenaar	    asdf		" returns -1
480b544f3c8SBram Moolenaar	    Xpath 't'
481b544f3c8SBram Moolenaar	    break
482b544f3c8SBram Moolenaar	endwhile
483b544f3c8SBram Moolenaar	Xpath 'v'
484b544f3c8SBram Moolenaar    endif | Xpath 'w'
485b544f3c8SBram Moolenaar    Xpath 'x'
486b544f3c8SBram Moolenaar
487b544f3c8SBram Moolenaar    return -4			" not reached
488a6296200SBram Moolenaarendfunc
489b544f3c8SBram Moolenaar
490a6296200SBram Moolenaarfunc T8_H() abort
491b544f3c8SBram Moolenaar    while 1
492b544f3c8SBram Moolenaar	Xpath 'A'
493b544f3c8SBram Moolenaar	if 1
494b544f3c8SBram Moolenaar	    Xpath 'B'
495b544f3c8SBram Moolenaar	    asdf		" returns -1
496b544f3c8SBram Moolenaar	    Xpath 'C'
497b544f3c8SBram Moolenaar	endif
498b544f3c8SBram Moolenaar	Xpath 'D'
499b544f3c8SBram Moolenaar	break
500b544f3c8SBram Moolenaar    endwhile | Xpath 'E'
501b544f3c8SBram Moolenaar    Xpath 'F'
502b544f3c8SBram Moolenaar
503b544f3c8SBram Moolenaar    return -4			" not reached
504a6296200SBram Moolenaarendfunc
505b544f3c8SBram Moolenaar
506b544f3c8SBram Moolenaar" Aborted functions (T8_G and T8_H) return -1.
507b544f3c8SBram Moolenaarlet g:test8_sum = (T8_F() + 1) - 4 * T8_G() - 8 * T8_H()
508b544f3c8SBram MoolenaarXpath 'X'
509b544f3c8SBram Moolenaarlet g:test8_result = g:Xpath
510b544f3c8SBram Moolenaar
511b544f3c8SBram Moolenaarfunc Test_error_in_function()
512b544f3c8SBram Moolenaar    call assert_equal(13, g:test8_sum)
513b544f3c8SBram Moolenaar    call assert_equal('abcefghijkmnoprsABX', g:test8_result)
514b544f3c8SBram Moolenaar
515b544f3c8SBram Moolenaar    delfunction T8_F
516b544f3c8SBram Moolenaar    delfunction T8_G
517b544f3c8SBram Moolenaar    delfunction T8_H
518b544f3c8SBram Moolenaarendfunc
519b544f3c8SBram Moolenaar
520b544f3c8SBram Moolenaar
521b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
522b544f3c8SBram Moolenaar" Test 9:   Continuing after aborted functions				    {{{1
523b544f3c8SBram Moolenaar"
524b544f3c8SBram Moolenaar"	    When a function with the "abort" attribute is aborted due to an
525b544f3c8SBram Moolenaar"	    error, the next function back in the call hierarchy without an
526b544f3c8SBram Moolenaar"	    "abort" attribute continues; the value -1 is returned then.
527b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
528b544f3c8SBram Moolenaar
529b544f3c8SBram MoolenaarXpathINIT
530b544f3c8SBram Moolenaar
531a6296200SBram Moolenaarfunc F() abort
532b544f3c8SBram Moolenaar    Xpath 'a'
533b544f3c8SBram Moolenaar    let result = G()	" not aborted
534b544f3c8SBram Moolenaar    Xpath 'b'
535b544f3c8SBram Moolenaar    if result != 2
536b544f3c8SBram Moolenaar	Xpath 'c'
537b544f3c8SBram Moolenaar    endif
538b544f3c8SBram Moolenaar    return 1
539a6296200SBram Moolenaarendfunc
540b544f3c8SBram Moolenaar
541a6296200SBram Moolenaarfunc G()		" no abort attribute
542b544f3c8SBram Moolenaar    Xpath 'd'
543b544f3c8SBram Moolenaar    if H() != -1	" aborted
544b544f3c8SBram Moolenaar	Xpath 'e'
545b544f3c8SBram Moolenaar    endif
546b544f3c8SBram Moolenaar    Xpath 'f'
547b544f3c8SBram Moolenaar    return 2
548a6296200SBram Moolenaarendfunc
549b544f3c8SBram Moolenaar
550a6296200SBram Moolenaarfunc H() abort
551b544f3c8SBram Moolenaar    Xpath 'g'
552b544f3c8SBram Moolenaar    call I()		" aborted
553b544f3c8SBram Moolenaar    Xpath 'h'
554b544f3c8SBram Moolenaar    return 4
555a6296200SBram Moolenaarendfunc
556b544f3c8SBram Moolenaar
557a6296200SBram Moolenaarfunc I() abort
558b544f3c8SBram Moolenaar    Xpath 'i'
559b544f3c8SBram Moolenaar    asdf		" error
560b544f3c8SBram Moolenaar    Xpath 'j'
561b544f3c8SBram Moolenaar    return 8
562a6296200SBram Moolenaarendfunc
563b544f3c8SBram Moolenaar
564b544f3c8SBram Moolenaarif F() != 1
565b544f3c8SBram Moolenaar    Xpath 'k'
566b544f3c8SBram Moolenaarendif
567b544f3c8SBram Moolenaar
568b544f3c8SBram Moolenaarlet g:test9_result = g:Xpath
569b544f3c8SBram Moolenaar
570b544f3c8SBram Moolenaardelfunction F
571b544f3c8SBram Moolenaardelfunction G
572b544f3c8SBram Moolenaardelfunction H
573b544f3c8SBram Moolenaardelfunction I
574b544f3c8SBram Moolenaar
575b544f3c8SBram Moolenaarfunc Test_func_abort()
576b544f3c8SBram Moolenaar    call assert_equal('adgifb', g:test9_result)
577b544f3c8SBram Moolenaarendfunc
578b544f3c8SBram Moolenaar
579b544f3c8SBram Moolenaar
580b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
581b544f3c8SBram Moolenaar" Test 10:  :if, :elseif, :while argument parsing			    {{{1
582b544f3c8SBram Moolenaar"
583b544f3c8SBram Moolenaar"	    A '"' or '|' in an argument expression must not be mixed up with
584b544f3c8SBram Moolenaar"	    a comment or a next command after a bar.  Parsing errors should
585b544f3c8SBram Moolenaar"	    be recognized.
586b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
587b544f3c8SBram Moolenaar
588b544f3c8SBram MoolenaarXpathINIT
589b544f3c8SBram Moolenaar
590a6296200SBram Moolenaarfunc MSG(enr, emsg)
591b544f3c8SBram Moolenaar    let english = v:lang == "C" || v:lang =~ '^[Ee]n'
592b544f3c8SBram Moolenaar    if a:enr == ""
593b544f3c8SBram Moolenaar	Xout "TODO: Add message number for:" a:emsg
594b544f3c8SBram Moolenaar	let v:errmsg = ":" . v:errmsg
595b544f3c8SBram Moolenaar    endif
596b544f3c8SBram Moolenaar    let match = 1
597b544f3c8SBram Moolenaar    if v:errmsg !~ '^'.a:enr.':' || (english && v:errmsg !~ a:emsg)
598b544f3c8SBram Moolenaar	let match = 0
599b544f3c8SBram Moolenaar	if v:errmsg == ""
600b544f3c8SBram Moolenaar	    Xout "Message missing."
601b544f3c8SBram Moolenaar	else
602a4208966SBram Moolenaar	    let v:errmsg = v:errmsg->escape('"')
603b544f3c8SBram Moolenaar	    Xout "Unexpected message:" v:errmsg
604b544f3c8SBram Moolenaar	endif
605b544f3c8SBram Moolenaar    endif
606b544f3c8SBram Moolenaar    return match
6071e115360SBram Moolenaarendfunc
608b544f3c8SBram Moolenaar
609b544f3c8SBram Moolenaarif 1 || strlen("\"") | Xpath 'a'
610b544f3c8SBram Moolenaar    Xpath 'b'
611b544f3c8SBram Moolenaarendif
612b544f3c8SBram MoolenaarXpath 'c'
613b544f3c8SBram Moolenaar
614b544f3c8SBram Moolenaarif 0
615b544f3c8SBram Moolenaarelseif 1 || strlen("\"") | Xpath 'd'
616b544f3c8SBram Moolenaar    Xpath 'e'
617b544f3c8SBram Moolenaarendif
618b544f3c8SBram MoolenaarXpath 'f'
619b544f3c8SBram Moolenaar
620b544f3c8SBram Moolenaarwhile 1 || strlen("\"") | Xpath 'g'
621b544f3c8SBram Moolenaar    Xpath 'h'
622b544f3c8SBram Moolenaar    break
623b544f3c8SBram Moolenaarendwhile
624b544f3c8SBram MoolenaarXpath 'i'
625b544f3c8SBram Moolenaar
626b544f3c8SBram Moolenaarlet v:errmsg = ""
627b544f3c8SBram Moolenaarif 1 ||| strlen("\"") | Xpath 'j'
628b544f3c8SBram Moolenaar    Xpath 'k'
629b544f3c8SBram Moolenaarendif
630b544f3c8SBram MoolenaarXpath 'l'
631b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression")
632b544f3c8SBram Moolenaar    Xpath 'm'
633b544f3c8SBram Moolenaarendif
634b544f3c8SBram Moolenaar
635b544f3c8SBram Moolenaarlet v:errmsg = ""
636b544f3c8SBram Moolenaarif 0
637b544f3c8SBram Moolenaarelseif 1 ||| strlen("\"") | Xpath 'n'
638b544f3c8SBram Moolenaar    Xpath 'o'
639b544f3c8SBram Moolenaarendif
640b544f3c8SBram MoolenaarXpath 'p'
641b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression")
642b544f3c8SBram Moolenaar    Xpath 'q'
643b544f3c8SBram Moolenaarendif
644b544f3c8SBram Moolenaar
645b544f3c8SBram Moolenaarlet v:errmsg = ""
646b544f3c8SBram Moolenaarwhile 1 ||| strlen("\"") | Xpath 'r'
647b544f3c8SBram Moolenaar    Xpath 's'
648b544f3c8SBram Moolenaar    break
649b544f3c8SBram Moolenaarendwhile
650b544f3c8SBram MoolenaarXpath 't'
651b544f3c8SBram Moolenaarif !MSG('E15', "Invalid expression")
652b544f3c8SBram Moolenaar    Xpath 'u'
653b544f3c8SBram Moolenaarendif
654b544f3c8SBram Moolenaar
655b544f3c8SBram Moolenaarlet g:test10_result = g:Xpath
656b544f3c8SBram Moolenaardelfunction MSG
657b544f3c8SBram Moolenaar
658b544f3c8SBram Moolenaarfunc Test_expr_parsing()
659b544f3c8SBram Moolenaar    call assert_equal('abcdefghilpt', g:test10_result)
660b544f3c8SBram Moolenaarendfunc
661b544f3c8SBram Moolenaar
662b544f3c8SBram Moolenaar
663b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
664b544f3c8SBram Moolenaar" Test 11:  :if, :elseif, :while argument evaluation after abort	    {{{1
665b544f3c8SBram Moolenaar"
666b544f3c8SBram Moolenaar"	    When code is skipped over due to an error, the boolean argument to
667b544f3c8SBram Moolenaar"	    an :if, :elseif, or :while must not be evaluated.
668b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
669b544f3c8SBram Moolenaar
670b544f3c8SBram MoolenaarXpathINIT
671b544f3c8SBram Moolenaar
672b544f3c8SBram Moolenaarlet calls = 0
673b544f3c8SBram Moolenaar
674a6296200SBram Moolenaarfunc P(num)
675b544f3c8SBram Moolenaar    let g:calls = g:calls + a:num   " side effect on call
676b544f3c8SBram Moolenaar    return 0
677a6296200SBram Moolenaarendfunc
678b544f3c8SBram Moolenaar
679b544f3c8SBram Moolenaarif 1
680b544f3c8SBram Moolenaar    Xpath 'a'
681b544f3c8SBram Moolenaar    asdf		" error
682b544f3c8SBram Moolenaar    Xpath 'b'
683b544f3c8SBram Moolenaar    if P(1)		" should not be called
684b544f3c8SBram Moolenaar	Xpath 'c'
685b544f3c8SBram Moolenaar    elseif !P(2)	" should not be called
686b544f3c8SBram Moolenaar	Xpath 'd'
687b544f3c8SBram Moolenaar    else
688b544f3c8SBram Moolenaar	Xpath 'e'
689b544f3c8SBram Moolenaar    endif
690b544f3c8SBram Moolenaar    Xpath 'f'
691b544f3c8SBram Moolenaar    while P(4)		" should not be called
692b544f3c8SBram Moolenaar	Xpath 'g'
693b544f3c8SBram Moolenaar    endwhile
694b544f3c8SBram Moolenaar    Xpath 'h'
695b544f3c8SBram Moolenaarendif
696b544f3c8SBram MoolenaarXpath 'x'
697b544f3c8SBram Moolenaar
698b544f3c8SBram Moolenaarlet g:test11_calls = calls
699b544f3c8SBram Moolenaarlet g:test11_result = g:Xpath
700b544f3c8SBram Moolenaar
701b544f3c8SBram Moolenaarunlet calls
702b544f3c8SBram Moolenaardelfunction P
703b544f3c8SBram Moolenaar
704b544f3c8SBram Moolenaarfunc Test_arg_abort()
705b544f3c8SBram Moolenaar    call assert_equal(0, g:test11_calls)
706b544f3c8SBram Moolenaar    call assert_equal('ax', g:test11_result)
707b544f3c8SBram Moolenaarendfunc
708b544f3c8SBram Moolenaar
709b544f3c8SBram Moolenaar
710b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
711b544f3c8SBram Moolenaar" Test 12:  Expressions in braces in skipped code			    {{{1
712b544f3c8SBram Moolenaar"
713b544f3c8SBram Moolenaar"	    In code skipped over due to an error or inactive conditional,
714b544f3c8SBram Moolenaar"	    an expression in braces as part of a variable or function name
715b544f3c8SBram Moolenaar"	    should not be evaluated.
716b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
717b544f3c8SBram Moolenaar
718b544f3c8SBram MoolenaarXpathINIT
719b544f3c8SBram Moolenaar
720b544f3c8SBram Moolenaarfunction! NULL()
721b544f3c8SBram Moolenaar    Xpath 'a'
722b544f3c8SBram Moolenaar    return 0
723b544f3c8SBram Moolenaarendfunction
724b544f3c8SBram Moolenaar
725b544f3c8SBram Moolenaarfunction! ZERO()
726b544f3c8SBram Moolenaar    Xpath 'b'
727b544f3c8SBram Moolenaar    return 0
728b544f3c8SBram Moolenaarendfunction
729b544f3c8SBram Moolenaar
730b544f3c8SBram Moolenaarfunction! F0()
731b544f3c8SBram Moolenaar    Xpath 'c'
732b544f3c8SBram Moolenaarendfunction
733b544f3c8SBram Moolenaar
734b544f3c8SBram Moolenaarfunction! F1(arg)
735b544f3c8SBram Moolenaar    Xpath 'e'
736b544f3c8SBram Moolenaarendfunction
737b544f3c8SBram Moolenaar
738b544f3c8SBram Moolenaarlet V0 = 1
739b544f3c8SBram Moolenaar
740b544f3c8SBram MoolenaarXpath 'f'
741b544f3c8SBram Moolenaarecho 0 ? F{NULL() + V{ZERO()}}() : 1
742b544f3c8SBram Moolenaar
743b544f3c8SBram MoolenaarXpath 'g'
744b544f3c8SBram Moolenaarif 0
745b544f3c8SBram Moolenaar    Xpath 'h'
746b544f3c8SBram Moolenaar    call F{NULL() + V{ZERO()}}()
747b544f3c8SBram Moolenaarendif
748b544f3c8SBram Moolenaar
749b544f3c8SBram MoolenaarXpath 'i'
750b544f3c8SBram Moolenaarif 1
751b544f3c8SBram Moolenaar    asdf		" error
752b544f3c8SBram Moolenaar    Xpath 'j'
753b544f3c8SBram Moolenaar    call F1(F{NULL() + V{ZERO()}}())
754b544f3c8SBram Moolenaarendif
755b544f3c8SBram Moolenaar
756b544f3c8SBram MoolenaarXpath 'k'
757b544f3c8SBram Moolenaarif 1
758b544f3c8SBram Moolenaar    asdf		" error
759b544f3c8SBram Moolenaar    Xpath 'l'
760b544f3c8SBram Moolenaar    call F{NULL() + V{ZERO()}}()
761b544f3c8SBram Moolenaarendif
762b544f3c8SBram Moolenaar
763b544f3c8SBram Moolenaarlet g:test12_result = g:Xpath
764b544f3c8SBram Moolenaar
765b544f3c8SBram Moolenaarfunc Test_braces_skipped()
766b544f3c8SBram Moolenaar    call assert_equal('fgik', g:test12_result)
767b544f3c8SBram Moolenaarendfunc
768b544f3c8SBram Moolenaar
769b544f3c8SBram Moolenaar
770b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
771b544f3c8SBram Moolenaar" Test 13:  Failure in argument evaluation for :while			    {{{1
772b544f3c8SBram Moolenaar"
773b544f3c8SBram Moolenaar"	    A failure in the expression evaluation for the condition of a :while
774b544f3c8SBram Moolenaar"	    causes the whole :while loop until the matching :endwhile being
775b544f3c8SBram Moolenaar"	    ignored.  Continuation is at the next following line.
776b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
777b544f3c8SBram Moolenaar
778b544f3c8SBram MoolenaarXpathINIT
779b544f3c8SBram Moolenaar
780b544f3c8SBram MoolenaarXpath 'a'
781b544f3c8SBram Moolenaarwhile asdf
782b544f3c8SBram Moolenaar    Xpath 'b'
783b544f3c8SBram Moolenaar    while 1
784b544f3c8SBram Moolenaar	Xpath 'c'
785b544f3c8SBram Moolenaar	break
786b544f3c8SBram Moolenaar    endwhile
787b544f3c8SBram Moolenaar    Xpath 'd'
788b544f3c8SBram Moolenaar    break
789b544f3c8SBram Moolenaarendwhile
790b544f3c8SBram MoolenaarXpath 'e'
791b544f3c8SBram Moolenaar
792b544f3c8SBram Moolenaarwhile asdf | Xpath 'f' | endwhile | Xpath 'g'
793b544f3c8SBram MoolenaarXpath 'h'
794b544f3c8SBram Moolenaarlet g:test13_result = g:Xpath
795b544f3c8SBram Moolenaar
796b544f3c8SBram Moolenaarfunc Test_while_fail()
797b544f3c8SBram Moolenaar    call assert_equal('aeh', g:test13_result)
798b544f3c8SBram Moolenaarendfunc
799b544f3c8SBram Moolenaar
800b544f3c8SBram Moolenaar
801b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
802b544f3c8SBram Moolenaar" Test 14:  Failure in argument evaluation for :if			    {{{1
803b544f3c8SBram Moolenaar"
804b544f3c8SBram Moolenaar"	    A failure in the expression evaluation for the condition of an :if
805b544f3c8SBram Moolenaar"	    does not cause the corresponding :else or :endif being matched to
806b544f3c8SBram Moolenaar"	    a previous :if/:elseif.  Neither of both branches of the failed :if
807b544f3c8SBram Moolenaar"	    are executed.
808b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
809b544f3c8SBram Moolenaar
810b544f3c8SBram MoolenaarXpathINIT
811b544f3c8SBram Moolenaar
812b544f3c8SBram Moolenaarfunction! F()
813b544f3c8SBram Moolenaar    Xpath 'a'
814b544f3c8SBram Moolenaar    let x = 0
815b544f3c8SBram Moolenaar    if x		" false
816b544f3c8SBram Moolenaar	Xpath 'b'
817b544f3c8SBram Moolenaar    elseif !x		" always true
818b544f3c8SBram Moolenaar	Xpath 'c'
819b544f3c8SBram Moolenaar	let x = 1
820b544f3c8SBram Moolenaar	if g:boolvar	" possibly undefined
821b544f3c8SBram Moolenaar	    Xpath 'd'
822b544f3c8SBram Moolenaar	else
823b544f3c8SBram Moolenaar	    Xpath 'e'
824b544f3c8SBram Moolenaar	endif
825b544f3c8SBram Moolenaar	Xpath 'f'
826b544f3c8SBram Moolenaar    elseif x		" never executed
827b544f3c8SBram Moolenaar	Xpath 'g'
828b544f3c8SBram Moolenaar    endif
829b544f3c8SBram Moolenaar    Xpath 'h'
830b544f3c8SBram Moolenaarendfunction
831b544f3c8SBram Moolenaar
832b544f3c8SBram Moolenaarlet boolvar = 1
833b544f3c8SBram Moolenaarcall F()
834b544f3c8SBram MoolenaarXpath '-'
835b544f3c8SBram Moolenaar
836b544f3c8SBram Moolenaarunlet boolvar
837b544f3c8SBram Moolenaarcall F()
838b544f3c8SBram Moolenaarlet g:test14_result = g:Xpath
839b544f3c8SBram Moolenaar
840b544f3c8SBram Moolenaardelfunction F
841b544f3c8SBram Moolenaar
842b544f3c8SBram Moolenaarfunc Test_if_fail()
843b544f3c8SBram Moolenaar    call assert_equal('acdfh-acfh', g:test14_result)
844b544f3c8SBram Moolenaarendfunc
845b544f3c8SBram Moolenaar
846b544f3c8SBram Moolenaar
847b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
848b544f3c8SBram Moolenaar" Test 15:  Failure in argument evaluation for :if (bar)		    {{{1
849b544f3c8SBram Moolenaar"
850b544f3c8SBram Moolenaar"	    Like previous test, except that the failing :if ... | ... | :endif
851b544f3c8SBram Moolenaar"	    is in a single line.
852b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
853b544f3c8SBram Moolenaar
854b544f3c8SBram MoolenaarXpathINIT
855b544f3c8SBram Moolenaar
856b544f3c8SBram Moolenaarfunction! F()
857b544f3c8SBram Moolenaar    Xpath 'a'
858b544f3c8SBram Moolenaar    let x = 0
859b544f3c8SBram Moolenaar    if x		" false
860b544f3c8SBram Moolenaar	Xpath 'b'
861b544f3c8SBram Moolenaar    elseif !x		" always true
862b544f3c8SBram Moolenaar	Xpath 'c'
863b544f3c8SBram Moolenaar	let x = 1
864b544f3c8SBram Moolenaar	if g:boolvar | Xpath 'd' | else | Xpath 'e' | endif
865b544f3c8SBram Moolenaar	Xpath 'f'
866b544f3c8SBram Moolenaar    elseif x		" never executed
867b544f3c8SBram Moolenaar	Xpath 'g'
868b544f3c8SBram Moolenaar    endif
869b544f3c8SBram Moolenaar    Xpath 'h'
870b544f3c8SBram Moolenaarendfunction
871b544f3c8SBram Moolenaar
872b544f3c8SBram Moolenaarlet boolvar = 1
873b544f3c8SBram Moolenaarcall F()
874b544f3c8SBram MoolenaarXpath '-'
875b544f3c8SBram Moolenaar
876b544f3c8SBram Moolenaarunlet boolvar
877b544f3c8SBram Moolenaarcall F()
878b544f3c8SBram Moolenaarlet g:test15_result = g:Xpath
879b544f3c8SBram Moolenaar
880b544f3c8SBram Moolenaardelfunction F
881b544f3c8SBram Moolenaar
882b544f3c8SBram Moolenaarfunc Test_if_bar_fail()
883b544f3c8SBram Moolenaar    call assert_equal('acdfh-acfh', g:test15_result)
884b544f3c8SBram Moolenaarendfunc
885b544f3c8SBram Moolenaar
886b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
8871f068233SBram Moolenaar" Test 16:  Double :else or :elseif after :else				    {{{1
8881f068233SBram Moolenaar"
8891f068233SBram Moolenaar"	    Multiple :elses or an :elseif after an :else are forbidden.
8901f068233SBram Moolenaar"-------------------------------------------------------------------------------
8911f068233SBram Moolenaar
8921f068233SBram Moolenaarfunc T16_F() abort
8931f068233SBram Moolenaar  if 0
8941f068233SBram Moolenaar    Xpath 'a'
8951f068233SBram Moolenaar  else
8961f068233SBram Moolenaar    Xpath 'b'
8971f068233SBram Moolenaar  else		" aborts function
8981f068233SBram Moolenaar    Xpath 'c'
8991f068233SBram Moolenaar  endif
9001f068233SBram Moolenaar  Xpath 'd'
9011f068233SBram Moolenaarendfunc
9021f068233SBram Moolenaar
9031f068233SBram Moolenaarfunc T16_G() abort
9041f068233SBram Moolenaar  if 0
9051f068233SBram Moolenaar    Xpath 'a'
9061f068233SBram Moolenaar  else
9071f068233SBram Moolenaar    Xpath 'b'
9081f068233SBram Moolenaar  elseif 1		" aborts function
9091f068233SBram Moolenaar    Xpath 'c'
9101f068233SBram Moolenaar  else
9111f068233SBram Moolenaar    Xpath 'd'
9121f068233SBram Moolenaar  endif
9131f068233SBram Moolenaar  Xpath 'e'
9141f068233SBram Moolenaarendfunc
9151f068233SBram Moolenaar
9161f068233SBram Moolenaarfunc T16_H() abort
9171f068233SBram Moolenaar  if 0
9181f068233SBram Moolenaar    Xpath 'a'
9191f068233SBram Moolenaar  elseif 0
9201f068233SBram Moolenaar    Xpath 'b'
9211f068233SBram Moolenaar  else
9221f068233SBram Moolenaar    Xpath 'c'
9231f068233SBram Moolenaar  else		" aborts function
9241f068233SBram Moolenaar    Xpath 'd'
9251f068233SBram Moolenaar  endif
9261f068233SBram Moolenaar  Xpath 'e'
9271f068233SBram Moolenaarendfunc
9281f068233SBram Moolenaar
9291f068233SBram Moolenaarfunc T16_I() abort
9301f068233SBram Moolenaar  if 0
9311f068233SBram Moolenaar    Xpath 'a'
9321f068233SBram Moolenaar  elseif 0
9331f068233SBram Moolenaar    Xpath 'b'
9341f068233SBram Moolenaar  else
9351f068233SBram Moolenaar    Xpath 'c'
9361f068233SBram Moolenaar  elseif 1		" aborts function
9371f068233SBram Moolenaar    Xpath 'd'
9381f068233SBram Moolenaar  else
9391f068233SBram Moolenaar    Xpath 'e'
9401f068233SBram Moolenaar  endif
9411f068233SBram Moolenaar  Xpath 'f'
9421f068233SBram Moolenaarendfunc
9431f068233SBram Moolenaar
9441f068233SBram Moolenaarfunc Test_Multi_Else()
9451f068233SBram Moolenaar  XpathINIT
9461f068233SBram Moolenaar  try
9471f068233SBram Moolenaar    call T16_F()
9481f068233SBram Moolenaar  catch /E583:/
9491f068233SBram Moolenaar    Xpath 'e'
9501f068233SBram Moolenaar  endtry
9511f068233SBram Moolenaar  call assert_equal('be', g:Xpath)
9521f068233SBram Moolenaar
9531f068233SBram Moolenaar  XpathINIT
9541f068233SBram Moolenaar  try
9551f068233SBram Moolenaar    call T16_G()
9561f068233SBram Moolenaar  catch /E584:/
9571f068233SBram Moolenaar    Xpath 'f'
9581f068233SBram Moolenaar  endtry
9591f068233SBram Moolenaar  call assert_equal('bf', g:Xpath)
9601f068233SBram Moolenaar
9611f068233SBram Moolenaar  XpathINIT
9621f068233SBram Moolenaar  try
9631f068233SBram Moolenaar    call T16_H()
9641f068233SBram Moolenaar  catch /E583:/
9651f068233SBram Moolenaar    Xpath 'f'
9661f068233SBram Moolenaar  endtry
9671f068233SBram Moolenaar  call assert_equal('cf', g:Xpath)
9681f068233SBram Moolenaar
9691f068233SBram Moolenaar  XpathINIT
9701f068233SBram Moolenaar  try
9711f068233SBram Moolenaar    call T16_I()
9721f068233SBram Moolenaar  catch /E584:/
9731f068233SBram Moolenaar    Xpath 'g'
9741f068233SBram Moolenaar  endtry
9751f068233SBram Moolenaar  call assert_equal('cg', g:Xpath)
9761f068233SBram Moolenaarendfunc
9771f068233SBram Moolenaar
9781f068233SBram Moolenaar"-------------------------------------------------------------------------------
9791f068233SBram Moolenaar" Test 17:  Nesting of unmatched :if or :endif inside a :while		    {{{1
9801f068233SBram Moolenaar"
9811f068233SBram Moolenaar"	    The :while/:endwhile takes precedence in nesting over an unclosed
9821f068233SBram Moolenaar"	    :if or an unopened :endif.
9831f068233SBram Moolenaar"-------------------------------------------------------------------------------
9841f068233SBram Moolenaar
9851f068233SBram Moolenaar" While loops inside a function are continued on error.
9861f068233SBram Moolenaarfunc T17_F()
9871f068233SBram Moolenaar  let loops = 3
9881f068233SBram Moolenaar  while loops > 0
9891f068233SBram Moolenaar    let loops -= 1
9901f068233SBram Moolenaar    Xpath 'a' . loops
9911f068233SBram Moolenaar    if (loops == 1)
9921f068233SBram Moolenaar      Xpath 'b' . loops
9931f068233SBram Moolenaar      continue
9941f068233SBram Moolenaar    elseif (loops == 0)
9951f068233SBram Moolenaar      Xpath 'c' . loops
9961f068233SBram Moolenaar      break
9971f068233SBram Moolenaar    elseif 1
9981f068233SBram Moolenaar      Xpath 'd' . loops
9991f068233SBram Moolenaar    " endif missing!
10001f068233SBram Moolenaar  endwhile	" :endwhile after :if 1
10011f068233SBram Moolenaar  Xpath 'e'
10021f068233SBram Moolenaarendfunc
10031f068233SBram Moolenaar
10041f068233SBram Moolenaarfunc T17_G()
10051f068233SBram Moolenaar  let loops = 2
10061f068233SBram Moolenaar  while loops > 0
10071f068233SBram Moolenaar    let loops -= 1
10081f068233SBram Moolenaar    Xpath 'a' . loops
10091f068233SBram Moolenaar    if 0
10101f068233SBram Moolenaar      Xpath 'b' . loops
10111f068233SBram Moolenaar    " endif missing
10121f068233SBram Moolenaar  endwhile	" :endwhile after :if 0
10131f068233SBram Moolenaarendfunc
10141f068233SBram Moolenaar
10151f068233SBram Moolenaarfunc T17_H()
10161f068233SBram Moolenaar  let loops = 2
10171f068233SBram Moolenaar  while loops > 0
10181f068233SBram Moolenaar    let loops -= 1
10191f068233SBram Moolenaar    Xpath 'a' . loops
10201f068233SBram Moolenaar    " if missing!
10211f068233SBram Moolenaar    endif	" :endif without :if in while
10221f068233SBram Moolenaar    Xpath 'b' . loops
10231f068233SBram Moolenaar  endwhile
10241f068233SBram Moolenaarendfunc
10251f068233SBram Moolenaar
10261f068233SBram Moolenaar" Error continuation outside a function is at the outermost :endwhile or :endif.
10271f068233SBram MoolenaarXpathINIT
10281f068233SBram Moolenaarlet v:errmsg = ''
10291f068233SBram Moolenaarlet loops = 2
10301f068233SBram Moolenaarwhile loops > 0
10311f068233SBram Moolenaar    let loops -= 1
10321f068233SBram Moolenaar    Xpath 'a' . loops
10331f068233SBram Moolenaar    if 0
10341f068233SBram Moolenaar	Xpath 'b' . loops
10351f068233SBram Moolenaar    " endif missing! Following :endwhile fails.
10361f068233SBram Moolenaarendwhile | Xpath 'c'
10371f068233SBram MoolenaarXpath 'd'
10381f068233SBram Moolenaarcall assert_match('E171:', v:errmsg)
10391f068233SBram Moolenaarcall assert_equal('a1d', g:Xpath)
10401f068233SBram Moolenaar
10411f068233SBram Moolenaarfunc Test_unmatched_if_in_while()
10421f068233SBram Moolenaar  XpathINIT
10431f068233SBram Moolenaar  call assert_fails('call T17_F()', 'E171:')
10441f068233SBram Moolenaar  call assert_equal('a2d2a1b1a0c0e', g:Xpath)
10451f068233SBram Moolenaar
10461f068233SBram Moolenaar  XpathINIT
10471f068233SBram Moolenaar  call assert_fails('call T17_G()', 'E171:')
10481f068233SBram Moolenaar  call assert_equal('a1a0', g:Xpath)
10491f068233SBram Moolenaar
10501f068233SBram Moolenaar  XpathINIT
10511f068233SBram Moolenaar  call assert_fails('call T17_H()', 'E580:')
10521f068233SBram Moolenaar  call assert_equal('a1b1a0b0', g:Xpath)
10531f068233SBram Moolenaarendfunc
10541f068233SBram Moolenaar
10551f068233SBram Moolenaar"-------------------------------------------------------------------------------
1056a6296200SBram Moolenaar" Test 18:  Interrupt (Ctrl-C pressed)					    {{{1
1057a6296200SBram Moolenaar"
1058a6296200SBram Moolenaar"	    On an interrupt, the script processing is terminated immediately.
10591f068233SBram Moolenaar"-------------------------------------------------------------------------------
1060a6296200SBram Moolenaar
1061a6296200SBram Moolenaarfunc Test_interrupt_while_if()
1062a6296200SBram Moolenaar  let test =<< trim [CODE]
1063a6296200SBram Moolenaar    try
1064a6296200SBram Moolenaar      if 1
1065a6296200SBram Moolenaar        Xpath 'a'
1066a6296200SBram Moolenaar        while 1
1067a6296200SBram Moolenaar          Xpath 'b'
1068a6296200SBram Moolenaar          if 1
1069a6296200SBram Moolenaar            Xpath 'c'
1070a6296200SBram Moolenaar            call interrupt()
1071a6296200SBram Moolenaar            call assert_report('should not get here')
1072a6296200SBram Moolenaar            break
1073a6296200SBram Moolenaar            finish
1074a6296200SBram Moolenaar          endif | call assert_report('should not get here')
1075a6296200SBram Moolenaar          call assert_report('should not get here')
1076a6296200SBram Moolenaar        endwhile | call assert_report('should not get here')
1077a6296200SBram Moolenaar        call assert_report('should not get here')
1078a6296200SBram Moolenaar      endif | call assert_report('should not get here')
1079a6296200SBram Moolenaar      call assert_report('should not get here')
1080a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1081a6296200SBram Moolenaar      Xpath 'd'
1082a6296200SBram Moolenaar    endtry | Xpath 'e'
1083a6296200SBram Moolenaar    Xpath 'f'
1084a6296200SBram Moolenaar  [CODE]
1085a6296200SBram Moolenaar  let verify =<< trim [CODE]
1086a6296200SBram Moolenaar    call assert_equal('abcdef', g:Xpath)
1087a6296200SBram Moolenaar  [CODE]
1088a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1089a6296200SBram Moolenaarendfunc
1090a6296200SBram Moolenaar
1091a6296200SBram Moolenaarfunc Test_interrupt_try()
1092a6296200SBram Moolenaar  let test =<< trim [CODE]
1093a6296200SBram Moolenaar    try
1094a6296200SBram Moolenaar      try
1095a6296200SBram Moolenaar        Xpath 'a'
1096a6296200SBram Moolenaar        call interrupt()
1097a6296200SBram Moolenaar        call assert_report('should not get here')
1098a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1099a6296200SBram Moolenaar      call assert_report('should not get here')
1100a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1101a6296200SBram Moolenaar      Xpath 'b'
1102a6296200SBram Moolenaar    endtry | Xpath 'c'
1103a6296200SBram Moolenaar    Xpath 'd'
1104a6296200SBram Moolenaar  [CODE]
1105a6296200SBram Moolenaar  let verify =<< trim [CODE]
1106a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1107a6296200SBram Moolenaar  [CODE]
1108a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1109a6296200SBram Moolenaarendfunc
1110a6296200SBram Moolenaar
1111a6296200SBram Moolenaarfunc Test_interrupt_func_while_if()
1112a6296200SBram Moolenaar  let test =<< trim [CODE]
1113a6296200SBram Moolenaar    func F()
1114a6296200SBram Moolenaar      if 1
1115a6296200SBram Moolenaar        Xpath 'a'
1116a6296200SBram Moolenaar        while 1
1117a6296200SBram Moolenaar          Xpath 'b'
1118a6296200SBram Moolenaar          if 1
1119a6296200SBram Moolenaar            Xpath 'c'
1120a6296200SBram Moolenaar            call interrupt()
1121a6296200SBram Moolenaar            call assert_report('should not get here')
1122a6296200SBram Moolenaar            break
1123a6296200SBram Moolenaar            return
1124a6296200SBram Moolenaar          endif | call assert_report('should not get here')
1125a6296200SBram Moolenaar          call assert_report('should not get here')
1126a6296200SBram Moolenaar        endwhile | call assert_report('should not get here')
1127a6296200SBram Moolenaar        call assert_report('should not get here')
1128a6296200SBram Moolenaar      endif | call assert_report('should not get here')
1129a6296200SBram Moolenaar      call assert_report('should not get here')
1130a6296200SBram Moolenaar    endfunc
1131a6296200SBram Moolenaar
1132a6296200SBram Moolenaar    Xpath 'd'
1133a6296200SBram Moolenaar    try
1134a6296200SBram Moolenaar      call F() | call assert_report('should not get here')
1135a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1136a6296200SBram Moolenaar      Xpath 'e'
1137a6296200SBram Moolenaar    endtry | Xpath 'f'
1138a6296200SBram Moolenaar    Xpath 'g'
1139a6296200SBram Moolenaar  [CODE]
1140a6296200SBram Moolenaar  let verify =<< trim [CODE]
1141a6296200SBram Moolenaar    call assert_equal('dabcefg', g:Xpath)
1142a6296200SBram Moolenaar  [CODE]
1143a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1144a6296200SBram Moolenaarendfunc
1145a6296200SBram Moolenaar
1146a6296200SBram Moolenaarfunc Test_interrupt_func_try()
1147a6296200SBram Moolenaar  let test =<< trim [CODE]
1148a6296200SBram Moolenaar    func G()
1149a6296200SBram Moolenaar      try
1150a6296200SBram Moolenaar        Xpath 'a'
1151a6296200SBram Moolenaar        call interrupt()
1152a6296200SBram Moolenaar        call assert_report('should not get here')
1153a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1154a6296200SBram Moolenaar      call assert_report('should not get here')
1155a6296200SBram Moolenaar    endfunc
1156a6296200SBram Moolenaar
1157a6296200SBram Moolenaar    Xpath 'b'
1158a6296200SBram Moolenaar    try
1159a6296200SBram Moolenaar      call G() | call assert_report('should not get here')
1160a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1161a6296200SBram Moolenaar      Xpath 'c'
1162a6296200SBram Moolenaar    endtry | Xpath 'd'
1163a6296200SBram Moolenaar    Xpath 'e'
1164a6296200SBram Moolenaar  [CODE]
1165a6296200SBram Moolenaar  let verify =<< trim [CODE]
1166a6296200SBram Moolenaar    call assert_equal('bacde', g:Xpath)
1167a6296200SBram Moolenaar  [CODE]
1168a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1169a6296200SBram Moolenaarendfunc
1170a6296200SBram Moolenaar
1171a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1172a6296200SBram Moolenaar" Test 19:  Aborting on errors inside :try/:endtry			    {{{1
1173a6296200SBram Moolenaar"
1174a6296200SBram Moolenaar"	    An error in a command dynamically enclosed in a :try/:endtry region
1175a6296200SBram Moolenaar"	    aborts script processing immediately.  It does not matter whether
1176a6296200SBram Moolenaar"	    the failing command is outside or inside a function and whether a
1177a6296200SBram Moolenaar"	    function has an "abort" attribute.
1178a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1179a6296200SBram Moolenaar
1180a6296200SBram Moolenaarfunc Test_try_error_abort_1()
1181a6296200SBram Moolenaar  let test =<< trim [CODE]
1182a6296200SBram Moolenaar    func F() abort
1183a6296200SBram Moolenaar      Xpath 'a'
1184a6296200SBram Moolenaar      asdf
1185a6296200SBram Moolenaar      call assert_report('should not get here')
1186a6296200SBram Moolenaar    endfunc
1187a6296200SBram Moolenaar
1188a6296200SBram Moolenaar    try
1189a6296200SBram Moolenaar      Xpath 'b'
1190a6296200SBram Moolenaar      call F()
1191a6296200SBram Moolenaar      call assert_report('should not get here')
1192a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1193a6296200SBram Moolenaar    call assert_report('should not get here')
1194a6296200SBram Moolenaar  [CODE]
1195a6296200SBram Moolenaar  let verify =<< trim [CODE]
1196a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1197a6296200SBram Moolenaar  [CODE]
1198a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1199a6296200SBram Moolenaarendfunc
1200a6296200SBram Moolenaar
1201a6296200SBram Moolenaarfunc Test_try_error_abort_2()
1202a6296200SBram Moolenaar  let test =<< trim [CODE]
1203a6296200SBram Moolenaar    func G()
1204a6296200SBram Moolenaar      Xpath 'a'
1205a6296200SBram Moolenaar      asdf
1206a6296200SBram Moolenaar      call assert_report('should not get here')
1207a6296200SBram Moolenaar    endfunc
1208a6296200SBram Moolenaar
1209a6296200SBram Moolenaar    try
1210a6296200SBram Moolenaar      Xpath 'b'
1211a6296200SBram Moolenaar      call G()
1212a6296200SBram Moolenaar      call assert_report('should not get here')
1213a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1214a6296200SBram Moolenaar    call assert_report('should not get here')
1215a6296200SBram Moolenaar  [CODE]
1216a6296200SBram Moolenaar  let verify =<< trim [CODE]
1217a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1218a6296200SBram Moolenaar  [CODE]
1219a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1220a6296200SBram Moolenaarendfunc
1221a6296200SBram Moolenaar
1222a6296200SBram Moolenaarfunc Test_try_error_abort_3()
1223a6296200SBram Moolenaar  let test =<< trim [CODE]
1224a6296200SBram Moolenaar    try
1225a6296200SBram Moolenaar      Xpath 'a'
1226a6296200SBram Moolenaar      asdf
1227a6296200SBram Moolenaar      call assert_report('should not get here')
1228a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1229a6296200SBram Moolenaar    call assert_report('should not get here')
1230a6296200SBram Moolenaar  [CODE]
1231a6296200SBram Moolenaar  let verify =<< trim [CODE]
1232a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1233a6296200SBram Moolenaar  [CODE]
1234a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1235a6296200SBram Moolenaarendfunc
1236a6296200SBram Moolenaar
1237a6296200SBram Moolenaarfunc Test_try_error_abort_4()
1238a6296200SBram Moolenaar  let test =<< trim [CODE]
1239a6296200SBram Moolenaar    if 1
1240a6296200SBram Moolenaar      try
1241a6296200SBram Moolenaar        Xpath 'a'
1242a6296200SBram Moolenaar        asdf
1243a6296200SBram Moolenaar        call assert_report('should not get here')
1244a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1245a6296200SBram Moolenaar    endif | call assert_report('should not get here')
1246a6296200SBram Moolenaar    call assert_report('should not get here')
1247a6296200SBram Moolenaar  [CODE]
1248a6296200SBram Moolenaar  let verify =<< trim [CODE]
1249a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1250a6296200SBram Moolenaar  [CODE]
1251a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1252a6296200SBram Moolenaarendfunc
1253a6296200SBram Moolenaar
1254a6296200SBram Moolenaarfunc Test_try_error_abort_5()
1255a6296200SBram Moolenaar  let test =<< trim [CODE]
1256a6296200SBram Moolenaar    let p = 1
1257a6296200SBram Moolenaar    while p
1258a6296200SBram Moolenaar      let p = 0
1259a6296200SBram Moolenaar      try
1260a6296200SBram Moolenaar        Xpath 'a'
1261a6296200SBram Moolenaar        asdf
1262a6296200SBram Moolenaar        call assert_report('should not get here')
1263a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1264a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1265a6296200SBram Moolenaar    call assert_report('should not get here')
1266a6296200SBram Moolenaar  [CODE]
1267a6296200SBram Moolenaar  let verify =<< trim [CODE]
1268a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1269a6296200SBram Moolenaar  [CODE]
1270a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1271a6296200SBram Moolenaarendfunc
1272a6296200SBram Moolenaar
1273a6296200SBram Moolenaarfunc Test_try_error_abort_6()
1274a6296200SBram Moolenaar  let test =<< trim [CODE]
1275a6296200SBram Moolenaar    let p = 1
1276a6296200SBram Moolenaar    Xpath 'a'
1277a6296200SBram Moolenaar    while p
1278a6296200SBram Moolenaar      Xpath 'b'
1279a6296200SBram Moolenaar      let p = 0
1280a6296200SBram Moolenaar      try
1281a6296200SBram Moolenaar        Xpath 'c'
1282a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1283a6296200SBram Moolenaar    call assert_report('should not get here')
1284a6296200SBram Moolenaar  [CODE]
1285a6296200SBram Moolenaar  let verify =<< trim [CODE]
1286a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1287a6296200SBram Moolenaar  [CODE]
1288a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1289a6296200SBram Moolenaarendfunc
1290a6296200SBram Moolenaar
1291a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1292a6296200SBram Moolenaar" Test 20:  Aborting on errors after :try/:endtry			    {{{1
1293a6296200SBram Moolenaar"
1294a6296200SBram Moolenaar"	    When an error occurs after the last active :try/:endtry region has
1295a6296200SBram Moolenaar"	    been left, termination behavior is as if no :try/:endtry has been
1296a6296200SBram Moolenaar"	    seen.
1297a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1298a6296200SBram Moolenaar
1299a6296200SBram Moolenaarfunc Test_error_after_try_1()
1300a6296200SBram Moolenaar  let test =<< trim [CODE]
1301a6296200SBram Moolenaar    let p = 1
1302a6296200SBram Moolenaar    while p
1303a6296200SBram Moolenaar      let p = 0
1304a6296200SBram Moolenaar      Xpath 'a'
1305a6296200SBram Moolenaar      try
1306a6296200SBram Moolenaar        Xpath 'b'
1307a6296200SBram Moolenaar      endtry
1308a6296200SBram Moolenaar      asdf
1309a6296200SBram Moolenaar      call assert_report('should not get here')
1310a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1311a6296200SBram Moolenaar    Xpath 'c'
1312a6296200SBram Moolenaar  [CODE]
1313a6296200SBram Moolenaar  let verify =<< trim [CODE]
1314a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1315a6296200SBram Moolenaar  [CODE]
1316a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1317a6296200SBram Moolenaarendfunc
1318a6296200SBram Moolenaar
1319a6296200SBram Moolenaarfunc Test_error_after_try_2()
1320a6296200SBram Moolenaar  let test =<< trim [CODE]
1321a6296200SBram Moolenaar    while 1
1322a6296200SBram Moolenaar      try
1323a6296200SBram Moolenaar        Xpath 'a'
1324a6296200SBram Moolenaar        break
1325a6296200SBram Moolenaar        call assert_report('should not get here')
1326a6296200SBram Moolenaar      endtry
1327a6296200SBram Moolenaar    endwhile
1328a6296200SBram Moolenaar    Xpath 'b'
1329a6296200SBram Moolenaar    asdf
1330a6296200SBram Moolenaar    Xpath 'c'
1331a6296200SBram Moolenaar  [CODE]
1332a6296200SBram Moolenaar  let verify =<< trim [CODE]
1333a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1334a6296200SBram Moolenaar  [CODE]
1335a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1336a6296200SBram Moolenaarendfunc
1337a6296200SBram Moolenaar
1338a6296200SBram Moolenaarfunc Test_error_after_try_3()
1339a6296200SBram Moolenaar  let test =<< trim [CODE]
1340a6296200SBram Moolenaar    while 1
1341a6296200SBram Moolenaar      try
1342a6296200SBram Moolenaar        Xpath 'a'
1343a6296200SBram Moolenaar        break
1344a6296200SBram Moolenaar        call assert_report('should not get here')
1345a6296200SBram Moolenaar      finally
1346a6296200SBram Moolenaar        Xpath 'b'
1347a6296200SBram Moolenaar      endtry
1348a6296200SBram Moolenaar    endwhile
1349a6296200SBram Moolenaar    Xpath 'c'
1350a6296200SBram Moolenaar    asdf
1351a6296200SBram Moolenaar    Xpath 'd'
1352a6296200SBram Moolenaar  [CODE]
1353a6296200SBram Moolenaar  let verify =<< trim [CODE]
1354a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1355a6296200SBram Moolenaar  [CODE]
1356a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1357a6296200SBram Moolenaarendfunc
1358a6296200SBram Moolenaar
1359a6296200SBram Moolenaarfunc Test_error_after_try_4()
1360a6296200SBram Moolenaar  let test =<< trim [CODE]
1361a6296200SBram Moolenaar    while 1
1362a6296200SBram Moolenaar      try
1363a6296200SBram Moolenaar        Xpath 'a'
1364a6296200SBram Moolenaar      finally
1365a6296200SBram Moolenaar        Xpath 'b'
1366a6296200SBram Moolenaar        break
1367a6296200SBram Moolenaar        call assert_report('should not get here')
1368a6296200SBram Moolenaar      endtry
1369a6296200SBram Moolenaar    endwhile
1370a6296200SBram Moolenaar    Xpath 'c'
1371a6296200SBram Moolenaar    asdf
1372a6296200SBram Moolenaar    Xpath 'd'
1373a6296200SBram Moolenaar  [CODE]
1374a6296200SBram Moolenaar  let verify =<< trim [CODE]
1375a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1376a6296200SBram Moolenaar  [CODE]
1377a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1378a6296200SBram Moolenaarendfunc
1379a6296200SBram Moolenaar
1380a6296200SBram Moolenaarfunc Test_error_after_try_5()
1381a6296200SBram Moolenaar  let test =<< trim [CODE]
1382a6296200SBram Moolenaar    let p = 1
1383a6296200SBram Moolenaar    while p
1384a6296200SBram Moolenaar      let p = 0
1385a6296200SBram Moolenaar      try
1386a6296200SBram Moolenaar        Xpath 'a'
1387a6296200SBram Moolenaar        continue
1388a6296200SBram Moolenaar        call assert_report('should not get here')
1389a6296200SBram Moolenaar      endtry
1390a6296200SBram Moolenaar    endwhile
1391a6296200SBram Moolenaar    Xpath 'b'
1392a6296200SBram Moolenaar    asdf
1393a6296200SBram Moolenaar    Xpath 'c'
1394a6296200SBram Moolenaar  [CODE]
1395a6296200SBram Moolenaar  let verify =<< trim [CODE]
1396a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1397a6296200SBram Moolenaar  [CODE]
1398a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1399a6296200SBram Moolenaarendfunc
1400a6296200SBram Moolenaar
1401a6296200SBram Moolenaarfunc Test_error_after_try_6()
1402a6296200SBram Moolenaar  let test =<< trim [CODE]
1403a6296200SBram Moolenaar    let p = 1
1404a6296200SBram Moolenaar    while p
1405a6296200SBram Moolenaar      let p = 0
1406a6296200SBram Moolenaar      try
1407a6296200SBram Moolenaar        Xpath 'a'
1408a6296200SBram Moolenaar        continue
1409a6296200SBram Moolenaar        call assert_report('should not get here')
1410a6296200SBram Moolenaar      finally
1411a6296200SBram Moolenaar        Xpath 'b'
1412a6296200SBram Moolenaar      endtry
1413a6296200SBram Moolenaar    endwhile
1414a6296200SBram Moolenaar    Xpath 'c'
1415a6296200SBram Moolenaar    asdf
1416a6296200SBram Moolenaar    Xpath 'd'
1417a6296200SBram Moolenaar  [CODE]
1418a6296200SBram Moolenaar  let verify =<< trim [CODE]
1419a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1420a6296200SBram Moolenaar  [CODE]
1421a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1422a6296200SBram Moolenaarendfunc
1423a6296200SBram Moolenaar
1424a6296200SBram Moolenaarfunc Test_error_after_try_7()
1425a6296200SBram Moolenaar  let test =<< trim [CODE]
1426a6296200SBram Moolenaar    let p = 1
1427a6296200SBram Moolenaar    while p
1428a6296200SBram Moolenaar      let p = 0
1429a6296200SBram Moolenaar      try
1430a6296200SBram Moolenaar        Xpath 'a'
1431a6296200SBram Moolenaar      finally
1432a6296200SBram Moolenaar        Xpath 'b'
1433a6296200SBram Moolenaar        continue
1434a6296200SBram Moolenaar        call assert_report('should not get here')
1435a6296200SBram Moolenaar      endtry
1436a6296200SBram Moolenaar    endwhile
1437a6296200SBram Moolenaar    Xpath 'c'
1438a6296200SBram Moolenaar    asdf
1439a6296200SBram Moolenaar    Xpath 'd'
1440a6296200SBram Moolenaar  [CODE]
1441a6296200SBram Moolenaar  let verify =<< trim [CODE]
1442a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1443a6296200SBram Moolenaar  [CODE]
1444a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1445a6296200SBram Moolenaarendfunc
1446a6296200SBram Moolenaar
1447a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1448a6296200SBram Moolenaar" Test 21:  :finally for :try after :continue/:break/:return/:finish	    {{{1
1449a6296200SBram Moolenaar"
1450a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :continue,
1451a6296200SBram Moolenaar"	    :break, :return, or :finish, its :finally clause should not be
1452a6296200SBram Moolenaar"	    executed.
1453a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1454a6296200SBram Moolenaar
1455a6296200SBram Moolenaarfunc Test_finally_after_loop_ctrl_statement()
1456a6296200SBram Moolenaar  let test =<< trim [CODE]
1457a6296200SBram Moolenaar    func F()
1458a6296200SBram Moolenaar      let loops = 2
1459a6296200SBram Moolenaar      while loops > 0
1460a6296200SBram Moolenaar        XloopNEXT
1461a6296200SBram Moolenaar        let loops = loops - 1
1462a6296200SBram Moolenaar        try
1463a6296200SBram Moolenaar          if loops == 1
1464a6296200SBram Moolenaar            Xloop 'a'
1465a6296200SBram Moolenaar            continue
1466a6296200SBram Moolenaar            call assert_report('should not get here')
1467a6296200SBram Moolenaar          elseif loops == 0
1468a6296200SBram Moolenaar            Xloop 'b'
1469a6296200SBram Moolenaar            break
1470a6296200SBram Moolenaar            call assert_report('should not get here')
1471a6296200SBram Moolenaar          endif
1472a6296200SBram Moolenaar
1473a6296200SBram Moolenaar          try		" inactive
1474a6296200SBram Moolenaar            call assert_report('should not get here')
1475a6296200SBram Moolenaar          finally
1476a6296200SBram Moolenaar            call assert_report('should not get here')
1477a6296200SBram Moolenaar          endtry
1478a6296200SBram Moolenaar        finally
1479a6296200SBram Moolenaar          Xloop 'c'
1480a6296200SBram Moolenaar        endtry
1481a6296200SBram Moolenaar        call assert_report('should not get here')
1482a6296200SBram Moolenaar      endwhile
1483a6296200SBram Moolenaar
1484a6296200SBram Moolenaar      try
1485a6296200SBram Moolenaar        Xpath 'd'
1486a6296200SBram Moolenaar        return
1487a6296200SBram Moolenaar        call assert_report('should not get here')
1488a6296200SBram Moolenaar        try		    " inactive
1489a6296200SBram Moolenaar          call assert_report('should not get here')
1490a6296200SBram Moolenaar        finally
1491a6296200SBram Moolenaar          call assert_report('should not get here')
1492a6296200SBram Moolenaar        endtry
1493a6296200SBram Moolenaar      finally
1494a6296200SBram Moolenaar        Xpath 'e'
1495a6296200SBram Moolenaar      endtry
1496a6296200SBram Moolenaar      call assert_report('should not get here')
1497a6296200SBram Moolenaar    endfunc
1498a6296200SBram Moolenaar
1499a6296200SBram Moolenaar    try
1500a6296200SBram Moolenaar      Xpath 'f'
1501a6296200SBram Moolenaar      call F()
1502a6296200SBram Moolenaar      Xpath 'g'
1503a6296200SBram Moolenaar      finish
1504a6296200SBram Moolenaar      call assert_report('should not get here')
1505a6296200SBram Moolenaar      try		" inactive
1506a6296200SBram Moolenaar        call assert_report('should not get here')
1507a6296200SBram Moolenaar      finally
1508a6296200SBram Moolenaar        call assert_report('should not get here')
1509a6296200SBram Moolenaar      endtry
1510a6296200SBram Moolenaar    finally
1511a6296200SBram Moolenaar      Xpath 'h'
1512a6296200SBram Moolenaar    endtry
1513a6296200SBram Moolenaar    call assert_report('should not get here')
1514a6296200SBram Moolenaar  [CODE]
1515a6296200SBram Moolenaar  let verify =<< trim [CODE]
1516a6296200SBram Moolenaar    call assert_equal('fa2c2b3c3degh', g:Xpath)
1517a6296200SBram Moolenaar  [CODE]
1518a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1519a6296200SBram Moolenaarendfunc
1520a6296200SBram Moolenaar
1521a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1522a6296200SBram Moolenaar" Test 22:  :finally for a :try after an error/interrupt/:throw		    {{{1
1523a6296200SBram Moolenaar"
1524a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding error or
1525a6296200SBram Moolenaar"	    interrupt or :throw, its :finally clause should not be executed.
1526a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1527a6296200SBram Moolenaar
1528a6296200SBram Moolenaarfunc Test_finally_after_error_in_func()
1529a6296200SBram Moolenaar  let test =<< trim [CODE]
1530a6296200SBram Moolenaar    func Error()
1531a6296200SBram Moolenaar      try
1532a6296200SBram Moolenaar        Xpath 'b'
1533a6296200SBram Moolenaar        asdf    " aborting error, triggering error exception
1534a6296200SBram Moolenaar        call assert_report('should not get here')
1535a6296200SBram Moolenaar      endtry
1536a6296200SBram Moolenaar      call assert_report('should not get here')
1537a6296200SBram Moolenaar    endfunc
1538a6296200SBram Moolenaar
1539a6296200SBram Moolenaar    Xpath 'a'
1540a6296200SBram Moolenaar    call Error()
1541a6296200SBram Moolenaar    call assert_report('should not get here')
1542a6296200SBram Moolenaar
1543a6296200SBram Moolenaar    if 1	" not active due to error
1544a6296200SBram Moolenaar      try	" not active since :if inactive
1545a6296200SBram Moolenaar        call assert_report('should not get here')
1546a6296200SBram Moolenaar      finally
1547a6296200SBram Moolenaar        call assert_report('should not get here')
1548a6296200SBram Moolenaar      endtry
1549a6296200SBram Moolenaar    endif
1550a6296200SBram Moolenaar
1551a6296200SBram Moolenaar    try		" not active due to error
1552a6296200SBram Moolenaar      call assert_report('should not get here')
1553a6296200SBram Moolenaar    finally
1554a6296200SBram Moolenaar      call assert_report('should not get here')
1555a6296200SBram Moolenaar    endtry
1556a6296200SBram Moolenaar  [CODE]
1557a6296200SBram Moolenaar  let verify =<< trim [CODE]
1558a6296200SBram Moolenaar    call assert_equal('ab', g:Xpath)
1559a6296200SBram Moolenaar  [CODE]
1560a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1561a6296200SBram Moolenaarendfunc
1562a6296200SBram Moolenaar
1563a6296200SBram Moolenaarfunc Test_finally_after_interrupt()
1564a6296200SBram Moolenaar  let test =<< trim [CODE]
1565a6296200SBram Moolenaar    func Interrupt()
1566a6296200SBram Moolenaar      try
1567a6296200SBram Moolenaar        Xpath 'a'
1568a6296200SBram Moolenaar        call interrupt()            " triggering interrupt exception
1569a6296200SBram Moolenaar        call assert_report('should not get here')
1570a6296200SBram Moolenaar      endtry
1571a6296200SBram Moolenaar    endfunc
1572a6296200SBram Moolenaar
1573a6296200SBram Moolenaar    Xpath 'b'
1574a6296200SBram Moolenaar    try
1575a6296200SBram Moolenaar      call Interrupt()
1576a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1577a6296200SBram Moolenaar      Xpath 'c'
1578a6296200SBram Moolenaar      finish
1579a6296200SBram Moolenaar    endtry
1580a6296200SBram Moolenaar    call assert_report('should not get here')
1581a6296200SBram Moolenaar
1582a6296200SBram Moolenaar    if 1	" not active due to interrupt
1583a6296200SBram Moolenaar      try	" not active since :if inactive
1584a6296200SBram Moolenaar        call assert_report('should not get here')
1585a6296200SBram Moolenaar      finally
1586a6296200SBram Moolenaar        call assert_report('should not get here')
1587a6296200SBram Moolenaar      endtry
1588a6296200SBram Moolenaar    endif
1589a6296200SBram Moolenaar
1590a6296200SBram Moolenaar    try		" not active due to interrupt
1591a6296200SBram Moolenaar      call assert_report('should not get here')
1592a6296200SBram Moolenaar    finally
1593a6296200SBram Moolenaar      call assert_report('should not get here')
1594a6296200SBram Moolenaar    endtry
1595a6296200SBram Moolenaar  [CODE]
1596a6296200SBram Moolenaar  let verify =<< trim [CODE]
1597a6296200SBram Moolenaar    call assert_equal('bac', g:Xpath)
1598a6296200SBram Moolenaar  [CODE]
1599a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1600a6296200SBram Moolenaarendfunc
1601a6296200SBram Moolenaar
1602a6296200SBram Moolenaarfunc Test_finally_after_throw()
1603a6296200SBram Moolenaar  let test =<< trim [CODE]
1604a6296200SBram Moolenaar    func Throw()
1605a6296200SBram Moolenaar      Xpath 'a'
1606a6296200SBram Moolenaar      throw 'xyz'
1607a6296200SBram Moolenaar    endfunc
1608a6296200SBram Moolenaar
1609a6296200SBram Moolenaar    Xpath 'b'
1610a6296200SBram Moolenaar    call Throw()
1611a6296200SBram Moolenaar    call assert_report('should not get here')
1612a6296200SBram Moolenaar
1613a6296200SBram Moolenaar    if 1	" not active due to :throw
1614a6296200SBram Moolenaar      try	" not active since :if inactive
1615a6296200SBram Moolenaar        call assert_report('should not get here')
1616a6296200SBram Moolenaar      finally
1617a6296200SBram Moolenaar        call assert_report('should not get here')
1618a6296200SBram Moolenaar      endtry
1619a6296200SBram Moolenaar    endif
1620a6296200SBram Moolenaar
1621a6296200SBram Moolenaar    try		" not active due to :throw
1622a6296200SBram Moolenaar      call assert_report('should not get here')
1623a6296200SBram Moolenaar    finally
1624a6296200SBram Moolenaar      call assert_report('should not get here')
1625a6296200SBram Moolenaar    endtry
1626a6296200SBram Moolenaar  [CODE]
1627a6296200SBram Moolenaar  let verify =<< trim [CODE]
1628a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1629a6296200SBram Moolenaar  [CODE]
1630a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1631a6296200SBram Moolenaarendfunc
1632a6296200SBram Moolenaar
1633a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1634a6296200SBram Moolenaar" Test 23:  :catch clauses for a :try after a :throw			    {{{1
1635a6296200SBram Moolenaar"
1636a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :throw,
1637a6296200SBram Moolenaar"	    none of its :catch clauses should be executed.
1638a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1639a6296200SBram Moolenaar
1640a6296200SBram Moolenaarfunc Test_catch_after_throw()
1641a6296200SBram Moolenaar  let test =<< trim [CODE]
1642a6296200SBram Moolenaar    try
1643a6296200SBram Moolenaar      Xpath 'a'
1644a6296200SBram Moolenaar      throw "xyz"
1645a6296200SBram Moolenaar      call assert_report('should not get here')
1646a6296200SBram Moolenaar
1647a6296200SBram Moolenaar      if 1	" not active due to :throw
1648a6296200SBram Moolenaar        try	" not active since :if inactive
1649a6296200SBram Moolenaar          call assert_report('should not get here')
1650a6296200SBram Moolenaar        catch /xyz/
1651a6296200SBram Moolenaar          call assert_report('should not get here')
1652a6296200SBram Moolenaar        endtry
1653a6296200SBram Moolenaar      endif
1654a6296200SBram Moolenaar    catch /xyz/
1655a6296200SBram Moolenaar      Xpath 'b'
1656a6296200SBram Moolenaar    endtry
1657a6296200SBram Moolenaar
1658a6296200SBram Moolenaar    Xpath 'c'
1659a6296200SBram Moolenaar    throw "abc"
1660a6296200SBram Moolenaar    call assert_report('should not get here')
1661a6296200SBram Moolenaar
1662a6296200SBram Moolenaar    try		" not active due to :throw
1663a6296200SBram Moolenaar      call assert_report('should not get here')
1664a6296200SBram Moolenaar    catch /abc/
1665a6296200SBram Moolenaar      call assert_report('should not get here')
1666a6296200SBram Moolenaar    endtry
1667a6296200SBram Moolenaar  [CODE]
1668a6296200SBram Moolenaar  let verify =<< trim [CODE]
1669a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1670a6296200SBram Moolenaar  [CODE]
1671a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1672a6296200SBram Moolenaarendfunc
1673a6296200SBram Moolenaar
1674a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1675a6296200SBram Moolenaar" Test 24:  :endtry for a :try after a :throw				    {{{1
1676a6296200SBram Moolenaar"
1677a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :throw,
1678a6296200SBram Moolenaar"	    its :endtry should not rethrow the exception to the next surrounding
1679a6296200SBram Moolenaar"	    active :try conditional.
1680a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1681a6296200SBram Moolenaar
1682a6296200SBram Moolenaarfunc Test_endtry_after_throw()
1683a6296200SBram Moolenaar  let test =<< trim [CODE]
1684a6296200SBram Moolenaar    try			" try 1
1685a6296200SBram Moolenaar      try		" try 2
1686a6296200SBram Moolenaar        Xpath 'a'
1687a6296200SBram Moolenaar        throw "xyz"	" makes try 2 inactive
1688a6296200SBram Moolenaar        call assert_report('should not get here')
1689a6296200SBram Moolenaar
1690a6296200SBram Moolenaar        try		" try 3
1691a6296200SBram Moolenaar          call assert_report('should not get here')
1692a6296200SBram Moolenaar        endtry	" no rethrow to try 1
1693a6296200SBram Moolenaar      catch /xyz/	" should catch although try 2 inactive
1694a6296200SBram Moolenaar        Xpath 'b'
1695a6296200SBram Moolenaar      endtry
1696a6296200SBram Moolenaar    catch /xyz/		" try 1 active, but exception already caught
1697a6296200SBram Moolenaar      call assert_report('should not get here')
1698a6296200SBram Moolenaar    endtry
1699a6296200SBram Moolenaar    Xpath 'c'
1700a6296200SBram Moolenaar  [CODE]
1701a6296200SBram Moolenaar  let verify =<< trim [CODE]
1702a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1703a6296200SBram Moolenaar  [CODE]
1704a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1705a6296200SBram Moolenaarendfunc
1706a6296200SBram Moolenaar
1707a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1708a6296200SBram Moolenaar" Test 27:  Executing :finally clauses after :return			    {{{1
1709a6296200SBram Moolenaar"
1710a6296200SBram Moolenaar"	    For a :return command dynamically enclosed in a :try/:endtry region,
1711a6296200SBram Moolenaar"	    :finally clauses are executed and the called function is ended.
1712a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1713a6296200SBram Moolenaar
1714a6296200SBram Moolenaarfunc T27_F()
1715a6296200SBram Moolenaar  try
1716a6296200SBram Moolenaar    Xpath 'a'
1717a6296200SBram Moolenaar    try
1718a6296200SBram Moolenaar      Xpath 'b'
1719a6296200SBram Moolenaar      return
1720a6296200SBram Moolenaar      call assert_report('should not get here')
1721a6296200SBram Moolenaar    finally
1722a6296200SBram Moolenaar      Xpath 'c'
1723a6296200SBram Moolenaar    endtry
1724a6296200SBram Moolenaar    Xpath 'd'
1725a6296200SBram Moolenaar  finally
1726a6296200SBram Moolenaar    Xpath 'e'
1727a6296200SBram Moolenaar  endtry
1728a6296200SBram Moolenaar  call assert_report('should not get here')
1729a6296200SBram Moolenaarendfunc
1730a6296200SBram Moolenaar
1731a6296200SBram Moolenaarfunc T27_G()
1732a6296200SBram Moolenaar  try
1733a6296200SBram Moolenaar    Xpath 'f'
1734a6296200SBram Moolenaar    return
1735a6296200SBram Moolenaar    call assert_report('should not get here')
1736a6296200SBram Moolenaar  finally
1737a6296200SBram Moolenaar    Xpath 'g'
1738a6296200SBram Moolenaar    call T27_F()
1739a6296200SBram Moolenaar    Xpath 'h'
1740a6296200SBram Moolenaar  endtry
1741a6296200SBram Moolenaar  call assert_report('should not get here')
1742a6296200SBram Moolenaarendfunc
1743a6296200SBram Moolenaar
1744a6296200SBram Moolenaarfunc T27_H()
1745a6296200SBram Moolenaar  try
1746a6296200SBram Moolenaar    Xpath 'i'
1747a6296200SBram Moolenaar    call T27_G()
1748a6296200SBram Moolenaar    Xpath 'j'
1749a6296200SBram Moolenaar  finally
1750a6296200SBram Moolenaar    Xpath 'k'
1751a6296200SBram Moolenaar    return
1752a6296200SBram Moolenaar    call assert_report('should not get here')
1753a6296200SBram Moolenaar  endtry
1754a6296200SBram Moolenaar  call assert_report('should not get here')
1755a6296200SBram Moolenaarendfunction
1756a6296200SBram Moolenaar
1757a6296200SBram Moolenaarfunc Test_finally_after_return()
1758a6296200SBram Moolenaar  XpathINIT
1759a6296200SBram Moolenaar  try
1760a6296200SBram Moolenaar      Xpath 'l'
1761a6296200SBram Moolenaar      call T27_H()
1762a6296200SBram Moolenaar      Xpath 'm'
1763a6296200SBram Moolenaar  finally
1764a6296200SBram Moolenaar      Xpath 'n'
1765a6296200SBram Moolenaar  endtry
1766a6296200SBram Moolenaar  call assert_equal('lifgabcehjkmn', g:Xpath)
1767a6296200SBram Moolenaarendfunc
1768a6296200SBram Moolenaar
1769a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1770a6296200SBram Moolenaar" Test 28:  Executing :finally clauses after :finish			    {{{1
1771a6296200SBram Moolenaar"
1772a6296200SBram Moolenaar"	    For a :finish command dynamically enclosed in a :try/:endtry region,
1773a6296200SBram Moolenaar"	    :finally clauses are executed and the sourced file is finished.
1774a6296200SBram Moolenaar"
1775a6296200SBram Moolenaar"	    This test executes the bodies of the functions F, G, and H from the
1776a6296200SBram Moolenaar"	    previous test as script files (:return replaced by :finish).
1777a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1778a6296200SBram Moolenaar
1779a6296200SBram Moolenaarfunc Test_finally_after_finish()
1780a6296200SBram Moolenaar  XpathINIT
1781a6296200SBram Moolenaar
1782a6296200SBram Moolenaar  let scriptF = MakeScript("T27_F")
1783a6296200SBram Moolenaar  let scriptG = MakeScript("T27_G", scriptF)
1784a6296200SBram Moolenaar  let scriptH = MakeScript("T27_H", scriptG)
1785a6296200SBram Moolenaar
1786a6296200SBram Moolenaar  try
1787a6296200SBram Moolenaar    Xpath 'A'
1788a6296200SBram Moolenaar    exec "source" scriptH
1789a6296200SBram Moolenaar    Xpath 'B'
1790a6296200SBram Moolenaar  finally
1791a6296200SBram Moolenaar    Xpath 'C'
1792a6296200SBram Moolenaar  endtry
1793a6296200SBram Moolenaar  Xpath 'D'
1794a6296200SBram Moolenaar  call assert_equal('AifgabcehjkBCD', g:Xpath)
1795a6296200SBram Moolenaar  call delete(scriptF)
1796a6296200SBram Moolenaar  call delete(scriptG)
1797a6296200SBram Moolenaar  call delete(scriptH)
1798a6296200SBram Moolenaarendfunc
1799a6296200SBram Moolenaar
1800a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1801a6296200SBram Moolenaar" Test 29:  Executing :finally clauses on errors			    {{{1
1802a6296200SBram Moolenaar"
1803a6296200SBram Moolenaar"	    After an error in a command dynamically enclosed in a :try/:endtry
1804a6296200SBram Moolenaar"	    region, :finally clauses are executed and the script processing is
1805a6296200SBram Moolenaar"	    terminated.
1806a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1807a6296200SBram Moolenaar
1808a6296200SBram Moolenaarfunc Test_finally_after_error_1()
1809a6296200SBram Moolenaar  let test =<< trim [CODE]
1810a6296200SBram Moolenaar    func F()
1811a6296200SBram Moolenaar      while 1
1812a6296200SBram Moolenaar        try
1813a6296200SBram Moolenaar          Xpath 'a'
1814a6296200SBram Moolenaar          while 1
1815a6296200SBram Moolenaar            try
1816a6296200SBram Moolenaar              Xpath 'b'
1817a6296200SBram Moolenaar              asdf	    " error
1818a6296200SBram Moolenaar              call assert_report('should not get here')
1819a6296200SBram Moolenaar            finally
1820a6296200SBram Moolenaar              Xpath 'c'
1821a6296200SBram Moolenaar            endtry | call assert_report('should not get here')
1822a6296200SBram Moolenaar            call assert_report('should not get here')
1823a6296200SBram Moolenaar            break
1824a6296200SBram Moolenaar          endwhile
1825a6296200SBram Moolenaar          call assert_report('should not get here')
1826a6296200SBram Moolenaar        finally
1827a6296200SBram Moolenaar          Xpath 'd'
1828a6296200SBram Moolenaar        endtry | call assert_report('should not get here')
1829a6296200SBram Moolenaar        call assert_report('should not get here')
1830a6296200SBram Moolenaar        break
1831a6296200SBram Moolenaar      endwhile
1832a6296200SBram Moolenaar      call assert_report('should not get here')
1833a6296200SBram Moolenaar    endfunc
1834a6296200SBram Moolenaar
1835a6296200SBram Moolenaar    while 1
1836a6296200SBram Moolenaar      try
1837a6296200SBram Moolenaar        Xpath 'e'
1838a6296200SBram Moolenaar        while 1
1839a6296200SBram Moolenaar          call F()
1840a6296200SBram Moolenaar          call assert_report('should not get here')
1841a6296200SBram Moolenaar          break
1842a6296200SBram Moolenaar        endwhile  | call assert_report('should not get here')
1843a6296200SBram Moolenaar        call assert_report('should not get here')
1844a6296200SBram Moolenaar      finally
1845a6296200SBram Moolenaar        Xpath 'f'
1846a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1847a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1848a6296200SBram Moolenaar    call assert_report('should not get here')
1849a6296200SBram Moolenaar  [CODE]
1850a6296200SBram Moolenaar  let verify =<< trim [CODE]
1851a6296200SBram Moolenaar    call assert_equal('eabcdf', g:Xpath)
1852a6296200SBram Moolenaar  [CODE]
1853a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1854a6296200SBram Moolenaarendfunc
1855a6296200SBram Moolenaar
1856a6296200SBram Moolenaarfunc Test_finally_after_error_2()
1857a6296200SBram Moolenaar  let test =<< trim [CODE]
1858a6296200SBram Moolenaar    func G() abort
1859a6296200SBram Moolenaar      if 1
1860a6296200SBram Moolenaar        try
1861a6296200SBram Moolenaar          Xpath 'a'
1862a6296200SBram Moolenaar          asdf	    " error
1863a6296200SBram Moolenaar          call assert_report('should not get here')
1864a6296200SBram Moolenaar        finally
1865a6296200SBram Moolenaar          Xpath 'b'
1866a6296200SBram Moolenaar        endtry | Xpath 'c'
1867a6296200SBram Moolenaar      endif | Xpath 'd'
1868a6296200SBram Moolenaar      call assert_report('should not get here')
1869a6296200SBram Moolenaar    endfunc
1870a6296200SBram Moolenaar
1871a6296200SBram Moolenaar    if 1
1872a6296200SBram Moolenaar      try
1873a6296200SBram Moolenaar        Xpath 'e'
1874a6296200SBram Moolenaar        call G()
1875a6296200SBram Moolenaar        call assert_report('should not get here')
1876a6296200SBram Moolenaar      finally
1877a6296200SBram Moolenaar        Xpath 'f'
1878a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1879a6296200SBram Moolenaar    endif | call assert_report('should not get here')
1880a6296200SBram Moolenaar    call assert_report('should not get here')
1881a6296200SBram Moolenaar  [CODE]
1882a6296200SBram Moolenaar  let verify =<< trim [CODE]
1883a6296200SBram Moolenaar    call assert_equal('eabf', g:Xpath)
1884a6296200SBram Moolenaar  [CODE]
1885a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1886a6296200SBram Moolenaarendfunc
1887a6296200SBram Moolenaar
1888a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1889a6296200SBram Moolenaar" Test 30:  Executing :finally clauses on interrupt			    {{{1
1890a6296200SBram Moolenaar"
1891a6296200SBram Moolenaar"	    After an interrupt in a command dynamically enclosed in
1892a6296200SBram Moolenaar"	    a :try/:endtry region, :finally clauses are executed and the
1893a6296200SBram Moolenaar"	    script processing is terminated.
1894a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1895a6296200SBram Moolenaar
1896a6296200SBram Moolenaarfunc Test_finally_on_interrupt()
1897a6296200SBram Moolenaar  let test =<< trim [CODE]
1898a6296200SBram Moolenaar    func F()
1899a6296200SBram Moolenaar      try
1900a6296200SBram Moolenaar        Xloop 'a'
1901a6296200SBram Moolenaar        call interrupt()
1902a6296200SBram Moolenaar        call assert_report('should not get here')
1903a6296200SBram Moolenaar      finally
1904a6296200SBram Moolenaar        Xloop 'b'
1905a6296200SBram Moolenaar      endtry
1906a6296200SBram Moolenaar      call assert_report('should not get here')
1907a6296200SBram Moolenaar    endfunc
1908a6296200SBram Moolenaar
1909a6296200SBram Moolenaar    try
1910a6296200SBram Moolenaar      try
1911a6296200SBram Moolenaar        Xpath 'c'
1912a6296200SBram Moolenaar        try
1913a6296200SBram Moolenaar          Xpath 'd'
1914a6296200SBram Moolenaar          call interrupt()
1915a6296200SBram Moolenaar          call assert_report('should not get here')
1916a6296200SBram Moolenaar        finally
1917a6296200SBram Moolenaar          Xpath 'e'
1918a6296200SBram Moolenaar          try
1919a6296200SBram Moolenaar            Xpath 'f'
1920a6296200SBram Moolenaar            try
1921a6296200SBram Moolenaar              Xpath 'g'
1922a6296200SBram Moolenaar            finally
1923a6296200SBram Moolenaar              Xpath 'h'
1924a6296200SBram Moolenaar              try
1925a6296200SBram Moolenaar                Xpath 'i'
1926a6296200SBram Moolenaar                call interrupt()
1927a6296200SBram Moolenaar                call assert_report('should not get here')
1928a6296200SBram Moolenaar              endtry
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      finally
1937a6296200SBram Moolenaar        Xpath 'j'
1938a6296200SBram Moolenaar        try
1939a6296200SBram Moolenaar          Xpath 'k'
1940a6296200SBram Moolenaar          call F()
1941a6296200SBram Moolenaar          call assert_report('should not get here')
1942a6296200SBram Moolenaar        finally
1943a6296200SBram Moolenaar          Xpath 'l'
1944a6296200SBram Moolenaar          try
1945a6296200SBram Moolenaar            Xpath 'm'
1946a6296200SBram Moolenaar            XloopNEXT
1947a6296200SBram Moolenaar            ExecAsScript F
1948a6296200SBram Moolenaar            call assert_report('should not get here')
1949a6296200SBram Moolenaar          finally
1950a6296200SBram Moolenaar            Xpath 'n'
1951a6296200SBram Moolenaar          endtry
1952a6296200SBram Moolenaar          call assert_report('should not get here')
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    catch /^Vim:Interrupt$/
1958a6296200SBram Moolenaar      Xpath 'o'
1959a6296200SBram Moolenaar    endtry
1960a6296200SBram Moolenaar  [CODE]
1961a6296200SBram Moolenaar  let verify =<< trim [CODE]
1962a6296200SBram Moolenaar    call assert_equal('cdefghijka1b1lma2b2no', g:Xpath)
1963a6296200SBram Moolenaar  [CODE]
1964a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1965a6296200SBram Moolenaarendfunc
1966a6296200SBram Moolenaar
1967a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1968a6296200SBram Moolenaar" Test 31:  Executing :finally clauses after :throw			    {{{1
1969a6296200SBram Moolenaar"
1970a6296200SBram Moolenaar"	    After a :throw dynamically enclosed in a :try/:endtry region,
1971a6296200SBram Moolenaar"	    :finally clauses are executed and the script processing is
1972a6296200SBram Moolenaar"	    terminated.
1973a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1974a6296200SBram Moolenaar
1975a6296200SBram Moolenaarfunc Test_finally_after_throw_2()
1976a6296200SBram Moolenaar  let test =<< trim [CODE]
1977a6296200SBram Moolenaar    func F()
1978a6296200SBram Moolenaar      try
1979a6296200SBram Moolenaar        Xloop 'a'
1980a6296200SBram Moolenaar        throw "exception"
1981a6296200SBram Moolenaar        call assert_report('should not get here')
1982a6296200SBram Moolenaar      finally
1983a6296200SBram Moolenaar        Xloop 'b'
1984a6296200SBram Moolenaar      endtry
1985a6296200SBram Moolenaar      call assert_report('should not get here')
1986a6296200SBram Moolenaar    endfunc
1987a6296200SBram Moolenaar
1988a6296200SBram Moolenaar    try
1989a6296200SBram Moolenaar      Xpath 'c'
1990a6296200SBram Moolenaar      try
1991a6296200SBram Moolenaar        Xpath 'd'
1992a6296200SBram Moolenaar        throw "exception"
1993a6296200SBram Moolenaar        call assert_report('should not get here')
1994a6296200SBram Moolenaar      finally
1995a6296200SBram Moolenaar        Xpath 'e'
1996a6296200SBram Moolenaar        try
1997a6296200SBram Moolenaar          Xpath 'f'
1998a6296200SBram Moolenaar          try
1999a6296200SBram Moolenaar            Xpath 'g'
2000a6296200SBram Moolenaar          finally
2001a6296200SBram Moolenaar            Xpath 'h'
2002a6296200SBram Moolenaar            try
2003a6296200SBram Moolenaar              Xpath 'i'
2004a6296200SBram Moolenaar              throw "exception"
2005a6296200SBram Moolenaar              call assert_report('should not get here')
2006a6296200SBram Moolenaar            endtry
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    finally
2015a6296200SBram Moolenaar      Xpath 'j'
2016a6296200SBram Moolenaar      try
2017a6296200SBram Moolenaar        Xpath 'k'
2018a6296200SBram Moolenaar        call F()
2019a6296200SBram Moolenaar        call assert_report('should not get here')
2020a6296200SBram Moolenaar      finally
2021a6296200SBram Moolenaar        Xpath 'l'
2022a6296200SBram Moolenaar        try
2023a6296200SBram Moolenaar          Xpath 'm'
2024a6296200SBram Moolenaar          XloopNEXT
2025a6296200SBram Moolenaar          ExecAsScript F
2026a6296200SBram Moolenaar          call assert_report('should not get here')
2027a6296200SBram Moolenaar        finally
2028a6296200SBram Moolenaar          Xpath 'n'
2029a6296200SBram Moolenaar        endtry
2030a6296200SBram Moolenaar        call assert_report('should not get here')
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  [CODE]
2036a6296200SBram Moolenaar  let verify =<< trim [CODE]
2037a6296200SBram Moolenaar    call assert_equal('cdefghijka1b1lma2b2n', g:Xpath)
2038a6296200SBram Moolenaar  [CODE]
2039a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2040a6296200SBram Moolenaarendfunc
2041a6296200SBram Moolenaar
2042a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2043a6296200SBram Moolenaar" Test 34:  :finally reason discarded by :continue			    {{{1
2044a6296200SBram Moolenaar"
2045a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2046a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2047a6296200SBram Moolenaar"	    discarded by a :continue in the finally clause.
2048a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2049a6296200SBram Moolenaar
2050a6296200SBram Moolenaarfunc Test_finally_after_continue()
2051a6296200SBram Moolenaar  let test =<< trim [CODE]
2052a6296200SBram Moolenaar    func C(jump)
2053a6296200SBram Moolenaar      XloopNEXT
2054a6296200SBram Moolenaar      let loop = 0
2055a6296200SBram Moolenaar      while loop < 2
2056a6296200SBram Moolenaar        let loop = loop + 1
2057a6296200SBram Moolenaar        if loop == 1
2058a6296200SBram Moolenaar          try
2059a6296200SBram Moolenaar            if a:jump == "continue"
2060a6296200SBram Moolenaar              continue
2061a6296200SBram Moolenaar            elseif a:jump == "break"
2062a6296200SBram Moolenaar              break
2063a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2064a6296200SBram Moolenaar              return
2065a6296200SBram Moolenaar            elseif a:jump == "error"
2066a6296200SBram Moolenaar              asdf
2067a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2068a6296200SBram Moolenaar              call interrupt()
2069a6296200SBram Moolenaar              let dummy = 0
2070a6296200SBram Moolenaar            elseif a:jump == "throw"
2071a6296200SBram Moolenaar              throw "abc"
2072a6296200SBram Moolenaar            endif
2073a6296200SBram Moolenaar          finally
2074a6296200SBram Moolenaar            continue	" discards jump that caused the :finally
2075a6296200SBram Moolenaar            call assert_report('should not get here')
2076a6296200SBram Moolenaar          endtry
2077a6296200SBram Moolenaar          call assert_report('should not get here')
2078a6296200SBram Moolenaar        elseif loop == 2
2079a6296200SBram Moolenaar          Xloop 'a'
2080a6296200SBram Moolenaar        endif
2081a6296200SBram Moolenaar      endwhile
2082a6296200SBram Moolenaar    endfunc
2083a6296200SBram Moolenaar
2084a6296200SBram Moolenaar    call C("continue")
2085a6296200SBram Moolenaar    Xpath 'b'
2086a6296200SBram Moolenaar    call C("break")
2087a6296200SBram Moolenaar    Xpath 'c'
2088a6296200SBram Moolenaar    call C("return")
2089a6296200SBram Moolenaar    Xpath 'd'
2090a6296200SBram Moolenaar    let g:jump = "finish"
2091a6296200SBram Moolenaar    ExecAsScript C
2092a6296200SBram Moolenaar    unlet g:jump
2093a6296200SBram Moolenaar    Xpath 'e'
2094a6296200SBram Moolenaar    try
2095a6296200SBram Moolenaar      call C("error")
2096a6296200SBram Moolenaar      Xpath 'f'
2097a6296200SBram Moolenaar    finally
2098a6296200SBram Moolenaar      Xpath 'g'
2099a6296200SBram Moolenaar      try
2100a6296200SBram Moolenaar        call C("interrupt")
2101a6296200SBram Moolenaar        Xpath 'h'
2102a6296200SBram Moolenaar      finally
2103a6296200SBram Moolenaar        Xpath 'i'
2104a6296200SBram Moolenaar        call C("throw")
2105a6296200SBram Moolenaar        Xpath 'j'
2106a6296200SBram Moolenaar      endtry
2107a6296200SBram Moolenaar    endtry
2108a6296200SBram Moolenaar    Xpath 'k'
2109a6296200SBram Moolenaar  [CODE]
2110a6296200SBram Moolenaar  let verify =<< trim [CODE]
2111a6296200SBram Moolenaar    call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath)
2112a6296200SBram Moolenaar  [CODE]
2113a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2114a6296200SBram Moolenaarendfunc
2115a6296200SBram Moolenaar
2116a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2117a6296200SBram Moolenaar" Test 35:  :finally reason discarded by :break				    {{{1
2118a6296200SBram Moolenaar"
2119a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2120a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2121a6296200SBram Moolenaar"	    discarded by a :break in the finally clause.
2122a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2123a6296200SBram Moolenaar
2124a6296200SBram Moolenaarfunc Test_finally_discard_by_break()
2125a6296200SBram Moolenaar  let test =<< trim [CODE]
2126a6296200SBram Moolenaar    func B(jump)
2127a6296200SBram Moolenaar      XloopNEXT
2128a6296200SBram Moolenaar      let loop = 0
2129a6296200SBram Moolenaar      while loop < 2
2130a6296200SBram Moolenaar        let loop = loop + 1
2131a6296200SBram Moolenaar        if loop == 1
2132a6296200SBram Moolenaar          try
2133a6296200SBram Moolenaar            if a:jump == "continue"
2134a6296200SBram Moolenaar              continue
2135a6296200SBram Moolenaar            elseif a:jump == "break"
2136a6296200SBram Moolenaar              break
2137a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2138a6296200SBram Moolenaar              return
2139a6296200SBram Moolenaar            elseif a:jump == "error"
2140a6296200SBram Moolenaar              asdf
2141a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2142a6296200SBram Moolenaar              call interrupt()
2143a6296200SBram Moolenaar              let dummy = 0
2144a6296200SBram Moolenaar            elseif a:jump == "throw"
2145a6296200SBram Moolenaar              throw "abc"
2146a6296200SBram Moolenaar            endif
2147a6296200SBram Moolenaar          finally
2148a6296200SBram Moolenaar            break	" discards jump that caused the :finally
2149a6296200SBram Moolenaar            call assert_report('should not get here')
2150a6296200SBram Moolenaar          endtry
2151a6296200SBram Moolenaar        elseif loop == 2
2152a6296200SBram Moolenaar          call assert_report('should not get here')
2153a6296200SBram Moolenaar        endif
2154a6296200SBram Moolenaar      endwhile
2155a6296200SBram Moolenaar      Xloop 'a'
2156a6296200SBram Moolenaar    endfunc
2157a6296200SBram Moolenaar
2158a6296200SBram Moolenaar    call B("continue")
2159a6296200SBram Moolenaar    Xpath 'b'
2160a6296200SBram Moolenaar    call B("break")
2161a6296200SBram Moolenaar    Xpath 'c'
2162a6296200SBram Moolenaar    call B("return")
2163a6296200SBram Moolenaar    Xpath 'd'
2164a6296200SBram Moolenaar    let g:jump = "finish"
2165a6296200SBram Moolenaar    ExecAsScript B
2166a6296200SBram Moolenaar    unlet g:jump
2167a6296200SBram Moolenaar    Xpath 'e'
2168a6296200SBram Moolenaar    try
2169a6296200SBram Moolenaar      call B("error")
2170a6296200SBram Moolenaar      Xpath 'f'
2171a6296200SBram Moolenaar    finally
2172a6296200SBram Moolenaar      Xpath 'g'
2173a6296200SBram Moolenaar      try
2174a6296200SBram Moolenaar        call B("interrupt")
2175a6296200SBram Moolenaar        Xpath 'h'
2176a6296200SBram Moolenaar      finally
2177a6296200SBram Moolenaar        Xpath 'i'
2178a6296200SBram Moolenaar        call B("throw")
2179a6296200SBram Moolenaar        Xpath 'j'
2180a6296200SBram Moolenaar      endtry
2181a6296200SBram Moolenaar    endtry
2182a6296200SBram Moolenaar    Xpath 'k'
2183a6296200SBram Moolenaar  [CODE]
2184a6296200SBram Moolenaar  let verify =<< trim [CODE]
2185a6296200SBram Moolenaar    call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath)
2186a6296200SBram Moolenaar  [CODE]
2187a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2188a6296200SBram Moolenaarendfunc
2189a6296200SBram Moolenaar
2190a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2191a6296200SBram Moolenaar" Test 36:  :finally reason discarded by :return			    {{{1
2192a6296200SBram Moolenaar"
2193a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2194a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2195a6296200SBram Moolenaar"	    discarded by a :return in the finally clause.
2196a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2197a6296200SBram Moolenaar
2198a6296200SBram Moolenaarfunc Test_finally_discard_by_return()
2199a6296200SBram Moolenaar  let test =<< trim [CODE]
2200a6296200SBram Moolenaar    func R(jump, retval) abort
2201a6296200SBram Moolenaar      let loop = 0
2202a6296200SBram Moolenaar      while loop < 2
2203a6296200SBram Moolenaar        let loop = loop + 1
2204a6296200SBram Moolenaar        if loop == 1
2205a6296200SBram Moolenaar          try
2206a6296200SBram Moolenaar            if a:jump == "continue"
2207a6296200SBram Moolenaar              continue
2208a6296200SBram Moolenaar            elseif a:jump == "break"
2209a6296200SBram Moolenaar              break
2210a6296200SBram Moolenaar            elseif a:jump == "return"
2211a6296200SBram Moolenaar              return
2212a6296200SBram Moolenaar            elseif a:jump == "error"
2213a6296200SBram Moolenaar              asdf
2214a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2215a6296200SBram Moolenaar              call interrupt()
2216a6296200SBram Moolenaar              let dummy = 0
2217a6296200SBram Moolenaar            elseif a:jump == "throw"
2218a6296200SBram Moolenaar              throw "abc"
2219a6296200SBram Moolenaar            endif
2220a6296200SBram Moolenaar          finally
2221a6296200SBram Moolenaar            return a:retval	" discards jump that caused the :finally
2222a6296200SBram Moolenaar            call assert_report('should not get here')
2223a6296200SBram Moolenaar          endtry
2224a6296200SBram Moolenaar        elseif loop == 2
2225a6296200SBram Moolenaar          call assert_report('should not get here')
2226a6296200SBram Moolenaar        endif
2227a6296200SBram Moolenaar      endwhile
2228a6296200SBram Moolenaar      call assert_report('should not get here')
2229a6296200SBram Moolenaar    endfunc
2230a6296200SBram Moolenaar
2231a6296200SBram Moolenaar    let sum =  -R("continue", -8)
2232a6296200SBram Moolenaar    Xpath 'a'
2233a6296200SBram Moolenaar    let sum = sum - R("break", -16)
2234a6296200SBram Moolenaar    Xpath 'b'
2235a6296200SBram Moolenaar    let sum = sum - R("return", -32)
2236a6296200SBram Moolenaar    Xpath 'c'
2237a6296200SBram Moolenaar    try
2238a6296200SBram Moolenaar      let sum = sum - R("error", -64)
2239a6296200SBram Moolenaar      Xpath 'd'
2240a6296200SBram Moolenaar    finally
2241a6296200SBram Moolenaar      Xpath 'e'
2242a6296200SBram Moolenaar      try
2243a6296200SBram Moolenaar        let sum = sum - R("interrupt", -128)
2244a6296200SBram Moolenaar        Xpath 'f'
2245a6296200SBram Moolenaar      finally
2246a6296200SBram Moolenaar        Xpath 'g'
2247a6296200SBram Moolenaar        let sum = sum - R("throw", -256)
2248a6296200SBram Moolenaar        Xpath 'h'
2249a6296200SBram Moolenaar      endtry
2250a6296200SBram Moolenaar    endtry
2251a6296200SBram Moolenaar    Xpath 'i'
2252a6296200SBram Moolenaar
2253a6296200SBram Moolenaar    let expected = 8 + 16 + 32 + 64 + 128 + 256
2254a6296200SBram Moolenaar    call assert_equal(sum, expected)
2255a6296200SBram Moolenaar  [CODE]
2256a6296200SBram Moolenaar  let verify =<< trim [CODE]
2257a6296200SBram Moolenaar    call assert_equal('abcdefghi', g:Xpath)
2258a6296200SBram Moolenaar  [CODE]
2259a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2260a6296200SBram Moolenaarendfunc
2261a6296200SBram Moolenaar
2262a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2263a6296200SBram Moolenaar" Test 37:  :finally reason discarded by :finish			    {{{1
2264a6296200SBram Moolenaar"
2265a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2266a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2267a6296200SBram Moolenaar"	    discarded by a :finish in the finally clause.
2268a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2269a6296200SBram Moolenaar
2270a6296200SBram Moolenaarfunc Test_finally_discard_by_finish()
2271a6296200SBram Moolenaar  let test =<< trim [CODE]
2272a6296200SBram Moolenaar    func F(jump)	" not executed as function, transformed to a script
2273a6296200SBram Moolenaar      let loop = 0
2274a6296200SBram Moolenaar      while loop < 2
2275a6296200SBram Moolenaar        let loop = loop + 1
2276a6296200SBram Moolenaar        if loop == 1
2277a6296200SBram Moolenaar          try
2278a6296200SBram Moolenaar            if a:jump == "continue"
2279a6296200SBram Moolenaar              continue
2280a6296200SBram Moolenaar            elseif a:jump == "break"
2281a6296200SBram Moolenaar              break
2282a6296200SBram Moolenaar            elseif a:jump == "finish"
2283a6296200SBram Moolenaar              finish
2284a6296200SBram Moolenaar            elseif a:jump == "error"
2285a6296200SBram Moolenaar              asdf
2286a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2287a6296200SBram Moolenaar              call interrupt()
2288a6296200SBram Moolenaar              let dummy = 0
2289a6296200SBram Moolenaar            elseif a:jump == "throw"
2290a6296200SBram Moolenaar              throw "abc"
2291a6296200SBram Moolenaar            endif
2292a6296200SBram Moolenaar          finally
2293a6296200SBram Moolenaar            finish	" discards jump that caused the :finally
2294a6296200SBram Moolenaar            call assert_report('should not get here')
2295a6296200SBram Moolenaar          endtry
2296a6296200SBram Moolenaar        elseif loop == 2
2297a6296200SBram Moolenaar          call assert_report('should not get here')
2298a6296200SBram Moolenaar        endif
2299a6296200SBram Moolenaar      endwhile
2300a6296200SBram Moolenaar      call assert_report('should not get here')
2301a6296200SBram Moolenaar    endfunc
2302a6296200SBram Moolenaar
2303a6296200SBram Moolenaar    let scriptF = MakeScript("F")
2304a6296200SBram Moolenaar    delfunction F
2305a6296200SBram Moolenaar
2306a6296200SBram Moolenaar    let g:jump = "continue"
2307a6296200SBram Moolenaar    exec "source" scriptF
2308a6296200SBram Moolenaar    Xpath 'a'
2309a6296200SBram Moolenaar    let g:jump = "break"
2310a6296200SBram Moolenaar    exec "source" scriptF
2311a6296200SBram Moolenaar    Xpath 'b'
2312a6296200SBram Moolenaar    let g:jump = "finish"
2313a6296200SBram Moolenaar    exec "source" scriptF
2314a6296200SBram Moolenaar    Xpath 'c'
2315a6296200SBram Moolenaar    try
2316a6296200SBram Moolenaar      let g:jump = "error"
2317a6296200SBram Moolenaar      exec "source" scriptF
2318a6296200SBram Moolenaar      Xpath 'd'
2319a6296200SBram Moolenaar    finally
2320a6296200SBram Moolenaar      Xpath 'e'
2321a6296200SBram Moolenaar      try
2322a6296200SBram Moolenaar        let g:jump = "interrupt"
2323a6296200SBram Moolenaar        exec "source" scriptF
2324a6296200SBram Moolenaar        Xpath 'f'
2325a6296200SBram Moolenaar      finally
2326a6296200SBram Moolenaar        Xpath 'g'
2327a6296200SBram Moolenaar        try
2328a6296200SBram Moolenaar          let g:jump = "throw"
2329a6296200SBram Moolenaar          exec "source" scriptF
2330a6296200SBram Moolenaar          Xpath 'h'
2331a6296200SBram Moolenaar        finally
2332a6296200SBram Moolenaar          Xpath 'i'
2333a6296200SBram Moolenaar        endtry
2334a6296200SBram Moolenaar      endtry
2335a6296200SBram Moolenaar    endtry
2336a6296200SBram Moolenaar    unlet g:jump
2337a6296200SBram Moolenaar    call delete(scriptF)
2338a6296200SBram Moolenaar  [CODE]
2339a6296200SBram Moolenaar  let verify =<< trim [CODE]
2340a6296200SBram Moolenaar    call assert_equal('abcdefghi', g:Xpath)
2341a6296200SBram Moolenaar  [CODE]
2342a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2343a6296200SBram Moolenaarendfunc
2344a6296200SBram Moolenaar
2345a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2346a6296200SBram Moolenaar" Test 38:  :finally reason discarded by an error			    {{{1
2347a6296200SBram Moolenaar"
2348a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2349a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2350a6296200SBram Moolenaar"	    discarded by an error in the finally clause.
2351a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2352a6296200SBram Moolenaar
2353a6296200SBram Moolenaarfunc Test_finally_discard_by_error()
2354a6296200SBram Moolenaar  let test =<< trim [CODE]
2355a6296200SBram Moolenaar    func E(jump)
2356a6296200SBram Moolenaar      let loop = 0
2357a6296200SBram Moolenaar      while loop < 2
2358a6296200SBram Moolenaar        let loop = loop + 1
2359a6296200SBram Moolenaar        if loop == 1
2360a6296200SBram Moolenaar          try
2361a6296200SBram Moolenaar            if a:jump == "continue"
2362a6296200SBram Moolenaar              continue
2363a6296200SBram Moolenaar            elseif a:jump == "break"
2364a6296200SBram Moolenaar              break
2365a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2366a6296200SBram Moolenaar              return
2367a6296200SBram Moolenaar            elseif a:jump == "error"
2368a6296200SBram Moolenaar              asdf
2369a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2370a6296200SBram Moolenaar              call interrupt()
2371a6296200SBram Moolenaar              let dummy = 0
2372a6296200SBram Moolenaar            elseif a:jump == "throw"
2373a6296200SBram Moolenaar              throw "abc"
2374a6296200SBram Moolenaar            endif
2375a6296200SBram Moolenaar          finally
2376a6296200SBram Moolenaar            asdf	" error; discards jump that caused the :finally
2377a6296200SBram Moolenaar          endtry
2378a6296200SBram Moolenaar        elseif loop == 2
2379a6296200SBram Moolenaar          call assert_report('should not get here')
2380a6296200SBram Moolenaar        endif
2381a6296200SBram Moolenaar      endwhile
2382a6296200SBram Moolenaar      call assert_report('should not get here')
2383a6296200SBram Moolenaar    endfunc
2384a6296200SBram Moolenaar
2385a6296200SBram Moolenaar    try
2386a6296200SBram Moolenaar      Xpath 'a'
2387a6296200SBram Moolenaar      call E("continue")
2388a6296200SBram Moolenaar      call assert_report('should not get here')
2389a6296200SBram Moolenaar    finally
2390a6296200SBram Moolenaar      try
2391a6296200SBram Moolenaar        Xpath 'b'
2392a6296200SBram Moolenaar        call E("break")
2393a6296200SBram Moolenaar        call assert_report('should not get here')
2394a6296200SBram Moolenaar      finally
2395a6296200SBram Moolenaar        try
2396a6296200SBram Moolenaar          Xpath 'c'
2397a6296200SBram Moolenaar          call E("return")
2398a6296200SBram Moolenaar          call assert_report('should not get here')
2399a6296200SBram Moolenaar        finally
2400a6296200SBram Moolenaar          try
2401a6296200SBram Moolenaar            Xpath 'd'
2402a6296200SBram Moolenaar            let g:jump = "finish"
2403a6296200SBram Moolenaar            ExecAsScript E
2404a6296200SBram Moolenaar            call assert_report('should not get here')
2405a6296200SBram Moolenaar          finally
2406a6296200SBram Moolenaar            unlet g:jump
2407a6296200SBram Moolenaar            try
2408a6296200SBram Moolenaar              Xpath 'e'
2409a6296200SBram Moolenaar              call E("error")
2410a6296200SBram Moolenaar              call assert_report('should not get here')
2411a6296200SBram Moolenaar            finally
2412a6296200SBram Moolenaar              try
2413a6296200SBram Moolenaar                Xpath 'f'
2414a6296200SBram Moolenaar                call E("interrupt")
2415a6296200SBram Moolenaar                call assert_report('should not get here')
2416a6296200SBram Moolenaar              finally
2417a6296200SBram Moolenaar                try
2418a6296200SBram Moolenaar                  Xpath 'g'
2419a6296200SBram Moolenaar                  call E("throw")
2420a6296200SBram Moolenaar                  call assert_report('should not get here')
2421a6296200SBram Moolenaar                finally
2422a6296200SBram Moolenaar                  Xpath 'h'
2423a6296200SBram Moolenaar                  delfunction E
2424a6296200SBram Moolenaar                endtry
2425a6296200SBram Moolenaar              endtry
2426a6296200SBram Moolenaar            endtry
2427a6296200SBram Moolenaar          endtry
2428a6296200SBram Moolenaar        endtry
2429a6296200SBram Moolenaar      endtry
2430a6296200SBram Moolenaar    endtry
2431a6296200SBram Moolenaar    call assert_report('should not get here')
2432a6296200SBram Moolenaar  [CODE]
2433a6296200SBram Moolenaar  let verify =<< trim [CODE]
2434a6296200SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
2435a6296200SBram Moolenaar  [CODE]
2436a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2437a6296200SBram Moolenaarendfunc
2438a6296200SBram Moolenaar
2439a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2440a6296200SBram Moolenaar" Test 39:  :finally reason discarded by an interrupt			    {{{1
2441a6296200SBram Moolenaar"
2442a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2443a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2444a6296200SBram Moolenaar"	    discarded by an interrupt in the finally clause.
2445a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2446a6296200SBram Moolenaar
2447a6296200SBram Moolenaarfunc Test_finally_discarded_by_interrupt()
2448a6296200SBram Moolenaar  let test =<< trim [CODE]
2449a6296200SBram Moolenaar    func I(jump)
2450a6296200SBram Moolenaar      let loop = 0
2451a6296200SBram Moolenaar      while loop < 2
2452a6296200SBram Moolenaar        let loop = loop + 1
2453a6296200SBram Moolenaar        if loop == 1
2454a6296200SBram Moolenaar          try
2455a6296200SBram Moolenaar            if a:jump == "continue"
2456a6296200SBram Moolenaar              continue
2457a6296200SBram Moolenaar            elseif a:jump == "break"
2458a6296200SBram Moolenaar              break
2459a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2460a6296200SBram Moolenaar              return
2461a6296200SBram Moolenaar            elseif a:jump == "error"
2462a6296200SBram Moolenaar              asdf
2463a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2464a6296200SBram Moolenaar              call interrupt()
2465a6296200SBram Moolenaar              let dummy = 0
2466a6296200SBram Moolenaar            elseif a:jump == "throw"
2467a6296200SBram Moolenaar              throw "abc"
2468a6296200SBram Moolenaar            endif
2469a6296200SBram Moolenaar          finally
2470a6296200SBram Moolenaar            call interrupt()
2471a6296200SBram Moolenaar            let dummy = 0
2472a6296200SBram Moolenaar          endtry
2473a6296200SBram Moolenaar        elseif loop == 2
2474a6296200SBram Moolenaar          call assert_report('should not get here')
2475a6296200SBram Moolenaar        endif
2476a6296200SBram Moolenaar      endwhile
2477a6296200SBram Moolenaar      call assert_report('should not get here')
2478a6296200SBram Moolenaar    endfunc
2479a6296200SBram Moolenaar
2480a6296200SBram Moolenaar    try
2481a6296200SBram Moolenaar      try
2482a6296200SBram Moolenaar        Xpath 'a'
2483a6296200SBram Moolenaar        call I("continue")
2484a6296200SBram Moolenaar        call assert_report('should not get here')
2485a6296200SBram Moolenaar      finally
2486a6296200SBram Moolenaar        try
2487a6296200SBram Moolenaar          Xpath 'b'
2488a6296200SBram Moolenaar          call I("break")
2489a6296200SBram Moolenaar          call assert_report('should not get here')
2490a6296200SBram Moolenaar        finally
2491a6296200SBram Moolenaar          try
2492a6296200SBram Moolenaar            Xpath 'c'
2493a6296200SBram Moolenaar            call I("return")
2494a6296200SBram Moolenaar            call assert_report('should not get here')
2495a6296200SBram Moolenaar          finally
2496a6296200SBram Moolenaar            try
2497a6296200SBram Moolenaar              Xpath 'd'
2498a6296200SBram Moolenaar              let g:jump = "finish"
2499a6296200SBram Moolenaar              ExecAsScript I
2500a6296200SBram Moolenaar              call assert_report('should not get here')
2501a6296200SBram Moolenaar            finally
2502a6296200SBram Moolenaar              unlet g:jump
2503a6296200SBram Moolenaar              try
2504a6296200SBram Moolenaar                Xpath 'e'
2505a6296200SBram Moolenaar                call I("error")
2506a6296200SBram Moolenaar                call assert_report('should not get here')
2507a6296200SBram Moolenaar              finally
2508a6296200SBram Moolenaar                try
2509a6296200SBram Moolenaar                  Xpath 'f'
2510a6296200SBram Moolenaar                  call I("interrupt")
2511a6296200SBram Moolenaar                  call assert_report('should not get here')
2512a6296200SBram Moolenaar                finally
2513a6296200SBram Moolenaar                  try
2514a6296200SBram Moolenaar                    Xpath 'g'
2515a6296200SBram Moolenaar                    call I("throw")
2516a6296200SBram Moolenaar                    call assert_report('should not get here')
2517a6296200SBram Moolenaar                  finally
2518a6296200SBram Moolenaar                    Xpath 'h'
2519a6296200SBram Moolenaar                    delfunction I
2520a6296200SBram Moolenaar                  endtry
2521a6296200SBram Moolenaar                endtry
2522a6296200SBram Moolenaar              endtry
2523a6296200SBram Moolenaar            endtry
2524a6296200SBram Moolenaar          endtry
2525a6296200SBram Moolenaar        endtry
2526a6296200SBram Moolenaar      endtry
2527a6296200SBram Moolenaar      call assert_report('should not get here')
2528a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
2529a6296200SBram Moolenaar      Xpath 'A'
2530a6296200SBram Moolenaar    endtry
2531a6296200SBram Moolenaar  [CODE]
2532a6296200SBram Moolenaar  let verify =<< trim [CODE]
2533a6296200SBram Moolenaar    call assert_equal('abcdefghA', g:Xpath)
2534a6296200SBram Moolenaar  [CODE]
2535a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2536a6296200SBram Moolenaarendfunc
2537a6296200SBram Moolenaar
2538a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2539a6296200SBram Moolenaar" Test 40:  :finally reason discarded by :throw				    {{{1
2540a6296200SBram Moolenaar"
2541a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2542a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2543a6296200SBram Moolenaar"	    discarded by a :throw in the finally clause.
2544a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2545a6296200SBram Moolenaar
2546a6296200SBram Moolenaarfunc Test_finally_discard_by_throw()
2547a6296200SBram Moolenaar  let test =<< trim [CODE]
2548a6296200SBram Moolenaar    func T(jump)
2549a6296200SBram Moolenaar      let loop = 0
2550a6296200SBram Moolenaar      while loop < 2
2551a6296200SBram Moolenaar        let loop = loop + 1
2552a6296200SBram Moolenaar        if loop == 1
2553a6296200SBram Moolenaar          try
2554a6296200SBram Moolenaar            if a:jump == "continue"
2555a6296200SBram Moolenaar              continue
2556a6296200SBram Moolenaar            elseif a:jump == "break"
2557a6296200SBram Moolenaar              break
2558a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2559a6296200SBram Moolenaar              return
2560a6296200SBram Moolenaar            elseif a:jump == "error"
2561a6296200SBram Moolenaar              asdf
2562a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2563a6296200SBram Moolenaar              call interrupt()
2564a6296200SBram Moolenaar              let dummy = 0
2565a6296200SBram Moolenaar            elseif a:jump == "throw"
2566a6296200SBram Moolenaar              throw "abc"
2567a6296200SBram Moolenaar            endif
2568a6296200SBram Moolenaar          finally
2569a6296200SBram Moolenaar            throw "xyz"	" discards jump that caused the :finally
2570a6296200SBram Moolenaar          endtry
2571a6296200SBram Moolenaar        elseif loop == 2
2572a6296200SBram Moolenaar          call assert_report('should not get here')
2573a6296200SBram Moolenaar        endif
2574a6296200SBram Moolenaar      endwhile
2575a6296200SBram Moolenaar      call assert_report('should not get here')
2576a6296200SBram Moolenaar    endfunc
2577a6296200SBram Moolenaar
2578a6296200SBram Moolenaar    try
2579a6296200SBram Moolenaar      Xpath 'a'
2580a6296200SBram Moolenaar      call T("continue")
2581a6296200SBram Moolenaar      call assert_report('should not get here')
2582a6296200SBram Moolenaar    finally
2583a6296200SBram Moolenaar      try
2584a6296200SBram Moolenaar        Xpath 'b'
2585a6296200SBram Moolenaar        call T("break")
2586a6296200SBram Moolenaar        call assert_report('should not get here')
2587a6296200SBram Moolenaar      finally
2588a6296200SBram Moolenaar        try
2589a6296200SBram Moolenaar          Xpath 'c'
2590a6296200SBram Moolenaar          call T("return")
2591a6296200SBram Moolenaar          call assert_report('should not get here')
2592a6296200SBram Moolenaar        finally
2593a6296200SBram Moolenaar          try
2594a6296200SBram Moolenaar            Xpath 'd'
2595a6296200SBram Moolenaar            let g:jump = "finish"
2596a6296200SBram Moolenaar            ExecAsScript T
2597a6296200SBram Moolenaar            call assert_report('should not get here')
2598a6296200SBram Moolenaar          finally
2599a6296200SBram Moolenaar            unlet g:jump
2600a6296200SBram Moolenaar            try
2601a6296200SBram Moolenaar              Xpath 'e'
2602a6296200SBram Moolenaar              call T("error")
2603a6296200SBram Moolenaar              call assert_report('should not get here')
2604a6296200SBram Moolenaar            finally
2605a6296200SBram Moolenaar              try
2606a6296200SBram Moolenaar                Xpath 'f'
2607a6296200SBram Moolenaar                call T("interrupt")
2608a6296200SBram Moolenaar                call assert_report('should not get here')
2609a6296200SBram Moolenaar              finally
2610a6296200SBram Moolenaar                try
2611a6296200SBram Moolenaar                  Xpath 'g'
2612a6296200SBram Moolenaar                  call T("throw")
2613a6296200SBram Moolenaar                  call assert_report('should not get here')
2614a6296200SBram Moolenaar                finally
2615a6296200SBram Moolenaar                  Xpath 'h'
2616a6296200SBram Moolenaar                  delfunction T
2617a6296200SBram Moolenaar                endtry
2618a6296200SBram Moolenaar              endtry
2619a6296200SBram Moolenaar            endtry
2620a6296200SBram Moolenaar          endtry
2621a6296200SBram Moolenaar        endtry
2622a6296200SBram Moolenaar      endtry
2623a6296200SBram Moolenaar    endtry
2624a6296200SBram Moolenaar    call assert_report('should not get here')
2625a6296200SBram Moolenaar  [CODE]
2626a6296200SBram Moolenaar  let verify =<< trim [CODE]
2627a6296200SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
2628a6296200SBram Moolenaar  [CODE]
2629a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2630a6296200SBram Moolenaarendfunc
2631a6296200SBram Moolenaar
2632a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2633a6296200SBram Moolenaar" Test 49:  Throwing exceptions across functions			    {{{1
2634a6296200SBram Moolenaar"
2635a6296200SBram Moolenaar"	    When an exception is thrown but not caught inside a function, the
2636a6296200SBram Moolenaar"	    caller is checked for a matching :catch clause.
2637a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2638a6296200SBram Moolenaar
2639a6296200SBram Moolenaarfunc T49_C()
2640a6296200SBram Moolenaar  try
2641a6296200SBram Moolenaar    Xpath 'a'
2642a6296200SBram Moolenaar    throw "arrgh"
2643a6296200SBram Moolenaar    call assert_report('should not get here')
2644a6296200SBram Moolenaar  catch /arrgh/
2645a6296200SBram Moolenaar    Xpath 'b'
2646a6296200SBram Moolenaar  endtry
2647a6296200SBram Moolenaar  Xpath 'c'
2648a6296200SBram Moolenaarendfunc
2649a6296200SBram Moolenaar
2650a6296200SBram Moolenaarfunc T49_T1()
2651a6296200SBram Moolenaar  XloopNEXT
2652a6296200SBram Moolenaar  try
2653a6296200SBram Moolenaar    Xloop 'd'
2654a6296200SBram Moolenaar    throw "arrgh"
2655a6296200SBram Moolenaar    call assert_report('should not get here')
2656a6296200SBram Moolenaar  finally
2657a6296200SBram Moolenaar    Xloop 'e'
2658a6296200SBram Moolenaar  endtry
2659a6296200SBram Moolenaar  Xloop 'f'
2660a6296200SBram Moolenaarendfunc
2661a6296200SBram Moolenaar
2662a6296200SBram Moolenaarfunc T49_T2()
2663a6296200SBram Moolenaar  try
2664a6296200SBram Moolenaar    Xpath 'g'
2665a6296200SBram Moolenaar    call T49_T1()
2666a6296200SBram Moolenaar    call assert_report('should not get here')
2667a6296200SBram Moolenaar  finally
2668a6296200SBram Moolenaar    Xpath 'h'
2669a6296200SBram Moolenaar  endtry
2670a6296200SBram Moolenaar  call assert_report('should not get here')
2671a6296200SBram Moolenaarendfunc
2672a6296200SBram Moolenaar
2673a6296200SBram Moolenaarfunc Test_throw_exception_across_funcs()
2674a6296200SBram Moolenaar  XpathINIT
2675a6296200SBram Moolenaar  XloopINIT
2676a6296200SBram Moolenaar  try
2677a6296200SBram Moolenaar    Xpath 'i'
2678a6296200SBram Moolenaar    call T49_C()            " throw and catch
2679a6296200SBram Moolenaar    Xpath 'j'
2680a6296200SBram Moolenaar  catch /.*/
2681a6296200SBram Moolenaar    call assert_report('should not get here')
2682a6296200SBram Moolenaar  endtry
2683a6296200SBram Moolenaar
2684a6296200SBram Moolenaar  try
2685a6296200SBram Moolenaar    Xpath 'k'
2686a6296200SBram Moolenaar    call T49_T1()  " throw, one level
2687a6296200SBram Moolenaar    call assert_report('should not get here')
2688a6296200SBram Moolenaar  catch /arrgh/
2689a6296200SBram Moolenaar    Xpath 'l'
2690a6296200SBram Moolenaar  catch /.*/
2691a6296200SBram Moolenaar    call assert_report('should not get here')
2692a6296200SBram Moolenaar  endtry
2693a6296200SBram Moolenaar
2694a6296200SBram Moolenaar  try
2695a6296200SBram Moolenaar    Xpath 'm'
2696a6296200SBram Moolenaar    call T49_T2()	" throw, two levels
2697a6296200SBram Moolenaar    call assert_report('should not get here')
2698a6296200SBram Moolenaar  catch /arrgh/
2699a6296200SBram Moolenaar    Xpath 'n'
2700a6296200SBram Moolenaar  catch /.*/
2701a6296200SBram Moolenaar    call assert_report('should not get here')
2702a6296200SBram Moolenaar  endtry
2703a6296200SBram Moolenaar  Xpath 'o'
2704a6296200SBram Moolenaar
2705a6296200SBram Moolenaar  call assert_equal('iabcjkd2e2lmgd3e3hno', g:Xpath)
2706a6296200SBram Moolenaarendfunc
2707a6296200SBram Moolenaar
2708a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2709a6296200SBram Moolenaar" Test 50:  Throwing exceptions across script files			    {{{1
2710a6296200SBram Moolenaar"
2711a6296200SBram Moolenaar"	    When an exception is thrown but not caught inside a script file,
2712a6296200SBram Moolenaar"	    the sourcing script or function is checked for a matching :catch
2713a6296200SBram Moolenaar"	    clause.
2714a6296200SBram Moolenaar"
2715a6296200SBram Moolenaar"	    This test executes the bodies of the functions C, T1, and T2 from
2716a6296200SBram Moolenaar"	    the previous test as script files (:return replaced by :finish).
2717a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2718a6296200SBram Moolenaar
2719a6296200SBram Moolenaarfunc T50_F()
2720a6296200SBram Moolenaar  try
2721a6296200SBram Moolenaar    Xpath 'A'
2722a6296200SBram Moolenaar    exec "source" g:scriptC
2723a6296200SBram Moolenaar    Xpath 'B'
2724a6296200SBram Moolenaar  catch /.*/
2725a6296200SBram Moolenaar    call assert_report('should not get here')
2726a6296200SBram Moolenaar  endtry
2727a6296200SBram Moolenaar
2728a6296200SBram Moolenaar  try
2729a6296200SBram Moolenaar    Xpath 'C'
2730a6296200SBram Moolenaar    exec "source" g:scriptT1
2731a6296200SBram Moolenaar    call assert_report('should not get here')
2732a6296200SBram Moolenaar  catch /arrgh/
2733a6296200SBram Moolenaar    Xpath 'D'
2734a6296200SBram Moolenaar  catch /.*/
2735a6296200SBram Moolenaar    call assert_report('should not get here')
2736a6296200SBram Moolenaar  endtry
2737a6296200SBram Moolenaarendfunc
2738a6296200SBram Moolenaar
2739a6296200SBram Moolenaarfunc Test_throw_across_script()
2740a6296200SBram Moolenaar  XpathINIT
2741a6296200SBram Moolenaar  XloopINIT
2742a6296200SBram Moolenaar  let g:scriptC = MakeScript("T49_C")
2743a6296200SBram Moolenaar  let g:scriptT1 = MakeScript("T49_T1")
2744a6296200SBram Moolenaar  let scriptT2 = MakeScript("T49_T2", g:scriptT1)
2745a6296200SBram Moolenaar
2746a6296200SBram Moolenaar  try
2747a6296200SBram Moolenaar    Xpath 'E'
2748a6296200SBram Moolenaar    call T50_F()
2749a6296200SBram Moolenaar    Xpath 'F'
2750a6296200SBram Moolenaar    exec "source" scriptT2
2751a6296200SBram Moolenaar    call assert_report('should not get here')
2752a6296200SBram Moolenaar  catch /arrgh/
2753a6296200SBram Moolenaar    Xpath 'G'
2754a6296200SBram Moolenaar  catch /.*/
2755a6296200SBram Moolenaar    call assert_report('should not get here')
2756a6296200SBram Moolenaar  endtry
2757a6296200SBram Moolenaar  Xpath 'H'
2758a6296200SBram Moolenaar  call assert_equal('EAabcBCd2e2DFgd3e3hGH', g:Xpath)
2759a6296200SBram Moolenaar
2760a6296200SBram Moolenaar  call delete(g:scriptC)
2761a6296200SBram Moolenaar  call delete(g:scriptT1)
2762a6296200SBram Moolenaar  call delete(scriptT2)
2763a6296200SBram Moolenaar  unlet g:scriptC g:scriptT1 scriptT2
2764a6296200SBram Moolenaarendfunc
2765a6296200SBram Moolenaar
27661f068233SBram Moolenaar"-------------------------------------------------------------------------------
2767*9470a4d8SBram Moolenaar" Test 52:  Uncaught exceptions						    {{{1
2768*9470a4d8SBram Moolenaar"
2769*9470a4d8SBram Moolenaar"	    When an exception is thrown but not caught, an error message is
2770*9470a4d8SBram Moolenaar"	    displayed when the script is terminated.  In case of an interrupt
2771*9470a4d8SBram Moolenaar"	    or error exception, the normal interrupt or error message(s) are
2772*9470a4d8SBram Moolenaar"	    displayed.
2773*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
2774*9470a4d8SBram Moolenaar
2775*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_1()
2776*9470a4d8SBram Moolenaar  CheckEnglish
2777*9470a4d8SBram Moolenaar
2778*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2779*9470a4d8SBram Moolenaar    Xpath 'a'
2780*9470a4d8SBram Moolenaar    throw "arrgh"
2781*9470a4d8SBram Moolenaar    call assert_report('should not get here')`
2782*9470a4d8SBram Moolenaar  [CODE]
2783*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2784*9470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: arrgh', v:errmsg)
2785*9470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
2786*9470a4d8SBram Moolenaar  [CODE]
2787*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2788*9470a4d8SBram Moolenaarendfunc
2789*9470a4d8SBram Moolenaar
2790*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_2()
2791*9470a4d8SBram Moolenaar  CheckEnglish
2792*9470a4d8SBram Moolenaar
2793*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2794*9470a4d8SBram Moolenaar    try
2795*9470a4d8SBram Moolenaar      Xpath 'a'
2796*9470a4d8SBram Moolenaar      throw "oops"
2797*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2798*9470a4d8SBram Moolenaar    catch /arrgh/
2799*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2800*9470a4d8SBram Moolenaar    endtry
2801*9470a4d8SBram Moolenaar    call assert_report('should not get here')`
2802*9470a4d8SBram Moolenaar  [CODE]
2803*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2804*9470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: oops', v:errmsg)
2805*9470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
2806*9470a4d8SBram Moolenaar  [CODE]
2807*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2808*9470a4d8SBram Moolenaarendfunc
2809*9470a4d8SBram Moolenaar
2810*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_3()
2811*9470a4d8SBram Moolenaar  CheckEnglish
2812*9470a4d8SBram Moolenaar
2813*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2814*9470a4d8SBram Moolenaar    func T()
2815*9470a4d8SBram Moolenaar      Xpath 'c'
2816*9470a4d8SBram Moolenaar      throw "brrr"
2817*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2818*9470a4d8SBram Moolenaar    endfunc
2819*9470a4d8SBram Moolenaar
2820*9470a4d8SBram Moolenaar    try
2821*9470a4d8SBram Moolenaar      Xpath 'a'
2822*9470a4d8SBram Moolenaar      throw "arrgh"
2823*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2824*9470a4d8SBram Moolenaar    catch /.*/
2825*9470a4d8SBram Moolenaar      Xpath 'b'
2826*9470a4d8SBram Moolenaar      call T()
2827*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2828*9470a4d8SBram Moolenaar    endtry
2829*9470a4d8SBram Moolenaar    call assert_report('should not get here')`
2830*9470a4d8SBram Moolenaar  [CODE]
2831*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2832*9470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: brrr', v:errmsg)
2833*9470a4d8SBram Moolenaar    call assert_equal('abc', g:Xpath)
2834*9470a4d8SBram Moolenaar  [CODE]
2835*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2836*9470a4d8SBram Moolenaarendfunc
2837*9470a4d8SBram Moolenaar
2838*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_4()
2839*9470a4d8SBram Moolenaar  CheckEnglish
2840*9470a4d8SBram Moolenaar
2841*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2842*9470a4d8SBram Moolenaar    try
2843*9470a4d8SBram Moolenaar      Xpath 'a'
2844*9470a4d8SBram Moolenaar      throw "arrgh"
2845*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2846*9470a4d8SBram Moolenaar    finally
2847*9470a4d8SBram Moolenaar      Xpath 'b'
2848*9470a4d8SBram Moolenaar      throw "brrr"
2849*9470a4d8SBram Moolenaar      call assert_report('should not get here')`
2850*9470a4d8SBram Moolenaar    endtry
2851*9470a4d8SBram Moolenaar    call assert_report('should not get here')`
2852*9470a4d8SBram Moolenaar  [CODE]
2853*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2854*9470a4d8SBram Moolenaar    call assert_equal('E605: Exception not caught: brrr', v:errmsg)
2855*9470a4d8SBram Moolenaar    call assert_equal('ab', g:Xpath)
2856*9470a4d8SBram Moolenaar  [CODE]
2857*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2858*9470a4d8SBram Moolenaarendfunc
2859*9470a4d8SBram Moolenaar
2860*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_5()
2861*9470a4d8SBram Moolenaar  CheckEnglish
2862*9470a4d8SBram Moolenaar
2863*9470a4d8SBram Moolenaar  " Need to catch and handle interrupt, otherwise the test will wait for the
2864*9470a4d8SBram Moolenaar  " user to press <Enter> to continue
2865*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2866*9470a4d8SBram Moolenaar    try
2867*9470a4d8SBram Moolenaar      try
2868*9470a4d8SBram Moolenaar        Xpath 'a'
2869*9470a4d8SBram Moolenaar        call interrupt()
2870*9470a4d8SBram Moolenaar        call assert_report('should not get here')
2871*9470a4d8SBram Moolenaar      endtry
2872*9470a4d8SBram Moolenaar      call assert_report('should not get here')
2873*9470a4d8SBram Moolenaar    catch /^Vim:Interrupt$/
2874*9470a4d8SBram Moolenaar      Xpath 'b'
2875*9470a4d8SBram Moolenaar    endtry
2876*9470a4d8SBram Moolenaar  [CODE]
2877*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2878*9470a4d8SBram Moolenaar    call assert_equal('ab', g:Xpath)
2879*9470a4d8SBram Moolenaar  [CODE]
2880*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2881*9470a4d8SBram Moolenaarendfunc
2882*9470a4d8SBram Moolenaar
2883*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_6()
2884*9470a4d8SBram Moolenaar  CheckEnglish
2885*9470a4d8SBram Moolenaar
2886*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2887*9470a4d8SBram Moolenaar    try
2888*9470a4d8SBram Moolenaar      Xpath 'a'
2889*9470a4d8SBram Moolenaar      let x = novar	" error E121; exception: E121
2890*9470a4d8SBram Moolenaar    catch /E15:/	" should not catch
2891*9470a4d8SBram Moolenaar      call assert_report('should not get here')
2892*9470a4d8SBram Moolenaar    endtry
2893*9470a4d8SBram Moolenaar    call assert_report('should not get here')
2894*9470a4d8SBram Moolenaar  [CODE]
2895*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2896*9470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
2897*9470a4d8SBram Moolenaar    call assert_equal('E121: Undefined variable: novar', v:errmsg)
2898*9470a4d8SBram Moolenaar  [CODE]
2899*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2900*9470a4d8SBram Moolenaarendfunc
2901*9470a4d8SBram Moolenaar
2902*9470a4d8SBram Moolenaarfunc Test_uncaught_exception_7()
2903*9470a4d8SBram Moolenaar  CheckEnglish
2904*9470a4d8SBram Moolenaar
2905*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
2906*9470a4d8SBram Moolenaar    try
2907*9470a4d8SBram Moolenaar      Xpath 'a'
2908*9470a4d8SBram Moolenaar      " error E108/E488; exception: E488
2909*9470a4d8SBram Moolenaar      unlet novar #
2910*9470a4d8SBram Moolenaar    catch /E108:/       " should not catch
2911*9470a4d8SBram Moolenaar      call assert_report('should not get here')
2912*9470a4d8SBram Moolenaar    endtry
2913*9470a4d8SBram Moolenaar    call assert_report('should not get here')
2914*9470a4d8SBram Moolenaar  [CODE]
2915*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
2916*9470a4d8SBram Moolenaar    call assert_equal('a', g:Xpath)
2917*9470a4d8SBram Moolenaar    call assert_equal('E488: Trailing characters: #', v:errmsg)
2918*9470a4d8SBram Moolenaar  [CODE]
2919*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
2920*9470a4d8SBram Moolenaarendfunc
2921*9470a4d8SBram Moolenaar
2922*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
2923*9470a4d8SBram Moolenaar" Test 53:  Nesting errors: :endif/:else/:elseif			    {{{1
2924*9470a4d8SBram Moolenaar"
2925*9470a4d8SBram Moolenaar"	    For nesting errors of :if conditionals the correct error messages
2926*9470a4d8SBram Moolenaar"	    should be given.
2927*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
2928*9470a4d8SBram Moolenaar
2929*9470a4d8SBram Moolenaarfunc Test_nested_if_else_errors()
2930*9470a4d8SBram Moolenaar  CheckEnglish
2931*9470a4d8SBram Moolenaar
2932*9470a4d8SBram Moolenaar  " :endif without :if
2933*9470a4d8SBram Moolenaar  let code =<< trim END
2934*9470a4d8SBram Moolenaar    endif
2935*9470a4d8SBram Moolenaar  END
2936*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2937*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
2938*9470a4d8SBram Moolenaar
2939*9470a4d8SBram Moolenaar  " :endif without :if
2940*9470a4d8SBram Moolenaar  let code =<< trim END
2941*9470a4d8SBram Moolenaar    while 1
2942*9470a4d8SBram Moolenaar      endif
2943*9470a4d8SBram Moolenaar    endwhile
2944*9470a4d8SBram Moolenaar  END
2945*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2946*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
2947*9470a4d8SBram Moolenaar
2948*9470a4d8SBram Moolenaar  " :endif without :if
2949*9470a4d8SBram Moolenaar  let code =<< trim END
2950*9470a4d8SBram Moolenaar    try
2951*9470a4d8SBram Moolenaar    finally
2952*9470a4d8SBram Moolenaar      endif
2953*9470a4d8SBram Moolenaar    endtry
2954*9470a4d8SBram Moolenaar  END
2955*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2956*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
2957*9470a4d8SBram Moolenaar
2958*9470a4d8SBram Moolenaar  " :endif without :if
2959*9470a4d8SBram Moolenaar  let code =<< trim END
2960*9470a4d8SBram Moolenaar    try
2961*9470a4d8SBram Moolenaar      endif
2962*9470a4d8SBram Moolenaar    endtry
2963*9470a4d8SBram Moolenaar  END
2964*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2965*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
2966*9470a4d8SBram Moolenaar
2967*9470a4d8SBram Moolenaar  " :endif without :if
2968*9470a4d8SBram Moolenaar  let code =<< trim END
2969*9470a4d8SBram Moolenaar    try
2970*9470a4d8SBram Moolenaar      throw "a"
2971*9470a4d8SBram Moolenaar    catch /a/
2972*9470a4d8SBram Moolenaar      endif
2973*9470a4d8SBram Moolenaar    endtry
2974*9470a4d8SBram Moolenaar  END
2975*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2976*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endif):E580: :endif without :if')
2977*9470a4d8SBram Moolenaar
2978*9470a4d8SBram Moolenaar  " :else without :if
2979*9470a4d8SBram Moolenaar  let code =<< trim END
2980*9470a4d8SBram Moolenaar    else
2981*9470a4d8SBram Moolenaar  END
2982*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2983*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
2984*9470a4d8SBram Moolenaar
2985*9470a4d8SBram Moolenaar  " :else without :if
2986*9470a4d8SBram Moolenaar  let code =<< trim END
2987*9470a4d8SBram Moolenaar    while 1
2988*9470a4d8SBram Moolenaar      else
2989*9470a4d8SBram Moolenaar    endwhile
2990*9470a4d8SBram Moolenaar  END
2991*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
2992*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
2993*9470a4d8SBram Moolenaar
2994*9470a4d8SBram Moolenaar  " :else without :if
2995*9470a4d8SBram Moolenaar  let code =<< trim END
2996*9470a4d8SBram Moolenaar    try
2997*9470a4d8SBram Moolenaar    finally
2998*9470a4d8SBram Moolenaar      else
2999*9470a4d8SBram Moolenaar    endtry
3000*9470a4d8SBram Moolenaar  END
3001*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3002*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
3003*9470a4d8SBram Moolenaar
3004*9470a4d8SBram Moolenaar  " :else without :if
3005*9470a4d8SBram Moolenaar  let code =<< trim END
3006*9470a4d8SBram Moolenaar    try
3007*9470a4d8SBram Moolenaar      else
3008*9470a4d8SBram Moolenaar    endtry
3009*9470a4d8SBram Moolenaar  END
3010*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3011*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
3012*9470a4d8SBram Moolenaar
3013*9470a4d8SBram Moolenaar  " :else without :if
3014*9470a4d8SBram Moolenaar  let code =<< trim END
3015*9470a4d8SBram Moolenaar    try
3016*9470a4d8SBram Moolenaar      throw "a"
3017*9470a4d8SBram Moolenaar    catch /a/
3018*9470a4d8SBram Moolenaar      else
3019*9470a4d8SBram Moolenaar    endtry
3020*9470a4d8SBram Moolenaar  END
3021*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3022*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E581: :else without :if')
3023*9470a4d8SBram Moolenaar
3024*9470a4d8SBram Moolenaar  " :elseif without :if
3025*9470a4d8SBram Moolenaar  let code =<< trim END
3026*9470a4d8SBram Moolenaar    elseif
3027*9470a4d8SBram Moolenaar  END
3028*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3029*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
3030*9470a4d8SBram Moolenaar
3031*9470a4d8SBram Moolenaar  " :elseif without :if
3032*9470a4d8SBram Moolenaar  let code =<< trim END
3033*9470a4d8SBram Moolenaar    while 1
3034*9470a4d8SBram Moolenaar      elseif
3035*9470a4d8SBram Moolenaar    endwhile
3036*9470a4d8SBram Moolenaar  END
3037*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3038*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
3039*9470a4d8SBram Moolenaar
3040*9470a4d8SBram Moolenaar  " :elseif without :if
3041*9470a4d8SBram Moolenaar  let code =<< trim END
3042*9470a4d8SBram Moolenaar    try
3043*9470a4d8SBram Moolenaar    finally
3044*9470a4d8SBram Moolenaar      elseif
3045*9470a4d8SBram Moolenaar    endtry
3046*9470a4d8SBram Moolenaar  END
3047*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3048*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
3049*9470a4d8SBram Moolenaar
3050*9470a4d8SBram Moolenaar  " :elseif without :if
3051*9470a4d8SBram Moolenaar  let code =<< trim END
3052*9470a4d8SBram Moolenaar    try
3053*9470a4d8SBram Moolenaar      elseif
3054*9470a4d8SBram Moolenaar    endtry
3055*9470a4d8SBram Moolenaar  END
3056*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3057*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
3058*9470a4d8SBram Moolenaar
3059*9470a4d8SBram Moolenaar  " :elseif without :if
3060*9470a4d8SBram Moolenaar  let code =<< trim END
3061*9470a4d8SBram Moolenaar    try
3062*9470a4d8SBram Moolenaar      throw "a"
3063*9470a4d8SBram Moolenaar    catch /a/
3064*9470a4d8SBram Moolenaar      elseif
3065*9470a4d8SBram Moolenaar    endtry
3066*9470a4d8SBram Moolenaar  END
3067*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3068*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E582: :elseif without :if')
3069*9470a4d8SBram Moolenaar
3070*9470a4d8SBram Moolenaar  " multiple :else
3071*9470a4d8SBram Moolenaar  let code =<< trim END
3072*9470a4d8SBram Moolenaar    if 1
3073*9470a4d8SBram Moolenaar    else
3074*9470a4d8SBram Moolenaar    else
3075*9470a4d8SBram Moolenaar    endif
3076*9470a4d8SBram Moolenaar  END
3077*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3078*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(else):E583: multiple :else')
3079*9470a4d8SBram Moolenaar
3080*9470a4d8SBram Moolenaar  " :elseif after :else
3081*9470a4d8SBram Moolenaar  let code =<< trim END
3082*9470a4d8SBram Moolenaar    if 1
3083*9470a4d8SBram Moolenaar    else
3084*9470a4d8SBram Moolenaar    elseif 1
3085*9470a4d8SBram Moolenaar    endif
3086*9470a4d8SBram Moolenaar  END
3087*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3088*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(elseif):E584: :elseif after :else')
3089*9470a4d8SBram Moolenaar
3090*9470a4d8SBram Moolenaar  call delete('Xtest')
3091*9470a4d8SBram Moolenaarendfunc
3092*9470a4d8SBram Moolenaar
3093*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3094*9470a4d8SBram Moolenaar" Test 54:  Nesting errors: :while/:endwhile				    {{{1
3095*9470a4d8SBram Moolenaar"
3096*9470a4d8SBram Moolenaar"	    For nesting errors of :while conditionals the correct error messages
3097*9470a4d8SBram Moolenaar"	    should be given.
3098*9470a4d8SBram Moolenaar"
3099*9470a4d8SBram Moolenaar"	    This test reuses the function MESSAGES() from the previous test.
3100*9470a4d8SBram Moolenaar"	    This functions checks the messages in g:msgfile.
3101*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3102*9470a4d8SBram Moolenaar
3103*9470a4d8SBram Moolenaarfunc Test_nested_while_error()
3104*9470a4d8SBram Moolenaar  CheckEnglish
3105*9470a4d8SBram Moolenaar
3106*9470a4d8SBram Moolenaar  " :endwhile without :while
3107*9470a4d8SBram Moolenaar  let code =<< trim END
3108*9470a4d8SBram Moolenaar    endwhile
3109*9470a4d8SBram Moolenaar  END
3110*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3111*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3112*9470a4d8SBram Moolenaar
3113*9470a4d8SBram Moolenaar  " :endwhile without :while
3114*9470a4d8SBram Moolenaar  let code =<< trim END
3115*9470a4d8SBram Moolenaar    if 1
3116*9470a4d8SBram Moolenaar      endwhile
3117*9470a4d8SBram Moolenaar    endif
3118*9470a4d8SBram Moolenaar  END
3119*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3120*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3121*9470a4d8SBram Moolenaar
3122*9470a4d8SBram Moolenaar  " Missing :endif
3123*9470a4d8SBram Moolenaar  let code =<< trim END
3124*9470a4d8SBram Moolenaar    while 1
3125*9470a4d8SBram Moolenaar      if 1
3126*9470a4d8SBram Moolenaar    endwhile
3127*9470a4d8SBram Moolenaar  END
3128*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3129*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
3130*9470a4d8SBram Moolenaar
3131*9470a4d8SBram Moolenaar  " :endwhile without :while
3132*9470a4d8SBram Moolenaar  let code =<< trim END
3133*9470a4d8SBram Moolenaar    try
3134*9470a4d8SBram Moolenaar    finally
3135*9470a4d8SBram Moolenaar      endwhile
3136*9470a4d8SBram Moolenaar    endtry
3137*9470a4d8SBram Moolenaar  END
3138*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3139*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3140*9470a4d8SBram Moolenaar
3141*9470a4d8SBram Moolenaar  " Missing :endtry
3142*9470a4d8SBram Moolenaar  let code =<< trim END
3143*9470a4d8SBram Moolenaar    while 1
3144*9470a4d8SBram Moolenaar      try
3145*9470a4d8SBram Moolenaar      finally
3146*9470a4d8SBram Moolenaar    endwhile
3147*9470a4d8SBram Moolenaar  END
3148*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3149*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry')
3150*9470a4d8SBram Moolenaar
3151*9470a4d8SBram Moolenaar  " Missing :endtry
3152*9470a4d8SBram Moolenaar  let code =<< trim END
3153*9470a4d8SBram Moolenaar    while 1
3154*9470a4d8SBram Moolenaar      if 1
3155*9470a4d8SBram Moolenaar        try
3156*9470a4d8SBram Moolenaar        finally
3157*9470a4d8SBram Moolenaar    endwhile
3158*9470a4d8SBram Moolenaar  END
3159*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3160*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E600: Missing :endtry')
3161*9470a4d8SBram Moolenaar
3162*9470a4d8SBram Moolenaar  " Missing :endif
3163*9470a4d8SBram Moolenaar  let code =<< trim END
3164*9470a4d8SBram Moolenaar    while 1
3165*9470a4d8SBram Moolenaar      try
3166*9470a4d8SBram Moolenaar      finally
3167*9470a4d8SBram Moolenaar        if 1
3168*9470a4d8SBram Moolenaar    endwhile
3169*9470a4d8SBram Moolenaar  END
3170*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3171*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E171: Missing :endif')
3172*9470a4d8SBram Moolenaar
3173*9470a4d8SBram Moolenaar  " :endwhile without :while
3174*9470a4d8SBram Moolenaar  let code =<< trim END
3175*9470a4d8SBram Moolenaar    try
3176*9470a4d8SBram Moolenaar      endwhile
3177*9470a4d8SBram Moolenaar    endtry
3178*9470a4d8SBram Moolenaar  END
3179*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3180*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3181*9470a4d8SBram Moolenaar
3182*9470a4d8SBram Moolenaar  " :endwhile without :while
3183*9470a4d8SBram Moolenaar  let code =<< trim END
3184*9470a4d8SBram Moolenaar    while 1
3185*9470a4d8SBram Moolenaar      try
3186*9470a4d8SBram Moolenaar        endwhile
3187*9470a4d8SBram Moolenaar      endtry
3188*9470a4d8SBram Moolenaar    endwhile
3189*9470a4d8SBram Moolenaar  END
3190*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3191*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3192*9470a4d8SBram Moolenaar
3193*9470a4d8SBram Moolenaar  " :endwhile without :while
3194*9470a4d8SBram Moolenaar  let code =<< trim END
3195*9470a4d8SBram Moolenaar    try
3196*9470a4d8SBram Moolenaar      throw "a"
3197*9470a4d8SBram Moolenaar    catch /a/
3198*9470a4d8SBram Moolenaar      endwhile
3199*9470a4d8SBram Moolenaar    endtry
3200*9470a4d8SBram Moolenaar  END
3201*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3202*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3203*9470a4d8SBram Moolenaar
3204*9470a4d8SBram Moolenaar  " :endwhile without :while
3205*9470a4d8SBram Moolenaar  let code =<< trim END
3206*9470a4d8SBram Moolenaar    while 1
3207*9470a4d8SBram Moolenaar      try
3208*9470a4d8SBram Moolenaar        throw "a"
3209*9470a4d8SBram Moolenaar      catch /a/
3210*9470a4d8SBram Moolenaar        endwhile
3211*9470a4d8SBram Moolenaar      endtry
3212*9470a4d8SBram Moolenaar    endwhile
3213*9470a4d8SBram Moolenaar  END
3214*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3215*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endwhile):E588: :endwhile without :while')
3216*9470a4d8SBram Moolenaar
3217*9470a4d8SBram Moolenaar  call delete('Xtest')
3218*9470a4d8SBram Moolenaarendfunc
3219*9470a4d8SBram Moolenaar
3220*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3221*9470a4d8SBram Moolenaar" Test 55:  Nesting errors: :continue/:break				    {{{1
3222*9470a4d8SBram Moolenaar"
3223*9470a4d8SBram Moolenaar"	    For nesting errors of :continue and :break commands the correct
3224*9470a4d8SBram Moolenaar"	    error messages should be given.
3225*9470a4d8SBram Moolenaar"
3226*9470a4d8SBram Moolenaar"	    This test reuses the function MESSAGES() from the previous test.
3227*9470a4d8SBram Moolenaar"	    This functions checks the messages in g:msgfile.
3228*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3229*9470a4d8SBram Moolenaar
3230*9470a4d8SBram Moolenaarfunc Test_nested_cont_break_error()
3231*9470a4d8SBram Moolenaar  CheckEnglish
3232*9470a4d8SBram Moolenaar
3233*9470a4d8SBram Moolenaar  " :continue without :while
3234*9470a4d8SBram Moolenaar  let code =<< trim END
3235*9470a4d8SBram Moolenaar    continue
3236*9470a4d8SBram Moolenaar  END
3237*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3238*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
3239*9470a4d8SBram Moolenaar
3240*9470a4d8SBram Moolenaar  " :continue without :while
3241*9470a4d8SBram Moolenaar  let code =<< trim END
3242*9470a4d8SBram Moolenaar    if 1
3243*9470a4d8SBram Moolenaar      continue
3244*9470a4d8SBram Moolenaar    endif
3245*9470a4d8SBram Moolenaar  END
3246*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3247*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
3248*9470a4d8SBram Moolenaar
3249*9470a4d8SBram Moolenaar  " :continue without :while
3250*9470a4d8SBram Moolenaar  let code =<< trim END
3251*9470a4d8SBram Moolenaar    try
3252*9470a4d8SBram Moolenaar    finally
3253*9470a4d8SBram Moolenaar      continue
3254*9470a4d8SBram Moolenaar    endtry
3255*9470a4d8SBram Moolenaar  END
3256*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3257*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
3258*9470a4d8SBram Moolenaar
3259*9470a4d8SBram Moolenaar  " :continue without :while
3260*9470a4d8SBram Moolenaar  let code =<< trim END
3261*9470a4d8SBram Moolenaar    try
3262*9470a4d8SBram Moolenaar      continue
3263*9470a4d8SBram Moolenaar    endtry
3264*9470a4d8SBram Moolenaar  END
3265*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3266*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
3267*9470a4d8SBram Moolenaar
3268*9470a4d8SBram Moolenaar  " :continue without :while
3269*9470a4d8SBram Moolenaar  let code =<< trim END
3270*9470a4d8SBram Moolenaar    try
3271*9470a4d8SBram Moolenaar      throw "a"
3272*9470a4d8SBram Moolenaar    catch /a/
3273*9470a4d8SBram Moolenaar      continue
3274*9470a4d8SBram Moolenaar    endtry
3275*9470a4d8SBram Moolenaar  END
3276*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3277*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(continue):E586: :continue without :while or :for')
3278*9470a4d8SBram Moolenaar
3279*9470a4d8SBram Moolenaar  " :break without :while
3280*9470a4d8SBram Moolenaar  let code =<< trim END
3281*9470a4d8SBram Moolenaar    break
3282*9470a4d8SBram Moolenaar  END
3283*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3284*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
3285*9470a4d8SBram Moolenaar
3286*9470a4d8SBram Moolenaar  " :break without :while
3287*9470a4d8SBram Moolenaar  let code =<< trim END
3288*9470a4d8SBram Moolenaar    if 1
3289*9470a4d8SBram Moolenaar      break
3290*9470a4d8SBram Moolenaar    endif
3291*9470a4d8SBram Moolenaar  END
3292*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3293*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
3294*9470a4d8SBram Moolenaar
3295*9470a4d8SBram Moolenaar  " :break without :while
3296*9470a4d8SBram Moolenaar  let code =<< trim END
3297*9470a4d8SBram Moolenaar    try
3298*9470a4d8SBram Moolenaar    finally
3299*9470a4d8SBram Moolenaar      break
3300*9470a4d8SBram Moolenaar    endtry
3301*9470a4d8SBram Moolenaar  END
3302*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3303*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
3304*9470a4d8SBram Moolenaar
3305*9470a4d8SBram Moolenaar  " :break without :while
3306*9470a4d8SBram Moolenaar  let code =<< trim END
3307*9470a4d8SBram Moolenaar    try
3308*9470a4d8SBram Moolenaar      break
3309*9470a4d8SBram Moolenaar    endtry
3310*9470a4d8SBram Moolenaar  END
3311*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3312*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
3313*9470a4d8SBram Moolenaar
3314*9470a4d8SBram Moolenaar  " :break without :while
3315*9470a4d8SBram Moolenaar  let code =<< trim END
3316*9470a4d8SBram Moolenaar    try
3317*9470a4d8SBram Moolenaar      throw "a"
3318*9470a4d8SBram Moolenaar    catch /a/
3319*9470a4d8SBram Moolenaar      break
3320*9470a4d8SBram Moolenaar    endtry
3321*9470a4d8SBram Moolenaar  END
3322*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3323*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(break):E587: :break without :while or :for')
3324*9470a4d8SBram Moolenaar
3325*9470a4d8SBram Moolenaar  call delete('Xtest')
3326*9470a4d8SBram Moolenaarendfunc
3327*9470a4d8SBram Moolenaar
3328*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3329*9470a4d8SBram Moolenaar" Test 56:  Nesting errors: :endtry					    {{{1
3330*9470a4d8SBram Moolenaar"
3331*9470a4d8SBram Moolenaar"	    For nesting errors of :try conditionals the correct error messages
3332*9470a4d8SBram Moolenaar"	    should be given.
3333*9470a4d8SBram Moolenaar"
3334*9470a4d8SBram Moolenaar"	    This test reuses the function MESSAGES() from the previous test.
3335*9470a4d8SBram Moolenaar"	    This functions checks the messages in g:msgfile.
3336*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3337*9470a4d8SBram Moolenaar
3338*9470a4d8SBram Moolenaarfunc Test_nested_endtry_error()
3339*9470a4d8SBram Moolenaar  CheckEnglish
3340*9470a4d8SBram Moolenaar
3341*9470a4d8SBram Moolenaar  " :endtry without :try
3342*9470a4d8SBram Moolenaar  let code =<< trim END
3343*9470a4d8SBram Moolenaar    endtry
3344*9470a4d8SBram Moolenaar  END
3345*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3346*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try')
3347*9470a4d8SBram Moolenaar
3348*9470a4d8SBram Moolenaar  " :endtry without :try
3349*9470a4d8SBram Moolenaar  let code =<< trim END
3350*9470a4d8SBram Moolenaar    if 1
3351*9470a4d8SBram Moolenaar      endtry
3352*9470a4d8SBram Moolenaar    endif
3353*9470a4d8SBram Moolenaar  END
3354*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3355*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try')
3356*9470a4d8SBram Moolenaar
3357*9470a4d8SBram Moolenaar  " :endtry without :try
3358*9470a4d8SBram Moolenaar  let code =<< trim END
3359*9470a4d8SBram Moolenaar    while 1
3360*9470a4d8SBram Moolenaar      endtry
3361*9470a4d8SBram Moolenaar    endwhile
3362*9470a4d8SBram Moolenaar  END
3363*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3364*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E602: :endtry without :try')
3365*9470a4d8SBram Moolenaar
3366*9470a4d8SBram Moolenaar  " Missing :endif
3367*9470a4d8SBram Moolenaar  let code =<< trim END
3368*9470a4d8SBram Moolenaar    try
3369*9470a4d8SBram Moolenaar        if 1
3370*9470a4d8SBram Moolenaar    endtry
3371*9470a4d8SBram Moolenaar  END
3372*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3373*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
3374*9470a4d8SBram Moolenaar
3375*9470a4d8SBram Moolenaar  " Missing :endwhile
3376*9470a4d8SBram Moolenaar  let code =<< trim END
3377*9470a4d8SBram Moolenaar    try
3378*9470a4d8SBram Moolenaar      while 1
3379*9470a4d8SBram Moolenaar    endtry
3380*9470a4d8SBram Moolenaar  END
3381*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3382*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile')
3383*9470a4d8SBram Moolenaar
3384*9470a4d8SBram Moolenaar  " Missing :endif
3385*9470a4d8SBram Moolenaar  let code =<< trim END
3386*9470a4d8SBram Moolenaar    try
3387*9470a4d8SBram Moolenaar    finally
3388*9470a4d8SBram Moolenaar      if 1
3389*9470a4d8SBram Moolenaar    endtry
3390*9470a4d8SBram Moolenaar  END
3391*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3392*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
3393*9470a4d8SBram Moolenaar
3394*9470a4d8SBram Moolenaar  " Missing :endwhile
3395*9470a4d8SBram Moolenaar  let code =<< trim END
3396*9470a4d8SBram Moolenaar    try
3397*9470a4d8SBram Moolenaar    finally
3398*9470a4d8SBram Moolenaar      while 1
3399*9470a4d8SBram Moolenaar    endtry
3400*9470a4d8SBram Moolenaar  END
3401*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3402*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile')
3403*9470a4d8SBram Moolenaar
3404*9470a4d8SBram Moolenaar  " Missing :endif
3405*9470a4d8SBram Moolenaar  let code =<< trim END
3406*9470a4d8SBram Moolenaar    try
3407*9470a4d8SBram Moolenaar      throw "a"
3408*9470a4d8SBram Moolenaar    catch /a/
3409*9470a4d8SBram Moolenaar      if 1
3410*9470a4d8SBram Moolenaar    endtry
3411*9470a4d8SBram Moolenaar  END
3412*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3413*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E171: Missing :endif')
3414*9470a4d8SBram Moolenaar
3415*9470a4d8SBram Moolenaar  " Missing :endwhile
3416*9470a4d8SBram Moolenaar  let code =<< trim END
3417*9470a4d8SBram Moolenaar    try
3418*9470a4d8SBram Moolenaar      throw "a"
3419*9470a4d8SBram Moolenaar    catch /a/
3420*9470a4d8SBram Moolenaar      while 1
3421*9470a4d8SBram Moolenaar    endtry
3422*9470a4d8SBram Moolenaar  END
3423*9470a4d8SBram Moolenaar  call writefile(code, 'Xtest')
3424*9470a4d8SBram Moolenaar  call AssertException(['source Xtest'], 'Vim(endtry):E170: Missing :endwhile')
3425*9470a4d8SBram Moolenaar
3426*9470a4d8SBram Moolenaar  call delete('Xtest')
3427*9470a4d8SBram Moolenaarendfunc
3428*9470a4d8SBram Moolenaar
3429*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3430*9470a4d8SBram Moolenaar" Test 57:  v:exception and v:throwpoint for user exceptions		    {{{1
3431*9470a4d8SBram Moolenaar"
3432*9470a4d8SBram Moolenaar"	    v:exception evaluates to the value of the exception that was caught
3433*9470a4d8SBram Moolenaar"	    most recently and is not finished.  (A caught exception is finished
3434*9470a4d8SBram Moolenaar"	    when the next ":catch", ":finally", or ":endtry" is reached.)
3435*9470a4d8SBram Moolenaar"	    v:throwpoint evaluates to the script/function name and line number
3436*9470a4d8SBram Moolenaar"	    where that exception has been thrown.
3437*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3438*9470a4d8SBram Moolenaar
3439*9470a4d8SBram Moolenaarfunc Test_user_exception_info()
3440*9470a4d8SBram Moolenaar  CheckEnglish
3441*9470a4d8SBram Moolenaar
3442*9470a4d8SBram Moolenaar  XpathINIT
3443*9470a4d8SBram Moolenaar  XloopINIT
3444*9470a4d8SBram Moolenaar
3445*9470a4d8SBram Moolenaar  func FuncException()
3446*9470a4d8SBram Moolenaar    let g:exception = v:exception
3447*9470a4d8SBram Moolenaar  endfunc
3448*9470a4d8SBram Moolenaar
3449*9470a4d8SBram Moolenaar  func FuncThrowpoint()
3450*9470a4d8SBram Moolenaar    let g:throwpoint = v:throwpoint
3451*9470a4d8SBram Moolenaar  endfunc
3452*9470a4d8SBram Moolenaar
3453*9470a4d8SBram Moolenaar  let scriptException  = MakeScript("FuncException")
3454*9470a4d8SBram Moolenaar  let scriptThrowPoint = MakeScript("FuncThrowpoint")
3455*9470a4d8SBram Moolenaar
3456*9470a4d8SBram Moolenaar  command! CmdException  let g:exception  = v:exception
3457*9470a4d8SBram Moolenaar  command! CmdThrowpoint let g:throwpoint = v:throwpoint
3458*9470a4d8SBram Moolenaar
3459*9470a4d8SBram Moolenaar  func T(arg, line)
3460*9470a4d8SBram Moolenaar    if a:line == 2
3461*9470a4d8SBram Moolenaar      throw a:arg		" in line 2
3462*9470a4d8SBram Moolenaar    elseif a:line == 4
3463*9470a4d8SBram Moolenaar      throw a:arg		" in line 4
3464*9470a4d8SBram Moolenaar    elseif a:line == 6
3465*9470a4d8SBram Moolenaar      throw a:arg		" in line 6
3466*9470a4d8SBram Moolenaar    elseif a:line == 8
3467*9470a4d8SBram Moolenaar      throw a:arg		" in line 8
3468*9470a4d8SBram Moolenaar    endif
3469*9470a4d8SBram Moolenaar  endfunc
3470*9470a4d8SBram Moolenaar
3471*9470a4d8SBram Moolenaar  func G(arg, line)
3472*9470a4d8SBram Moolenaar    call T(a:arg, a:line)
3473*9470a4d8SBram Moolenaar  endfunc
3474*9470a4d8SBram Moolenaar
3475*9470a4d8SBram Moolenaar  func F(arg, line)
3476*9470a4d8SBram Moolenaar    call G(a:arg, a:line)
3477*9470a4d8SBram Moolenaar  endfunc
3478*9470a4d8SBram Moolenaar
3479*9470a4d8SBram Moolenaar  let scriptT = MakeScript("T")
3480*9470a4d8SBram Moolenaar  let scriptG = MakeScript("G", scriptT)
3481*9470a4d8SBram Moolenaar  let scriptF = MakeScript("F", scriptG)
3482*9470a4d8SBram Moolenaar
3483*9470a4d8SBram Moolenaar  try
3484*9470a4d8SBram Moolenaar    Xpath 'a'
3485*9470a4d8SBram Moolenaar    call F("oops", 2)
3486*9470a4d8SBram Moolenaar  catch /.*/
3487*9470a4d8SBram Moolenaar    Xpath 'b'
3488*9470a4d8SBram Moolenaar    let exception  = v:exception
3489*9470a4d8SBram Moolenaar    let throwpoint = v:throwpoint
3490*9470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
3491*9470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3492*9470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
3493*9470a4d8SBram Moolenaar
3494*9470a4d8SBram Moolenaar    exec "let exception  = v:exception"
3495*9470a4d8SBram Moolenaar    exec "let throwpoint = v:throwpoint"
3496*9470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
3497*9470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3498*9470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
3499*9470a4d8SBram Moolenaar
3500*9470a4d8SBram Moolenaar    CmdException
3501*9470a4d8SBram Moolenaar    CmdThrowpoint
3502*9470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
3503*9470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3504*9470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
3505*9470a4d8SBram Moolenaar
3506*9470a4d8SBram Moolenaar    call FuncException()
3507*9470a4d8SBram Moolenaar    call FuncThrowpoint()
3508*9470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
3509*9470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3510*9470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
3511*9470a4d8SBram Moolenaar
3512*9470a4d8SBram Moolenaar    exec "source" scriptException
3513*9470a4d8SBram Moolenaar    exec "source" scriptThrowPoint
3514*9470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
3515*9470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3516*9470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
3517*9470a4d8SBram Moolenaar
3518*9470a4d8SBram Moolenaar    try
3519*9470a4d8SBram Moolenaar      Xpath 'c'
3520*9470a4d8SBram Moolenaar      call G("arrgh", 4)
3521*9470a4d8SBram Moolenaar    catch /.*/
3522*9470a4d8SBram Moolenaar      Xpath 'd'
3523*9470a4d8SBram Moolenaar      let exception  = v:exception
3524*9470a4d8SBram Moolenaar      let throwpoint = v:throwpoint
3525*9470a4d8SBram Moolenaar      call assert_equal("arrgh", v:exception)
3526*9470a4d8SBram Moolenaar      call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
3527*9470a4d8SBram Moolenaar      call assert_match('\<4\>', v:throwpoint)
3528*9470a4d8SBram Moolenaar
3529*9470a4d8SBram Moolenaar      try
3530*9470a4d8SBram Moolenaar        Xpath 'e'
3531*9470a4d8SBram Moolenaar        let g:arg = "autsch"
3532*9470a4d8SBram Moolenaar        let g:line = 6
3533*9470a4d8SBram Moolenaar        exec "source" scriptF
3534*9470a4d8SBram Moolenaar      catch /.*/
3535*9470a4d8SBram Moolenaar        Xpath 'f'
3536*9470a4d8SBram Moolenaar        let exception  = v:exception
3537*9470a4d8SBram Moolenaar        let throwpoint = v:throwpoint
3538*9470a4d8SBram Moolenaar        call assert_equal("autsch", v:exception)
3539*9470a4d8SBram Moolenaar        call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
3540*9470a4d8SBram Moolenaar        call assert_match('\<6\>', v:throwpoint)
3541*9470a4d8SBram Moolenaar      finally
3542*9470a4d8SBram Moolenaar        Xpath 'g'
3543*9470a4d8SBram Moolenaar        let exception  = v:exception
3544*9470a4d8SBram Moolenaar        let throwpoint = v:throwpoint
3545*9470a4d8SBram Moolenaar        call assert_equal("arrgh", v:exception)
3546*9470a4d8SBram Moolenaar        call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
3547*9470a4d8SBram Moolenaar        call assert_match('\<4\>', v:throwpoint)
3548*9470a4d8SBram Moolenaar        try
3549*9470a4d8SBram Moolenaar          Xpath 'h'
3550*9470a4d8SBram Moolenaar          let g:arg = "brrrr"
3551*9470a4d8SBram Moolenaar          let g:line = 8
3552*9470a4d8SBram Moolenaar          exec "source" scriptG
3553*9470a4d8SBram Moolenaar        catch /.*/
3554*9470a4d8SBram Moolenaar          Xpath 'i'
3555*9470a4d8SBram Moolenaar          let exception  = v:exception
3556*9470a4d8SBram Moolenaar          let throwpoint = v:throwpoint
3557*9470a4d8SBram Moolenaar          " Resolve scriptT for matching it against v:throwpoint.
3558*9470a4d8SBram Moolenaar          call assert_equal("brrrr", v:exception)
3559*9470a4d8SBram Moolenaar          call assert_match(fnamemodify(scriptT, ':t'), v:throwpoint)
3560*9470a4d8SBram Moolenaar          call assert_match('\<8\>', v:throwpoint)
3561*9470a4d8SBram Moolenaar        finally
3562*9470a4d8SBram Moolenaar          Xpath 'j'
3563*9470a4d8SBram Moolenaar          let exception  = v:exception
3564*9470a4d8SBram Moolenaar          let throwpoint = v:throwpoint
3565*9470a4d8SBram Moolenaar          call assert_equal("arrgh", v:exception)
3566*9470a4d8SBram Moolenaar          call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
3567*9470a4d8SBram Moolenaar          call assert_match('\<4\>', v:throwpoint)
3568*9470a4d8SBram Moolenaar        endtry
3569*9470a4d8SBram Moolenaar        Xpath 'k'
3570*9470a4d8SBram Moolenaar        let exception  = v:exception
3571*9470a4d8SBram Moolenaar        let throwpoint = v:throwpoint
3572*9470a4d8SBram Moolenaar        call assert_equal("arrgh", v:exception)
3573*9470a4d8SBram Moolenaar        call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
3574*9470a4d8SBram Moolenaar        call assert_match('\<4\>', v:throwpoint)
3575*9470a4d8SBram Moolenaar      endtry
3576*9470a4d8SBram Moolenaar      Xpath 'l'
3577*9470a4d8SBram Moolenaar      let exception  = v:exception
3578*9470a4d8SBram Moolenaar      let throwpoint = v:throwpoint
3579*9470a4d8SBram Moolenaar      call assert_equal("arrgh", v:exception)
3580*9470a4d8SBram Moolenaar      call assert_match('\<G\[1]\.\.T\>', v:throwpoint)
3581*9470a4d8SBram Moolenaar      call assert_match('\<4\>', v:throwpoint)
3582*9470a4d8SBram Moolenaar    finally
3583*9470a4d8SBram Moolenaar      Xpath 'm'
3584*9470a4d8SBram Moolenaar      let exception  = v:exception
3585*9470a4d8SBram Moolenaar      let throwpoint = v:throwpoint
3586*9470a4d8SBram Moolenaar      call assert_equal("oops", v:exception)
3587*9470a4d8SBram Moolenaar      call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3588*9470a4d8SBram Moolenaar      call assert_match('\<2\>', v:throwpoint)
3589*9470a4d8SBram Moolenaar    endtry
3590*9470a4d8SBram Moolenaar    Xpath 'n'
3591*9470a4d8SBram Moolenaar    let exception  = v:exception
3592*9470a4d8SBram Moolenaar    let throwpoint = v:throwpoint
3593*9470a4d8SBram Moolenaar    call assert_equal("oops", v:exception)
3594*9470a4d8SBram Moolenaar    call assert_match('\<F\[1]\.\.G\[1]\.\.T\>', v:throwpoint)
3595*9470a4d8SBram Moolenaar    call assert_match('\<2\>', v:throwpoint)
3596*9470a4d8SBram Moolenaar  finally
3597*9470a4d8SBram Moolenaar    Xpath 'o'
3598*9470a4d8SBram Moolenaar    let exception  = v:exception
3599*9470a4d8SBram Moolenaar    let throwpoint = v:throwpoint
3600*9470a4d8SBram Moolenaar    call assert_equal("", v:exception)
3601*9470a4d8SBram Moolenaar    call assert_match('^$', v:throwpoint)
3602*9470a4d8SBram Moolenaar    call assert_match('^$', v:throwpoint)
3603*9470a4d8SBram Moolenaar  endtry
3604*9470a4d8SBram Moolenaar
3605*9470a4d8SBram Moolenaar  call assert_equal('abcdefghijklmno', g:Xpath)
3606*9470a4d8SBram Moolenaar
3607*9470a4d8SBram Moolenaar  unlet exception throwpoint
3608*9470a4d8SBram Moolenaar  delfunction FuncException
3609*9470a4d8SBram Moolenaar  delfunction FuncThrowpoint
3610*9470a4d8SBram Moolenaar  call delete(scriptException)
3611*9470a4d8SBram Moolenaar  call delete(scriptThrowPoint)
3612*9470a4d8SBram Moolenaar  unlet scriptException scriptThrowPoint
3613*9470a4d8SBram Moolenaar  delcommand CmdException
3614*9470a4d8SBram Moolenaar  delcommand CmdThrowpoint
3615*9470a4d8SBram Moolenaar  delfunction T
3616*9470a4d8SBram Moolenaar  delfunction G
3617*9470a4d8SBram Moolenaar  delfunction F
3618*9470a4d8SBram Moolenaar  call delete(scriptT)
3619*9470a4d8SBram Moolenaar  call delete(scriptG)
3620*9470a4d8SBram Moolenaar  call delete(scriptF)
3621*9470a4d8SBram Moolenaar  unlet scriptT scriptG scriptF
3622*9470a4d8SBram Moolenaarendfunc
3623*9470a4d8SBram Moolenaar
3624*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3625*9470a4d8SBram Moolenaar"
3626*9470a4d8SBram Moolenaar" Test 58:  v:exception and v:throwpoint for error/interrupt exceptions	    {{{1
3627*9470a4d8SBram Moolenaar"
3628*9470a4d8SBram Moolenaar"	    v:exception and v:throwpoint work also for error and interrupt
3629*9470a4d8SBram Moolenaar"	    exceptions.
3630*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3631*9470a4d8SBram Moolenaar
3632*9470a4d8SBram Moolenaarfunc Test_execption_info_for_error()
3633*9470a4d8SBram Moolenaar  CheckEnglish
3634*9470a4d8SBram Moolenaar
3635*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
3636*9470a4d8SBram Moolenaar    func T(line)
3637*9470a4d8SBram Moolenaar      if a:line == 2
3638*9470a4d8SBram Moolenaar        delfunction T		" error (function in use) in line 2
3639*9470a4d8SBram Moolenaar      elseif a:line == 4
3640*9470a4d8SBram Moolenaar        call interrupt()
3641*9470a4d8SBram Moolenaar      endif
3642*9470a4d8SBram Moolenaar    endfunc
3643*9470a4d8SBram Moolenaar
3644*9470a4d8SBram Moolenaar    while 1
3645*9470a4d8SBram Moolenaar      try
3646*9470a4d8SBram Moolenaar        Xpath 'a'
3647*9470a4d8SBram Moolenaar        call T(2)
3648*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3649*9470a4d8SBram Moolenaar      catch /.*/
3650*9470a4d8SBram Moolenaar        Xpath 'b'
3651*9470a4d8SBram Moolenaar        if v:exception !~ 'Vim(delfunction):'
3652*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3653*9470a4d8SBram Moolenaar        endif
3654*9470a4d8SBram Moolenaar        if v:throwpoint !~ '\<T\>'
3655*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3656*9470a4d8SBram Moolenaar        endif
3657*9470a4d8SBram Moolenaar        if v:throwpoint !~ '\<2\>'
3658*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3659*9470a4d8SBram Moolenaar        endif
3660*9470a4d8SBram Moolenaar      finally
3661*9470a4d8SBram Moolenaar        Xpath 'c'
3662*9470a4d8SBram Moolenaar        if v:exception != ""
3663*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3664*9470a4d8SBram Moolenaar        endif
3665*9470a4d8SBram Moolenaar        if v:throwpoint != ""
3666*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3667*9470a4d8SBram Moolenaar        endif
3668*9470a4d8SBram Moolenaar        break
3669*9470a4d8SBram Moolenaar      endtry
3670*9470a4d8SBram Moolenaar    endwhile
3671*9470a4d8SBram Moolenaar
3672*9470a4d8SBram Moolenaar    Xpath 'd'
3673*9470a4d8SBram Moolenaar    if v:exception != ""
3674*9470a4d8SBram Moolenaar      call assert_report('should not get here')
3675*9470a4d8SBram Moolenaar    endif
3676*9470a4d8SBram Moolenaar    if v:throwpoint != ""
3677*9470a4d8SBram Moolenaar      call assert_report('should not get here')
3678*9470a4d8SBram Moolenaar    endif
3679*9470a4d8SBram Moolenaar
3680*9470a4d8SBram Moolenaar    while 1
3681*9470a4d8SBram Moolenaar      try
3682*9470a4d8SBram Moolenaar        Xpath 'e'
3683*9470a4d8SBram Moolenaar        call T(4)
3684*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3685*9470a4d8SBram Moolenaar      catch /.*/
3686*9470a4d8SBram Moolenaar        Xpath 'f'
3687*9470a4d8SBram Moolenaar        if v:exception != 'Vim:Interrupt'
3688*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3689*9470a4d8SBram Moolenaar        endif
3690*9470a4d8SBram Moolenaar        if v:throwpoint !~ 'function T'
3691*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3692*9470a4d8SBram Moolenaar        endif
3693*9470a4d8SBram Moolenaar        if v:throwpoint !~ '\<4\>'
3694*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3695*9470a4d8SBram Moolenaar        endif
3696*9470a4d8SBram Moolenaar      finally
3697*9470a4d8SBram Moolenaar        Xpath 'g'
3698*9470a4d8SBram Moolenaar        if v:exception != ""
3699*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3700*9470a4d8SBram Moolenaar        endif
3701*9470a4d8SBram Moolenaar        if v:throwpoint != ""
3702*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3703*9470a4d8SBram Moolenaar        endif
3704*9470a4d8SBram Moolenaar        break
3705*9470a4d8SBram Moolenaar      endtry
3706*9470a4d8SBram Moolenaar    endwhile
3707*9470a4d8SBram Moolenaar
3708*9470a4d8SBram Moolenaar    Xpath 'h'
3709*9470a4d8SBram Moolenaar    if v:exception != ""
3710*9470a4d8SBram Moolenaar      call assert_report('should not get here')
3711*9470a4d8SBram Moolenaar    endif
3712*9470a4d8SBram Moolenaar    if v:throwpoint != ""
3713*9470a4d8SBram Moolenaar      call assert_report('should not get here')
3714*9470a4d8SBram Moolenaar    endif
3715*9470a4d8SBram Moolenaar  [CODE]
3716*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
3717*9470a4d8SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
3718*9470a4d8SBram Moolenaar  [CODE]
3719*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
3720*9470a4d8SBram Moolenaarendfunc
3721*9470a4d8SBram Moolenaar
3722*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3723*9470a4d8SBram Moolenaar" Test 61:  Catching interrupt exceptions				    {{{1
3724*9470a4d8SBram Moolenaar"
3725*9470a4d8SBram Moolenaar"	    When an interrupt occurs inside a :try/:endtry region, an
3726*9470a4d8SBram Moolenaar"	    interrupt exception is thrown and can be caught.  Its value is
3727*9470a4d8SBram Moolenaar"	    "Vim:Interrupt".  If the interrupt occurs after an error or a :throw
3728*9470a4d8SBram Moolenaar"	    but before a matching :catch is reached, all following :catches of
3729*9470a4d8SBram Moolenaar"	    that try block are ignored, but the interrupt exception can be
3730*9470a4d8SBram Moolenaar"	    caught by the next surrounding try conditional.  An interrupt is
3731*9470a4d8SBram Moolenaar"	    ignored when there is a previous interrupt that has not been caught
3732*9470a4d8SBram Moolenaar"	    or causes a :finally clause to be executed.
3733*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3734*9470a4d8SBram Moolenaar
3735*9470a4d8SBram Moolenaarfunc Test_catch_intr_exception()
3736*9470a4d8SBram Moolenaar  let test =<< trim [CODE]
3737*9470a4d8SBram Moolenaar    while 1
3738*9470a4d8SBram Moolenaar      try
3739*9470a4d8SBram Moolenaar        try
3740*9470a4d8SBram Moolenaar          Xpath 'a'
3741*9470a4d8SBram Moolenaar          call interrupt()
3742*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3743*9470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
3744*9470a4d8SBram Moolenaar          Xpath 'b'
3745*9470a4d8SBram Moolenaar        finally
3746*9470a4d8SBram Moolenaar          Xpath 'c'
3747*9470a4d8SBram Moolenaar        endtry
3748*9470a4d8SBram Moolenaar      catch /.*/
3749*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3750*9470a4d8SBram Moolenaar      finally
3751*9470a4d8SBram Moolenaar        Xpath 'd'
3752*9470a4d8SBram Moolenaar        break
3753*9470a4d8SBram Moolenaar      endtry
3754*9470a4d8SBram Moolenaar    endwhile
3755*9470a4d8SBram Moolenaar
3756*9470a4d8SBram Moolenaar    while 1
3757*9470a4d8SBram Moolenaar      try
3758*9470a4d8SBram Moolenaar        try
3759*9470a4d8SBram Moolenaar          try
3760*9470a4d8SBram Moolenaar            Xpath 'e'
3761*9470a4d8SBram Moolenaar            asdf
3762*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3763*9470a4d8SBram Moolenaar          catch /do_not_catch/
3764*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3765*9470a4d8SBram Moolenaar          catch /.*/
3766*9470a4d8SBram Moolenaar            Xpath 'f'
3767*9470a4d8SBram Moolenaar            call interrupt()
3768*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3769*9470a4d8SBram Moolenaar          catch /.*/
3770*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3771*9470a4d8SBram Moolenaar          finally
3772*9470a4d8SBram Moolenaar            Xpath 'g'
3773*9470a4d8SBram Moolenaar            call interrupt()
3774*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3775*9470a4d8SBram Moolenaar          endtry
3776*9470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
3777*9470a4d8SBram Moolenaar          Xpath 'h'
3778*9470a4d8SBram Moolenaar        finally
3779*9470a4d8SBram Moolenaar          Xpath 'i'
3780*9470a4d8SBram Moolenaar        endtry
3781*9470a4d8SBram Moolenaar      catch /.*/
3782*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3783*9470a4d8SBram Moolenaar      finally
3784*9470a4d8SBram Moolenaar        Xpath 'j'
3785*9470a4d8SBram Moolenaar        break
3786*9470a4d8SBram Moolenaar      endtry
3787*9470a4d8SBram Moolenaar    endwhile
3788*9470a4d8SBram Moolenaar
3789*9470a4d8SBram Moolenaar    while 1
3790*9470a4d8SBram Moolenaar      try
3791*9470a4d8SBram Moolenaar        try
3792*9470a4d8SBram Moolenaar          try
3793*9470a4d8SBram Moolenaar            Xpath 'k'
3794*9470a4d8SBram Moolenaar            throw "x"
3795*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3796*9470a4d8SBram Moolenaar          catch /do_not_catch/
3797*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3798*9470a4d8SBram Moolenaar          catch /x/
3799*9470a4d8SBram Moolenaar            Xpath 'l'
3800*9470a4d8SBram Moolenaar            call interrupt()
3801*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3802*9470a4d8SBram Moolenaar          catch /.*/
3803*9470a4d8SBram Moolenaar            call assert_report('should not get here')
3804*9470a4d8SBram Moolenaar          endtry
3805*9470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
3806*9470a4d8SBram Moolenaar          Xpath 'm'
3807*9470a4d8SBram Moolenaar        finally
3808*9470a4d8SBram Moolenaar          Xpath 'n'
3809*9470a4d8SBram Moolenaar        endtry
3810*9470a4d8SBram Moolenaar      catch /.*/
3811*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3812*9470a4d8SBram Moolenaar      finally
3813*9470a4d8SBram Moolenaar        Xpath 'o'
3814*9470a4d8SBram Moolenaar        break
3815*9470a4d8SBram Moolenaar      endtry
3816*9470a4d8SBram Moolenaar    endwhile
3817*9470a4d8SBram Moolenaar
3818*9470a4d8SBram Moolenaar    while 1
3819*9470a4d8SBram Moolenaar      try
3820*9470a4d8SBram Moolenaar        try
3821*9470a4d8SBram Moolenaar          Xpath 'p'
3822*9470a4d8SBram Moolenaar          call interrupt()
3823*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3824*9470a4d8SBram Moolenaar        catch /do_not_catch/
3825*9470a4d8SBram Moolenaar          call interrupt()
3826*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3827*9470a4d8SBram Moolenaar        catch /^Vim:Interrupt$/
3828*9470a4d8SBram Moolenaar          Xpath 'q'
3829*9470a4d8SBram Moolenaar        finally
3830*9470a4d8SBram Moolenaar          Xpath 'r'
3831*9470a4d8SBram Moolenaar        endtry
3832*9470a4d8SBram Moolenaar      catch /.*/
3833*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3834*9470a4d8SBram Moolenaar      finally
3835*9470a4d8SBram Moolenaar        Xpath 's'
3836*9470a4d8SBram Moolenaar        break
3837*9470a4d8SBram Moolenaar      endtry
3838*9470a4d8SBram Moolenaar    endwhile
3839*9470a4d8SBram Moolenaar
3840*9470a4d8SBram Moolenaar    Xpath 't'
3841*9470a4d8SBram Moolenaar  [CODE]
3842*9470a4d8SBram Moolenaar  let verify =<< trim [CODE]
3843*9470a4d8SBram Moolenaar    call assert_equal('abcdefghijklmnopqrst', g:Xpath)
3844*9470a4d8SBram Moolenaar  [CODE]
3845*9470a4d8SBram Moolenaar  call RunInNewVim(test, verify)
3846*9470a4d8SBram Moolenaarendfunc
3847*9470a4d8SBram Moolenaar
3848*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3849*9470a4d8SBram Moolenaar" Test 65:  Errors in the /pattern/ argument of a :catch		    {{{1
3850*9470a4d8SBram Moolenaar"
3851*9470a4d8SBram Moolenaar"	    On an error in the /pattern/ argument of a :catch, the :catch does
3852*9470a4d8SBram Moolenaar"	    not match.  Any following :catches of the same :try/:endtry don't
3853*9470a4d8SBram Moolenaar"	    match either.  Finally clauses are executed.
3854*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
3855*9470a4d8SBram Moolenaar
3856*9470a4d8SBram Moolenaarfunc Test_catch_pattern_error()
3857*9470a4d8SBram Moolenaar  CheckEnglish
3858*9470a4d8SBram Moolenaar  XpathINIT
3859*9470a4d8SBram Moolenaar
3860*9470a4d8SBram Moolenaar  try
3861*9470a4d8SBram Moolenaar    try
3862*9470a4d8SBram Moolenaar      Xpath 'a'
3863*9470a4d8SBram Moolenaar      throw "oops"
3864*9470a4d8SBram Moolenaar    catch /^oops$/
3865*9470a4d8SBram Moolenaar      Xpath 'b'
3866*9470a4d8SBram Moolenaar    catch /\)/		" not checked; exception has already been caught
3867*9470a4d8SBram Moolenaar      call assert_report('should not get here')
3868*9470a4d8SBram Moolenaar    endtry
3869*9470a4d8SBram Moolenaar    Xpath 'c'
3870*9470a4d8SBram Moolenaar  catch /.*/
3871*9470a4d8SBram Moolenaar    call assert_report('should not get here')
3872*9470a4d8SBram Moolenaar  endtry
3873*9470a4d8SBram Moolenaar  call assert_equal('abc', g:Xpath)
3874*9470a4d8SBram Moolenaar
3875*9470a4d8SBram Moolenaar  XpathINIT
3876*9470a4d8SBram Moolenaar  func F()
3877*9470a4d8SBram Moolenaar    try
3878*9470a4d8SBram Moolenaar      try
3879*9470a4d8SBram Moolenaar        try
3880*9470a4d8SBram Moolenaar          Xpath 'a'
3881*9470a4d8SBram Moolenaar          throw "ab"
3882*9470a4d8SBram Moolenaar        catch /abc/	" does not catch
3883*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3884*9470a4d8SBram Moolenaar        catch /\)/	" error; discards exception
3885*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3886*9470a4d8SBram Moolenaar        catch /.*/	" not checked
3887*9470a4d8SBram Moolenaar          call assert_report('should not get here')
3888*9470a4d8SBram Moolenaar        finally
3889*9470a4d8SBram Moolenaar          Xpath 'b'
3890*9470a4d8SBram Moolenaar        endtry
3891*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3892*9470a4d8SBram Moolenaar      catch /^ab$/	" checked, but original exception is discarded
3893*9470a4d8SBram Moolenaar        call assert_report('should not get here')
3894*9470a4d8SBram Moolenaar      catch /^Vim(catch):/
3895*9470a4d8SBram Moolenaar        Xpath 'c'
3896*9470a4d8SBram Moolenaar        call assert_match('Vim(catch):E475: Invalid argument:', v:exception)
3897*9470a4d8SBram Moolenaar      finally
3898*9470a4d8SBram Moolenaar        Xpath 'd'
3899*9470a4d8SBram Moolenaar      endtry
3900*9470a4d8SBram Moolenaar      Xpath 'e'
3901*9470a4d8SBram Moolenaar    catch /.*/
3902*9470a4d8SBram Moolenaar      call assert_report('should not get here')
3903*9470a4d8SBram Moolenaar    endtry
3904*9470a4d8SBram Moolenaar    Xpath 'f'
3905*9470a4d8SBram Moolenaar  endfunc
3906*9470a4d8SBram Moolenaar
3907*9470a4d8SBram Moolenaar  call F()
3908*9470a4d8SBram Moolenaar  call assert_equal('abcdef', g:Xpath)
3909*9470a4d8SBram Moolenaar
3910*9470a4d8SBram Moolenaar  delfunc F
3911*9470a4d8SBram Moolenaarendfunc
3912*9470a4d8SBram Moolenaar
3913*9470a4d8SBram Moolenaar"-------------------------------------------------------------------------------
39141f068233SBram Moolenaar" Test 87   using (expr) ? funcref : funcref				    {{{1
39151f068233SBram Moolenaar"
39161f068233SBram Moolenaar"	    Vim needs to correctly parse the funcref and even when it does
39171f068233SBram Moolenaar"	    not execute the funcref, it needs to consume the trailing ()
39181f068233SBram Moolenaar"-------------------------------------------------------------------------------
39191f068233SBram Moolenaar
39201f068233SBram Moolenaarfunc Add2(x1, x2)
39211f068233SBram Moolenaar  return a:x1 + a:x2
39221f068233SBram Moolenaarendfu
39231f068233SBram Moolenaar
39241f068233SBram Moolenaarfunc GetStr()
39251f068233SBram Moolenaar  return "abcdefghijklmnopqrstuvwxyp"
39261f068233SBram Moolenaarendfu
39271f068233SBram Moolenaar
39281f068233SBram Moolenaarfunc Test_funcref_with_condexpr()
39291f068233SBram Moolenaar  call assert_equal(5, function('Add2')(2,3))
39301f068233SBram Moolenaar
39311f068233SBram Moolenaar  call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3))
39321f068233SBram Moolenaar  call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3))
39331f068233SBram Moolenaar  " Make sure, GetStr() still works.
39341f068233SBram Moolenaar  call assert_equal('abcdefghijk', GetStr()[0:10])
39351f068233SBram Moolenaarendfunc
39361f068233SBram Moolenaar
3937b544f3c8SBram Moolenaar" Test 90:  Recognizing {} in variable name.			    {{{1
3938b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3939b544f3c8SBram Moolenaar
3940b544f3c8SBram Moolenaarfunc Test_curlies()
3941b544f3c8SBram Moolenaar    let s:var = 66
3942b544f3c8SBram Moolenaar    let ns = 's'
3943b544f3c8SBram Moolenaar    call assert_equal(66, {ns}:var)
3944b544f3c8SBram Moolenaar
3945b544f3c8SBram Moolenaar    let g:a = {}
3946b544f3c8SBram Moolenaar    let g:b = 't'
3947b544f3c8SBram Moolenaar    let g:a[g:b] = 77
3948b544f3c8SBram Moolenaar    call assert_equal(77, g:a['t'])
3949b544f3c8SBram Moolenaarendfunc
3950b544f3c8SBram Moolenaar
3951b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3952b544f3c8SBram Moolenaar" Test 91:  using type().					    {{{1
3953b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3954b544f3c8SBram Moolenaar
3955b544f3c8SBram Moolenaarfunc Test_type()
3956b544f3c8SBram Moolenaar    call assert_equal(0, type(0))
3957b544f3c8SBram Moolenaar    call assert_equal(1, type(""))
3958b544f3c8SBram Moolenaar    call assert_equal(2, type(function("tr")))
3959b544f3c8SBram Moolenaar    call assert_equal(2, type(function("tr", [8])))
3960b544f3c8SBram Moolenaar    call assert_equal(3, type([]))
3961b544f3c8SBram Moolenaar    call assert_equal(4, type({}))
39625feabe00SBram Moolenaar    if has('float')
3963b544f3c8SBram Moolenaar      call assert_equal(5, type(0.0))
39645feabe00SBram Moolenaar    endif
3965b544f3c8SBram Moolenaar    call assert_equal(6, type(v:false))
3966b544f3c8SBram Moolenaar    call assert_equal(6, type(v:true))
3967b544f3c8SBram Moolenaar    call assert_equal(7, type(v:none))
3968b544f3c8SBram Moolenaar    call assert_equal(7, type(v:null))
3969b544f3c8SBram Moolenaar    call assert_equal(8, v:t_job)
3970b544f3c8SBram Moolenaar    call assert_equal(9, v:t_channel)
3971b544f3c8SBram Moolenaar    call assert_equal(v:t_number, type(0))
3972b544f3c8SBram Moolenaar    call assert_equal(v:t_string, type(""))
3973b544f3c8SBram Moolenaar    call assert_equal(v:t_func, type(function("tr")))
3974b544f3c8SBram Moolenaar    call assert_equal(v:t_func, type(function("tr", [8])))
3975b544f3c8SBram Moolenaar    call assert_equal(v:t_list, type([]))
3976b544f3c8SBram Moolenaar    call assert_equal(v:t_dict, type({}))
39775feabe00SBram Moolenaar    if has('float')
3978b544f3c8SBram Moolenaar      call assert_equal(v:t_float, type(0.0))
39795feabe00SBram Moolenaar    endif
3980b544f3c8SBram Moolenaar    call assert_equal(v:t_bool, type(v:false))
3981b544f3c8SBram Moolenaar    call assert_equal(v:t_bool, type(v:true))
3982b544f3c8SBram Moolenaar    call assert_equal(v:t_none, type(v:none))
3983b544f3c8SBram Moolenaar    call assert_equal(v:t_none, type(v:null))
398492b83ccfSBram Moolenaar    call assert_equal(v:t_string, type(test_null_string()))
398592b83ccfSBram Moolenaar    call assert_equal(v:t_func, type(test_null_function()))
398692b83ccfSBram Moolenaar    call assert_equal(v:t_func, type(test_null_partial()))
398792b83ccfSBram Moolenaar    call assert_equal(v:t_list, type(test_null_list()))
398892b83ccfSBram Moolenaar    call assert_equal(v:t_dict, type(test_null_dict()))
398992b83ccfSBram Moolenaar    if has('job')
399092b83ccfSBram Moolenaar      call assert_equal(v:t_job, type(test_null_job()))
399192b83ccfSBram Moolenaar    endif
399292b83ccfSBram Moolenaar    if has('channel')
399392b83ccfSBram Moolenaar      call assert_equal(v:t_channel, type(test_null_channel()))
399492b83ccfSBram Moolenaar    endif
399592b83ccfSBram Moolenaar    call assert_equal(v:t_blob, type(test_null_blob()))
3996b544f3c8SBram Moolenaar
39977c215c58SBram Moolenaar    call assert_fails("call type(test_void())", 'E685:')
39987c215c58SBram Moolenaar    call assert_fails("call type(test_unknown())", 'E685:')
3999b544f3c8SBram Moolenaar
4000b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:false)
4001b544f3c8SBram Moolenaar    call assert_equal(1, 0 + v:true)
4002b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:none)
4003b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:null)
4004b544f3c8SBram Moolenaar
4005b544f3c8SBram Moolenaar    call assert_equal('v:false', '' . v:false)
4006b544f3c8SBram Moolenaar    call assert_equal('v:true', '' . v:true)
4007b544f3c8SBram Moolenaar    call assert_equal('v:none', '' . v:none)
4008b544f3c8SBram Moolenaar    call assert_equal('v:null', '' . v:null)
4009b544f3c8SBram Moolenaar
4010b544f3c8SBram Moolenaar    call assert_true(v:false == 0)
4011b544f3c8SBram Moolenaar    call assert_false(v:false != 0)
4012b544f3c8SBram Moolenaar    call assert_true(v:true == 1)
4013b544f3c8SBram Moolenaar    call assert_false(v:true != 1)
4014b544f3c8SBram Moolenaar    call assert_false(v:true == v:false)
4015b544f3c8SBram Moolenaar    call assert_true(v:true != v:false)
4016b544f3c8SBram Moolenaar
4017b544f3c8SBram Moolenaar    call assert_true(v:null == 0)
4018b544f3c8SBram Moolenaar    call assert_false(v:null != 0)
4019b544f3c8SBram Moolenaar    call assert_true(v:none == 0)
4020b544f3c8SBram Moolenaar    call assert_false(v:none != 0)
4021b544f3c8SBram Moolenaar
4022b544f3c8SBram Moolenaar    call assert_true(v:false is v:false)
4023b544f3c8SBram Moolenaar    call assert_true(v:true is v:true)
4024b544f3c8SBram Moolenaar    call assert_true(v:none is v:none)
4025b544f3c8SBram Moolenaar    call assert_true(v:null is v:null)
4026b544f3c8SBram Moolenaar
4027b544f3c8SBram Moolenaar    call assert_false(v:false isnot v:false)
4028b544f3c8SBram Moolenaar    call assert_false(v:true isnot v:true)
4029b544f3c8SBram Moolenaar    call assert_false(v:none isnot v:none)
4030b544f3c8SBram Moolenaar    call assert_false(v:null isnot v:null)
4031b544f3c8SBram Moolenaar
4032b544f3c8SBram Moolenaar    call assert_false(v:false is 0)
4033b544f3c8SBram Moolenaar    call assert_false(v:true is 1)
4034b544f3c8SBram Moolenaar    call assert_false(v:true is v:false)
4035b544f3c8SBram Moolenaar    call assert_false(v:none is 0)
4036b544f3c8SBram Moolenaar    call assert_false(v:null is 0)
4037b544f3c8SBram Moolenaar    call assert_false(v:null is v:none)
4038b544f3c8SBram Moolenaar
4039b544f3c8SBram Moolenaar    call assert_true(v:false isnot 0)
4040b544f3c8SBram Moolenaar    call assert_true(v:true isnot 1)
4041b544f3c8SBram Moolenaar    call assert_true(v:true isnot v:false)
4042b544f3c8SBram Moolenaar    call assert_true(v:none isnot 0)
4043b544f3c8SBram Moolenaar    call assert_true(v:null isnot 0)
4044b544f3c8SBram Moolenaar    call assert_true(v:null isnot v:none)
4045b544f3c8SBram Moolenaar
4046b544f3c8SBram Moolenaar    call assert_equal(v:false, eval(string(v:false)))
4047b544f3c8SBram Moolenaar    call assert_equal(v:true, eval(string(v:true)))
4048b544f3c8SBram Moolenaar    call assert_equal(v:none, eval(string(v:none)))
4049b544f3c8SBram Moolenaar    call assert_equal(v:null, eval(string(v:null)))
4050b544f3c8SBram Moolenaar
4051b544f3c8SBram Moolenaar    call assert_equal(v:false, copy(v:false))
4052b544f3c8SBram Moolenaar    call assert_equal(v:true, copy(v:true))
4053b544f3c8SBram Moolenaar    call assert_equal(v:none, copy(v:none))
4054b544f3c8SBram Moolenaar    call assert_equal(v:null, copy(v:null))
4055b544f3c8SBram Moolenaar
4056b544f3c8SBram Moolenaar    call assert_equal([v:false], deepcopy([v:false]))
4057b544f3c8SBram Moolenaar    call assert_equal([v:true], deepcopy([v:true]))
4058b544f3c8SBram Moolenaar    call assert_equal([v:none], deepcopy([v:none]))
4059b544f3c8SBram Moolenaar    call assert_equal([v:null], deepcopy([v:null]))
4060b544f3c8SBram Moolenaar
4061b544f3c8SBram Moolenaar    call assert_true(empty(v:false))
4062b544f3c8SBram Moolenaar    call assert_false(empty(v:true))
4063b544f3c8SBram Moolenaar    call assert_true(empty(v:null))
4064b544f3c8SBram Moolenaar    call assert_true(empty(v:none))
4065b544f3c8SBram Moolenaar
4066b544f3c8SBram Moolenaar    func ChangeYourMind()
4067b544f3c8SBram Moolenaar	try
4068b544f3c8SBram Moolenaar	    return v:true
4069b544f3c8SBram Moolenaar	finally
4070b544f3c8SBram Moolenaar	    return 'something else'
4071b544f3c8SBram Moolenaar	endtry
4072b544f3c8SBram Moolenaar    endfunc
4073b544f3c8SBram Moolenaar
4074b544f3c8SBram Moolenaar    call ChangeYourMind()
4075b544f3c8SBram Moolenaarendfunc
4076b544f3c8SBram Moolenaar
4077b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4078b544f3c8SBram Moolenaar" Test 92:  skipping code					    {{{1
4079b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4080b544f3c8SBram Moolenaar
4081b544f3c8SBram Moolenaarfunc Test_skip()
4082b544f3c8SBram Moolenaar    let Fn = function('Test_type')
4083b544f3c8SBram Moolenaar    call assert_false(0 && Fn[1])
4084b544f3c8SBram Moolenaar    call assert_false(0 && string(Fn))
4085b544f3c8SBram Moolenaar    call assert_false(0 && len(Fn))
4086b544f3c8SBram Moolenaar    let l = []
4087b544f3c8SBram Moolenaar    call assert_false(0 && l[1])
4088b544f3c8SBram Moolenaar    call assert_false(0 && string(l))
4089b544f3c8SBram Moolenaar    call assert_false(0 && len(l))
4090b544f3c8SBram Moolenaar    let f = 1.0
4091b544f3c8SBram Moolenaar    call assert_false(0 && f[1])
4092b544f3c8SBram Moolenaar    call assert_false(0 && string(f))
4093b544f3c8SBram Moolenaar    call assert_false(0 && len(f))
4094b544f3c8SBram Moolenaar    let sp = v:null
4095b544f3c8SBram Moolenaar    call assert_false(0 && sp[1])
4096b544f3c8SBram Moolenaar    call assert_false(0 && string(sp))
4097b544f3c8SBram Moolenaar    call assert_false(0 && len(sp))
4098b544f3c8SBram Moolenaar
4099b544f3c8SBram Moolenaarendfunc
4100b544f3c8SBram Moolenaar
4101b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4102b544f3c8SBram Moolenaar" Test 93:  :echo and string()					    {{{1
4103b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4104b544f3c8SBram Moolenaar
4105b544f3c8SBram Moolenaarfunc Test_echo_and_string()
4106b544f3c8SBram Moolenaar    " String
4107b544f3c8SBram Moolenaar    let a = 'foo bar'
4108b544f3c8SBram Moolenaar    redir => result
4109b544f3c8SBram Moolenaar    echo a
4110b544f3c8SBram Moolenaar    echo string(a)
4111b544f3c8SBram Moolenaar    redir END
4112b544f3c8SBram Moolenaar    let l = split(result, "\n")
4113b544f3c8SBram Moolenaar    call assert_equal(["foo bar",
4114b544f3c8SBram Moolenaar		     \ "'foo bar'"], l)
4115b544f3c8SBram Moolenaar
4116b544f3c8SBram Moolenaar    " Float
4117b544f3c8SBram Moolenaar    if has('float')
4118b544f3c8SBram Moolenaar	let a = -1.2e0
4119b544f3c8SBram Moolenaar	redir => result
4120b544f3c8SBram Moolenaar	echo a
4121b544f3c8SBram Moolenaar	echo string(a)
4122b544f3c8SBram Moolenaar	redir END
4123b544f3c8SBram Moolenaar	let l = split(result, "\n")
4124b544f3c8SBram Moolenaar	call assert_equal(["-1.2",
4125b544f3c8SBram Moolenaar			 \ "-1.2"], l)
4126b544f3c8SBram Moolenaar    endif
4127b544f3c8SBram Moolenaar
4128b544f3c8SBram Moolenaar    " Funcref
4129b544f3c8SBram Moolenaar    redir => result
4130b544f3c8SBram Moolenaar    echo function('string')
4131b544f3c8SBram Moolenaar    echo string(function('string'))
4132b544f3c8SBram Moolenaar    redir END
4133b544f3c8SBram Moolenaar    let l = split(result, "\n")
4134b544f3c8SBram Moolenaar    call assert_equal(["string",
4135b544f3c8SBram Moolenaar		     \ "function('string')"], l)
4136b544f3c8SBram Moolenaar
4137b544f3c8SBram Moolenaar    " Recursive dictionary
4138b544f3c8SBram Moolenaar    let a = {}
4139b544f3c8SBram Moolenaar    let a["a"] = a
4140b544f3c8SBram Moolenaar    redir => result
4141b544f3c8SBram Moolenaar    echo a
4142b544f3c8SBram Moolenaar    echo string(a)
4143b544f3c8SBram Moolenaar    redir END
4144b544f3c8SBram Moolenaar    let l = split(result, "\n")
4145b544f3c8SBram Moolenaar    call assert_equal(["{'a': {...}}",
4146b544f3c8SBram Moolenaar		     \ "{'a': {...}}"], l)
4147b544f3c8SBram Moolenaar
4148b544f3c8SBram Moolenaar    " Recursive list
4149b544f3c8SBram Moolenaar    let a = [0]
4150b544f3c8SBram Moolenaar    let a[0] = a
4151b544f3c8SBram Moolenaar    redir => result
4152b544f3c8SBram Moolenaar    echo a
4153b544f3c8SBram Moolenaar    echo string(a)
4154b544f3c8SBram Moolenaar    redir END
4155b544f3c8SBram Moolenaar    let l = split(result, "\n")
4156b544f3c8SBram Moolenaar    call assert_equal(["[[...]]",
4157b544f3c8SBram Moolenaar		     \ "[[...]]"], l)
4158b544f3c8SBram Moolenaar
4159b544f3c8SBram Moolenaar    " Empty dictionaries in a list
4160b544f3c8SBram Moolenaar    let a = {}
4161b544f3c8SBram Moolenaar    redir => result
4162b544f3c8SBram Moolenaar    echo [a, a, a]
4163b544f3c8SBram Moolenaar    echo string([a, a, a])
4164b544f3c8SBram Moolenaar    redir END
4165b544f3c8SBram Moolenaar    let l = split(result, "\n")
4166b544f3c8SBram Moolenaar    call assert_equal(["[{}, {}, {}]",
4167b544f3c8SBram Moolenaar		     \ "[{}, {}, {}]"], l)
4168b544f3c8SBram Moolenaar
4169b544f3c8SBram Moolenaar    " Empty dictionaries in a dictionary
4170b544f3c8SBram Moolenaar    let a = {}
4171b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
4172b544f3c8SBram Moolenaar    redir => result
4173b544f3c8SBram Moolenaar    echo b
4174b544f3c8SBram Moolenaar    echo string(b)
4175b544f3c8SBram Moolenaar    redir END
4176b544f3c8SBram Moolenaar    let l = split(result, "\n")
4177b544f3c8SBram Moolenaar    call assert_equal(["{'a': {}, 'b': {}}",
4178b544f3c8SBram Moolenaar		     \ "{'a': {}, 'b': {}}"], l)
4179b544f3c8SBram Moolenaar
4180b544f3c8SBram Moolenaar    " Empty lists in a list
4181b544f3c8SBram Moolenaar    let a = []
4182b544f3c8SBram Moolenaar    redir => result
4183b544f3c8SBram Moolenaar    echo [a, a, a]
4184b544f3c8SBram Moolenaar    echo string([a, a, a])
4185b544f3c8SBram Moolenaar    redir END
4186b544f3c8SBram Moolenaar    let l = split(result, "\n")
4187b544f3c8SBram Moolenaar    call assert_equal(["[[], [], []]",
4188b544f3c8SBram Moolenaar		     \ "[[], [], []]"], l)
4189b544f3c8SBram Moolenaar
4190b544f3c8SBram Moolenaar    " Empty lists in a dictionary
4191b544f3c8SBram Moolenaar    let a = []
4192b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
4193b544f3c8SBram Moolenaar    redir => result
4194b544f3c8SBram Moolenaar    echo b
4195b544f3c8SBram Moolenaar    echo string(b)
4196b544f3c8SBram Moolenaar    redir END
4197b544f3c8SBram Moolenaar    let l = split(result, "\n")
4198b544f3c8SBram Moolenaar    call assert_equal(["{'a': [], 'b': []}",
4199b544f3c8SBram Moolenaar		     \ "{'a': [], 'b': []}"], l)
4200b544f3c8SBram Moolenaar
4201b544f3c8SBram Moolenaar    " Dictionaries in a list
4202b544f3c8SBram Moolenaar    let a = {"one": "yes", "two": "yes", "three": "yes"}
4203b544f3c8SBram Moolenaar    redir => result
4204b544f3c8SBram Moolenaar    echo [a, a, a]
4205b544f3c8SBram Moolenaar    echo string([a, a, a])
4206b544f3c8SBram Moolenaar    redir END
4207b544f3c8SBram Moolenaar    let l = split(result, "\n")
4208b544f3c8SBram Moolenaar    call assert_equal(["[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {...}, {...}]",
4209b544f3c8SBram Moolenaar		     \ "[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}]"], l)
4210b544f3c8SBram Moolenaar
4211b544f3c8SBram Moolenaar    " Dictionaries in a dictionary
4212b544f3c8SBram Moolenaar    let a = {"one": "yes", "two": "yes", "three": "yes"}
4213b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
4214b544f3c8SBram Moolenaar    redir => result
4215b544f3c8SBram Moolenaar    echo b
4216b544f3c8SBram Moolenaar    echo string(b)
4217b544f3c8SBram Moolenaar    redir END
4218b544f3c8SBram Moolenaar    let l = split(result, "\n")
4219b544f3c8SBram Moolenaar    call assert_equal(["{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {...}}",
4220b544f3c8SBram Moolenaar		     \ "{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {'one': 'yes', 'two': 'yes', 'three': 'yes'}}"], l)
4221b544f3c8SBram Moolenaar
4222b544f3c8SBram Moolenaar    " Lists in a list
4223b544f3c8SBram Moolenaar    let a = [1, 2, 3]
4224b544f3c8SBram Moolenaar    redir => result
4225b544f3c8SBram Moolenaar    echo [a, a, a]
4226b544f3c8SBram Moolenaar    echo string([a, a, a])
4227b544f3c8SBram Moolenaar    redir END
4228b544f3c8SBram Moolenaar    let l = split(result, "\n")
4229b544f3c8SBram Moolenaar    call assert_equal(["[[1, 2, 3], [...], [...]]",
4230b544f3c8SBram Moolenaar		     \ "[[1, 2, 3], [1, 2, 3], [1, 2, 3]]"], l)
4231b544f3c8SBram Moolenaar
4232b544f3c8SBram Moolenaar    " Lists in a dictionary
4233b544f3c8SBram Moolenaar    let a = [1, 2, 3]
4234b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
4235b544f3c8SBram Moolenaar    redir => result
4236b544f3c8SBram Moolenaar    echo b
4237b544f3c8SBram Moolenaar    echo string(b)
4238b544f3c8SBram Moolenaar    redir END
4239b544f3c8SBram Moolenaar    let l = split(result, "\n")
4240b544f3c8SBram Moolenaar    call assert_equal(["{'a': [1, 2, 3], 'b': [...]}",
4241b544f3c8SBram Moolenaar		     \ "{'a': [1, 2, 3], 'b': [1, 2, 3]}"], l)
4242b544f3c8SBram Moolenaar
42431363a30cSBram Moolenaar    call assert_fails('echo &:', 'E112:')
42441363a30cSBram Moolenaar    call assert_fails('echo &g:', 'E112:')
42451363a30cSBram Moolenaar    call assert_fails('echo &l:', 'E112:')
42461363a30cSBram Moolenaar
4247b544f3c8SBram Moolenaarendfunc
4248b544f3c8SBram Moolenaar
4249b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4250b544f3c8SBram Moolenaar" Test 94:  64-bit Numbers					    {{{1
4251b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4252b544f3c8SBram Moolenaar
4253b544f3c8SBram Moolenaarfunc Test_num64()
4254b544f3c8SBram Moolenaar    call assert_notequal( 4294967296, 0)
4255b544f3c8SBram Moolenaar    call assert_notequal(-4294967296, 0)
4256b544f3c8SBram Moolenaar    call assert_equal( 4294967296,  0xFFFFffff + 1)
4257b544f3c8SBram Moolenaar    call assert_equal(-4294967296, -0xFFFFffff - 1)
4258b544f3c8SBram Moolenaar
4259b544f3c8SBram Moolenaar    call assert_equal( 9223372036854775807,  1 / 0)
4260b544f3c8SBram Moolenaar    call assert_equal(-9223372036854775807, -1 / 0)
4261b544f3c8SBram Moolenaar    call assert_equal(-9223372036854775807 - 1,  0 / 0)
4262b544f3c8SBram Moolenaar
42635feabe00SBram Moolenaar    if has('float')
4264b544f3c8SBram Moolenaar      call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150))
4265b544f3c8SBram Moolenaar      call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150))
42665feabe00SBram Moolenaar    endif
4267b544f3c8SBram Moolenaar
4268b544f3c8SBram Moolenaar    let rng = range(0xFFFFffff, 0x100000001)
4269b544f3c8SBram Moolenaar    call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng)
4270b544f3c8SBram Moolenaar    call assert_equal(0x100000001, max(rng))
4271b544f3c8SBram Moolenaar    call assert_equal(0xFFFFffff, min(rng))
4272b544f3c8SBram Moolenaar    call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N'))
4273b544f3c8SBram Moolenaarendfunc
4274b544f3c8SBram Moolenaar
4275b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4276b544f3c8SBram Moolenaar" Test 95:  lines of :append, :change, :insert			    {{{1
4277b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4278b544f3c8SBram Moolenaar
4279b544f3c8SBram Moolenaarfunction! DefineFunction(name, body)
4280b544f3c8SBram Moolenaar    let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n")
4281b544f3c8SBram Moolenaar    exec func
4282b544f3c8SBram Moolenaarendfunction
4283b544f3c8SBram Moolenaar
4284b544f3c8SBram Moolenaarfunc Test_script_lines()
4285b544f3c8SBram Moolenaar    " :append
4286b544f3c8SBram Moolenaar    try
4287b544f3c8SBram Moolenaar	call DefineFunction('T_Append', [
4288b544f3c8SBram Moolenaar		    \ 'append',
4289b544f3c8SBram Moolenaar		    \ 'py <<EOS',
4290b544f3c8SBram Moolenaar		    \ '.',
4291b544f3c8SBram Moolenaar		    \ ])
4292b544f3c8SBram Moolenaar    catch
429337175409SBram Moolenaar	call assert_report("Can't define function")
4294b544f3c8SBram Moolenaar    endtry
4295b544f3c8SBram Moolenaar    try
4296b544f3c8SBram Moolenaar	call DefineFunction('T_Append', [
4297b544f3c8SBram Moolenaar		    \ 'append',
4298b544f3c8SBram Moolenaar		    \ 'abc',
4299b544f3c8SBram Moolenaar		    \ ])
430037175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
4301b544f3c8SBram Moolenaar    catch
4302b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
4303b544f3c8SBram Moolenaar    endtry
4304b544f3c8SBram Moolenaar
4305b544f3c8SBram Moolenaar    " :change
4306b544f3c8SBram Moolenaar    try
4307b544f3c8SBram Moolenaar	call DefineFunction('T_Change', [
4308b544f3c8SBram Moolenaar		    \ 'change',
4309b544f3c8SBram Moolenaar		    \ 'py <<EOS',
4310b544f3c8SBram Moolenaar		    \ '.',
4311b544f3c8SBram Moolenaar		    \ ])
4312b544f3c8SBram Moolenaar    catch
431337175409SBram Moolenaar	call assert_report("Can't define function")
4314b544f3c8SBram Moolenaar    endtry
4315b544f3c8SBram Moolenaar    try
4316b544f3c8SBram Moolenaar	call DefineFunction('T_Change', [
4317b544f3c8SBram Moolenaar		    \ 'change',
4318b544f3c8SBram Moolenaar		    \ 'abc',
4319b544f3c8SBram Moolenaar		    \ ])
432037175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
4321b544f3c8SBram Moolenaar    catch
4322b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
4323b544f3c8SBram Moolenaar    endtry
4324b544f3c8SBram Moolenaar
4325b544f3c8SBram Moolenaar    " :insert
4326b544f3c8SBram Moolenaar    try
4327b544f3c8SBram Moolenaar	call DefineFunction('T_Insert', [
4328b544f3c8SBram Moolenaar		    \ 'insert',
4329b544f3c8SBram Moolenaar		    \ 'py <<EOS',
4330b544f3c8SBram Moolenaar		    \ '.',
4331b544f3c8SBram Moolenaar		    \ ])
4332b544f3c8SBram Moolenaar    catch
433337175409SBram Moolenaar	call assert_report("Can't define function")
4334b544f3c8SBram Moolenaar    endtry
4335b544f3c8SBram Moolenaar    try
4336b544f3c8SBram Moolenaar	call DefineFunction('T_Insert', [
4337b544f3c8SBram Moolenaar		    \ 'insert',
4338b544f3c8SBram Moolenaar		    \ 'abc',
4339b544f3c8SBram Moolenaar		    \ ])
434037175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
4341b544f3c8SBram Moolenaar    catch
4342b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
4343b544f3c8SBram Moolenaar    endtry
4344b544f3c8SBram Moolenaarendfunc
4345b544f3c8SBram Moolenaar
4346b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4347478af67dSBram Moolenaar" Test 96:  line continuation						    {{{1
4348478af67dSBram Moolenaar"
4349478af67dSBram Moolenaar"	    Undefined behavior was detected by ubsan with line continuation
4350478af67dSBram Moolenaar"	    after an empty line.
4351478af67dSBram Moolenaar"-------------------------------------------------------------------------------
4352478af67dSBram Moolenaarfunc Test_script_emty_line_continuation()
4353478af67dSBram Moolenaar
4354478af67dSBram Moolenaar    \
4355478af67dSBram Moolenaarendfunc
4356478af67dSBram Moolenaar
4357478af67dSBram Moolenaar"-------------------------------------------------------------------------------
4358863e80b4SBram Moolenaar" Test 97:  bitwise functions						    {{{1
4359863e80b4SBram Moolenaar"-------------------------------------------------------------------------------
4360863e80b4SBram Moolenaarfunc Test_bitwise_functions()
4361863e80b4SBram Moolenaar    " and
4362863e80b4SBram Moolenaar    call assert_equal(127, and(127, 127))
4363863e80b4SBram Moolenaar    call assert_equal(16, and(127, 16))
4364073e4b92SBram Moolenaar    eval 127->and(16)->assert_equal(16)
4365863e80b4SBram Moolenaar    call assert_equal(0, and(127, 128))
4366863e80b4SBram Moolenaar    call assert_fails("call and([], 1)", 'E745:')
4367863e80b4SBram Moolenaar    call assert_fails("call and({}, 1)", 'E728:')
43685feabe00SBram Moolenaar    if has('float')
43695feabe00SBram Moolenaar      call assert_fails("call and(1.0, 1)", 'E805:')
4370863e80b4SBram Moolenaar      call assert_fails("call and(1, 1.0)", 'E805:')
43715feabe00SBram Moolenaar    endif
4372863e80b4SBram Moolenaar    call assert_fails("call and(1, [])", 'E745:')
4373863e80b4SBram Moolenaar    call assert_fails("call and(1, {})", 'E728:')
4374863e80b4SBram Moolenaar    " or
4375863e80b4SBram Moolenaar    call assert_equal(23, or(16, 7))
4376863e80b4SBram Moolenaar    call assert_equal(15, or(8, 7))
4377073e4b92SBram Moolenaar    eval 8->or(7)->assert_equal(15)
4378863e80b4SBram Moolenaar    call assert_equal(123, or(0, 123))
4379863e80b4SBram Moolenaar    call assert_fails("call or([], 1)", 'E745:')
4380863e80b4SBram Moolenaar    call assert_fails("call or({}, 1)", 'E728:')
43815feabe00SBram Moolenaar    if has('float')
43825feabe00SBram Moolenaar      call assert_fails("call or(1.0, 1)", 'E805:')
4383863e80b4SBram Moolenaar      call assert_fails("call or(1, 1.0)", 'E805:')
43845feabe00SBram Moolenaar    endif
4385863e80b4SBram Moolenaar    call assert_fails("call or(1, [])", 'E745:')
4386863e80b4SBram Moolenaar    call assert_fails("call or(1, {})", 'E728:')
4387863e80b4SBram Moolenaar    " xor
4388863e80b4SBram Moolenaar    call assert_equal(0, xor(127, 127))
4389863e80b4SBram Moolenaar    call assert_equal(111, xor(127, 16))
4390073e4b92SBram Moolenaar    eval 127->xor(16)->assert_equal(111)
4391863e80b4SBram Moolenaar    call assert_equal(255, xor(127, 128))
43925feabe00SBram Moolenaar    if has('float')
4393863e80b4SBram Moolenaar      call assert_fails("call xor(1.0, 1)", 'E805:')
43945feabe00SBram Moolenaar      call assert_fails("call xor(1, 1.0)", 'E805:')
43955feabe00SBram Moolenaar    endif
4396863e80b4SBram Moolenaar    call assert_fails("call xor([], 1)", 'E745:')
4397863e80b4SBram Moolenaar    call assert_fails("call xor({}, 1)", 'E728:')
4398863e80b4SBram Moolenaar    call assert_fails("call xor(1, [])", 'E745:')
4399863e80b4SBram Moolenaar    call assert_fails("call xor(1, {})", 'E728:')
4400863e80b4SBram Moolenaar    " invert
4401863e80b4SBram Moolenaar    call assert_equal(65408, and(invert(127), 65535))
4402073e4b92SBram Moolenaar    eval 127->invert()->and(65535)->assert_equal(65408)
4403863e80b4SBram Moolenaar    call assert_equal(65519, and(invert(16), 65535))
4404863e80b4SBram Moolenaar    call assert_equal(65407, and(invert(128), 65535))
44055feabe00SBram Moolenaar    if has('float')
4406863e80b4SBram Moolenaar      call assert_fails("call invert(1.0)", 'E805:')
44075feabe00SBram Moolenaar    endif
4408863e80b4SBram Moolenaar    call assert_fails("call invert([])", 'E745:')
4409863e80b4SBram Moolenaar    call assert_fails("call invert({})", 'E728:')
4410863e80b4SBram Moolenaarendfunc
4411863e80b4SBram Moolenaar
44126f9a476bSBram Moolenaar" Test using bang after user command				    {{{1
44136f9a476bSBram Moolenaarfunc Test_user_command_with_bang()
44146f9a476bSBram Moolenaar    command -bang Nieuw let nieuw = 1
44156f9a476bSBram Moolenaar    Ni!
44166f9a476bSBram Moolenaar    call assert_equal(1, nieuw)
44176f9a476bSBram Moolenaar    unlet nieuw
44186f9a476bSBram Moolenaar    delcommand Nieuw
44196f9a476bSBram Moolenaarendfunc
44206f9a476bSBram Moolenaar
4421b9adef79SBram Moolenaarfunc Test_script_expand_sfile()
4422b9adef79SBram Moolenaar  let lines =<< trim END
4423b9adef79SBram Moolenaar    func s:snr()
4424b9adef79SBram Moolenaar      return expand('<sfile>')
4425b9adef79SBram Moolenaar    endfunc
4426b9adef79SBram Moolenaar    let g:result = s:snr()
4427b9adef79SBram Moolenaar  END
4428b9adef79SBram Moolenaar  call writefile(lines, 'Xexpand')
4429b9adef79SBram Moolenaar  source Xexpand
4430b9adef79SBram Moolenaar  call assert_match('<SNR>\d\+_snr', g:result)
4431b9adef79SBram Moolenaar  source Xexpand
4432b9adef79SBram Moolenaar  call assert_match('<SNR>\d\+_snr', g:result)
4433b9adef79SBram Moolenaar
4434b9adef79SBram Moolenaar  call delete('Xexpand')
4435b9adef79SBram Moolenaar  unlet g:result
4436b9adef79SBram Moolenaarendfunc
4437b9adef79SBram Moolenaar
4438ff697e6cSBram Moolenaarfunc Test_compound_assignment_operators()
4439ff697e6cSBram Moolenaar    " Test for number
4440ff697e6cSBram Moolenaar    let x = 1
4441ff697e6cSBram Moolenaar    let x += 10
4442ff697e6cSBram Moolenaar    call assert_equal(11, x)
4443ff697e6cSBram Moolenaar    let x -= 5
4444ff697e6cSBram Moolenaar    call assert_equal(6, x)
4445ff697e6cSBram Moolenaar    let x *= 4
4446ff697e6cSBram Moolenaar    call assert_equal(24, x)
4447ff697e6cSBram Moolenaar    let x /= 3
4448ff697e6cSBram Moolenaar    call assert_equal(8, x)
4449ff697e6cSBram Moolenaar    let x %= 3
4450ff697e6cSBram Moolenaar    call assert_equal(2, x)
4451ff697e6cSBram Moolenaar    let x .= 'n'
4452ff697e6cSBram Moolenaar    call assert_equal('2n', x)
4453ff697e6cSBram Moolenaar
4454e21c1580SBram Moolenaar    " Test special cases: division or modulus with 0.
4455e21c1580SBram Moolenaar    let x = 1
4456e21c1580SBram Moolenaar    let x /= 0
4457e21c1580SBram Moolenaar    call assert_equal(0x7FFFFFFFFFFFFFFF, x)
4458e21c1580SBram Moolenaar
4459e21c1580SBram Moolenaar    let x = -1
4460e21c1580SBram Moolenaar    let x /= 0
4461e21c1580SBram Moolenaar    call assert_equal(-0x7FFFFFFFFFFFFFFF, x)
4462e21c1580SBram Moolenaar
4463e21c1580SBram Moolenaar    let x = 0
4464e21c1580SBram Moolenaar    let x /= 0
4465e21c1580SBram Moolenaar    call assert_equal(-0x7FFFFFFFFFFFFFFF - 1, x)
4466e21c1580SBram Moolenaar
4467e21c1580SBram Moolenaar    let x = 1
4468e21c1580SBram Moolenaar    let x %= 0
4469e21c1580SBram Moolenaar    call assert_equal(0, x)
4470e21c1580SBram Moolenaar
4471e21c1580SBram Moolenaar    let x = -1
4472e21c1580SBram Moolenaar    let x %= 0
4473e21c1580SBram Moolenaar    call assert_equal(0, x)
4474e21c1580SBram Moolenaar
4475e21c1580SBram Moolenaar    let x = 0
4476e21c1580SBram Moolenaar    let x %= 0
4477e21c1580SBram Moolenaar    call assert_equal(0, x)
4478e21c1580SBram Moolenaar
4479ff697e6cSBram Moolenaar    " Test for string
4480ff697e6cSBram Moolenaar    let x = 'str'
4481ff697e6cSBram Moolenaar    let x .= 'ing'
4482ff697e6cSBram Moolenaar    call assert_equal('string', x)
4483ff697e6cSBram Moolenaar    let x += 1
4484ff697e6cSBram Moolenaar    call assert_equal(1, x)
4485ff697e6cSBram Moolenaar
4486ff697e6cSBram Moolenaar    if has('float')
4487ff697e6cSBram Moolenaar      " Test for float
44885feabe00SBram Moolenaar      let x -= 1.5
44895feabe00SBram Moolenaar      call assert_equal(-0.5, x)
4490ff697e6cSBram Moolenaar      let x = 0.5
4491ff697e6cSBram Moolenaar      let x += 4.5
4492ff697e6cSBram Moolenaar      call assert_equal(5.0, x)
4493ff697e6cSBram Moolenaar      let x -= 1.5
4494ff697e6cSBram Moolenaar      call assert_equal(3.5, x)
4495ff697e6cSBram Moolenaar      let x *= 3.0
4496ff697e6cSBram Moolenaar      call assert_equal(10.5, x)
4497ff697e6cSBram Moolenaar      let x /= 2.5
4498ff697e6cSBram Moolenaar      call assert_equal(4.2, x)
4499ff697e6cSBram Moolenaar      call assert_fails('let x %= 0.5', 'E734')
4500ff697e6cSBram Moolenaar      call assert_fails('let x .= "f"', 'E734')
45018b633135SBram Moolenaar      let x = !3.14
45028b633135SBram Moolenaar      call assert_equal(0.0, x)
4503ea04a6e8SBram Moolenaar
4504ea04a6e8SBram Moolenaar      " integer and float operations
4505ea04a6e8SBram Moolenaar      let x = 1
4506ea04a6e8SBram Moolenaar      let x *= 2.1
4507ea04a6e8SBram Moolenaar      call assert_equal(2.1, x)
4508ea04a6e8SBram Moolenaar      let x = 1
4509ea04a6e8SBram Moolenaar      let x /= 0.25
4510ea04a6e8SBram Moolenaar      call assert_equal(4.0, x)
4511ea04a6e8SBram Moolenaar      let x = 1
4512ea04a6e8SBram Moolenaar      call assert_fails('let x %= 0.25', 'E734:')
4513ea04a6e8SBram Moolenaar      let x = 1
4514ea04a6e8SBram Moolenaar      call assert_fails('let x .= 0.25', 'E734:')
4515ea04a6e8SBram Moolenaar      let x = 1.0
4516ea04a6e8SBram Moolenaar      call assert_fails('let x += [1.1]', 'E734:')
4517ff697e6cSBram Moolenaar    endif
4518ff697e6cSBram Moolenaar
4519ff697e6cSBram Moolenaar    " Test for environment variable
4520ff697e6cSBram Moolenaar    let $FOO = 1
4521ff697e6cSBram Moolenaar    call assert_fails('let $FOO += 1', 'E734')
4522ff697e6cSBram Moolenaar    call assert_fails('let $FOO -= 1', 'E734')
4523ff697e6cSBram Moolenaar    call assert_fails('let $FOO *= 1', 'E734')
4524ff697e6cSBram Moolenaar    call assert_fails('let $FOO /= 1', 'E734')
4525ff697e6cSBram Moolenaar    call assert_fails('let $FOO %= 1', 'E734')
4526ff697e6cSBram Moolenaar    let $FOO .= 's'
4527ff697e6cSBram Moolenaar    call assert_equal('1s', $FOO)
4528ff697e6cSBram Moolenaar    unlet $FOO
4529ff697e6cSBram Moolenaar
4530ff697e6cSBram Moolenaar    " Test for option variable (type: number)
4531ff697e6cSBram Moolenaar    let &scrolljump = 1
4532ff697e6cSBram Moolenaar    let &scrolljump += 5
4533ff697e6cSBram Moolenaar    call assert_equal(6, &scrolljump)
4534ff697e6cSBram Moolenaar    let &scrolljump -= 2
4535ff697e6cSBram Moolenaar    call assert_equal(4, &scrolljump)
4536ff697e6cSBram Moolenaar    let &scrolljump *= 3
4537ff697e6cSBram Moolenaar    call assert_equal(12, &scrolljump)
4538ff697e6cSBram Moolenaar    let &scrolljump /= 2
4539ff697e6cSBram Moolenaar    call assert_equal(6, &scrolljump)
4540ff697e6cSBram Moolenaar    let &scrolljump %= 5
4541ff697e6cSBram Moolenaar    call assert_equal(1, &scrolljump)
4542ff697e6cSBram Moolenaar    call assert_fails('let &scrolljump .= "j"', 'E734')
4543ff697e6cSBram Moolenaar    set scrolljump&vim
4544ff697e6cSBram Moolenaar
4545ff697e6cSBram Moolenaar    " Test for register
4546ff697e6cSBram Moolenaar    let @/ = 1
4547ff697e6cSBram Moolenaar    call assert_fails('let @/ += 1', 'E734')
4548ff697e6cSBram Moolenaar    call assert_fails('let @/ -= 1', 'E734')
4549ff697e6cSBram Moolenaar    call assert_fails('let @/ *= 1', 'E734')
4550ff697e6cSBram Moolenaar    call assert_fails('let @/ /= 1', 'E734')
4551ff697e6cSBram Moolenaar    call assert_fails('let @/ %= 1', 'E734')
4552ff697e6cSBram Moolenaar    let @/ .= 's'
4553ff697e6cSBram Moolenaar    call assert_equal('1s', @/)
4554ff697e6cSBram Moolenaar    let @/ = ''
4555ff697e6cSBram Moolenaarendfunc
4556ff697e6cSBram Moolenaar
45577e0868efSBram Moolenaarfunc Test_unlet_env()
45587e0868efSBram Moolenaar  let $TESTVAR = 'yes'
45597e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
45607e0868efSBram Moolenaar  call assert_fails('lockvar $TESTVAR', 'E940')
45617e0868efSBram Moolenaar  call assert_fails('unlockvar $TESTVAR', 'E940')
45627e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
45637e0868efSBram Moolenaar  if 0
45647e0868efSBram Moolenaar    unlet $TESTVAR
45657e0868efSBram Moolenaar  endif
45667e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
45677e0868efSBram Moolenaar  unlet $TESTVAR
45687e0868efSBram Moolenaar  call assert_equal('', $TESTVAR)
45697e0868efSBram Moolenaarendfunc
45707e0868efSBram Moolenaar
4571c3e92c16SBram Moolenaarfunc Test_refcount()
4572c3e92c16SBram Moolenaar    " Immediate values
4573c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(1))
4574c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount('s'))
4575c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(v:true))
4576c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount([]))
4577c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount({}))
4578c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(0zff))
4579c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount({-> line('.')}))
4580c3e92c16SBram Moolenaar    if has('float')
4581c3e92c16SBram Moolenaar        call assert_equal(-1, test_refcount(0.1))
4582c3e92c16SBram Moolenaar    endif
4583c3e92c16SBram Moolenaar    if has('job')
4584c3e92c16SBram Moolenaar        call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .'])))
4585c3e92c16SBram Moolenaar    endif
4586c3e92c16SBram Moolenaar
4587c3e92c16SBram Moolenaar    " No refcount types
4588c3e92c16SBram Moolenaar    let x = 1
4589c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
4590c3e92c16SBram Moolenaar    let x = 's'
4591c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
4592c3e92c16SBram Moolenaar    let x = v:true
4593c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
4594c3e92c16SBram Moolenaar    if has('float')
4595c3e92c16SBram Moolenaar        let x = 0.1
4596c3e92c16SBram Moolenaar        call assert_equal(-1, test_refcount(x))
4597c3e92c16SBram Moolenaar    endif
4598c3e92c16SBram Moolenaar
4599c3e92c16SBram Moolenaar    " Check refcount
4600c3e92c16SBram Moolenaar    let x = []
4601c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(x))
4602c3e92c16SBram Moolenaar
4603c3e92c16SBram Moolenaar    let x = {}
4604ce90e36fSBram Moolenaar    call assert_equal(1, x->test_refcount())
4605c3e92c16SBram Moolenaar
4606c3e92c16SBram Moolenaar    let x = 0zff
4607c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(x))
4608c3e92c16SBram Moolenaar
4609c3e92c16SBram Moolenaar    let X = {-> line('.')}
4610c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(X))
4611c3e92c16SBram Moolenaar    let Y = X
4612c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
4613c3e92c16SBram Moolenaar
4614c3e92c16SBram Moolenaar    if has('job')
4615c3e92c16SBram Moolenaar        let job = job_start([&shell, &shellcmdflag, 'echo .'])
4616c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job))
4617c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job_getchannel(job)))
4618c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job))
4619c3e92c16SBram Moolenaar    endif
4620c3e92c16SBram Moolenaar
4621c3e92c16SBram Moolenaar    " Function arguments, copying and unassigning
4622c3e92c16SBram Moolenaar    func ExprCheck(x, i)
4623c3e92c16SBram Moolenaar        let i = a:i + 1
4624c3e92c16SBram Moolenaar        call assert_equal(i, test_refcount(a:x))
4625c3e92c16SBram Moolenaar        let Y = a:x
4626c3e92c16SBram Moolenaar        call assert_equal(i + 1, test_refcount(a:x))
4627c3e92c16SBram Moolenaar        call assert_equal(test_refcount(a:x), test_refcount(Y))
4628c3e92c16SBram Moolenaar        let Y = 0
4629c3e92c16SBram Moolenaar        call assert_equal(i, test_refcount(a:x))
4630c3e92c16SBram Moolenaar    endfunc
4631c3e92c16SBram Moolenaar    call ExprCheck([], 0)
4632c3e92c16SBram Moolenaar    call ExprCheck({}, 0)
4633c3e92c16SBram Moolenaar    call ExprCheck(0zff, 0)
4634c3e92c16SBram Moolenaar    call ExprCheck({-> line('.')}, 0)
4635c3e92c16SBram Moolenaar    if has('job')
4636c3e92c16SBram Moolenaar	call ExprCheck(job, 1)
4637c3e92c16SBram Moolenaar	call ExprCheck(job_getchannel(job), 1)
4638c3e92c16SBram Moolenaar	call job_stop(job)
4639c3e92c16SBram Moolenaar    endif
4640c3e92c16SBram Moolenaar    delfunc ExprCheck
4641c3e92c16SBram Moolenaar
4642c3e92c16SBram Moolenaar    " Regarding function
4643c3e92c16SBram Moolenaar    func Func(x) abort
4644c3e92c16SBram Moolenaar        call assert_equal(2, test_refcount(function('Func')))
4645c3e92c16SBram Moolenaar        call assert_equal(0, test_refcount(funcref('Func')))
4646c3e92c16SBram Moolenaar    endfunc
4647c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(function('Func')))
4648c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(function('Func', [1])))
4649c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(funcref('Func')))
4650c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(funcref('Func', [1])))
4651c3e92c16SBram Moolenaar    let X = function('Func')
4652c3e92c16SBram Moolenaar    let Y = X
4653c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(X))
4654c3e92c16SBram Moolenaar    let X = function('Func', [1])
4655c3e92c16SBram Moolenaar    let Y = X
4656c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
4657c3e92c16SBram Moolenaar    let X = funcref('Func')
4658c3e92c16SBram Moolenaar    let Y = X
4659c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
4660c3e92c16SBram Moolenaar    let X = funcref('Func', [1])
4661c3e92c16SBram Moolenaar    let Y = X
4662c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
4663c3e92c16SBram Moolenaar    unlet X
4664c3e92c16SBram Moolenaar    unlet Y
4665c3e92c16SBram Moolenaar    call Func(1)
4666c3e92c16SBram Moolenaar    delfunc Func
4667c3e92c16SBram Moolenaar
4668c3e92c16SBram Moolenaar    " Function with dict
4669c3e92c16SBram Moolenaar    func DictFunc() dict
4670c3e92c16SBram Moolenaar        call assert_equal(3, test_refcount(self))
4671c3e92c16SBram Moolenaar    endfunc
4672c3e92c16SBram Moolenaar    let d = {'Func': function('DictFunc')}
4673c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(d))
4674c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(d.Func))
4675c3e92c16SBram Moolenaar    call d.Func()
4676c3e92c16SBram Moolenaar    unlet d
4677c3e92c16SBram Moolenaar    delfunc DictFunc
4678c3e92c16SBram Moolenaarendfunc
4679c3e92c16SBram Moolenaar
46809f6277bdSBram Moolenaar" Test for missing :endif, :endfor, :endwhile and :endtry           {{{1
46819f6277bdSBram Moolenaarfunc Test_missing_end()
46829f6277bdSBram Moolenaar  call writefile(['if 2 > 1', 'echo ">"'], 'Xscript')
46839f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E171:')
46849f6277bdSBram Moolenaar  call writefile(['for i in range(5)', 'echo i'], 'Xscript')
46859f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E170:')
46869f6277bdSBram Moolenaar  call writefile(['while v:true', 'echo "."'], 'Xscript')
46879f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E170:')
46889f6277bdSBram Moolenaar  call writefile(['try', 'echo "."'], 'Xscript')
46899f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E600:')
46909f6277bdSBram Moolenaar  call delete('Xscript')
4691818fc9adSBram Moolenaar
4692818fc9adSBram Moolenaar  " Using endfor with :while
4693818fc9adSBram Moolenaar  let caught_e732 = 0
4694818fc9adSBram Moolenaar  try
4695818fc9adSBram Moolenaar    while v:true
4696818fc9adSBram Moolenaar    endfor
4697818fc9adSBram Moolenaar  catch /E732:/
4698818fc9adSBram Moolenaar    let caught_e732 = 1
4699818fc9adSBram Moolenaar  endtry
4700818fc9adSBram Moolenaar  call assert_equal(1, caught_e732)
4701818fc9adSBram Moolenaar
4702818fc9adSBram Moolenaar  " Using endwhile with :for
4703818fc9adSBram Moolenaar  let caught_e733 = 0
4704818fc9adSBram Moolenaar  try
4705818fc9adSBram Moolenaar    for i in range(1)
4706818fc9adSBram Moolenaar    endwhile
4707818fc9adSBram Moolenaar  catch /E733:/
4708818fc9adSBram Moolenaar    let caught_e733 = 1
4709818fc9adSBram Moolenaar  endtry
4710818fc9adSBram Moolenaar  call assert_equal(1, caught_e733)
4711818fc9adSBram Moolenaar
4712ee4e0c1eSBram Moolenaar  " Using endfunc with :if
4713ee4e0c1eSBram Moolenaar  call assert_fails('exe "if 1 | endfunc | endif"', 'E193:')
4714ee4e0c1eSBram Moolenaar
4715818fc9adSBram Moolenaar  " Missing 'in' in a :for statement
4716818fc9adSBram Moolenaar  call assert_fails('for i range(1) | endfor', 'E690:')
4717ea04a6e8SBram Moolenaar
4718ea04a6e8SBram Moolenaar  " Incorrect number of variables in for
4719ea04a6e8SBram Moolenaar  call assert_fails('for [i,] in range(3) | endfor', 'E475:')
47209f6277bdSBram Moolenaarendfunc
47219f6277bdSBram Moolenaar
47229f6277bdSBram Moolenaar" Test for deep nesting of if/for/while/try statements              {{{1
47239f6277bdSBram Moolenaarfunc Test_deep_nest()
4724494e9069SBram Moolenaar  CheckRunVimInTerminal
47259f6277bdSBram Moolenaar
47269f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
47279f6277bdSBram Moolenaar    " Deep nesting of if ... endif
47289f6277bdSBram Moolenaar    func Test1()
47299f6277bdSBram Moolenaar      let @a = join(repeat(['if v:true'], 51), "\n")
47309f6277bdSBram Moolenaar      let @a ..= "\n"
47319f6277bdSBram Moolenaar      let @a ..= join(repeat(['endif'], 51), "\n")
47329f6277bdSBram Moolenaar      @a
47339f6277bdSBram Moolenaar      let @a = ''
47349f6277bdSBram Moolenaar    endfunc
47359f6277bdSBram Moolenaar
47369f6277bdSBram Moolenaar    " Deep nesting of for ... endfor
47379f6277bdSBram Moolenaar    func Test2()
47389f6277bdSBram Moolenaar      let @a = join(repeat(['for i in [1]'], 51), "\n")
47399f6277bdSBram Moolenaar      let @a ..= "\n"
47409f6277bdSBram Moolenaar      let @a ..= join(repeat(['endfor'], 51), "\n")
47419f6277bdSBram Moolenaar      @a
47429f6277bdSBram Moolenaar      let @a = ''
47439f6277bdSBram Moolenaar    endfunc
47449f6277bdSBram Moolenaar
47459f6277bdSBram Moolenaar    " Deep nesting of while ... endwhile
47469f6277bdSBram Moolenaar    func Test3()
47479f6277bdSBram Moolenaar      let @a = join(repeat(['while v:true'], 51), "\n")
47489f6277bdSBram Moolenaar      let @a ..= "\n"
47499f6277bdSBram Moolenaar      let @a ..= join(repeat(['endwhile'], 51), "\n")
47509f6277bdSBram Moolenaar      @a
47519f6277bdSBram Moolenaar      let @a = ''
47529f6277bdSBram Moolenaar    endfunc
47539f6277bdSBram Moolenaar
47549f6277bdSBram Moolenaar    " Deep nesting of try ... endtry
47559f6277bdSBram Moolenaar    func Test4()
47569f6277bdSBram Moolenaar      let @a = join(repeat(['try'], 51), "\n")
47579f6277bdSBram Moolenaar      let @a ..= "\necho v:true\n"
47589f6277bdSBram Moolenaar      let @a ..= join(repeat(['endtry'], 51), "\n")
47599f6277bdSBram Moolenaar      @a
47609f6277bdSBram Moolenaar      let @a = ''
47619f6277bdSBram Moolenaar    endfunc
4762ee4e0c1eSBram Moolenaar
4763ee4e0c1eSBram Moolenaar    " Deep nesting of function ... endfunction
4764ee4e0c1eSBram Moolenaar    func Test5()
4765ee4e0c1eSBram Moolenaar      let @a = join(repeat(['function X()'], 51), "\n")
4766ee4e0c1eSBram Moolenaar      let @a ..= "\necho v:true\n"
4767ee4e0c1eSBram Moolenaar      let @a ..= join(repeat(['endfunction'], 51), "\n")
4768ee4e0c1eSBram Moolenaar      @a
4769ee4e0c1eSBram Moolenaar      let @a = ''
4770ee4e0c1eSBram Moolenaar    endfunc
47719f6277bdSBram Moolenaar  [SCRIPT]
47729f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
47739f6277bdSBram Moolenaar
47749f6277bdSBram Moolenaar  let buf = RunVimInTerminal('-S Xscript', {'rows': 6})
47759f6277bdSBram Moolenaar
47769f6277bdSBram Moolenaar  " Deep nesting of if ... endif
47779f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test1()\n")
47786a2c5a7dSBram Moolenaar  call TermWait(buf)
47799f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E579:', term_getline(buf, 5))})
47809f6277bdSBram Moolenaar
47819f6277bdSBram Moolenaar  " Deep nesting of for ... endfor
47829f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test2()\n")
47836a2c5a7dSBram Moolenaar  call TermWait(buf)
47849f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))})
47859f6277bdSBram Moolenaar
47869f6277bdSBram Moolenaar  " Deep nesting of while ... endwhile
47879f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test3()\n")
47886a2c5a7dSBram Moolenaar  call TermWait(buf)
47899f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))})
47909f6277bdSBram Moolenaar
47919f6277bdSBram Moolenaar  " Deep nesting of try ... endtry
47929f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test4()\n")
47936a2c5a7dSBram Moolenaar  call TermWait(buf)
47949f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E601:', term_getline(buf, 5))})
47959f6277bdSBram Moolenaar
4796ee4e0c1eSBram Moolenaar  " Deep nesting of function ... endfunction
4797ee4e0c1eSBram Moolenaar  call term_sendkeys(buf, ":call Test5()\n")
47986a2c5a7dSBram Moolenaar  call TermWait(buf)
4799ee4e0c1eSBram Moolenaar  call WaitForAssert({-> assert_match('^E1058:', term_getline(buf, 4))})
4800ee4e0c1eSBram Moolenaar  call term_sendkeys(buf, "\<C-C>\n")
48016a2c5a7dSBram Moolenaar  call TermWait(buf)
4802ee4e0c1eSBram Moolenaar
48039f6277bdSBram Moolenaar  "let l = ''
48049f6277bdSBram Moolenaar  "for i in range(1, 6)
48059f6277bdSBram Moolenaar  "  let l ..= term_getline(buf, i) . "\n"
48069f6277bdSBram Moolenaar  "endfor
48079f6277bdSBram Moolenaar  "call assert_report(l)
48089f6277bdSBram Moolenaar
48099f6277bdSBram Moolenaar  call StopVimInTerminal(buf)
48109f6277bdSBram Moolenaar  call delete('Xscript')
48119f6277bdSBram Moolenaarendfunc
48129f6277bdSBram Moolenaar
48138b633135SBram Moolenaar" Test for errors in converting to float from various types         {{{1
48148b633135SBram Moolenaarfunc Test_float_conversion_errors()
48158b633135SBram Moolenaar  if has('float')
48168b633135SBram Moolenaar    call assert_fails('let x = 4.0 % 2.0', 'E804')
48178b633135SBram Moolenaar    call assert_fails('echo 1.1[0]', 'E806')
48188b633135SBram Moolenaar    call assert_fails('echo sort([function("min"), 1], "f")', 'E891:')
48198b633135SBram Moolenaar    call assert_fails('echo 3.2 == "vim"', 'E892:')
48208b633135SBram Moolenaar    call assert_fails('echo sort([[], 1], "f")', 'E893:')
48218b633135SBram Moolenaar    call assert_fails('echo sort([{}, 1], "f")', 'E894:')
48228b633135SBram Moolenaar    call assert_fails('echo 3.2 == v:true', 'E362:')
48238b633135SBram Moolenaar    call assert_fails('echo 3.2 == v:none', 'E907:')
48248b633135SBram Moolenaar  endif
48258b633135SBram Moolenaarendfunc
48268b633135SBram Moolenaar
48278e6cbb72SBram Moolenaar" invalid function names               {{{1
482808f4157cSBram Moolenaarfunc Test_invalid_function_names()
482908f4157cSBram Moolenaar  " function name not starting with capital
483008f4157cSBram Moolenaar  let caught_e128 = 0
483108f4157cSBram Moolenaar  try
483208f4157cSBram Moolenaar    func! g:test()
483308f4157cSBram Moolenaar      echo "test"
483408f4157cSBram Moolenaar    endfunc
483508f4157cSBram Moolenaar  catch /E128:/
483608f4157cSBram Moolenaar    let caught_e128 = 1
483708f4157cSBram Moolenaar  endtry
483808f4157cSBram Moolenaar  call assert_equal(1, caught_e128)
483908f4157cSBram Moolenaar
484008f4157cSBram Moolenaar  " function name includes a colon
484108f4157cSBram Moolenaar  let caught_e884 = 0
484208f4157cSBram Moolenaar  try
484308f4157cSBram Moolenaar    func! b:test()
484408f4157cSBram Moolenaar      echo "test"
484508f4157cSBram Moolenaar    endfunc
484608f4157cSBram Moolenaar  catch /E884:/
484708f4157cSBram Moolenaar    let caught_e884 = 1
484808f4157cSBram Moolenaar  endtry
484908f4157cSBram Moolenaar  call assert_equal(1, caught_e884)
485008f4157cSBram Moolenaar
485108f4157cSBram Moolenaar  " function name folowed by #
485208f4157cSBram Moolenaar  let caught_e128 = 0
485308f4157cSBram Moolenaar  try
485408f4157cSBram Moolenaar    func! test2() "#
485508f4157cSBram Moolenaar      echo "test2"
485608f4157cSBram Moolenaar    endfunc
485708f4157cSBram Moolenaar  catch /E128:/
485808f4157cSBram Moolenaar    let caught_e128 = 1
485908f4157cSBram Moolenaar  endtry
486008f4157cSBram Moolenaar  call assert_equal(1, caught_e128)
486108f4157cSBram Moolenaar
486208f4157cSBram Moolenaar  " function name starting with/without "g:", buffer-local funcref.
486308f4157cSBram Moolenaar  function! g:Foo(n)
486408f4157cSBram Moolenaar    return 'called Foo(' . a:n . ')'
486508f4157cSBram Moolenaar  endfunction
486608f4157cSBram Moolenaar  let b:my_func = function('Foo')
486708f4157cSBram Moolenaar  call assert_equal('called Foo(1)', b:my_func(1))
486808f4157cSBram Moolenaar  call assert_equal('called Foo(2)', g:Foo(2))
486908f4157cSBram Moolenaar  call assert_equal('called Foo(3)', Foo(3))
487008f4157cSBram Moolenaar  delfunc g:Foo
487108f4157cSBram Moolenaar
487208f4157cSBram Moolenaar  " script-local function used in Funcref must exist.
487308f4157cSBram Moolenaar  let lines =<< trim END
487408f4157cSBram Moolenaar    func s:Testje()
487508f4157cSBram Moolenaar      return "foo"
487608f4157cSBram Moolenaar    endfunc
487708f4157cSBram Moolenaar    let Bar = function('s:Testje')
487808f4157cSBram Moolenaar    call assert_equal(0, exists('s:Testje'))
487908f4157cSBram Moolenaar    call assert_equal(1, exists('*s:Testje'))
488008f4157cSBram Moolenaar    call assert_equal(1, exists('Bar'))
488108f4157cSBram Moolenaar    call assert_equal(1, exists('*Bar'))
488208f4157cSBram Moolenaar  END
488308f4157cSBram Moolenaar  call writefile(lines, 'Xscript')
488408f4157cSBram Moolenaar  source Xscript
488508f4157cSBram Moolenaar  call delete('Xscript')
488608f4157cSBram Moolenaarendfunc
488708f4157cSBram Moolenaar
48888e6cbb72SBram Moolenaar" substring and variable name              {{{1
488908f4157cSBram Moolenaarfunc Test_substring_var()
489008f4157cSBram Moolenaar  let str = 'abcdef'
489108f4157cSBram Moolenaar  let n = 3
489208f4157cSBram Moolenaar  call assert_equal('def', str[n:])
489308f4157cSBram Moolenaar  call assert_equal('abcd', str[:n])
489408f4157cSBram Moolenaar  call assert_equal('d', str[n:n])
489508f4157cSBram Moolenaar  unlet n
489608f4157cSBram Moolenaar  let nn = 3
489708f4157cSBram Moolenaar  call assert_equal('def', str[nn:])
489808f4157cSBram Moolenaar  call assert_equal('abcd', str[:nn])
489908f4157cSBram Moolenaar  call assert_equal('d', str[nn:nn])
490008f4157cSBram Moolenaar  unlet nn
490108f4157cSBram Moolenaar  let b:nn = 4
490208f4157cSBram Moolenaar  call assert_equal('ef', str[b:nn:])
490308f4157cSBram Moolenaar  call assert_equal('abcde', str[:b:nn])
490408f4157cSBram Moolenaar  call assert_equal('e', str[b:nn:b:nn])
490508f4157cSBram Moolenaar  unlet b:nn
490608f4157cSBram Moolenaarendfunc
490708f4157cSBram Moolenaar
49088e6cbb72SBram Moolenaar" Test using s: with a typed command              {{{1
49098e6cbb72SBram Moolenaarfunc Test_typed_script_var()
49108e6cbb72SBram Moolenaar  CheckRunVimInTerminal
49118e6cbb72SBram Moolenaar
49128e6cbb72SBram Moolenaar  let buf = RunVimInTerminal('', {'rows': 6})
49138e6cbb72SBram Moolenaar
49148e6cbb72SBram Moolenaar  " Deep nesting of if ... endif
49158e6cbb72SBram Moolenaar  call term_sendkeys(buf, ":echo get(s:, 'foo', 'x')\n")
49168e6cbb72SBram Moolenaar  call TermWait(buf)
49178e6cbb72SBram Moolenaar  call WaitForAssert({-> assert_match('^E116:', term_getline(buf, 5))})
49188e6cbb72SBram Moolenaar
49198e6cbb72SBram Moolenaar  call StopVimInTerminal(buf)
49208e6cbb72SBram Moolenaarendfunc
49218e6cbb72SBram Moolenaar
4922863e80b4SBram Moolenaar"-------------------------------------------------------------------------------
4923b544f3c8SBram Moolenaar" Modelines								    {{{1
49241f068233SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
4925b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
4926