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
6*a6296200SBram 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
21*a6296200SBram Moolenaar" Create a new instance of Vim and run the commands in 'test' and then 'verify'
22*a6296200SBram Moolenaar" The commands in 'test' are expected to store the test results in the Xtest.out
23*a6296200SBram Moolenaar" file. If the test passes successfully, then Xtest.out should be empty.
24*a6296200SBram Moolenaarfunc RunInNewVim(test, verify)
25*a6296200SBram Moolenaar  let init =<< trim END
26*a6296200SBram Moolenaar    source script_util.vim
27*a6296200SBram Moolenaar    XpathINIT
28*a6296200SBram Moolenaar    XloopINIT
29*a6296200SBram Moolenaar  END
30*a6296200SBram Moolenaar  let cleanup =<< trim END
31*a6296200SBram Moolenaar    call writefile(v:errors, 'Xtest.out')
32*a6296200SBram Moolenaar    qall
33*a6296200SBram Moolenaar  END
34*a6296200SBram Moolenaar  call writefile(init, 'Xtest.vim')
35*a6296200SBram Moolenaar  call writefile(a:test, 'Xtest.vim', 'a')
36*a6296200SBram Moolenaar  call writefile(a:verify, 'Xverify.vim')
37*a6296200SBram Moolenaar  call writefile(cleanup, 'Xverify.vim', 'a')
38*a6296200SBram Moolenaar  call RunVim([], [], "-S Xtest.vim -S Xverify.vim")
39*a6296200SBram Moolenaar  call assert_equal([], readfile('Xtest.out'))
40*a6296200SBram Moolenaar  call delete('Xtest.out')
41*a6296200SBram Moolenaar  call delete('Xtest.vim')
42*a6296200SBram 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
54*a6296200SBram 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
68*a6296200SBram Moolenaarendfunc
69b544f3c8SBram Moolenaar
70*a6296200SBram 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
85*a6296200SBram 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
139*a6296200SBram 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
199*a6296200SBram 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
217*a6296200SBram Moolenaarendfunc
218b544f3c8SBram Moolenaar
219*a6296200SBram 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)
225*a6296200SBram 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
235*a6296200SBram 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)
242*a6296200SBram 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
376*a6296200SBram 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
440*a6296200SBram 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
472*a6296200SBram Moolenaarendfunc
473b544f3c8SBram Moolenaar
474*a6296200SBram 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
488*a6296200SBram Moolenaarendfunc
489b544f3c8SBram Moolenaar
490*a6296200SBram 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
504*a6296200SBram 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
531*a6296200SBram 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
539*a6296200SBram Moolenaarendfunc
540b544f3c8SBram Moolenaar
541*a6296200SBram 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
548*a6296200SBram Moolenaarendfunc
549b544f3c8SBram Moolenaar
550*a6296200SBram Moolenaarfunc H() abort
551b544f3c8SBram Moolenaar    Xpath 'g'
552b544f3c8SBram Moolenaar    call I()		" aborted
553b544f3c8SBram Moolenaar    Xpath 'h'
554b544f3c8SBram Moolenaar    return 4
555*a6296200SBram Moolenaarendfunc
556b544f3c8SBram Moolenaar
557*a6296200SBram Moolenaarfunc I() abort
558b544f3c8SBram Moolenaar    Xpath 'i'
559b544f3c8SBram Moolenaar    asdf		" error
560b544f3c8SBram Moolenaar    Xpath 'j'
561b544f3c8SBram Moolenaar    return 8
562*a6296200SBram 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
590*a6296200SBram 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
674*a6296200SBram Moolenaarfunc P(num)
675b544f3c8SBram Moolenaar    let g:calls = g:calls + a:num   " side effect on call
676b544f3c8SBram Moolenaar    return 0
677*a6296200SBram 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"-------------------------------------------------------------------------------
1056*a6296200SBram Moolenaar" Test 18:  Interrupt (Ctrl-C pressed)					    {{{1
1057*a6296200SBram Moolenaar"
1058*a6296200SBram Moolenaar"	    On an interrupt, the script processing is terminated immediately.
10591f068233SBram Moolenaar"-------------------------------------------------------------------------------
1060*a6296200SBram Moolenaar
1061*a6296200SBram Moolenaarfunc Test_interrupt_while_if()
1062*a6296200SBram Moolenaar  let test =<< trim [CODE]
1063*a6296200SBram Moolenaar    try
1064*a6296200SBram Moolenaar      if 1
1065*a6296200SBram Moolenaar        Xpath 'a'
1066*a6296200SBram Moolenaar        while 1
1067*a6296200SBram Moolenaar          Xpath 'b'
1068*a6296200SBram Moolenaar          if 1
1069*a6296200SBram Moolenaar            Xpath 'c'
1070*a6296200SBram Moolenaar            call interrupt()
1071*a6296200SBram Moolenaar            call assert_report('should not get here')
1072*a6296200SBram Moolenaar            break
1073*a6296200SBram Moolenaar            finish
1074*a6296200SBram Moolenaar          endif | call assert_report('should not get here')
1075*a6296200SBram Moolenaar          call assert_report('should not get here')
1076*a6296200SBram Moolenaar        endwhile | call assert_report('should not get here')
1077*a6296200SBram Moolenaar        call assert_report('should not get here')
1078*a6296200SBram Moolenaar      endif | call assert_report('should not get here')
1079*a6296200SBram Moolenaar      call assert_report('should not get here')
1080*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1081*a6296200SBram Moolenaar      Xpath 'd'
1082*a6296200SBram Moolenaar    endtry | Xpath 'e'
1083*a6296200SBram Moolenaar    Xpath 'f'
1084*a6296200SBram Moolenaar  [CODE]
1085*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1086*a6296200SBram Moolenaar    call assert_equal('abcdef', g:Xpath)
1087*a6296200SBram Moolenaar  [CODE]
1088*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1089*a6296200SBram Moolenaarendfunc
1090*a6296200SBram Moolenaar
1091*a6296200SBram Moolenaarfunc Test_interrupt_try()
1092*a6296200SBram Moolenaar  let test =<< trim [CODE]
1093*a6296200SBram Moolenaar    try
1094*a6296200SBram Moolenaar      try
1095*a6296200SBram Moolenaar        Xpath 'a'
1096*a6296200SBram Moolenaar        call interrupt()
1097*a6296200SBram Moolenaar        call assert_report('should not get here')
1098*a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1099*a6296200SBram Moolenaar      call assert_report('should not get here')
1100*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1101*a6296200SBram Moolenaar      Xpath 'b'
1102*a6296200SBram Moolenaar    endtry | Xpath 'c'
1103*a6296200SBram Moolenaar    Xpath 'd'
1104*a6296200SBram Moolenaar  [CODE]
1105*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1106*a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1107*a6296200SBram Moolenaar  [CODE]
1108*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1109*a6296200SBram Moolenaarendfunc
1110*a6296200SBram Moolenaar
1111*a6296200SBram Moolenaarfunc Test_interrupt_func_while_if()
1112*a6296200SBram Moolenaar  let test =<< trim [CODE]
1113*a6296200SBram Moolenaar    func F()
1114*a6296200SBram Moolenaar      if 1
1115*a6296200SBram Moolenaar        Xpath 'a'
1116*a6296200SBram Moolenaar        while 1
1117*a6296200SBram Moolenaar          Xpath 'b'
1118*a6296200SBram Moolenaar          if 1
1119*a6296200SBram Moolenaar            Xpath 'c'
1120*a6296200SBram Moolenaar            call interrupt()
1121*a6296200SBram Moolenaar            call assert_report('should not get here')
1122*a6296200SBram Moolenaar            break
1123*a6296200SBram Moolenaar            return
1124*a6296200SBram Moolenaar          endif | call assert_report('should not get here')
1125*a6296200SBram Moolenaar          call assert_report('should not get here')
1126*a6296200SBram Moolenaar        endwhile | call assert_report('should not get here')
1127*a6296200SBram Moolenaar        call assert_report('should not get here')
1128*a6296200SBram Moolenaar      endif | call assert_report('should not get here')
1129*a6296200SBram Moolenaar      call assert_report('should not get here')
1130*a6296200SBram Moolenaar    endfunc
1131*a6296200SBram Moolenaar
1132*a6296200SBram Moolenaar    Xpath 'd'
1133*a6296200SBram Moolenaar    try
1134*a6296200SBram Moolenaar      call F() | call assert_report('should not get here')
1135*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1136*a6296200SBram Moolenaar      Xpath 'e'
1137*a6296200SBram Moolenaar    endtry | Xpath 'f'
1138*a6296200SBram Moolenaar    Xpath 'g'
1139*a6296200SBram Moolenaar  [CODE]
1140*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1141*a6296200SBram Moolenaar    call assert_equal('dabcefg', g:Xpath)
1142*a6296200SBram Moolenaar  [CODE]
1143*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1144*a6296200SBram Moolenaarendfunc
1145*a6296200SBram Moolenaar
1146*a6296200SBram Moolenaarfunc Test_interrupt_func_try()
1147*a6296200SBram Moolenaar  let test =<< trim [CODE]
1148*a6296200SBram Moolenaar    func G()
1149*a6296200SBram Moolenaar      try
1150*a6296200SBram Moolenaar        Xpath 'a'
1151*a6296200SBram Moolenaar        call interrupt()
1152*a6296200SBram Moolenaar        call assert_report('should not get here')
1153*a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1154*a6296200SBram Moolenaar      call assert_report('should not get here')
1155*a6296200SBram Moolenaar    endfunc
1156*a6296200SBram Moolenaar
1157*a6296200SBram Moolenaar    Xpath 'b'
1158*a6296200SBram Moolenaar    try
1159*a6296200SBram Moolenaar      call G() | call assert_report('should not get here')
1160*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1161*a6296200SBram Moolenaar      Xpath 'c'
1162*a6296200SBram Moolenaar    endtry | Xpath 'd'
1163*a6296200SBram Moolenaar    Xpath 'e'
1164*a6296200SBram Moolenaar  [CODE]
1165*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1166*a6296200SBram Moolenaar    call assert_equal('bacde', g:Xpath)
1167*a6296200SBram Moolenaar  [CODE]
1168*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1169*a6296200SBram Moolenaarendfunc
1170*a6296200SBram Moolenaar
1171*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1172*a6296200SBram Moolenaar" Test 19:  Aborting on errors inside :try/:endtry			    {{{1
1173*a6296200SBram Moolenaar"
1174*a6296200SBram Moolenaar"	    An error in a command dynamically enclosed in a :try/:endtry region
1175*a6296200SBram Moolenaar"	    aborts script processing immediately.  It does not matter whether
1176*a6296200SBram Moolenaar"	    the failing command is outside or inside a function and whether a
1177*a6296200SBram Moolenaar"	    function has an "abort" attribute.
1178*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1179*a6296200SBram Moolenaar
1180*a6296200SBram Moolenaarfunc Test_try_error_abort_1()
1181*a6296200SBram Moolenaar  let test =<< trim [CODE]
1182*a6296200SBram Moolenaar    func F() abort
1183*a6296200SBram Moolenaar      Xpath 'a'
1184*a6296200SBram Moolenaar      asdf
1185*a6296200SBram Moolenaar      call assert_report('should not get here')
1186*a6296200SBram Moolenaar    endfunc
1187*a6296200SBram Moolenaar
1188*a6296200SBram Moolenaar    try
1189*a6296200SBram Moolenaar      Xpath 'b'
1190*a6296200SBram Moolenaar      call F()
1191*a6296200SBram Moolenaar      call assert_report('should not get here')
1192*a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1193*a6296200SBram Moolenaar    call assert_report('should not get here')
1194*a6296200SBram Moolenaar  [CODE]
1195*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1196*a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1197*a6296200SBram Moolenaar  [CODE]
1198*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1199*a6296200SBram Moolenaarendfunc
1200*a6296200SBram Moolenaar
1201*a6296200SBram Moolenaarfunc Test_try_error_abort_2()
1202*a6296200SBram Moolenaar  let test =<< trim [CODE]
1203*a6296200SBram Moolenaar    func G()
1204*a6296200SBram Moolenaar      Xpath 'a'
1205*a6296200SBram Moolenaar      asdf
1206*a6296200SBram Moolenaar      call assert_report('should not get here')
1207*a6296200SBram Moolenaar    endfunc
1208*a6296200SBram Moolenaar
1209*a6296200SBram Moolenaar    try
1210*a6296200SBram Moolenaar      Xpath 'b'
1211*a6296200SBram Moolenaar      call G()
1212*a6296200SBram Moolenaar      call assert_report('should not get here')
1213*a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1214*a6296200SBram Moolenaar    call assert_report('should not get here')
1215*a6296200SBram Moolenaar  [CODE]
1216*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1217*a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1218*a6296200SBram Moolenaar  [CODE]
1219*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1220*a6296200SBram Moolenaarendfunc
1221*a6296200SBram Moolenaar
1222*a6296200SBram Moolenaarfunc Test_try_error_abort_3()
1223*a6296200SBram Moolenaar  let test =<< trim [CODE]
1224*a6296200SBram Moolenaar    try
1225*a6296200SBram Moolenaar      Xpath 'a'
1226*a6296200SBram Moolenaar      asdf
1227*a6296200SBram Moolenaar      call assert_report('should not get here')
1228*a6296200SBram Moolenaar    endtry | call assert_report('should not get here')
1229*a6296200SBram Moolenaar    call assert_report('should not get here')
1230*a6296200SBram Moolenaar  [CODE]
1231*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1232*a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1233*a6296200SBram Moolenaar  [CODE]
1234*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1235*a6296200SBram Moolenaarendfunc
1236*a6296200SBram Moolenaar
1237*a6296200SBram Moolenaarfunc Test_try_error_abort_4()
1238*a6296200SBram Moolenaar  let test =<< trim [CODE]
1239*a6296200SBram Moolenaar    if 1
1240*a6296200SBram Moolenaar      try
1241*a6296200SBram Moolenaar        Xpath 'a'
1242*a6296200SBram Moolenaar        asdf
1243*a6296200SBram Moolenaar        call assert_report('should not get here')
1244*a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1245*a6296200SBram Moolenaar    endif | call assert_report('should not get here')
1246*a6296200SBram Moolenaar    call assert_report('should not get here')
1247*a6296200SBram Moolenaar  [CODE]
1248*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1249*a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1250*a6296200SBram Moolenaar  [CODE]
1251*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1252*a6296200SBram Moolenaarendfunc
1253*a6296200SBram Moolenaar
1254*a6296200SBram Moolenaarfunc Test_try_error_abort_5()
1255*a6296200SBram Moolenaar  let test =<< trim [CODE]
1256*a6296200SBram Moolenaar    let p = 1
1257*a6296200SBram Moolenaar    while p
1258*a6296200SBram Moolenaar      let p = 0
1259*a6296200SBram Moolenaar      try
1260*a6296200SBram Moolenaar        Xpath 'a'
1261*a6296200SBram Moolenaar        asdf
1262*a6296200SBram Moolenaar        call assert_report('should not get here')
1263*a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1264*a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1265*a6296200SBram Moolenaar    call assert_report('should not get here')
1266*a6296200SBram Moolenaar  [CODE]
1267*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1268*a6296200SBram Moolenaar    call assert_equal('a', g:Xpath)
1269*a6296200SBram Moolenaar  [CODE]
1270*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1271*a6296200SBram Moolenaarendfunc
1272*a6296200SBram Moolenaar
1273*a6296200SBram Moolenaarfunc Test_try_error_abort_6()
1274*a6296200SBram Moolenaar  let test =<< trim [CODE]
1275*a6296200SBram Moolenaar    let p = 1
1276*a6296200SBram Moolenaar    Xpath 'a'
1277*a6296200SBram Moolenaar    while p
1278*a6296200SBram Moolenaar      Xpath 'b'
1279*a6296200SBram Moolenaar      let p = 0
1280*a6296200SBram Moolenaar      try
1281*a6296200SBram Moolenaar        Xpath 'c'
1282*a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1283*a6296200SBram Moolenaar    call assert_report('should not get here')
1284*a6296200SBram Moolenaar  [CODE]
1285*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1286*a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1287*a6296200SBram Moolenaar  [CODE]
1288*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1289*a6296200SBram Moolenaarendfunc
1290*a6296200SBram Moolenaar
1291*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1292*a6296200SBram Moolenaar" Test 20:  Aborting on errors after :try/:endtry			    {{{1
1293*a6296200SBram Moolenaar"
1294*a6296200SBram Moolenaar"	    When an error occurs after the last active :try/:endtry region has
1295*a6296200SBram Moolenaar"	    been left, termination behavior is as if no :try/:endtry has been
1296*a6296200SBram Moolenaar"	    seen.
1297*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1298*a6296200SBram Moolenaar
1299*a6296200SBram Moolenaarfunc Test_error_after_try_1()
1300*a6296200SBram Moolenaar  let test =<< trim [CODE]
1301*a6296200SBram Moolenaar    let p = 1
1302*a6296200SBram Moolenaar    while p
1303*a6296200SBram Moolenaar      let p = 0
1304*a6296200SBram Moolenaar      Xpath 'a'
1305*a6296200SBram Moolenaar      try
1306*a6296200SBram Moolenaar        Xpath 'b'
1307*a6296200SBram Moolenaar      endtry
1308*a6296200SBram Moolenaar      asdf
1309*a6296200SBram Moolenaar      call assert_report('should not get here')
1310*a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1311*a6296200SBram Moolenaar    Xpath 'c'
1312*a6296200SBram Moolenaar  [CODE]
1313*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1314*a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1315*a6296200SBram Moolenaar  [CODE]
1316*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1317*a6296200SBram Moolenaarendfunc
1318*a6296200SBram Moolenaar
1319*a6296200SBram Moolenaarfunc Test_error_after_try_2()
1320*a6296200SBram Moolenaar  let test =<< trim [CODE]
1321*a6296200SBram Moolenaar    while 1
1322*a6296200SBram Moolenaar      try
1323*a6296200SBram Moolenaar        Xpath 'a'
1324*a6296200SBram Moolenaar        break
1325*a6296200SBram Moolenaar        call assert_report('should not get here')
1326*a6296200SBram Moolenaar      endtry
1327*a6296200SBram Moolenaar    endwhile
1328*a6296200SBram Moolenaar    Xpath 'b'
1329*a6296200SBram Moolenaar    asdf
1330*a6296200SBram Moolenaar    Xpath 'c'
1331*a6296200SBram Moolenaar  [CODE]
1332*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1333*a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1334*a6296200SBram Moolenaar  [CODE]
1335*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1336*a6296200SBram Moolenaarendfunc
1337*a6296200SBram Moolenaar
1338*a6296200SBram Moolenaarfunc Test_error_after_try_3()
1339*a6296200SBram Moolenaar  let test =<< trim [CODE]
1340*a6296200SBram Moolenaar    while 1
1341*a6296200SBram Moolenaar      try
1342*a6296200SBram Moolenaar        Xpath 'a'
1343*a6296200SBram Moolenaar        break
1344*a6296200SBram Moolenaar        call assert_report('should not get here')
1345*a6296200SBram Moolenaar      finally
1346*a6296200SBram Moolenaar        Xpath 'b'
1347*a6296200SBram Moolenaar      endtry
1348*a6296200SBram Moolenaar    endwhile
1349*a6296200SBram Moolenaar    Xpath 'c'
1350*a6296200SBram Moolenaar    asdf
1351*a6296200SBram Moolenaar    Xpath 'd'
1352*a6296200SBram Moolenaar  [CODE]
1353*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1354*a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1355*a6296200SBram Moolenaar  [CODE]
1356*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1357*a6296200SBram Moolenaarendfunc
1358*a6296200SBram Moolenaar
1359*a6296200SBram Moolenaarfunc Test_error_after_try_4()
1360*a6296200SBram Moolenaar  let test =<< trim [CODE]
1361*a6296200SBram Moolenaar    while 1
1362*a6296200SBram Moolenaar      try
1363*a6296200SBram Moolenaar        Xpath 'a'
1364*a6296200SBram Moolenaar      finally
1365*a6296200SBram Moolenaar        Xpath 'b'
1366*a6296200SBram Moolenaar        break
1367*a6296200SBram Moolenaar        call assert_report('should not get here')
1368*a6296200SBram Moolenaar      endtry
1369*a6296200SBram Moolenaar    endwhile
1370*a6296200SBram Moolenaar    Xpath 'c'
1371*a6296200SBram Moolenaar    asdf
1372*a6296200SBram Moolenaar    Xpath 'd'
1373*a6296200SBram Moolenaar  [CODE]
1374*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1375*a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1376*a6296200SBram Moolenaar  [CODE]
1377*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1378*a6296200SBram Moolenaarendfunc
1379*a6296200SBram Moolenaar
1380*a6296200SBram Moolenaarfunc Test_error_after_try_5()
1381*a6296200SBram Moolenaar  let test =<< trim [CODE]
1382*a6296200SBram Moolenaar    let p = 1
1383*a6296200SBram Moolenaar    while p
1384*a6296200SBram Moolenaar      let p = 0
1385*a6296200SBram Moolenaar      try
1386*a6296200SBram Moolenaar        Xpath 'a'
1387*a6296200SBram Moolenaar        continue
1388*a6296200SBram Moolenaar        call assert_report('should not get here')
1389*a6296200SBram Moolenaar      endtry
1390*a6296200SBram Moolenaar    endwhile
1391*a6296200SBram Moolenaar    Xpath 'b'
1392*a6296200SBram Moolenaar    asdf
1393*a6296200SBram Moolenaar    Xpath 'c'
1394*a6296200SBram Moolenaar  [CODE]
1395*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1396*a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1397*a6296200SBram Moolenaar  [CODE]
1398*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1399*a6296200SBram Moolenaarendfunc
1400*a6296200SBram Moolenaar
1401*a6296200SBram Moolenaarfunc Test_error_after_try_6()
1402*a6296200SBram Moolenaar  let test =<< trim [CODE]
1403*a6296200SBram Moolenaar    let p = 1
1404*a6296200SBram Moolenaar    while p
1405*a6296200SBram Moolenaar      let p = 0
1406*a6296200SBram Moolenaar      try
1407*a6296200SBram Moolenaar        Xpath 'a'
1408*a6296200SBram Moolenaar        continue
1409*a6296200SBram Moolenaar        call assert_report('should not get here')
1410*a6296200SBram Moolenaar      finally
1411*a6296200SBram Moolenaar        Xpath 'b'
1412*a6296200SBram Moolenaar      endtry
1413*a6296200SBram Moolenaar    endwhile
1414*a6296200SBram Moolenaar    Xpath 'c'
1415*a6296200SBram Moolenaar    asdf
1416*a6296200SBram Moolenaar    Xpath 'd'
1417*a6296200SBram Moolenaar  [CODE]
1418*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1419*a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1420*a6296200SBram Moolenaar  [CODE]
1421*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1422*a6296200SBram Moolenaarendfunc
1423*a6296200SBram Moolenaar
1424*a6296200SBram Moolenaarfunc Test_error_after_try_7()
1425*a6296200SBram Moolenaar  let test =<< trim [CODE]
1426*a6296200SBram Moolenaar    let p = 1
1427*a6296200SBram Moolenaar    while p
1428*a6296200SBram Moolenaar      let p = 0
1429*a6296200SBram Moolenaar      try
1430*a6296200SBram Moolenaar        Xpath 'a'
1431*a6296200SBram Moolenaar      finally
1432*a6296200SBram Moolenaar        Xpath 'b'
1433*a6296200SBram Moolenaar        continue
1434*a6296200SBram Moolenaar        call assert_report('should not get here')
1435*a6296200SBram Moolenaar      endtry
1436*a6296200SBram Moolenaar    endwhile
1437*a6296200SBram Moolenaar    Xpath 'c'
1438*a6296200SBram Moolenaar    asdf
1439*a6296200SBram Moolenaar    Xpath 'd'
1440*a6296200SBram Moolenaar  [CODE]
1441*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1442*a6296200SBram Moolenaar    call assert_equal('abcd', g:Xpath)
1443*a6296200SBram Moolenaar  [CODE]
1444*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1445*a6296200SBram Moolenaarendfunc
1446*a6296200SBram Moolenaar
1447*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1448*a6296200SBram Moolenaar" Test 21:  :finally for :try after :continue/:break/:return/:finish	    {{{1
1449*a6296200SBram Moolenaar"
1450*a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :continue,
1451*a6296200SBram Moolenaar"	    :break, :return, or :finish, its :finally clause should not be
1452*a6296200SBram Moolenaar"	    executed.
1453*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1454*a6296200SBram Moolenaar
1455*a6296200SBram Moolenaarfunc Test_finally_after_loop_ctrl_statement()
1456*a6296200SBram Moolenaar  let test =<< trim [CODE]
1457*a6296200SBram Moolenaar    func F()
1458*a6296200SBram Moolenaar      let loops = 2
1459*a6296200SBram Moolenaar      while loops > 0
1460*a6296200SBram Moolenaar        XloopNEXT
1461*a6296200SBram Moolenaar        let loops = loops - 1
1462*a6296200SBram Moolenaar        try
1463*a6296200SBram Moolenaar          if loops == 1
1464*a6296200SBram Moolenaar            Xloop 'a'
1465*a6296200SBram Moolenaar            continue
1466*a6296200SBram Moolenaar            call assert_report('should not get here')
1467*a6296200SBram Moolenaar          elseif loops == 0
1468*a6296200SBram Moolenaar            Xloop 'b'
1469*a6296200SBram Moolenaar            break
1470*a6296200SBram Moolenaar            call assert_report('should not get here')
1471*a6296200SBram Moolenaar          endif
1472*a6296200SBram Moolenaar
1473*a6296200SBram Moolenaar          try		" inactive
1474*a6296200SBram Moolenaar            call assert_report('should not get here')
1475*a6296200SBram Moolenaar          finally
1476*a6296200SBram Moolenaar            call assert_report('should not get here')
1477*a6296200SBram Moolenaar          endtry
1478*a6296200SBram Moolenaar        finally
1479*a6296200SBram Moolenaar          Xloop 'c'
1480*a6296200SBram Moolenaar        endtry
1481*a6296200SBram Moolenaar        call assert_report('should not get here')
1482*a6296200SBram Moolenaar      endwhile
1483*a6296200SBram Moolenaar
1484*a6296200SBram Moolenaar      try
1485*a6296200SBram Moolenaar        Xpath 'd'
1486*a6296200SBram Moolenaar        return
1487*a6296200SBram Moolenaar        call assert_report('should not get here')
1488*a6296200SBram Moolenaar        try		    " inactive
1489*a6296200SBram Moolenaar          call assert_report('should not get here')
1490*a6296200SBram Moolenaar        finally
1491*a6296200SBram Moolenaar          call assert_report('should not get here')
1492*a6296200SBram Moolenaar        endtry
1493*a6296200SBram Moolenaar      finally
1494*a6296200SBram Moolenaar        Xpath 'e'
1495*a6296200SBram Moolenaar      endtry
1496*a6296200SBram Moolenaar      call assert_report('should not get here')
1497*a6296200SBram Moolenaar    endfunc
1498*a6296200SBram Moolenaar
1499*a6296200SBram Moolenaar    try
1500*a6296200SBram Moolenaar      Xpath 'f'
1501*a6296200SBram Moolenaar      call F()
1502*a6296200SBram Moolenaar      Xpath 'g'
1503*a6296200SBram Moolenaar      finish
1504*a6296200SBram Moolenaar      call assert_report('should not get here')
1505*a6296200SBram Moolenaar      try		" inactive
1506*a6296200SBram Moolenaar        call assert_report('should not get here')
1507*a6296200SBram Moolenaar      finally
1508*a6296200SBram Moolenaar        call assert_report('should not get here')
1509*a6296200SBram Moolenaar      endtry
1510*a6296200SBram Moolenaar    finally
1511*a6296200SBram Moolenaar      Xpath 'h'
1512*a6296200SBram Moolenaar    endtry
1513*a6296200SBram Moolenaar    call assert_report('should not get here')
1514*a6296200SBram Moolenaar  [CODE]
1515*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1516*a6296200SBram Moolenaar    call assert_equal('fa2c2b3c3degh', g:Xpath)
1517*a6296200SBram Moolenaar  [CODE]
1518*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1519*a6296200SBram Moolenaarendfunc
1520*a6296200SBram Moolenaar
1521*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1522*a6296200SBram Moolenaar" Test 22:  :finally for a :try after an error/interrupt/:throw		    {{{1
1523*a6296200SBram Moolenaar"
1524*a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding error or
1525*a6296200SBram Moolenaar"	    interrupt or :throw, its :finally clause should not be executed.
1526*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1527*a6296200SBram Moolenaar
1528*a6296200SBram Moolenaarfunc Test_finally_after_error_in_func()
1529*a6296200SBram Moolenaar  let test =<< trim [CODE]
1530*a6296200SBram Moolenaar    func Error()
1531*a6296200SBram Moolenaar      try
1532*a6296200SBram Moolenaar        Xpath 'b'
1533*a6296200SBram Moolenaar        asdf    " aborting error, triggering error exception
1534*a6296200SBram Moolenaar        call assert_report('should not get here')
1535*a6296200SBram Moolenaar      endtry
1536*a6296200SBram Moolenaar      call assert_report('should not get here')
1537*a6296200SBram Moolenaar    endfunc
1538*a6296200SBram Moolenaar
1539*a6296200SBram Moolenaar    Xpath 'a'
1540*a6296200SBram Moolenaar    call Error()
1541*a6296200SBram Moolenaar    call assert_report('should not get here')
1542*a6296200SBram Moolenaar
1543*a6296200SBram Moolenaar    if 1	" not active due to error
1544*a6296200SBram Moolenaar      try	" not active since :if inactive
1545*a6296200SBram Moolenaar        call assert_report('should not get here')
1546*a6296200SBram Moolenaar      finally
1547*a6296200SBram Moolenaar        call assert_report('should not get here')
1548*a6296200SBram Moolenaar      endtry
1549*a6296200SBram Moolenaar    endif
1550*a6296200SBram Moolenaar
1551*a6296200SBram Moolenaar    try		" not active due to error
1552*a6296200SBram Moolenaar      call assert_report('should not get here')
1553*a6296200SBram Moolenaar    finally
1554*a6296200SBram Moolenaar      call assert_report('should not get here')
1555*a6296200SBram Moolenaar    endtry
1556*a6296200SBram Moolenaar  [CODE]
1557*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1558*a6296200SBram Moolenaar    call assert_equal('ab', g:Xpath)
1559*a6296200SBram Moolenaar  [CODE]
1560*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1561*a6296200SBram Moolenaarendfunc
1562*a6296200SBram Moolenaar
1563*a6296200SBram Moolenaarfunc Test_finally_after_interrupt()
1564*a6296200SBram Moolenaar  let test =<< trim [CODE]
1565*a6296200SBram Moolenaar    func Interrupt()
1566*a6296200SBram Moolenaar      try
1567*a6296200SBram Moolenaar        Xpath 'a'
1568*a6296200SBram Moolenaar        call interrupt()            " triggering interrupt exception
1569*a6296200SBram Moolenaar        call assert_report('should not get here')
1570*a6296200SBram Moolenaar      endtry
1571*a6296200SBram Moolenaar    endfunc
1572*a6296200SBram Moolenaar
1573*a6296200SBram Moolenaar    Xpath 'b'
1574*a6296200SBram Moolenaar    try
1575*a6296200SBram Moolenaar      call Interrupt()
1576*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1577*a6296200SBram Moolenaar      Xpath 'c'
1578*a6296200SBram Moolenaar      finish
1579*a6296200SBram Moolenaar    endtry
1580*a6296200SBram Moolenaar    call assert_report('should not get here')
1581*a6296200SBram Moolenaar
1582*a6296200SBram Moolenaar    if 1	" not active due to interrupt
1583*a6296200SBram Moolenaar      try	" not active since :if inactive
1584*a6296200SBram Moolenaar        call assert_report('should not get here')
1585*a6296200SBram Moolenaar      finally
1586*a6296200SBram Moolenaar        call assert_report('should not get here')
1587*a6296200SBram Moolenaar      endtry
1588*a6296200SBram Moolenaar    endif
1589*a6296200SBram Moolenaar
1590*a6296200SBram Moolenaar    try		" not active due to interrupt
1591*a6296200SBram Moolenaar      call assert_report('should not get here')
1592*a6296200SBram Moolenaar    finally
1593*a6296200SBram Moolenaar      call assert_report('should not get here')
1594*a6296200SBram Moolenaar    endtry
1595*a6296200SBram Moolenaar  [CODE]
1596*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1597*a6296200SBram Moolenaar    call assert_equal('bac', g:Xpath)
1598*a6296200SBram Moolenaar  [CODE]
1599*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1600*a6296200SBram Moolenaarendfunc
1601*a6296200SBram Moolenaar
1602*a6296200SBram Moolenaarfunc Test_finally_after_throw()
1603*a6296200SBram Moolenaar  let test =<< trim [CODE]
1604*a6296200SBram Moolenaar    func Throw()
1605*a6296200SBram Moolenaar      Xpath 'a'
1606*a6296200SBram Moolenaar      throw 'xyz'
1607*a6296200SBram Moolenaar    endfunc
1608*a6296200SBram Moolenaar
1609*a6296200SBram Moolenaar    Xpath 'b'
1610*a6296200SBram Moolenaar    call Throw()
1611*a6296200SBram Moolenaar    call assert_report('should not get here')
1612*a6296200SBram Moolenaar
1613*a6296200SBram Moolenaar    if 1	" not active due to :throw
1614*a6296200SBram Moolenaar      try	" not active since :if inactive
1615*a6296200SBram Moolenaar        call assert_report('should not get here')
1616*a6296200SBram Moolenaar      finally
1617*a6296200SBram Moolenaar        call assert_report('should not get here')
1618*a6296200SBram Moolenaar      endtry
1619*a6296200SBram Moolenaar    endif
1620*a6296200SBram Moolenaar
1621*a6296200SBram Moolenaar    try		" not active due to :throw
1622*a6296200SBram Moolenaar      call assert_report('should not get here')
1623*a6296200SBram Moolenaar    finally
1624*a6296200SBram Moolenaar      call assert_report('should not get here')
1625*a6296200SBram Moolenaar    endtry
1626*a6296200SBram Moolenaar  [CODE]
1627*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1628*a6296200SBram Moolenaar    call assert_equal('ba', g:Xpath)
1629*a6296200SBram Moolenaar  [CODE]
1630*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1631*a6296200SBram Moolenaarendfunc
1632*a6296200SBram Moolenaar
1633*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1634*a6296200SBram Moolenaar" Test 23:  :catch clauses for a :try after a :throw			    {{{1
1635*a6296200SBram Moolenaar"
1636*a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :throw,
1637*a6296200SBram Moolenaar"	    none of its :catch clauses should be executed.
1638*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1639*a6296200SBram Moolenaar
1640*a6296200SBram Moolenaarfunc Test_catch_after_throw()
1641*a6296200SBram Moolenaar  let test =<< trim [CODE]
1642*a6296200SBram Moolenaar    try
1643*a6296200SBram Moolenaar      Xpath 'a'
1644*a6296200SBram Moolenaar      throw "xyz"
1645*a6296200SBram Moolenaar      call assert_report('should not get here')
1646*a6296200SBram Moolenaar
1647*a6296200SBram Moolenaar      if 1	" not active due to :throw
1648*a6296200SBram Moolenaar        try	" not active since :if inactive
1649*a6296200SBram Moolenaar          call assert_report('should not get here')
1650*a6296200SBram Moolenaar        catch /xyz/
1651*a6296200SBram Moolenaar          call assert_report('should not get here')
1652*a6296200SBram Moolenaar        endtry
1653*a6296200SBram Moolenaar      endif
1654*a6296200SBram Moolenaar    catch /xyz/
1655*a6296200SBram Moolenaar      Xpath 'b'
1656*a6296200SBram Moolenaar    endtry
1657*a6296200SBram Moolenaar
1658*a6296200SBram Moolenaar    Xpath 'c'
1659*a6296200SBram Moolenaar    throw "abc"
1660*a6296200SBram Moolenaar    call assert_report('should not get here')
1661*a6296200SBram Moolenaar
1662*a6296200SBram Moolenaar    try		" not active due to :throw
1663*a6296200SBram Moolenaar      call assert_report('should not get here')
1664*a6296200SBram Moolenaar    catch /abc/
1665*a6296200SBram Moolenaar      call assert_report('should not get here')
1666*a6296200SBram Moolenaar    endtry
1667*a6296200SBram Moolenaar  [CODE]
1668*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1669*a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1670*a6296200SBram Moolenaar  [CODE]
1671*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1672*a6296200SBram Moolenaarendfunc
1673*a6296200SBram Moolenaar
1674*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1675*a6296200SBram Moolenaar" Test 24:  :endtry for a :try after a :throw				    {{{1
1676*a6296200SBram Moolenaar"
1677*a6296200SBram Moolenaar"	    If a :try conditional stays inactive due to a preceding :throw,
1678*a6296200SBram Moolenaar"	    its :endtry should not rethrow the exception to the next surrounding
1679*a6296200SBram Moolenaar"	    active :try conditional.
1680*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1681*a6296200SBram Moolenaar
1682*a6296200SBram Moolenaarfunc Test_endtry_after_throw()
1683*a6296200SBram Moolenaar  let test =<< trim [CODE]
1684*a6296200SBram Moolenaar    try			" try 1
1685*a6296200SBram Moolenaar      try		" try 2
1686*a6296200SBram Moolenaar        Xpath 'a'
1687*a6296200SBram Moolenaar        throw "xyz"	" makes try 2 inactive
1688*a6296200SBram Moolenaar        call assert_report('should not get here')
1689*a6296200SBram Moolenaar
1690*a6296200SBram Moolenaar        try		" try 3
1691*a6296200SBram Moolenaar          call assert_report('should not get here')
1692*a6296200SBram Moolenaar        endtry	" no rethrow to try 1
1693*a6296200SBram Moolenaar      catch /xyz/	" should catch although try 2 inactive
1694*a6296200SBram Moolenaar        Xpath 'b'
1695*a6296200SBram Moolenaar      endtry
1696*a6296200SBram Moolenaar    catch /xyz/		" try 1 active, but exception already caught
1697*a6296200SBram Moolenaar      call assert_report('should not get here')
1698*a6296200SBram Moolenaar    endtry
1699*a6296200SBram Moolenaar    Xpath 'c'
1700*a6296200SBram Moolenaar  [CODE]
1701*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1702*a6296200SBram Moolenaar    call assert_equal('abc', g:Xpath)
1703*a6296200SBram Moolenaar  [CODE]
1704*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1705*a6296200SBram Moolenaarendfunc
1706*a6296200SBram Moolenaar
1707*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1708*a6296200SBram Moolenaar" Test 27:  Executing :finally clauses after :return			    {{{1
1709*a6296200SBram Moolenaar"
1710*a6296200SBram Moolenaar"	    For a :return command dynamically enclosed in a :try/:endtry region,
1711*a6296200SBram Moolenaar"	    :finally clauses are executed and the called function is ended.
1712*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1713*a6296200SBram Moolenaar
1714*a6296200SBram Moolenaarfunc T27_F()
1715*a6296200SBram Moolenaar  try
1716*a6296200SBram Moolenaar    Xpath 'a'
1717*a6296200SBram Moolenaar    try
1718*a6296200SBram Moolenaar      Xpath 'b'
1719*a6296200SBram Moolenaar      return
1720*a6296200SBram Moolenaar      call assert_report('should not get here')
1721*a6296200SBram Moolenaar    finally
1722*a6296200SBram Moolenaar      Xpath 'c'
1723*a6296200SBram Moolenaar    endtry
1724*a6296200SBram Moolenaar    Xpath 'd'
1725*a6296200SBram Moolenaar  finally
1726*a6296200SBram Moolenaar    Xpath 'e'
1727*a6296200SBram Moolenaar  endtry
1728*a6296200SBram Moolenaar  call assert_report('should not get here')
1729*a6296200SBram Moolenaarendfunc
1730*a6296200SBram Moolenaar
1731*a6296200SBram Moolenaarfunc T27_G()
1732*a6296200SBram Moolenaar  try
1733*a6296200SBram Moolenaar    Xpath 'f'
1734*a6296200SBram Moolenaar    return
1735*a6296200SBram Moolenaar    call assert_report('should not get here')
1736*a6296200SBram Moolenaar  finally
1737*a6296200SBram Moolenaar    Xpath 'g'
1738*a6296200SBram Moolenaar    call T27_F()
1739*a6296200SBram Moolenaar    Xpath 'h'
1740*a6296200SBram Moolenaar  endtry
1741*a6296200SBram Moolenaar  call assert_report('should not get here')
1742*a6296200SBram Moolenaarendfunc
1743*a6296200SBram Moolenaar
1744*a6296200SBram Moolenaarfunc T27_H()
1745*a6296200SBram Moolenaar  try
1746*a6296200SBram Moolenaar    Xpath 'i'
1747*a6296200SBram Moolenaar    call T27_G()
1748*a6296200SBram Moolenaar    Xpath 'j'
1749*a6296200SBram Moolenaar  finally
1750*a6296200SBram Moolenaar    Xpath 'k'
1751*a6296200SBram Moolenaar    return
1752*a6296200SBram Moolenaar    call assert_report('should not get here')
1753*a6296200SBram Moolenaar  endtry
1754*a6296200SBram Moolenaar  call assert_report('should not get here')
1755*a6296200SBram Moolenaarendfunction
1756*a6296200SBram Moolenaar
1757*a6296200SBram Moolenaarfunc Test_finally_after_return()
1758*a6296200SBram Moolenaar  XpathINIT
1759*a6296200SBram Moolenaar  try
1760*a6296200SBram Moolenaar      Xpath 'l'
1761*a6296200SBram Moolenaar      call T27_H()
1762*a6296200SBram Moolenaar      Xpath 'm'
1763*a6296200SBram Moolenaar  finally
1764*a6296200SBram Moolenaar      Xpath 'n'
1765*a6296200SBram Moolenaar  endtry
1766*a6296200SBram Moolenaar  call assert_equal('lifgabcehjkmn', g:Xpath)
1767*a6296200SBram Moolenaarendfunc
1768*a6296200SBram Moolenaar
1769*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1770*a6296200SBram Moolenaar" Test 28:  Executing :finally clauses after :finish			    {{{1
1771*a6296200SBram Moolenaar"
1772*a6296200SBram Moolenaar"	    For a :finish command dynamically enclosed in a :try/:endtry region,
1773*a6296200SBram Moolenaar"	    :finally clauses are executed and the sourced file is finished.
1774*a6296200SBram Moolenaar"
1775*a6296200SBram Moolenaar"	    This test executes the bodies of the functions F, G, and H from the
1776*a6296200SBram Moolenaar"	    previous test as script files (:return replaced by :finish).
1777*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1778*a6296200SBram Moolenaar
1779*a6296200SBram Moolenaarfunc Test_finally_after_finish()
1780*a6296200SBram Moolenaar  XpathINIT
1781*a6296200SBram Moolenaar
1782*a6296200SBram Moolenaar  let scriptF = MakeScript("T27_F")
1783*a6296200SBram Moolenaar  let scriptG = MakeScript("T27_G", scriptF)
1784*a6296200SBram Moolenaar  let scriptH = MakeScript("T27_H", scriptG)
1785*a6296200SBram Moolenaar
1786*a6296200SBram Moolenaar  try
1787*a6296200SBram Moolenaar    Xpath 'A'
1788*a6296200SBram Moolenaar    exec "source" scriptH
1789*a6296200SBram Moolenaar    Xpath 'B'
1790*a6296200SBram Moolenaar  finally
1791*a6296200SBram Moolenaar    Xpath 'C'
1792*a6296200SBram Moolenaar  endtry
1793*a6296200SBram Moolenaar  Xpath 'D'
1794*a6296200SBram Moolenaar  call assert_equal('AifgabcehjkBCD', g:Xpath)
1795*a6296200SBram Moolenaar  call delete(scriptF)
1796*a6296200SBram Moolenaar  call delete(scriptG)
1797*a6296200SBram Moolenaar  call delete(scriptH)
1798*a6296200SBram Moolenaarendfunc
1799*a6296200SBram Moolenaar
1800*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1801*a6296200SBram Moolenaar" Test 29:  Executing :finally clauses on errors			    {{{1
1802*a6296200SBram Moolenaar"
1803*a6296200SBram Moolenaar"	    After an error in a command dynamically enclosed in a :try/:endtry
1804*a6296200SBram Moolenaar"	    region, :finally clauses are executed and the script processing is
1805*a6296200SBram Moolenaar"	    terminated.
1806*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1807*a6296200SBram Moolenaar
1808*a6296200SBram Moolenaarfunc Test_finally_after_error_1()
1809*a6296200SBram Moolenaar  let test =<< trim [CODE]
1810*a6296200SBram Moolenaar    func F()
1811*a6296200SBram Moolenaar      while 1
1812*a6296200SBram Moolenaar        try
1813*a6296200SBram Moolenaar          Xpath 'a'
1814*a6296200SBram Moolenaar          while 1
1815*a6296200SBram Moolenaar            try
1816*a6296200SBram Moolenaar              Xpath 'b'
1817*a6296200SBram Moolenaar              asdf	    " error
1818*a6296200SBram Moolenaar              call assert_report('should not get here')
1819*a6296200SBram Moolenaar            finally
1820*a6296200SBram Moolenaar              Xpath 'c'
1821*a6296200SBram Moolenaar            endtry | call assert_report('should not get here')
1822*a6296200SBram Moolenaar            call assert_report('should not get here')
1823*a6296200SBram Moolenaar            break
1824*a6296200SBram Moolenaar          endwhile
1825*a6296200SBram Moolenaar          call assert_report('should not get here')
1826*a6296200SBram Moolenaar        finally
1827*a6296200SBram Moolenaar          Xpath 'd'
1828*a6296200SBram Moolenaar        endtry | call assert_report('should not get here')
1829*a6296200SBram Moolenaar        call assert_report('should not get here')
1830*a6296200SBram Moolenaar        break
1831*a6296200SBram Moolenaar      endwhile
1832*a6296200SBram Moolenaar      call assert_report('should not get here')
1833*a6296200SBram Moolenaar    endfunc
1834*a6296200SBram Moolenaar
1835*a6296200SBram Moolenaar    while 1
1836*a6296200SBram Moolenaar      try
1837*a6296200SBram Moolenaar        Xpath 'e'
1838*a6296200SBram Moolenaar        while 1
1839*a6296200SBram Moolenaar          call F()
1840*a6296200SBram Moolenaar          call assert_report('should not get here')
1841*a6296200SBram Moolenaar          break
1842*a6296200SBram Moolenaar        endwhile  | call assert_report('should not get here')
1843*a6296200SBram Moolenaar        call assert_report('should not get here')
1844*a6296200SBram Moolenaar      finally
1845*a6296200SBram Moolenaar        Xpath 'f'
1846*a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1847*a6296200SBram Moolenaar    endwhile | call assert_report('should not get here')
1848*a6296200SBram Moolenaar    call assert_report('should not get here')
1849*a6296200SBram Moolenaar  [CODE]
1850*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1851*a6296200SBram Moolenaar    call assert_equal('eabcdf', g:Xpath)
1852*a6296200SBram Moolenaar  [CODE]
1853*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1854*a6296200SBram Moolenaarendfunc
1855*a6296200SBram Moolenaar
1856*a6296200SBram Moolenaarfunc Test_finally_after_error_2()
1857*a6296200SBram Moolenaar  let test =<< trim [CODE]
1858*a6296200SBram Moolenaar    func G() abort
1859*a6296200SBram Moolenaar      if 1
1860*a6296200SBram Moolenaar        try
1861*a6296200SBram Moolenaar          Xpath 'a'
1862*a6296200SBram Moolenaar          asdf	    " error
1863*a6296200SBram Moolenaar          call assert_report('should not get here')
1864*a6296200SBram Moolenaar        finally
1865*a6296200SBram Moolenaar          Xpath 'b'
1866*a6296200SBram Moolenaar        endtry | Xpath 'c'
1867*a6296200SBram Moolenaar      endif | Xpath 'd'
1868*a6296200SBram Moolenaar      call assert_report('should not get here')
1869*a6296200SBram Moolenaar    endfunc
1870*a6296200SBram Moolenaar
1871*a6296200SBram Moolenaar    if 1
1872*a6296200SBram Moolenaar      try
1873*a6296200SBram Moolenaar        Xpath 'e'
1874*a6296200SBram Moolenaar        call G()
1875*a6296200SBram Moolenaar        call assert_report('should not get here')
1876*a6296200SBram Moolenaar      finally
1877*a6296200SBram Moolenaar        Xpath 'f'
1878*a6296200SBram Moolenaar      endtry | call assert_report('should not get here')
1879*a6296200SBram Moolenaar    endif | call assert_report('should not get here')
1880*a6296200SBram Moolenaar    call assert_report('should not get here')
1881*a6296200SBram Moolenaar  [CODE]
1882*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1883*a6296200SBram Moolenaar    call assert_equal('eabf', g:Xpath)
1884*a6296200SBram Moolenaar  [CODE]
1885*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1886*a6296200SBram Moolenaarendfunc
1887*a6296200SBram Moolenaar
1888*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1889*a6296200SBram Moolenaar" Test 30:  Executing :finally clauses on interrupt			    {{{1
1890*a6296200SBram Moolenaar"
1891*a6296200SBram Moolenaar"	    After an interrupt in a command dynamically enclosed in
1892*a6296200SBram Moolenaar"	    a :try/:endtry region, :finally clauses are executed and the
1893*a6296200SBram Moolenaar"	    script processing is terminated.
1894*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1895*a6296200SBram Moolenaar
1896*a6296200SBram Moolenaarfunc Test_finally_on_interrupt()
1897*a6296200SBram Moolenaar  let test =<< trim [CODE]
1898*a6296200SBram Moolenaar    func F()
1899*a6296200SBram Moolenaar      try
1900*a6296200SBram Moolenaar        Xloop 'a'
1901*a6296200SBram Moolenaar        call interrupt()
1902*a6296200SBram Moolenaar        call assert_report('should not get here')
1903*a6296200SBram Moolenaar      finally
1904*a6296200SBram Moolenaar        Xloop 'b'
1905*a6296200SBram Moolenaar      endtry
1906*a6296200SBram Moolenaar      call assert_report('should not get here')
1907*a6296200SBram Moolenaar    endfunc
1908*a6296200SBram Moolenaar
1909*a6296200SBram Moolenaar    try
1910*a6296200SBram Moolenaar      try
1911*a6296200SBram Moolenaar        Xpath 'c'
1912*a6296200SBram Moolenaar        try
1913*a6296200SBram Moolenaar          Xpath 'd'
1914*a6296200SBram Moolenaar          call interrupt()
1915*a6296200SBram Moolenaar          call assert_report('should not get here')
1916*a6296200SBram Moolenaar        finally
1917*a6296200SBram Moolenaar          Xpath 'e'
1918*a6296200SBram Moolenaar          try
1919*a6296200SBram Moolenaar            Xpath 'f'
1920*a6296200SBram Moolenaar            try
1921*a6296200SBram Moolenaar              Xpath 'g'
1922*a6296200SBram Moolenaar            finally
1923*a6296200SBram Moolenaar              Xpath 'h'
1924*a6296200SBram Moolenaar              try
1925*a6296200SBram Moolenaar                Xpath 'i'
1926*a6296200SBram Moolenaar                call interrupt()
1927*a6296200SBram Moolenaar                call assert_report('should not get here')
1928*a6296200SBram Moolenaar              endtry
1929*a6296200SBram Moolenaar              call assert_report('should not get here')
1930*a6296200SBram Moolenaar            endtry
1931*a6296200SBram Moolenaar            call assert_report('should not get here')
1932*a6296200SBram Moolenaar          endtry
1933*a6296200SBram Moolenaar          call assert_report('should not get here')
1934*a6296200SBram Moolenaar        endtry
1935*a6296200SBram Moolenaar        call assert_report('should not get here')
1936*a6296200SBram Moolenaar      finally
1937*a6296200SBram Moolenaar        Xpath 'j'
1938*a6296200SBram Moolenaar        try
1939*a6296200SBram Moolenaar          Xpath 'k'
1940*a6296200SBram Moolenaar          call F()
1941*a6296200SBram Moolenaar          call assert_report('should not get here')
1942*a6296200SBram Moolenaar        finally
1943*a6296200SBram Moolenaar          Xpath 'l'
1944*a6296200SBram Moolenaar          try
1945*a6296200SBram Moolenaar            Xpath 'm'
1946*a6296200SBram Moolenaar            XloopNEXT
1947*a6296200SBram Moolenaar            ExecAsScript F
1948*a6296200SBram Moolenaar            call assert_report('should not get here')
1949*a6296200SBram Moolenaar          finally
1950*a6296200SBram Moolenaar            Xpath 'n'
1951*a6296200SBram Moolenaar          endtry
1952*a6296200SBram Moolenaar          call assert_report('should not get here')
1953*a6296200SBram Moolenaar        endtry
1954*a6296200SBram Moolenaar        call assert_report('should not get here')
1955*a6296200SBram Moolenaar      endtry
1956*a6296200SBram Moolenaar      call assert_report('should not get here')
1957*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
1958*a6296200SBram Moolenaar      Xpath 'o'
1959*a6296200SBram Moolenaar    endtry
1960*a6296200SBram Moolenaar  [CODE]
1961*a6296200SBram Moolenaar  let verify =<< trim [CODE]
1962*a6296200SBram Moolenaar    call assert_equal('cdefghijka1b1lma2b2no', g:Xpath)
1963*a6296200SBram Moolenaar  [CODE]
1964*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
1965*a6296200SBram Moolenaarendfunc
1966*a6296200SBram Moolenaar
1967*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1968*a6296200SBram Moolenaar" Test 31:  Executing :finally clauses after :throw			    {{{1
1969*a6296200SBram Moolenaar"
1970*a6296200SBram Moolenaar"	    After a :throw dynamically enclosed in a :try/:endtry region,
1971*a6296200SBram Moolenaar"	    :finally clauses are executed and the script processing is
1972*a6296200SBram Moolenaar"	    terminated.
1973*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
1974*a6296200SBram Moolenaar
1975*a6296200SBram Moolenaarfunc Test_finally_after_throw_2()
1976*a6296200SBram Moolenaar  let test =<< trim [CODE]
1977*a6296200SBram Moolenaar    func F()
1978*a6296200SBram Moolenaar      try
1979*a6296200SBram Moolenaar        Xloop 'a'
1980*a6296200SBram Moolenaar        throw "exception"
1981*a6296200SBram Moolenaar        call assert_report('should not get here')
1982*a6296200SBram Moolenaar      finally
1983*a6296200SBram Moolenaar        Xloop 'b'
1984*a6296200SBram Moolenaar      endtry
1985*a6296200SBram Moolenaar      call assert_report('should not get here')
1986*a6296200SBram Moolenaar    endfunc
1987*a6296200SBram Moolenaar
1988*a6296200SBram Moolenaar    try
1989*a6296200SBram Moolenaar      Xpath 'c'
1990*a6296200SBram Moolenaar      try
1991*a6296200SBram Moolenaar        Xpath 'd'
1992*a6296200SBram Moolenaar        throw "exception"
1993*a6296200SBram Moolenaar        call assert_report('should not get here')
1994*a6296200SBram Moolenaar      finally
1995*a6296200SBram Moolenaar        Xpath 'e'
1996*a6296200SBram Moolenaar        try
1997*a6296200SBram Moolenaar          Xpath 'f'
1998*a6296200SBram Moolenaar          try
1999*a6296200SBram Moolenaar            Xpath 'g'
2000*a6296200SBram Moolenaar          finally
2001*a6296200SBram Moolenaar            Xpath 'h'
2002*a6296200SBram Moolenaar            try
2003*a6296200SBram Moolenaar              Xpath 'i'
2004*a6296200SBram Moolenaar              throw "exception"
2005*a6296200SBram Moolenaar              call assert_report('should not get here')
2006*a6296200SBram Moolenaar            endtry
2007*a6296200SBram Moolenaar            call assert_report('should not get here')
2008*a6296200SBram Moolenaar          endtry
2009*a6296200SBram Moolenaar          call assert_report('should not get here')
2010*a6296200SBram Moolenaar        endtry
2011*a6296200SBram Moolenaar        call assert_report('should not get here')
2012*a6296200SBram Moolenaar      endtry
2013*a6296200SBram Moolenaar      call assert_report('should not get here')
2014*a6296200SBram Moolenaar    finally
2015*a6296200SBram Moolenaar      Xpath 'j'
2016*a6296200SBram Moolenaar      try
2017*a6296200SBram Moolenaar        Xpath 'k'
2018*a6296200SBram Moolenaar        call F()
2019*a6296200SBram Moolenaar        call assert_report('should not get here')
2020*a6296200SBram Moolenaar      finally
2021*a6296200SBram Moolenaar        Xpath 'l'
2022*a6296200SBram Moolenaar        try
2023*a6296200SBram Moolenaar          Xpath 'm'
2024*a6296200SBram Moolenaar          XloopNEXT
2025*a6296200SBram Moolenaar          ExecAsScript F
2026*a6296200SBram Moolenaar          call assert_report('should not get here')
2027*a6296200SBram Moolenaar        finally
2028*a6296200SBram Moolenaar          Xpath 'n'
2029*a6296200SBram Moolenaar        endtry
2030*a6296200SBram Moolenaar        call assert_report('should not get here')
2031*a6296200SBram Moolenaar      endtry
2032*a6296200SBram Moolenaar      call assert_report('should not get here')
2033*a6296200SBram Moolenaar    endtry
2034*a6296200SBram Moolenaar    call assert_report('should not get here')
2035*a6296200SBram Moolenaar  [CODE]
2036*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2037*a6296200SBram Moolenaar    call assert_equal('cdefghijka1b1lma2b2n', g:Xpath)
2038*a6296200SBram Moolenaar  [CODE]
2039*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2040*a6296200SBram Moolenaarendfunc
2041*a6296200SBram Moolenaar
2042*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2043*a6296200SBram Moolenaar" Test 34:  :finally reason discarded by :continue			    {{{1
2044*a6296200SBram Moolenaar"
2045*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2046*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2047*a6296200SBram Moolenaar"	    discarded by a :continue in the finally clause.
2048*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2049*a6296200SBram Moolenaar
2050*a6296200SBram Moolenaarfunc Test_finally_after_continue()
2051*a6296200SBram Moolenaar  let test =<< trim [CODE]
2052*a6296200SBram Moolenaar    func C(jump)
2053*a6296200SBram Moolenaar      XloopNEXT
2054*a6296200SBram Moolenaar      let loop = 0
2055*a6296200SBram Moolenaar      while loop < 2
2056*a6296200SBram Moolenaar        let loop = loop + 1
2057*a6296200SBram Moolenaar        if loop == 1
2058*a6296200SBram Moolenaar          try
2059*a6296200SBram Moolenaar            if a:jump == "continue"
2060*a6296200SBram Moolenaar              continue
2061*a6296200SBram Moolenaar            elseif a:jump == "break"
2062*a6296200SBram Moolenaar              break
2063*a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2064*a6296200SBram Moolenaar              return
2065*a6296200SBram Moolenaar            elseif a:jump == "error"
2066*a6296200SBram Moolenaar              asdf
2067*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2068*a6296200SBram Moolenaar              call interrupt()
2069*a6296200SBram Moolenaar              let dummy = 0
2070*a6296200SBram Moolenaar            elseif a:jump == "throw"
2071*a6296200SBram Moolenaar              throw "abc"
2072*a6296200SBram Moolenaar            endif
2073*a6296200SBram Moolenaar          finally
2074*a6296200SBram Moolenaar            continue	" discards jump that caused the :finally
2075*a6296200SBram Moolenaar            call assert_report('should not get here')
2076*a6296200SBram Moolenaar          endtry
2077*a6296200SBram Moolenaar          call assert_report('should not get here')
2078*a6296200SBram Moolenaar        elseif loop == 2
2079*a6296200SBram Moolenaar          Xloop 'a'
2080*a6296200SBram Moolenaar        endif
2081*a6296200SBram Moolenaar      endwhile
2082*a6296200SBram Moolenaar    endfunc
2083*a6296200SBram Moolenaar
2084*a6296200SBram Moolenaar    call C("continue")
2085*a6296200SBram Moolenaar    Xpath 'b'
2086*a6296200SBram Moolenaar    call C("break")
2087*a6296200SBram Moolenaar    Xpath 'c'
2088*a6296200SBram Moolenaar    call C("return")
2089*a6296200SBram Moolenaar    Xpath 'd'
2090*a6296200SBram Moolenaar    let g:jump = "finish"
2091*a6296200SBram Moolenaar    ExecAsScript C
2092*a6296200SBram Moolenaar    unlet g:jump
2093*a6296200SBram Moolenaar    Xpath 'e'
2094*a6296200SBram Moolenaar    try
2095*a6296200SBram Moolenaar      call C("error")
2096*a6296200SBram Moolenaar      Xpath 'f'
2097*a6296200SBram Moolenaar    finally
2098*a6296200SBram Moolenaar      Xpath 'g'
2099*a6296200SBram Moolenaar      try
2100*a6296200SBram Moolenaar        call C("interrupt")
2101*a6296200SBram Moolenaar        Xpath 'h'
2102*a6296200SBram Moolenaar      finally
2103*a6296200SBram Moolenaar        Xpath 'i'
2104*a6296200SBram Moolenaar        call C("throw")
2105*a6296200SBram Moolenaar        Xpath 'j'
2106*a6296200SBram Moolenaar      endtry
2107*a6296200SBram Moolenaar    endtry
2108*a6296200SBram Moolenaar    Xpath 'k'
2109*a6296200SBram Moolenaar  [CODE]
2110*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2111*a6296200SBram Moolenaar    call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath)
2112*a6296200SBram Moolenaar  [CODE]
2113*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2114*a6296200SBram Moolenaarendfunc
2115*a6296200SBram Moolenaar
2116*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2117*a6296200SBram Moolenaar" Test 35:  :finally reason discarded by :break				    {{{1
2118*a6296200SBram Moolenaar"
2119*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2120*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2121*a6296200SBram Moolenaar"	    discarded by a :break in the finally clause.
2122*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2123*a6296200SBram Moolenaar
2124*a6296200SBram Moolenaarfunc Test_finally_discard_by_break()
2125*a6296200SBram Moolenaar  let test =<< trim [CODE]
2126*a6296200SBram Moolenaar    func B(jump)
2127*a6296200SBram Moolenaar      XloopNEXT
2128*a6296200SBram Moolenaar      let loop = 0
2129*a6296200SBram Moolenaar      while loop < 2
2130*a6296200SBram Moolenaar        let loop = loop + 1
2131*a6296200SBram Moolenaar        if loop == 1
2132*a6296200SBram Moolenaar          try
2133*a6296200SBram Moolenaar            if a:jump == "continue"
2134*a6296200SBram Moolenaar              continue
2135*a6296200SBram Moolenaar            elseif a:jump == "break"
2136*a6296200SBram Moolenaar              break
2137*a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2138*a6296200SBram Moolenaar              return
2139*a6296200SBram Moolenaar            elseif a:jump == "error"
2140*a6296200SBram Moolenaar              asdf
2141*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2142*a6296200SBram Moolenaar              call interrupt()
2143*a6296200SBram Moolenaar              let dummy = 0
2144*a6296200SBram Moolenaar            elseif a:jump == "throw"
2145*a6296200SBram Moolenaar              throw "abc"
2146*a6296200SBram Moolenaar            endif
2147*a6296200SBram Moolenaar          finally
2148*a6296200SBram Moolenaar            break	" discards jump that caused the :finally
2149*a6296200SBram Moolenaar            call assert_report('should not get here')
2150*a6296200SBram Moolenaar          endtry
2151*a6296200SBram Moolenaar        elseif loop == 2
2152*a6296200SBram Moolenaar          call assert_report('should not get here')
2153*a6296200SBram Moolenaar        endif
2154*a6296200SBram Moolenaar      endwhile
2155*a6296200SBram Moolenaar      Xloop 'a'
2156*a6296200SBram Moolenaar    endfunc
2157*a6296200SBram Moolenaar
2158*a6296200SBram Moolenaar    call B("continue")
2159*a6296200SBram Moolenaar    Xpath 'b'
2160*a6296200SBram Moolenaar    call B("break")
2161*a6296200SBram Moolenaar    Xpath 'c'
2162*a6296200SBram Moolenaar    call B("return")
2163*a6296200SBram Moolenaar    Xpath 'd'
2164*a6296200SBram Moolenaar    let g:jump = "finish"
2165*a6296200SBram Moolenaar    ExecAsScript B
2166*a6296200SBram Moolenaar    unlet g:jump
2167*a6296200SBram Moolenaar    Xpath 'e'
2168*a6296200SBram Moolenaar    try
2169*a6296200SBram Moolenaar      call B("error")
2170*a6296200SBram Moolenaar      Xpath 'f'
2171*a6296200SBram Moolenaar    finally
2172*a6296200SBram Moolenaar      Xpath 'g'
2173*a6296200SBram Moolenaar      try
2174*a6296200SBram Moolenaar        call B("interrupt")
2175*a6296200SBram Moolenaar        Xpath 'h'
2176*a6296200SBram Moolenaar      finally
2177*a6296200SBram Moolenaar        Xpath 'i'
2178*a6296200SBram Moolenaar        call B("throw")
2179*a6296200SBram Moolenaar        Xpath 'j'
2180*a6296200SBram Moolenaar      endtry
2181*a6296200SBram Moolenaar    endtry
2182*a6296200SBram Moolenaar    Xpath 'k'
2183*a6296200SBram Moolenaar  [CODE]
2184*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2185*a6296200SBram Moolenaar    call assert_equal('a2ba3ca4da5ea6fga7hia8jk', g:Xpath)
2186*a6296200SBram Moolenaar  [CODE]
2187*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2188*a6296200SBram Moolenaarendfunc
2189*a6296200SBram Moolenaar
2190*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2191*a6296200SBram Moolenaar" Test 36:  :finally reason discarded by :return			    {{{1
2192*a6296200SBram Moolenaar"
2193*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2194*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2195*a6296200SBram Moolenaar"	    discarded by a :return in the finally clause.
2196*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2197*a6296200SBram Moolenaar
2198*a6296200SBram Moolenaarfunc Test_finally_discard_by_return()
2199*a6296200SBram Moolenaar  let test =<< trim [CODE]
2200*a6296200SBram Moolenaar    func R(jump, retval) abort
2201*a6296200SBram Moolenaar      let loop = 0
2202*a6296200SBram Moolenaar      while loop < 2
2203*a6296200SBram Moolenaar        let loop = loop + 1
2204*a6296200SBram Moolenaar        if loop == 1
2205*a6296200SBram Moolenaar          try
2206*a6296200SBram Moolenaar            if a:jump == "continue"
2207*a6296200SBram Moolenaar              continue
2208*a6296200SBram Moolenaar            elseif a:jump == "break"
2209*a6296200SBram Moolenaar              break
2210*a6296200SBram Moolenaar            elseif a:jump == "return"
2211*a6296200SBram Moolenaar              return
2212*a6296200SBram Moolenaar            elseif a:jump == "error"
2213*a6296200SBram Moolenaar              asdf
2214*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2215*a6296200SBram Moolenaar              call interrupt()
2216*a6296200SBram Moolenaar              let dummy = 0
2217*a6296200SBram Moolenaar            elseif a:jump == "throw"
2218*a6296200SBram Moolenaar              throw "abc"
2219*a6296200SBram Moolenaar            endif
2220*a6296200SBram Moolenaar          finally
2221*a6296200SBram Moolenaar            return a:retval	" discards jump that caused the :finally
2222*a6296200SBram Moolenaar            call assert_report('should not get here')
2223*a6296200SBram Moolenaar          endtry
2224*a6296200SBram Moolenaar        elseif loop == 2
2225*a6296200SBram Moolenaar          call assert_report('should not get here')
2226*a6296200SBram Moolenaar        endif
2227*a6296200SBram Moolenaar      endwhile
2228*a6296200SBram Moolenaar      call assert_report('should not get here')
2229*a6296200SBram Moolenaar    endfunc
2230*a6296200SBram Moolenaar
2231*a6296200SBram Moolenaar    let sum =  -R("continue", -8)
2232*a6296200SBram Moolenaar    Xpath 'a'
2233*a6296200SBram Moolenaar    let sum = sum - R("break", -16)
2234*a6296200SBram Moolenaar    Xpath 'b'
2235*a6296200SBram Moolenaar    let sum = sum - R("return", -32)
2236*a6296200SBram Moolenaar    Xpath 'c'
2237*a6296200SBram Moolenaar    try
2238*a6296200SBram Moolenaar      let sum = sum - R("error", -64)
2239*a6296200SBram Moolenaar      Xpath 'd'
2240*a6296200SBram Moolenaar    finally
2241*a6296200SBram Moolenaar      Xpath 'e'
2242*a6296200SBram Moolenaar      try
2243*a6296200SBram Moolenaar        let sum = sum - R("interrupt", -128)
2244*a6296200SBram Moolenaar        Xpath 'f'
2245*a6296200SBram Moolenaar      finally
2246*a6296200SBram Moolenaar        Xpath 'g'
2247*a6296200SBram Moolenaar        let sum = sum - R("throw", -256)
2248*a6296200SBram Moolenaar        Xpath 'h'
2249*a6296200SBram Moolenaar      endtry
2250*a6296200SBram Moolenaar    endtry
2251*a6296200SBram Moolenaar    Xpath 'i'
2252*a6296200SBram Moolenaar
2253*a6296200SBram Moolenaar    let expected = 8 + 16 + 32 + 64 + 128 + 256
2254*a6296200SBram Moolenaar    call assert_equal(sum, expected)
2255*a6296200SBram Moolenaar  [CODE]
2256*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2257*a6296200SBram Moolenaar    call assert_equal('abcdefghi', g:Xpath)
2258*a6296200SBram Moolenaar  [CODE]
2259*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2260*a6296200SBram Moolenaarendfunc
2261*a6296200SBram Moolenaar
2262*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2263*a6296200SBram Moolenaar" Test 37:  :finally reason discarded by :finish			    {{{1
2264*a6296200SBram Moolenaar"
2265*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2266*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2267*a6296200SBram Moolenaar"	    discarded by a :finish in the finally clause.
2268*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2269*a6296200SBram Moolenaar
2270*a6296200SBram Moolenaarfunc Test_finally_discard_by_finish()
2271*a6296200SBram Moolenaar  let test =<< trim [CODE]
2272*a6296200SBram Moolenaar    func F(jump)	" not executed as function, transformed to a script
2273*a6296200SBram Moolenaar      let loop = 0
2274*a6296200SBram Moolenaar      while loop < 2
2275*a6296200SBram Moolenaar        let loop = loop + 1
2276*a6296200SBram Moolenaar        if loop == 1
2277*a6296200SBram Moolenaar          try
2278*a6296200SBram Moolenaar            if a:jump == "continue"
2279*a6296200SBram Moolenaar              continue
2280*a6296200SBram Moolenaar            elseif a:jump == "break"
2281*a6296200SBram Moolenaar              break
2282*a6296200SBram Moolenaar            elseif a:jump == "finish"
2283*a6296200SBram Moolenaar              finish
2284*a6296200SBram Moolenaar            elseif a:jump == "error"
2285*a6296200SBram Moolenaar              asdf
2286*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2287*a6296200SBram Moolenaar              call interrupt()
2288*a6296200SBram Moolenaar              let dummy = 0
2289*a6296200SBram Moolenaar            elseif a:jump == "throw"
2290*a6296200SBram Moolenaar              throw "abc"
2291*a6296200SBram Moolenaar            endif
2292*a6296200SBram Moolenaar          finally
2293*a6296200SBram Moolenaar            finish	" discards jump that caused the :finally
2294*a6296200SBram Moolenaar            call assert_report('should not get here')
2295*a6296200SBram Moolenaar          endtry
2296*a6296200SBram Moolenaar        elseif loop == 2
2297*a6296200SBram Moolenaar          call assert_report('should not get here')
2298*a6296200SBram Moolenaar        endif
2299*a6296200SBram Moolenaar      endwhile
2300*a6296200SBram Moolenaar      call assert_report('should not get here')
2301*a6296200SBram Moolenaar    endfunc
2302*a6296200SBram Moolenaar
2303*a6296200SBram Moolenaar    let scriptF = MakeScript("F")
2304*a6296200SBram Moolenaar    delfunction F
2305*a6296200SBram Moolenaar
2306*a6296200SBram Moolenaar    let g:jump = "continue"
2307*a6296200SBram Moolenaar    exec "source" scriptF
2308*a6296200SBram Moolenaar    Xpath 'a'
2309*a6296200SBram Moolenaar    let g:jump = "break"
2310*a6296200SBram Moolenaar    exec "source" scriptF
2311*a6296200SBram Moolenaar    Xpath 'b'
2312*a6296200SBram Moolenaar    let g:jump = "finish"
2313*a6296200SBram Moolenaar    exec "source" scriptF
2314*a6296200SBram Moolenaar    Xpath 'c'
2315*a6296200SBram Moolenaar    try
2316*a6296200SBram Moolenaar      let g:jump = "error"
2317*a6296200SBram Moolenaar      exec "source" scriptF
2318*a6296200SBram Moolenaar      Xpath 'd'
2319*a6296200SBram Moolenaar    finally
2320*a6296200SBram Moolenaar      Xpath 'e'
2321*a6296200SBram Moolenaar      try
2322*a6296200SBram Moolenaar        let g:jump = "interrupt"
2323*a6296200SBram Moolenaar        exec "source" scriptF
2324*a6296200SBram Moolenaar        Xpath 'f'
2325*a6296200SBram Moolenaar      finally
2326*a6296200SBram Moolenaar        Xpath 'g'
2327*a6296200SBram Moolenaar        try
2328*a6296200SBram Moolenaar          let g:jump = "throw"
2329*a6296200SBram Moolenaar          exec "source" scriptF
2330*a6296200SBram Moolenaar          Xpath 'h'
2331*a6296200SBram Moolenaar        finally
2332*a6296200SBram Moolenaar          Xpath 'i'
2333*a6296200SBram Moolenaar        endtry
2334*a6296200SBram Moolenaar      endtry
2335*a6296200SBram Moolenaar    endtry
2336*a6296200SBram Moolenaar    unlet g:jump
2337*a6296200SBram Moolenaar    call delete(scriptF)
2338*a6296200SBram Moolenaar  [CODE]
2339*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2340*a6296200SBram Moolenaar    call assert_equal('abcdefghi', g:Xpath)
2341*a6296200SBram Moolenaar  [CODE]
2342*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2343*a6296200SBram Moolenaarendfunc
2344*a6296200SBram Moolenaar
2345*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2346*a6296200SBram Moolenaar" Test 38:  :finally reason discarded by an error			    {{{1
2347*a6296200SBram Moolenaar"
2348*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2349*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2350*a6296200SBram Moolenaar"	    discarded by an error in the finally clause.
2351*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2352*a6296200SBram Moolenaar
2353*a6296200SBram Moolenaarfunc Test_finally_discard_by_error()
2354*a6296200SBram Moolenaar  let test =<< trim [CODE]
2355*a6296200SBram Moolenaar    func E(jump)
2356*a6296200SBram Moolenaar      let loop = 0
2357*a6296200SBram Moolenaar      while loop < 2
2358*a6296200SBram Moolenaar        let loop = loop + 1
2359*a6296200SBram Moolenaar        if loop == 1
2360*a6296200SBram Moolenaar          try
2361*a6296200SBram Moolenaar            if a:jump == "continue"
2362*a6296200SBram Moolenaar              continue
2363*a6296200SBram Moolenaar            elseif a:jump == "break"
2364*a6296200SBram Moolenaar              break
2365*a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2366*a6296200SBram Moolenaar              return
2367*a6296200SBram Moolenaar            elseif a:jump == "error"
2368*a6296200SBram Moolenaar              asdf
2369*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2370*a6296200SBram Moolenaar              call interrupt()
2371*a6296200SBram Moolenaar              let dummy = 0
2372*a6296200SBram Moolenaar            elseif a:jump == "throw"
2373*a6296200SBram Moolenaar              throw "abc"
2374*a6296200SBram Moolenaar            endif
2375*a6296200SBram Moolenaar          finally
2376*a6296200SBram Moolenaar            asdf	" error; discards jump that caused the :finally
2377*a6296200SBram Moolenaar          endtry
2378*a6296200SBram Moolenaar        elseif loop == 2
2379*a6296200SBram Moolenaar          call assert_report('should not get here')
2380*a6296200SBram Moolenaar        endif
2381*a6296200SBram Moolenaar      endwhile
2382*a6296200SBram Moolenaar      call assert_report('should not get here')
2383*a6296200SBram Moolenaar    endfunc
2384*a6296200SBram Moolenaar
2385*a6296200SBram Moolenaar    try
2386*a6296200SBram Moolenaar      Xpath 'a'
2387*a6296200SBram Moolenaar      call E("continue")
2388*a6296200SBram Moolenaar      call assert_report('should not get here')
2389*a6296200SBram Moolenaar    finally
2390*a6296200SBram Moolenaar      try
2391*a6296200SBram Moolenaar        Xpath 'b'
2392*a6296200SBram Moolenaar        call E("break")
2393*a6296200SBram Moolenaar        call assert_report('should not get here')
2394*a6296200SBram Moolenaar      finally
2395*a6296200SBram Moolenaar        try
2396*a6296200SBram Moolenaar          Xpath 'c'
2397*a6296200SBram Moolenaar          call E("return")
2398*a6296200SBram Moolenaar          call assert_report('should not get here')
2399*a6296200SBram Moolenaar        finally
2400*a6296200SBram Moolenaar          try
2401*a6296200SBram Moolenaar            Xpath 'd'
2402*a6296200SBram Moolenaar            let g:jump = "finish"
2403*a6296200SBram Moolenaar            ExecAsScript E
2404*a6296200SBram Moolenaar            call assert_report('should not get here')
2405*a6296200SBram Moolenaar          finally
2406*a6296200SBram Moolenaar            unlet g:jump
2407*a6296200SBram Moolenaar            try
2408*a6296200SBram Moolenaar              Xpath 'e'
2409*a6296200SBram Moolenaar              call E("error")
2410*a6296200SBram Moolenaar              call assert_report('should not get here')
2411*a6296200SBram Moolenaar            finally
2412*a6296200SBram Moolenaar              try
2413*a6296200SBram Moolenaar                Xpath 'f'
2414*a6296200SBram Moolenaar                call E("interrupt")
2415*a6296200SBram Moolenaar                call assert_report('should not get here')
2416*a6296200SBram Moolenaar              finally
2417*a6296200SBram Moolenaar                try
2418*a6296200SBram Moolenaar                  Xpath 'g'
2419*a6296200SBram Moolenaar                  call E("throw")
2420*a6296200SBram Moolenaar                  call assert_report('should not get here')
2421*a6296200SBram Moolenaar                finally
2422*a6296200SBram Moolenaar                  Xpath 'h'
2423*a6296200SBram Moolenaar                  delfunction E
2424*a6296200SBram Moolenaar                endtry
2425*a6296200SBram Moolenaar              endtry
2426*a6296200SBram Moolenaar            endtry
2427*a6296200SBram Moolenaar          endtry
2428*a6296200SBram Moolenaar        endtry
2429*a6296200SBram Moolenaar      endtry
2430*a6296200SBram Moolenaar    endtry
2431*a6296200SBram Moolenaar    call assert_report('should not get here')
2432*a6296200SBram Moolenaar  [CODE]
2433*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2434*a6296200SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
2435*a6296200SBram Moolenaar  [CODE]
2436*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2437*a6296200SBram Moolenaarendfunc
2438*a6296200SBram Moolenaar
2439*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2440*a6296200SBram Moolenaar" Test 39:  :finally reason discarded by an interrupt			    {{{1
2441*a6296200SBram Moolenaar"
2442*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2443*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2444*a6296200SBram Moolenaar"	    discarded by an interrupt in the finally clause.
2445*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2446*a6296200SBram Moolenaar
2447*a6296200SBram Moolenaarfunc Test_finally_discarded_by_interrupt()
2448*a6296200SBram Moolenaar  let test =<< trim [CODE]
2449*a6296200SBram Moolenaar    func I(jump)
2450*a6296200SBram Moolenaar      let loop = 0
2451*a6296200SBram Moolenaar      while loop < 2
2452*a6296200SBram Moolenaar        let loop = loop + 1
2453*a6296200SBram Moolenaar        if loop == 1
2454*a6296200SBram Moolenaar          try
2455*a6296200SBram Moolenaar            if a:jump == "continue"
2456*a6296200SBram Moolenaar              continue
2457*a6296200SBram Moolenaar            elseif a:jump == "break"
2458*a6296200SBram Moolenaar              break
2459*a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2460*a6296200SBram Moolenaar              return
2461*a6296200SBram Moolenaar            elseif a:jump == "error"
2462*a6296200SBram Moolenaar              asdf
2463*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2464*a6296200SBram Moolenaar              call interrupt()
2465*a6296200SBram Moolenaar              let dummy = 0
2466*a6296200SBram Moolenaar            elseif a:jump == "throw"
2467*a6296200SBram Moolenaar              throw "abc"
2468*a6296200SBram Moolenaar            endif
2469*a6296200SBram Moolenaar          finally
2470*a6296200SBram Moolenaar            call interrupt()
2471*a6296200SBram Moolenaar            let dummy = 0
2472*a6296200SBram Moolenaar          endtry
2473*a6296200SBram Moolenaar        elseif loop == 2
2474*a6296200SBram Moolenaar          call assert_report('should not get here')
2475*a6296200SBram Moolenaar        endif
2476*a6296200SBram Moolenaar      endwhile
2477*a6296200SBram Moolenaar      call assert_report('should not get here')
2478*a6296200SBram Moolenaar    endfunc
2479*a6296200SBram Moolenaar
2480*a6296200SBram Moolenaar    try
2481*a6296200SBram Moolenaar      try
2482*a6296200SBram Moolenaar        Xpath 'a'
2483*a6296200SBram Moolenaar        call I("continue")
2484*a6296200SBram Moolenaar        call assert_report('should not get here')
2485*a6296200SBram Moolenaar      finally
2486*a6296200SBram Moolenaar        try
2487*a6296200SBram Moolenaar          Xpath 'b'
2488*a6296200SBram Moolenaar          call I("break")
2489*a6296200SBram Moolenaar          call assert_report('should not get here')
2490*a6296200SBram Moolenaar        finally
2491*a6296200SBram Moolenaar          try
2492*a6296200SBram Moolenaar            Xpath 'c'
2493*a6296200SBram Moolenaar            call I("return")
2494*a6296200SBram Moolenaar            call assert_report('should not get here')
2495*a6296200SBram Moolenaar          finally
2496*a6296200SBram Moolenaar            try
2497*a6296200SBram Moolenaar              Xpath 'd'
2498*a6296200SBram Moolenaar              let g:jump = "finish"
2499*a6296200SBram Moolenaar              ExecAsScript I
2500*a6296200SBram Moolenaar              call assert_report('should not get here')
2501*a6296200SBram Moolenaar            finally
2502*a6296200SBram Moolenaar              unlet g:jump
2503*a6296200SBram Moolenaar              try
2504*a6296200SBram Moolenaar                Xpath 'e'
2505*a6296200SBram Moolenaar                call I("error")
2506*a6296200SBram Moolenaar                call assert_report('should not get here')
2507*a6296200SBram Moolenaar              finally
2508*a6296200SBram Moolenaar                try
2509*a6296200SBram Moolenaar                  Xpath 'f'
2510*a6296200SBram Moolenaar                  call I("interrupt")
2511*a6296200SBram Moolenaar                  call assert_report('should not get here')
2512*a6296200SBram Moolenaar                finally
2513*a6296200SBram Moolenaar                  try
2514*a6296200SBram Moolenaar                    Xpath 'g'
2515*a6296200SBram Moolenaar                    call I("throw")
2516*a6296200SBram Moolenaar                    call assert_report('should not get here')
2517*a6296200SBram Moolenaar                  finally
2518*a6296200SBram Moolenaar                    Xpath 'h'
2519*a6296200SBram Moolenaar                    delfunction I
2520*a6296200SBram Moolenaar                  endtry
2521*a6296200SBram Moolenaar                endtry
2522*a6296200SBram Moolenaar              endtry
2523*a6296200SBram Moolenaar            endtry
2524*a6296200SBram Moolenaar          endtry
2525*a6296200SBram Moolenaar        endtry
2526*a6296200SBram Moolenaar      endtry
2527*a6296200SBram Moolenaar      call assert_report('should not get here')
2528*a6296200SBram Moolenaar    catch /^Vim:Interrupt$/
2529*a6296200SBram Moolenaar      Xpath 'A'
2530*a6296200SBram Moolenaar    endtry
2531*a6296200SBram Moolenaar  [CODE]
2532*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2533*a6296200SBram Moolenaar    call assert_equal('abcdefghA', g:Xpath)
2534*a6296200SBram Moolenaar  [CODE]
2535*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2536*a6296200SBram Moolenaarendfunc
2537*a6296200SBram Moolenaar
2538*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2539*a6296200SBram Moolenaar" Test 40:  :finally reason discarded by :throw				    {{{1
2540*a6296200SBram Moolenaar"
2541*a6296200SBram Moolenaar"	    When a :finally clause is executed due to a :continue, :break,
2542*a6296200SBram Moolenaar"	    :return, :finish, error, interrupt or :throw, the jump reason is
2543*a6296200SBram Moolenaar"	    discarded by a :throw in the finally clause.
2544*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2545*a6296200SBram Moolenaar
2546*a6296200SBram Moolenaarfunc Test_finally_discard_by_throw()
2547*a6296200SBram Moolenaar  let test =<< trim [CODE]
2548*a6296200SBram Moolenaar    func T(jump)
2549*a6296200SBram Moolenaar      let loop = 0
2550*a6296200SBram Moolenaar      while loop < 2
2551*a6296200SBram Moolenaar        let loop = loop + 1
2552*a6296200SBram Moolenaar        if loop == 1
2553*a6296200SBram Moolenaar          try
2554*a6296200SBram Moolenaar            if a:jump == "continue"
2555*a6296200SBram Moolenaar              continue
2556*a6296200SBram Moolenaar            elseif a:jump == "break"
2557*a6296200SBram Moolenaar              break
2558*a6296200SBram Moolenaar            elseif a:jump == "return" || a:jump == "finish"
2559*a6296200SBram Moolenaar              return
2560*a6296200SBram Moolenaar            elseif a:jump == "error"
2561*a6296200SBram Moolenaar              asdf
2562*a6296200SBram Moolenaar            elseif a:jump == "interrupt"
2563*a6296200SBram Moolenaar              call interrupt()
2564*a6296200SBram Moolenaar              let dummy = 0
2565*a6296200SBram Moolenaar            elseif a:jump == "throw"
2566*a6296200SBram Moolenaar              throw "abc"
2567*a6296200SBram Moolenaar            endif
2568*a6296200SBram Moolenaar          finally
2569*a6296200SBram Moolenaar            throw "xyz"	" discards jump that caused the :finally
2570*a6296200SBram Moolenaar          endtry
2571*a6296200SBram Moolenaar        elseif loop == 2
2572*a6296200SBram Moolenaar          call assert_report('should not get here')
2573*a6296200SBram Moolenaar        endif
2574*a6296200SBram Moolenaar      endwhile
2575*a6296200SBram Moolenaar      call assert_report('should not get here')
2576*a6296200SBram Moolenaar    endfunc
2577*a6296200SBram Moolenaar
2578*a6296200SBram Moolenaar    try
2579*a6296200SBram Moolenaar      Xpath 'a'
2580*a6296200SBram Moolenaar      call T("continue")
2581*a6296200SBram Moolenaar      call assert_report('should not get here')
2582*a6296200SBram Moolenaar    finally
2583*a6296200SBram Moolenaar      try
2584*a6296200SBram Moolenaar        Xpath 'b'
2585*a6296200SBram Moolenaar        call T("break")
2586*a6296200SBram Moolenaar        call assert_report('should not get here')
2587*a6296200SBram Moolenaar      finally
2588*a6296200SBram Moolenaar        try
2589*a6296200SBram Moolenaar          Xpath 'c'
2590*a6296200SBram Moolenaar          call T("return")
2591*a6296200SBram Moolenaar          call assert_report('should not get here')
2592*a6296200SBram Moolenaar        finally
2593*a6296200SBram Moolenaar          try
2594*a6296200SBram Moolenaar            Xpath 'd'
2595*a6296200SBram Moolenaar            let g:jump = "finish"
2596*a6296200SBram Moolenaar            ExecAsScript T
2597*a6296200SBram Moolenaar            call assert_report('should not get here')
2598*a6296200SBram Moolenaar          finally
2599*a6296200SBram Moolenaar            unlet g:jump
2600*a6296200SBram Moolenaar            try
2601*a6296200SBram Moolenaar              Xpath 'e'
2602*a6296200SBram Moolenaar              call T("error")
2603*a6296200SBram Moolenaar              call assert_report('should not get here')
2604*a6296200SBram Moolenaar            finally
2605*a6296200SBram Moolenaar              try
2606*a6296200SBram Moolenaar                Xpath 'f'
2607*a6296200SBram Moolenaar                call T("interrupt")
2608*a6296200SBram Moolenaar                call assert_report('should not get here')
2609*a6296200SBram Moolenaar              finally
2610*a6296200SBram Moolenaar                try
2611*a6296200SBram Moolenaar                  Xpath 'g'
2612*a6296200SBram Moolenaar                  call T("throw")
2613*a6296200SBram Moolenaar                  call assert_report('should not get here')
2614*a6296200SBram Moolenaar                finally
2615*a6296200SBram Moolenaar                  Xpath 'h'
2616*a6296200SBram Moolenaar                  delfunction T
2617*a6296200SBram Moolenaar                endtry
2618*a6296200SBram Moolenaar              endtry
2619*a6296200SBram Moolenaar            endtry
2620*a6296200SBram Moolenaar          endtry
2621*a6296200SBram Moolenaar        endtry
2622*a6296200SBram Moolenaar      endtry
2623*a6296200SBram Moolenaar    endtry
2624*a6296200SBram Moolenaar    call assert_report('should not get here')
2625*a6296200SBram Moolenaar  [CODE]
2626*a6296200SBram Moolenaar  let verify =<< trim [CODE]
2627*a6296200SBram Moolenaar    call assert_equal('abcdefgh', g:Xpath)
2628*a6296200SBram Moolenaar  [CODE]
2629*a6296200SBram Moolenaar  call RunInNewVim(test, verify)
2630*a6296200SBram Moolenaarendfunc
2631*a6296200SBram Moolenaar
2632*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2633*a6296200SBram Moolenaar" Test 49:  Throwing exceptions across functions			    {{{1
2634*a6296200SBram Moolenaar"
2635*a6296200SBram Moolenaar"	    When an exception is thrown but not caught inside a function, the
2636*a6296200SBram Moolenaar"	    caller is checked for a matching :catch clause.
2637*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2638*a6296200SBram Moolenaar
2639*a6296200SBram Moolenaarfunc T49_C()
2640*a6296200SBram Moolenaar  try
2641*a6296200SBram Moolenaar    Xpath 'a'
2642*a6296200SBram Moolenaar    throw "arrgh"
2643*a6296200SBram Moolenaar    call assert_report('should not get here')
2644*a6296200SBram Moolenaar  catch /arrgh/
2645*a6296200SBram Moolenaar    Xpath 'b'
2646*a6296200SBram Moolenaar  endtry
2647*a6296200SBram Moolenaar  Xpath 'c'
2648*a6296200SBram Moolenaarendfunc
2649*a6296200SBram Moolenaar
2650*a6296200SBram Moolenaarfunc T49_T1()
2651*a6296200SBram Moolenaar  XloopNEXT
2652*a6296200SBram Moolenaar  try
2653*a6296200SBram Moolenaar    Xloop 'd'
2654*a6296200SBram Moolenaar    throw "arrgh"
2655*a6296200SBram Moolenaar    call assert_report('should not get here')
2656*a6296200SBram Moolenaar  finally
2657*a6296200SBram Moolenaar    Xloop 'e'
2658*a6296200SBram Moolenaar  endtry
2659*a6296200SBram Moolenaar  Xloop 'f'
2660*a6296200SBram Moolenaarendfunc
2661*a6296200SBram Moolenaar
2662*a6296200SBram Moolenaarfunc T49_T2()
2663*a6296200SBram Moolenaar  try
2664*a6296200SBram Moolenaar    Xpath 'g'
2665*a6296200SBram Moolenaar    call T49_T1()
2666*a6296200SBram Moolenaar    call assert_report('should not get here')
2667*a6296200SBram Moolenaar  finally
2668*a6296200SBram Moolenaar    Xpath 'h'
2669*a6296200SBram Moolenaar  endtry
2670*a6296200SBram Moolenaar  call assert_report('should not get here')
2671*a6296200SBram Moolenaarendfunc
2672*a6296200SBram Moolenaar
2673*a6296200SBram Moolenaarfunc Test_throw_exception_across_funcs()
2674*a6296200SBram Moolenaar  XpathINIT
2675*a6296200SBram Moolenaar  XloopINIT
2676*a6296200SBram Moolenaar  try
2677*a6296200SBram Moolenaar    Xpath 'i'
2678*a6296200SBram Moolenaar    call T49_C()            " throw and catch
2679*a6296200SBram Moolenaar    Xpath 'j'
2680*a6296200SBram Moolenaar  catch /.*/
2681*a6296200SBram Moolenaar    call assert_report('should not get here')
2682*a6296200SBram Moolenaar  endtry
2683*a6296200SBram Moolenaar
2684*a6296200SBram Moolenaar  try
2685*a6296200SBram Moolenaar    Xpath 'k'
2686*a6296200SBram Moolenaar    call T49_T1()  " throw, one level
2687*a6296200SBram Moolenaar    call assert_report('should not get here')
2688*a6296200SBram Moolenaar  catch /arrgh/
2689*a6296200SBram Moolenaar    Xpath 'l'
2690*a6296200SBram Moolenaar  catch /.*/
2691*a6296200SBram Moolenaar    call assert_report('should not get here')
2692*a6296200SBram Moolenaar  endtry
2693*a6296200SBram Moolenaar
2694*a6296200SBram Moolenaar  try
2695*a6296200SBram Moolenaar    Xpath 'm'
2696*a6296200SBram Moolenaar    call T49_T2()	" throw, two levels
2697*a6296200SBram Moolenaar    call assert_report('should not get here')
2698*a6296200SBram Moolenaar  catch /arrgh/
2699*a6296200SBram Moolenaar    Xpath 'n'
2700*a6296200SBram Moolenaar  catch /.*/
2701*a6296200SBram Moolenaar    call assert_report('should not get here')
2702*a6296200SBram Moolenaar  endtry
2703*a6296200SBram Moolenaar  Xpath 'o'
2704*a6296200SBram Moolenaar
2705*a6296200SBram Moolenaar  call assert_equal('iabcjkd2e2lmgd3e3hno', g:Xpath)
2706*a6296200SBram Moolenaarendfunc
2707*a6296200SBram Moolenaar
2708*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2709*a6296200SBram Moolenaar" Test 50:  Throwing exceptions across script files			    {{{1
2710*a6296200SBram Moolenaar"
2711*a6296200SBram Moolenaar"	    When an exception is thrown but not caught inside a script file,
2712*a6296200SBram Moolenaar"	    the sourcing script or function is checked for a matching :catch
2713*a6296200SBram Moolenaar"	    clause.
2714*a6296200SBram Moolenaar"
2715*a6296200SBram Moolenaar"	    This test executes the bodies of the functions C, T1, and T2 from
2716*a6296200SBram Moolenaar"	    the previous test as script files (:return replaced by :finish).
2717*a6296200SBram Moolenaar"-------------------------------------------------------------------------------
2718*a6296200SBram Moolenaar
2719*a6296200SBram Moolenaarfunc T50_F()
2720*a6296200SBram Moolenaar  try
2721*a6296200SBram Moolenaar    Xpath 'A'
2722*a6296200SBram Moolenaar    exec "source" g:scriptC
2723*a6296200SBram Moolenaar    Xpath 'B'
2724*a6296200SBram Moolenaar  catch /.*/
2725*a6296200SBram Moolenaar    call assert_report('should not get here')
2726*a6296200SBram Moolenaar  endtry
2727*a6296200SBram Moolenaar
2728*a6296200SBram Moolenaar  try
2729*a6296200SBram Moolenaar    Xpath 'C'
2730*a6296200SBram Moolenaar    exec "source" g:scriptT1
2731*a6296200SBram Moolenaar    call assert_report('should not get here')
2732*a6296200SBram Moolenaar  catch /arrgh/
2733*a6296200SBram Moolenaar    Xpath 'D'
2734*a6296200SBram Moolenaar  catch /.*/
2735*a6296200SBram Moolenaar    call assert_report('should not get here')
2736*a6296200SBram Moolenaar  endtry
2737*a6296200SBram Moolenaarendfunc
2738*a6296200SBram Moolenaar
2739*a6296200SBram Moolenaarfunc Test_throw_across_script()
2740*a6296200SBram Moolenaar  XpathINIT
2741*a6296200SBram Moolenaar  XloopINIT
2742*a6296200SBram Moolenaar  let g:scriptC = MakeScript("T49_C")
2743*a6296200SBram Moolenaar  let g:scriptT1 = MakeScript("T49_T1")
2744*a6296200SBram Moolenaar  let scriptT2 = MakeScript("T49_T2", g:scriptT1)
2745*a6296200SBram Moolenaar
2746*a6296200SBram Moolenaar  try
2747*a6296200SBram Moolenaar    Xpath 'E'
2748*a6296200SBram Moolenaar    call T50_F()
2749*a6296200SBram Moolenaar    Xpath 'F'
2750*a6296200SBram Moolenaar    exec "source" scriptT2
2751*a6296200SBram Moolenaar    call assert_report('should not get here')
2752*a6296200SBram Moolenaar  catch /arrgh/
2753*a6296200SBram Moolenaar    Xpath 'G'
2754*a6296200SBram Moolenaar  catch /.*/
2755*a6296200SBram Moolenaar    call assert_report('should not get here')
2756*a6296200SBram Moolenaar  endtry
2757*a6296200SBram Moolenaar  Xpath 'H'
2758*a6296200SBram Moolenaar  call assert_equal('EAabcBCd2e2DFgd3e3hGH', g:Xpath)
2759*a6296200SBram Moolenaar
2760*a6296200SBram Moolenaar  call delete(g:scriptC)
2761*a6296200SBram Moolenaar  call delete(g:scriptT1)
2762*a6296200SBram Moolenaar  call delete(scriptT2)
2763*a6296200SBram Moolenaar  unlet g:scriptC g:scriptT1 scriptT2
2764*a6296200SBram Moolenaarendfunc
2765*a6296200SBram Moolenaar
27661f068233SBram Moolenaar"-------------------------------------------------------------------------------
27671f068233SBram Moolenaar" Test 87   using (expr) ? funcref : funcref				    {{{1
27681f068233SBram Moolenaar"
27691f068233SBram Moolenaar"	    Vim needs to correctly parse the funcref and even when it does
27701f068233SBram Moolenaar"	    not execute the funcref, it needs to consume the trailing ()
27711f068233SBram Moolenaar"-------------------------------------------------------------------------------
27721f068233SBram Moolenaar
27731f068233SBram Moolenaarfunc Add2(x1, x2)
27741f068233SBram Moolenaar  return a:x1 + a:x2
27751f068233SBram Moolenaarendfu
27761f068233SBram Moolenaar
27771f068233SBram Moolenaarfunc GetStr()
27781f068233SBram Moolenaar  return "abcdefghijklmnopqrstuvwxyp"
27791f068233SBram Moolenaarendfu
27801f068233SBram Moolenaar
27811f068233SBram Moolenaarfunc Test_funcref_with_condexpr()
27821f068233SBram Moolenaar  call assert_equal(5, function('Add2')(2,3))
27831f068233SBram Moolenaar
27841f068233SBram Moolenaar  call assert_equal(3, 1 ? function('Add2')(1,2) : function('Add2')(2,3))
27851f068233SBram Moolenaar  call assert_equal(5, 0 ? function('Add2')(1,2) : function('Add2')(2,3))
27861f068233SBram Moolenaar  " Make sure, GetStr() still works.
27871f068233SBram Moolenaar  call assert_equal('abcdefghijk', GetStr()[0:10])
27881f068233SBram Moolenaarendfunc
27891f068233SBram Moolenaar
2790b544f3c8SBram Moolenaar" Test 90:  Recognizing {} in variable name.			    {{{1
2791b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2792b544f3c8SBram Moolenaar
2793b544f3c8SBram Moolenaarfunc Test_curlies()
2794b544f3c8SBram Moolenaar    let s:var = 66
2795b544f3c8SBram Moolenaar    let ns = 's'
2796b544f3c8SBram Moolenaar    call assert_equal(66, {ns}:var)
2797b544f3c8SBram Moolenaar
2798b544f3c8SBram Moolenaar    let g:a = {}
2799b544f3c8SBram Moolenaar    let g:b = 't'
2800b544f3c8SBram Moolenaar    let g:a[g:b] = 77
2801b544f3c8SBram Moolenaar    call assert_equal(77, g:a['t'])
2802b544f3c8SBram Moolenaarendfunc
2803b544f3c8SBram Moolenaar
2804b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2805b544f3c8SBram Moolenaar" Test 91:  using type().					    {{{1
2806b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2807b544f3c8SBram Moolenaar
2808b544f3c8SBram Moolenaarfunc Test_type()
2809b544f3c8SBram Moolenaar    call assert_equal(0, type(0))
2810b544f3c8SBram Moolenaar    call assert_equal(1, type(""))
2811b544f3c8SBram Moolenaar    call assert_equal(2, type(function("tr")))
2812b544f3c8SBram Moolenaar    call assert_equal(2, type(function("tr", [8])))
2813b544f3c8SBram Moolenaar    call assert_equal(3, type([]))
2814b544f3c8SBram Moolenaar    call assert_equal(4, type({}))
28155feabe00SBram Moolenaar    if has('float')
2816b544f3c8SBram Moolenaar      call assert_equal(5, type(0.0))
28175feabe00SBram Moolenaar    endif
2818b544f3c8SBram Moolenaar    call assert_equal(6, type(v:false))
2819b544f3c8SBram Moolenaar    call assert_equal(6, type(v:true))
2820b544f3c8SBram Moolenaar    call assert_equal(7, type(v:none))
2821b544f3c8SBram Moolenaar    call assert_equal(7, type(v:null))
2822b544f3c8SBram Moolenaar    call assert_equal(8, v:t_job)
2823b544f3c8SBram Moolenaar    call assert_equal(9, v:t_channel)
2824b544f3c8SBram Moolenaar    call assert_equal(v:t_number, type(0))
2825b544f3c8SBram Moolenaar    call assert_equal(v:t_string, type(""))
2826b544f3c8SBram Moolenaar    call assert_equal(v:t_func, type(function("tr")))
2827b544f3c8SBram Moolenaar    call assert_equal(v:t_func, type(function("tr", [8])))
2828b544f3c8SBram Moolenaar    call assert_equal(v:t_list, type([]))
2829b544f3c8SBram Moolenaar    call assert_equal(v:t_dict, type({}))
28305feabe00SBram Moolenaar    if has('float')
2831b544f3c8SBram Moolenaar      call assert_equal(v:t_float, type(0.0))
28325feabe00SBram Moolenaar    endif
2833b544f3c8SBram Moolenaar    call assert_equal(v:t_bool, type(v:false))
2834b544f3c8SBram Moolenaar    call assert_equal(v:t_bool, type(v:true))
2835b544f3c8SBram Moolenaar    call assert_equal(v:t_none, type(v:none))
2836b544f3c8SBram Moolenaar    call assert_equal(v:t_none, type(v:null))
283792b83ccfSBram Moolenaar    call assert_equal(v:t_string, type(test_null_string()))
283892b83ccfSBram Moolenaar    call assert_equal(v:t_func, type(test_null_function()))
283992b83ccfSBram Moolenaar    call assert_equal(v:t_func, type(test_null_partial()))
284092b83ccfSBram Moolenaar    call assert_equal(v:t_list, type(test_null_list()))
284192b83ccfSBram Moolenaar    call assert_equal(v:t_dict, type(test_null_dict()))
284292b83ccfSBram Moolenaar    if has('job')
284392b83ccfSBram Moolenaar      call assert_equal(v:t_job, type(test_null_job()))
284492b83ccfSBram Moolenaar    endif
284592b83ccfSBram Moolenaar    if has('channel')
284692b83ccfSBram Moolenaar      call assert_equal(v:t_channel, type(test_null_channel()))
284792b83ccfSBram Moolenaar    endif
284892b83ccfSBram Moolenaar    call assert_equal(v:t_blob, type(test_null_blob()))
2849b544f3c8SBram Moolenaar
28507c215c58SBram Moolenaar    call assert_fails("call type(test_void())", 'E685:')
28517c215c58SBram Moolenaar    call assert_fails("call type(test_unknown())", 'E685:')
2852b544f3c8SBram Moolenaar
2853b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:false)
2854b544f3c8SBram Moolenaar    call assert_equal(1, 0 + v:true)
2855b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:none)
2856b544f3c8SBram Moolenaar    call assert_equal(0, 0 + v:null)
2857b544f3c8SBram Moolenaar
2858b544f3c8SBram Moolenaar    call assert_equal('v:false', '' . v:false)
2859b544f3c8SBram Moolenaar    call assert_equal('v:true', '' . v:true)
2860b544f3c8SBram Moolenaar    call assert_equal('v:none', '' . v:none)
2861b544f3c8SBram Moolenaar    call assert_equal('v:null', '' . v:null)
2862b544f3c8SBram Moolenaar
2863b544f3c8SBram Moolenaar    call assert_true(v:false == 0)
2864b544f3c8SBram Moolenaar    call assert_false(v:false != 0)
2865b544f3c8SBram Moolenaar    call assert_true(v:true == 1)
2866b544f3c8SBram Moolenaar    call assert_false(v:true != 1)
2867b544f3c8SBram Moolenaar    call assert_false(v:true == v:false)
2868b544f3c8SBram Moolenaar    call assert_true(v:true != v:false)
2869b544f3c8SBram Moolenaar
2870b544f3c8SBram Moolenaar    call assert_true(v:null == 0)
2871b544f3c8SBram Moolenaar    call assert_false(v:null != 0)
2872b544f3c8SBram Moolenaar    call assert_true(v:none == 0)
2873b544f3c8SBram Moolenaar    call assert_false(v:none != 0)
2874b544f3c8SBram Moolenaar
2875b544f3c8SBram Moolenaar    call assert_true(v:false is v:false)
2876b544f3c8SBram Moolenaar    call assert_true(v:true is v:true)
2877b544f3c8SBram Moolenaar    call assert_true(v:none is v:none)
2878b544f3c8SBram Moolenaar    call assert_true(v:null is v:null)
2879b544f3c8SBram Moolenaar
2880b544f3c8SBram Moolenaar    call assert_false(v:false isnot v:false)
2881b544f3c8SBram Moolenaar    call assert_false(v:true isnot v:true)
2882b544f3c8SBram Moolenaar    call assert_false(v:none isnot v:none)
2883b544f3c8SBram Moolenaar    call assert_false(v:null isnot v:null)
2884b544f3c8SBram Moolenaar
2885b544f3c8SBram Moolenaar    call assert_false(v:false is 0)
2886b544f3c8SBram Moolenaar    call assert_false(v:true is 1)
2887b544f3c8SBram Moolenaar    call assert_false(v:true is v:false)
2888b544f3c8SBram Moolenaar    call assert_false(v:none is 0)
2889b544f3c8SBram Moolenaar    call assert_false(v:null is 0)
2890b544f3c8SBram Moolenaar    call assert_false(v:null is v:none)
2891b544f3c8SBram Moolenaar
2892b544f3c8SBram Moolenaar    call assert_true(v:false isnot 0)
2893b544f3c8SBram Moolenaar    call assert_true(v:true isnot 1)
2894b544f3c8SBram Moolenaar    call assert_true(v:true isnot v:false)
2895b544f3c8SBram Moolenaar    call assert_true(v:none isnot 0)
2896b544f3c8SBram Moolenaar    call assert_true(v:null isnot 0)
2897b544f3c8SBram Moolenaar    call assert_true(v:null isnot v:none)
2898b544f3c8SBram Moolenaar
2899b544f3c8SBram Moolenaar    call assert_equal(v:false, eval(string(v:false)))
2900b544f3c8SBram Moolenaar    call assert_equal(v:true, eval(string(v:true)))
2901b544f3c8SBram Moolenaar    call assert_equal(v:none, eval(string(v:none)))
2902b544f3c8SBram Moolenaar    call assert_equal(v:null, eval(string(v:null)))
2903b544f3c8SBram Moolenaar
2904b544f3c8SBram Moolenaar    call assert_equal(v:false, copy(v:false))
2905b544f3c8SBram Moolenaar    call assert_equal(v:true, copy(v:true))
2906b544f3c8SBram Moolenaar    call assert_equal(v:none, copy(v:none))
2907b544f3c8SBram Moolenaar    call assert_equal(v:null, copy(v:null))
2908b544f3c8SBram Moolenaar
2909b544f3c8SBram Moolenaar    call assert_equal([v:false], deepcopy([v:false]))
2910b544f3c8SBram Moolenaar    call assert_equal([v:true], deepcopy([v:true]))
2911b544f3c8SBram Moolenaar    call assert_equal([v:none], deepcopy([v:none]))
2912b544f3c8SBram Moolenaar    call assert_equal([v:null], deepcopy([v:null]))
2913b544f3c8SBram Moolenaar
2914b544f3c8SBram Moolenaar    call assert_true(empty(v:false))
2915b544f3c8SBram Moolenaar    call assert_false(empty(v:true))
2916b544f3c8SBram Moolenaar    call assert_true(empty(v:null))
2917b544f3c8SBram Moolenaar    call assert_true(empty(v:none))
2918b544f3c8SBram Moolenaar
2919b544f3c8SBram Moolenaar    func ChangeYourMind()
2920b544f3c8SBram Moolenaar	try
2921b544f3c8SBram Moolenaar	    return v:true
2922b544f3c8SBram Moolenaar	finally
2923b544f3c8SBram Moolenaar	    return 'something else'
2924b544f3c8SBram Moolenaar	endtry
2925b544f3c8SBram Moolenaar    endfunc
2926b544f3c8SBram Moolenaar
2927b544f3c8SBram Moolenaar    call ChangeYourMind()
2928b544f3c8SBram Moolenaarendfunc
2929b544f3c8SBram Moolenaar
2930b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2931b544f3c8SBram Moolenaar" Test 92:  skipping code					    {{{1
2932b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2933b544f3c8SBram Moolenaar
2934b544f3c8SBram Moolenaarfunc Test_skip()
2935b544f3c8SBram Moolenaar    let Fn = function('Test_type')
2936b544f3c8SBram Moolenaar    call assert_false(0 && Fn[1])
2937b544f3c8SBram Moolenaar    call assert_false(0 && string(Fn))
2938b544f3c8SBram Moolenaar    call assert_false(0 && len(Fn))
2939b544f3c8SBram Moolenaar    let l = []
2940b544f3c8SBram Moolenaar    call assert_false(0 && l[1])
2941b544f3c8SBram Moolenaar    call assert_false(0 && string(l))
2942b544f3c8SBram Moolenaar    call assert_false(0 && len(l))
2943b544f3c8SBram Moolenaar    let f = 1.0
2944b544f3c8SBram Moolenaar    call assert_false(0 && f[1])
2945b544f3c8SBram Moolenaar    call assert_false(0 && string(f))
2946b544f3c8SBram Moolenaar    call assert_false(0 && len(f))
2947b544f3c8SBram Moolenaar    let sp = v:null
2948b544f3c8SBram Moolenaar    call assert_false(0 && sp[1])
2949b544f3c8SBram Moolenaar    call assert_false(0 && string(sp))
2950b544f3c8SBram Moolenaar    call assert_false(0 && len(sp))
2951b544f3c8SBram Moolenaar
2952b544f3c8SBram Moolenaarendfunc
2953b544f3c8SBram Moolenaar
2954b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2955b544f3c8SBram Moolenaar" Test 93:  :echo and string()					    {{{1
2956b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
2957b544f3c8SBram Moolenaar
2958b544f3c8SBram Moolenaarfunc Test_echo_and_string()
2959b544f3c8SBram Moolenaar    " String
2960b544f3c8SBram Moolenaar    let a = 'foo bar'
2961b544f3c8SBram Moolenaar    redir => result
2962b544f3c8SBram Moolenaar    echo a
2963b544f3c8SBram Moolenaar    echo string(a)
2964b544f3c8SBram Moolenaar    redir END
2965b544f3c8SBram Moolenaar    let l = split(result, "\n")
2966b544f3c8SBram Moolenaar    call assert_equal(["foo bar",
2967b544f3c8SBram Moolenaar		     \ "'foo bar'"], l)
2968b544f3c8SBram Moolenaar
2969b544f3c8SBram Moolenaar    " Float
2970b544f3c8SBram Moolenaar    if has('float')
2971b544f3c8SBram Moolenaar	let a = -1.2e0
2972b544f3c8SBram Moolenaar	redir => result
2973b544f3c8SBram Moolenaar	echo a
2974b544f3c8SBram Moolenaar	echo string(a)
2975b544f3c8SBram Moolenaar	redir END
2976b544f3c8SBram Moolenaar	let l = split(result, "\n")
2977b544f3c8SBram Moolenaar	call assert_equal(["-1.2",
2978b544f3c8SBram Moolenaar			 \ "-1.2"], l)
2979b544f3c8SBram Moolenaar    endif
2980b544f3c8SBram Moolenaar
2981b544f3c8SBram Moolenaar    " Funcref
2982b544f3c8SBram Moolenaar    redir => result
2983b544f3c8SBram Moolenaar    echo function('string')
2984b544f3c8SBram Moolenaar    echo string(function('string'))
2985b544f3c8SBram Moolenaar    redir END
2986b544f3c8SBram Moolenaar    let l = split(result, "\n")
2987b544f3c8SBram Moolenaar    call assert_equal(["string",
2988b544f3c8SBram Moolenaar		     \ "function('string')"], l)
2989b544f3c8SBram Moolenaar
2990b544f3c8SBram Moolenaar    " Recursive dictionary
2991b544f3c8SBram Moolenaar    let a = {}
2992b544f3c8SBram Moolenaar    let a["a"] = a
2993b544f3c8SBram Moolenaar    redir => result
2994b544f3c8SBram Moolenaar    echo a
2995b544f3c8SBram Moolenaar    echo string(a)
2996b544f3c8SBram Moolenaar    redir END
2997b544f3c8SBram Moolenaar    let l = split(result, "\n")
2998b544f3c8SBram Moolenaar    call assert_equal(["{'a': {...}}",
2999b544f3c8SBram Moolenaar		     \ "{'a': {...}}"], l)
3000b544f3c8SBram Moolenaar
3001b544f3c8SBram Moolenaar    " Recursive list
3002b544f3c8SBram Moolenaar    let a = [0]
3003b544f3c8SBram Moolenaar    let a[0] = a
3004b544f3c8SBram Moolenaar    redir => result
3005b544f3c8SBram Moolenaar    echo a
3006b544f3c8SBram Moolenaar    echo string(a)
3007b544f3c8SBram Moolenaar    redir END
3008b544f3c8SBram Moolenaar    let l = split(result, "\n")
3009b544f3c8SBram Moolenaar    call assert_equal(["[[...]]",
3010b544f3c8SBram Moolenaar		     \ "[[...]]"], l)
3011b544f3c8SBram Moolenaar
3012b544f3c8SBram Moolenaar    " Empty dictionaries in a list
3013b544f3c8SBram Moolenaar    let a = {}
3014b544f3c8SBram Moolenaar    redir => result
3015b544f3c8SBram Moolenaar    echo [a, a, a]
3016b544f3c8SBram Moolenaar    echo string([a, a, a])
3017b544f3c8SBram Moolenaar    redir END
3018b544f3c8SBram Moolenaar    let l = split(result, "\n")
3019b544f3c8SBram Moolenaar    call assert_equal(["[{}, {}, {}]",
3020b544f3c8SBram Moolenaar		     \ "[{}, {}, {}]"], l)
3021b544f3c8SBram Moolenaar
3022b544f3c8SBram Moolenaar    " Empty dictionaries in a dictionary
3023b544f3c8SBram Moolenaar    let a = {}
3024b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
3025b544f3c8SBram Moolenaar    redir => result
3026b544f3c8SBram Moolenaar    echo b
3027b544f3c8SBram Moolenaar    echo string(b)
3028b544f3c8SBram Moolenaar    redir END
3029b544f3c8SBram Moolenaar    let l = split(result, "\n")
3030b544f3c8SBram Moolenaar    call assert_equal(["{'a': {}, 'b': {}}",
3031b544f3c8SBram Moolenaar		     \ "{'a': {}, 'b': {}}"], l)
3032b544f3c8SBram Moolenaar
3033b544f3c8SBram Moolenaar    " Empty lists in a list
3034b544f3c8SBram Moolenaar    let a = []
3035b544f3c8SBram Moolenaar    redir => result
3036b544f3c8SBram Moolenaar    echo [a, a, a]
3037b544f3c8SBram Moolenaar    echo string([a, a, a])
3038b544f3c8SBram Moolenaar    redir END
3039b544f3c8SBram Moolenaar    let l = split(result, "\n")
3040b544f3c8SBram Moolenaar    call assert_equal(["[[], [], []]",
3041b544f3c8SBram Moolenaar		     \ "[[], [], []]"], l)
3042b544f3c8SBram Moolenaar
3043b544f3c8SBram Moolenaar    " Empty lists in a dictionary
3044b544f3c8SBram Moolenaar    let a = []
3045b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
3046b544f3c8SBram Moolenaar    redir => result
3047b544f3c8SBram Moolenaar    echo b
3048b544f3c8SBram Moolenaar    echo string(b)
3049b544f3c8SBram Moolenaar    redir END
3050b544f3c8SBram Moolenaar    let l = split(result, "\n")
3051b544f3c8SBram Moolenaar    call assert_equal(["{'a': [], 'b': []}",
3052b544f3c8SBram Moolenaar		     \ "{'a': [], 'b': []}"], l)
3053b544f3c8SBram Moolenaar
3054b544f3c8SBram Moolenaar    " Dictionaries in a list
3055b544f3c8SBram Moolenaar    let a = {"one": "yes", "two": "yes", "three": "yes"}
3056b544f3c8SBram Moolenaar    redir => result
3057b544f3c8SBram Moolenaar    echo [a, a, a]
3058b544f3c8SBram Moolenaar    echo string([a, a, a])
3059b544f3c8SBram Moolenaar    redir END
3060b544f3c8SBram Moolenaar    let l = split(result, "\n")
3061b544f3c8SBram Moolenaar    call assert_equal(["[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {...}, {...}]",
3062b544f3c8SBram Moolenaar		     \ "[{'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}, {'one': 'yes', 'two': 'yes', 'three': 'yes'}]"], l)
3063b544f3c8SBram Moolenaar
3064b544f3c8SBram Moolenaar    " Dictionaries in a dictionary
3065b544f3c8SBram Moolenaar    let a = {"one": "yes", "two": "yes", "three": "yes"}
3066b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
3067b544f3c8SBram Moolenaar    redir => result
3068b544f3c8SBram Moolenaar    echo b
3069b544f3c8SBram Moolenaar    echo string(b)
3070b544f3c8SBram Moolenaar    redir END
3071b544f3c8SBram Moolenaar    let l = split(result, "\n")
3072b544f3c8SBram Moolenaar    call assert_equal(["{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {...}}",
3073b544f3c8SBram Moolenaar		     \ "{'a': {'one': 'yes', 'two': 'yes', 'three': 'yes'}, 'b': {'one': 'yes', 'two': 'yes', 'three': 'yes'}}"], l)
3074b544f3c8SBram Moolenaar
3075b544f3c8SBram Moolenaar    " Lists in a list
3076b544f3c8SBram Moolenaar    let a = [1, 2, 3]
3077b544f3c8SBram Moolenaar    redir => result
3078b544f3c8SBram Moolenaar    echo [a, a, a]
3079b544f3c8SBram Moolenaar    echo string([a, a, a])
3080b544f3c8SBram Moolenaar    redir END
3081b544f3c8SBram Moolenaar    let l = split(result, "\n")
3082b544f3c8SBram Moolenaar    call assert_equal(["[[1, 2, 3], [...], [...]]",
3083b544f3c8SBram Moolenaar		     \ "[[1, 2, 3], [1, 2, 3], [1, 2, 3]]"], l)
3084b544f3c8SBram Moolenaar
3085b544f3c8SBram Moolenaar    " Lists in a dictionary
3086b544f3c8SBram Moolenaar    let a = [1, 2, 3]
3087b544f3c8SBram Moolenaar    let b = {"a": a, "b": a}
3088b544f3c8SBram Moolenaar    redir => result
3089b544f3c8SBram Moolenaar    echo b
3090b544f3c8SBram Moolenaar    echo string(b)
3091b544f3c8SBram Moolenaar    redir END
3092b544f3c8SBram Moolenaar    let l = split(result, "\n")
3093b544f3c8SBram Moolenaar    call assert_equal(["{'a': [1, 2, 3], 'b': [...]}",
3094b544f3c8SBram Moolenaar		     \ "{'a': [1, 2, 3], 'b': [1, 2, 3]}"], l)
3095b544f3c8SBram Moolenaar
30961363a30cSBram Moolenaar    call assert_fails('echo &:', 'E112:')
30971363a30cSBram Moolenaar    call assert_fails('echo &g:', 'E112:')
30981363a30cSBram Moolenaar    call assert_fails('echo &l:', 'E112:')
30991363a30cSBram Moolenaar
3100b544f3c8SBram Moolenaarendfunc
3101b544f3c8SBram Moolenaar
3102b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3103b544f3c8SBram Moolenaar" Test 94:  64-bit Numbers					    {{{1
3104b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3105b544f3c8SBram Moolenaar
3106b544f3c8SBram Moolenaarfunc Test_num64()
3107b544f3c8SBram Moolenaar    call assert_notequal( 4294967296, 0)
3108b544f3c8SBram Moolenaar    call assert_notequal(-4294967296, 0)
3109b544f3c8SBram Moolenaar    call assert_equal( 4294967296,  0xFFFFffff + 1)
3110b544f3c8SBram Moolenaar    call assert_equal(-4294967296, -0xFFFFffff - 1)
3111b544f3c8SBram Moolenaar
3112b544f3c8SBram Moolenaar    call assert_equal( 9223372036854775807,  1 / 0)
3113b544f3c8SBram Moolenaar    call assert_equal(-9223372036854775807, -1 / 0)
3114b544f3c8SBram Moolenaar    call assert_equal(-9223372036854775807 - 1,  0 / 0)
3115b544f3c8SBram Moolenaar
31165feabe00SBram Moolenaar    if has('float')
3117b544f3c8SBram Moolenaar      call assert_equal( 0x7FFFffffFFFFffff, float2nr( 1.0e150))
3118b544f3c8SBram Moolenaar      call assert_equal(-0x7FFFffffFFFFffff, float2nr(-1.0e150))
31195feabe00SBram Moolenaar    endif
3120b544f3c8SBram Moolenaar
3121b544f3c8SBram Moolenaar    let rng = range(0xFFFFffff, 0x100000001)
3122b544f3c8SBram Moolenaar    call assert_equal([0xFFFFffff, 0x100000000, 0x100000001], rng)
3123b544f3c8SBram Moolenaar    call assert_equal(0x100000001, max(rng))
3124b544f3c8SBram Moolenaar    call assert_equal(0xFFFFffff, min(rng))
3125b544f3c8SBram Moolenaar    call assert_equal(rng, sort(range(0x100000001, 0xFFFFffff, -1), 'N'))
3126b544f3c8SBram Moolenaarendfunc
3127b544f3c8SBram Moolenaar
3128b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3129b544f3c8SBram Moolenaar" Test 95:  lines of :append, :change, :insert			    {{{1
3130b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3131b544f3c8SBram Moolenaar
3132b544f3c8SBram Moolenaarfunction! DefineFunction(name, body)
3133b544f3c8SBram Moolenaar    let func = join(['function! ' . a:name . '()'] + a:body + ['endfunction'], "\n")
3134b544f3c8SBram Moolenaar    exec func
3135b544f3c8SBram Moolenaarendfunction
3136b544f3c8SBram Moolenaar
3137b544f3c8SBram Moolenaarfunc Test_script_lines()
3138b544f3c8SBram Moolenaar    " :append
3139b544f3c8SBram Moolenaar    try
3140b544f3c8SBram Moolenaar	call DefineFunction('T_Append', [
3141b544f3c8SBram Moolenaar		    \ 'append',
3142b544f3c8SBram Moolenaar		    \ 'py <<EOS',
3143b544f3c8SBram Moolenaar		    \ '.',
3144b544f3c8SBram Moolenaar		    \ ])
3145b544f3c8SBram Moolenaar    catch
314637175409SBram Moolenaar	call assert_report("Can't define function")
3147b544f3c8SBram Moolenaar    endtry
3148b544f3c8SBram Moolenaar    try
3149b544f3c8SBram Moolenaar	call DefineFunction('T_Append', [
3150b544f3c8SBram Moolenaar		    \ 'append',
3151b544f3c8SBram Moolenaar		    \ 'abc',
3152b544f3c8SBram Moolenaar		    \ ])
315337175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
3154b544f3c8SBram Moolenaar    catch
3155b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
3156b544f3c8SBram Moolenaar    endtry
3157b544f3c8SBram Moolenaar
3158b544f3c8SBram Moolenaar    " :change
3159b544f3c8SBram Moolenaar    try
3160b544f3c8SBram Moolenaar	call DefineFunction('T_Change', [
3161b544f3c8SBram Moolenaar		    \ 'change',
3162b544f3c8SBram Moolenaar		    \ 'py <<EOS',
3163b544f3c8SBram Moolenaar		    \ '.',
3164b544f3c8SBram Moolenaar		    \ ])
3165b544f3c8SBram Moolenaar    catch
316637175409SBram Moolenaar	call assert_report("Can't define function")
3167b544f3c8SBram Moolenaar    endtry
3168b544f3c8SBram Moolenaar    try
3169b544f3c8SBram Moolenaar	call DefineFunction('T_Change', [
3170b544f3c8SBram Moolenaar		    \ 'change',
3171b544f3c8SBram Moolenaar		    \ 'abc',
3172b544f3c8SBram Moolenaar		    \ ])
317337175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
3174b544f3c8SBram Moolenaar    catch
3175b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
3176b544f3c8SBram Moolenaar    endtry
3177b544f3c8SBram Moolenaar
3178b544f3c8SBram Moolenaar    " :insert
3179b544f3c8SBram Moolenaar    try
3180b544f3c8SBram Moolenaar	call DefineFunction('T_Insert', [
3181b544f3c8SBram Moolenaar		    \ 'insert',
3182b544f3c8SBram Moolenaar		    \ 'py <<EOS',
3183b544f3c8SBram Moolenaar		    \ '.',
3184b544f3c8SBram Moolenaar		    \ ])
3185b544f3c8SBram Moolenaar    catch
318637175409SBram Moolenaar	call assert_report("Can't define function")
3187b544f3c8SBram Moolenaar    endtry
3188b544f3c8SBram Moolenaar    try
3189b544f3c8SBram Moolenaar	call DefineFunction('T_Insert', [
3190b544f3c8SBram Moolenaar		    \ 'insert',
3191b544f3c8SBram Moolenaar		    \ 'abc',
3192b544f3c8SBram Moolenaar		    \ ])
319337175409SBram Moolenaar	call assert_report("Shouldn't be able to define function")
3194b544f3c8SBram Moolenaar    catch
3195b544f3c8SBram Moolenaar	call assert_exception('Vim(function):E126: Missing :endfunction')
3196b544f3c8SBram Moolenaar    endtry
3197b544f3c8SBram Moolenaarendfunc
3198b544f3c8SBram Moolenaar
3199b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3200478af67dSBram Moolenaar" Test 96:  line continuation						    {{{1
3201478af67dSBram Moolenaar"
3202478af67dSBram Moolenaar"	    Undefined behavior was detected by ubsan with line continuation
3203478af67dSBram Moolenaar"	    after an empty line.
3204478af67dSBram Moolenaar"-------------------------------------------------------------------------------
3205478af67dSBram Moolenaarfunc Test_script_emty_line_continuation()
3206478af67dSBram Moolenaar
3207478af67dSBram Moolenaar    \
3208478af67dSBram Moolenaarendfunc
3209478af67dSBram Moolenaar
3210478af67dSBram Moolenaar"-------------------------------------------------------------------------------
3211863e80b4SBram Moolenaar" Test 97:  bitwise functions						    {{{1
3212863e80b4SBram Moolenaar"-------------------------------------------------------------------------------
3213863e80b4SBram Moolenaarfunc Test_bitwise_functions()
3214863e80b4SBram Moolenaar    " and
3215863e80b4SBram Moolenaar    call assert_equal(127, and(127, 127))
3216863e80b4SBram Moolenaar    call assert_equal(16, and(127, 16))
3217073e4b92SBram Moolenaar    eval 127->and(16)->assert_equal(16)
3218863e80b4SBram Moolenaar    call assert_equal(0, and(127, 128))
3219863e80b4SBram Moolenaar    call assert_fails("call and([], 1)", 'E745:')
3220863e80b4SBram Moolenaar    call assert_fails("call and({}, 1)", 'E728:')
32215feabe00SBram Moolenaar    if has('float')
32225feabe00SBram Moolenaar      call assert_fails("call and(1.0, 1)", 'E805:')
3223863e80b4SBram Moolenaar      call assert_fails("call and(1, 1.0)", 'E805:')
32245feabe00SBram Moolenaar    endif
3225863e80b4SBram Moolenaar    call assert_fails("call and(1, [])", 'E745:')
3226863e80b4SBram Moolenaar    call assert_fails("call and(1, {})", 'E728:')
3227863e80b4SBram Moolenaar    " or
3228863e80b4SBram Moolenaar    call assert_equal(23, or(16, 7))
3229863e80b4SBram Moolenaar    call assert_equal(15, or(8, 7))
3230073e4b92SBram Moolenaar    eval 8->or(7)->assert_equal(15)
3231863e80b4SBram Moolenaar    call assert_equal(123, or(0, 123))
3232863e80b4SBram Moolenaar    call assert_fails("call or([], 1)", 'E745:')
3233863e80b4SBram Moolenaar    call assert_fails("call or({}, 1)", 'E728:')
32345feabe00SBram Moolenaar    if has('float')
32355feabe00SBram Moolenaar      call assert_fails("call or(1.0, 1)", 'E805:')
3236863e80b4SBram Moolenaar      call assert_fails("call or(1, 1.0)", 'E805:')
32375feabe00SBram Moolenaar    endif
3238863e80b4SBram Moolenaar    call assert_fails("call or(1, [])", 'E745:')
3239863e80b4SBram Moolenaar    call assert_fails("call or(1, {})", 'E728:')
3240863e80b4SBram Moolenaar    " xor
3241863e80b4SBram Moolenaar    call assert_equal(0, xor(127, 127))
3242863e80b4SBram Moolenaar    call assert_equal(111, xor(127, 16))
3243073e4b92SBram Moolenaar    eval 127->xor(16)->assert_equal(111)
3244863e80b4SBram Moolenaar    call assert_equal(255, xor(127, 128))
32455feabe00SBram Moolenaar    if has('float')
3246863e80b4SBram Moolenaar      call assert_fails("call xor(1.0, 1)", 'E805:')
32475feabe00SBram Moolenaar      call assert_fails("call xor(1, 1.0)", 'E805:')
32485feabe00SBram Moolenaar    endif
3249863e80b4SBram Moolenaar    call assert_fails("call xor([], 1)", 'E745:')
3250863e80b4SBram Moolenaar    call assert_fails("call xor({}, 1)", 'E728:')
3251863e80b4SBram Moolenaar    call assert_fails("call xor(1, [])", 'E745:')
3252863e80b4SBram Moolenaar    call assert_fails("call xor(1, {})", 'E728:')
3253863e80b4SBram Moolenaar    " invert
3254863e80b4SBram Moolenaar    call assert_equal(65408, and(invert(127), 65535))
3255073e4b92SBram Moolenaar    eval 127->invert()->and(65535)->assert_equal(65408)
3256863e80b4SBram Moolenaar    call assert_equal(65519, and(invert(16), 65535))
3257863e80b4SBram Moolenaar    call assert_equal(65407, and(invert(128), 65535))
32585feabe00SBram Moolenaar    if has('float')
3259863e80b4SBram Moolenaar      call assert_fails("call invert(1.0)", 'E805:')
32605feabe00SBram Moolenaar    endif
3261863e80b4SBram Moolenaar    call assert_fails("call invert([])", 'E745:')
3262863e80b4SBram Moolenaar    call assert_fails("call invert({})", 'E728:')
3263863e80b4SBram Moolenaarendfunc
3264863e80b4SBram Moolenaar
32656f9a476bSBram Moolenaar" Test using bang after user command				    {{{1
32666f9a476bSBram Moolenaarfunc Test_user_command_with_bang()
32676f9a476bSBram Moolenaar    command -bang Nieuw let nieuw = 1
32686f9a476bSBram Moolenaar    Ni!
32696f9a476bSBram Moolenaar    call assert_equal(1, nieuw)
32706f9a476bSBram Moolenaar    unlet nieuw
32716f9a476bSBram Moolenaar    delcommand Nieuw
32726f9a476bSBram Moolenaarendfunc
32736f9a476bSBram Moolenaar
3274b9adef79SBram Moolenaarfunc Test_script_expand_sfile()
3275b9adef79SBram Moolenaar  let lines =<< trim END
3276b9adef79SBram Moolenaar    func s:snr()
3277b9adef79SBram Moolenaar      return expand('<sfile>')
3278b9adef79SBram Moolenaar    endfunc
3279b9adef79SBram Moolenaar    let g:result = s:snr()
3280b9adef79SBram Moolenaar  END
3281b9adef79SBram Moolenaar  call writefile(lines, 'Xexpand')
3282b9adef79SBram Moolenaar  source Xexpand
3283b9adef79SBram Moolenaar  call assert_match('<SNR>\d\+_snr', g:result)
3284b9adef79SBram Moolenaar  source Xexpand
3285b9adef79SBram Moolenaar  call assert_match('<SNR>\d\+_snr', g:result)
3286b9adef79SBram Moolenaar
3287b9adef79SBram Moolenaar  call delete('Xexpand')
3288b9adef79SBram Moolenaar  unlet g:result
3289b9adef79SBram Moolenaarendfunc
3290b9adef79SBram Moolenaar
3291ff697e6cSBram Moolenaarfunc Test_compound_assignment_operators()
3292ff697e6cSBram Moolenaar    " Test for number
3293ff697e6cSBram Moolenaar    let x = 1
3294ff697e6cSBram Moolenaar    let x += 10
3295ff697e6cSBram Moolenaar    call assert_equal(11, x)
3296ff697e6cSBram Moolenaar    let x -= 5
3297ff697e6cSBram Moolenaar    call assert_equal(6, x)
3298ff697e6cSBram Moolenaar    let x *= 4
3299ff697e6cSBram Moolenaar    call assert_equal(24, x)
3300ff697e6cSBram Moolenaar    let x /= 3
3301ff697e6cSBram Moolenaar    call assert_equal(8, x)
3302ff697e6cSBram Moolenaar    let x %= 3
3303ff697e6cSBram Moolenaar    call assert_equal(2, x)
3304ff697e6cSBram Moolenaar    let x .= 'n'
3305ff697e6cSBram Moolenaar    call assert_equal('2n', x)
3306ff697e6cSBram Moolenaar
3307e21c1580SBram Moolenaar    " Test special cases: division or modulus with 0.
3308e21c1580SBram Moolenaar    let x = 1
3309e21c1580SBram Moolenaar    let x /= 0
3310e21c1580SBram Moolenaar    call assert_equal(0x7FFFFFFFFFFFFFFF, x)
3311e21c1580SBram Moolenaar
3312e21c1580SBram Moolenaar    let x = -1
3313e21c1580SBram Moolenaar    let x /= 0
3314e21c1580SBram Moolenaar    call assert_equal(-0x7FFFFFFFFFFFFFFF, x)
3315e21c1580SBram Moolenaar
3316e21c1580SBram Moolenaar    let x = 0
3317e21c1580SBram Moolenaar    let x /= 0
3318e21c1580SBram Moolenaar    call assert_equal(-0x7FFFFFFFFFFFFFFF - 1, x)
3319e21c1580SBram Moolenaar
3320e21c1580SBram Moolenaar    let x = 1
3321e21c1580SBram Moolenaar    let x %= 0
3322e21c1580SBram Moolenaar    call assert_equal(0, x)
3323e21c1580SBram Moolenaar
3324e21c1580SBram Moolenaar    let x = -1
3325e21c1580SBram Moolenaar    let x %= 0
3326e21c1580SBram Moolenaar    call assert_equal(0, x)
3327e21c1580SBram Moolenaar
3328e21c1580SBram Moolenaar    let x = 0
3329e21c1580SBram Moolenaar    let x %= 0
3330e21c1580SBram Moolenaar    call assert_equal(0, x)
3331e21c1580SBram Moolenaar
3332ff697e6cSBram Moolenaar    " Test for string
3333ff697e6cSBram Moolenaar    let x = 'str'
3334ff697e6cSBram Moolenaar    let x .= 'ing'
3335ff697e6cSBram Moolenaar    call assert_equal('string', x)
3336ff697e6cSBram Moolenaar    let x += 1
3337ff697e6cSBram Moolenaar    call assert_equal(1, x)
3338ff697e6cSBram Moolenaar
3339ff697e6cSBram Moolenaar    if has('float')
3340ff697e6cSBram Moolenaar      " Test for float
33415feabe00SBram Moolenaar      let x -= 1.5
33425feabe00SBram Moolenaar      call assert_equal(-0.5, x)
3343ff697e6cSBram Moolenaar      let x = 0.5
3344ff697e6cSBram Moolenaar      let x += 4.5
3345ff697e6cSBram Moolenaar      call assert_equal(5.0, x)
3346ff697e6cSBram Moolenaar      let x -= 1.5
3347ff697e6cSBram Moolenaar      call assert_equal(3.5, x)
3348ff697e6cSBram Moolenaar      let x *= 3.0
3349ff697e6cSBram Moolenaar      call assert_equal(10.5, x)
3350ff697e6cSBram Moolenaar      let x /= 2.5
3351ff697e6cSBram Moolenaar      call assert_equal(4.2, x)
3352ff697e6cSBram Moolenaar      call assert_fails('let x %= 0.5', 'E734')
3353ff697e6cSBram Moolenaar      call assert_fails('let x .= "f"', 'E734')
33548b633135SBram Moolenaar      let x = !3.14
33558b633135SBram Moolenaar      call assert_equal(0.0, x)
3356ea04a6e8SBram Moolenaar
3357ea04a6e8SBram Moolenaar      " integer and float operations
3358ea04a6e8SBram Moolenaar      let x = 1
3359ea04a6e8SBram Moolenaar      let x *= 2.1
3360ea04a6e8SBram Moolenaar      call assert_equal(2.1, x)
3361ea04a6e8SBram Moolenaar      let x = 1
3362ea04a6e8SBram Moolenaar      let x /= 0.25
3363ea04a6e8SBram Moolenaar      call assert_equal(4.0, x)
3364ea04a6e8SBram Moolenaar      let x = 1
3365ea04a6e8SBram Moolenaar      call assert_fails('let x %= 0.25', 'E734:')
3366ea04a6e8SBram Moolenaar      let x = 1
3367ea04a6e8SBram Moolenaar      call assert_fails('let x .= 0.25', 'E734:')
3368ea04a6e8SBram Moolenaar      let x = 1.0
3369ea04a6e8SBram Moolenaar      call assert_fails('let x += [1.1]', 'E734:')
3370ff697e6cSBram Moolenaar    endif
3371ff697e6cSBram Moolenaar
3372ff697e6cSBram Moolenaar    " Test for environment variable
3373ff697e6cSBram Moolenaar    let $FOO = 1
3374ff697e6cSBram Moolenaar    call assert_fails('let $FOO += 1', 'E734')
3375ff697e6cSBram Moolenaar    call assert_fails('let $FOO -= 1', 'E734')
3376ff697e6cSBram Moolenaar    call assert_fails('let $FOO *= 1', 'E734')
3377ff697e6cSBram Moolenaar    call assert_fails('let $FOO /= 1', 'E734')
3378ff697e6cSBram Moolenaar    call assert_fails('let $FOO %= 1', 'E734')
3379ff697e6cSBram Moolenaar    let $FOO .= 's'
3380ff697e6cSBram Moolenaar    call assert_equal('1s', $FOO)
3381ff697e6cSBram Moolenaar    unlet $FOO
3382ff697e6cSBram Moolenaar
3383ff697e6cSBram Moolenaar    " Test for option variable (type: number)
3384ff697e6cSBram Moolenaar    let &scrolljump = 1
3385ff697e6cSBram Moolenaar    let &scrolljump += 5
3386ff697e6cSBram Moolenaar    call assert_equal(6, &scrolljump)
3387ff697e6cSBram Moolenaar    let &scrolljump -= 2
3388ff697e6cSBram Moolenaar    call assert_equal(4, &scrolljump)
3389ff697e6cSBram Moolenaar    let &scrolljump *= 3
3390ff697e6cSBram Moolenaar    call assert_equal(12, &scrolljump)
3391ff697e6cSBram Moolenaar    let &scrolljump /= 2
3392ff697e6cSBram Moolenaar    call assert_equal(6, &scrolljump)
3393ff697e6cSBram Moolenaar    let &scrolljump %= 5
3394ff697e6cSBram Moolenaar    call assert_equal(1, &scrolljump)
3395ff697e6cSBram Moolenaar    call assert_fails('let &scrolljump .= "j"', 'E734')
3396ff697e6cSBram Moolenaar    set scrolljump&vim
3397ff697e6cSBram Moolenaar
3398ff697e6cSBram Moolenaar    " Test for register
3399ff697e6cSBram Moolenaar    let @/ = 1
3400ff697e6cSBram Moolenaar    call assert_fails('let @/ += 1', 'E734')
3401ff697e6cSBram Moolenaar    call assert_fails('let @/ -= 1', 'E734')
3402ff697e6cSBram Moolenaar    call assert_fails('let @/ *= 1', 'E734')
3403ff697e6cSBram Moolenaar    call assert_fails('let @/ /= 1', 'E734')
3404ff697e6cSBram Moolenaar    call assert_fails('let @/ %= 1', 'E734')
3405ff697e6cSBram Moolenaar    let @/ .= 's'
3406ff697e6cSBram Moolenaar    call assert_equal('1s', @/)
3407ff697e6cSBram Moolenaar    let @/ = ''
3408ff697e6cSBram Moolenaarendfunc
3409ff697e6cSBram Moolenaar
34107e0868efSBram Moolenaarfunc Test_unlet_env()
34117e0868efSBram Moolenaar  let $TESTVAR = 'yes'
34127e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
34137e0868efSBram Moolenaar  call assert_fails('lockvar $TESTVAR', 'E940')
34147e0868efSBram Moolenaar  call assert_fails('unlockvar $TESTVAR', 'E940')
34157e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
34167e0868efSBram Moolenaar  if 0
34177e0868efSBram Moolenaar    unlet $TESTVAR
34187e0868efSBram Moolenaar  endif
34197e0868efSBram Moolenaar  call assert_equal('yes', $TESTVAR)
34207e0868efSBram Moolenaar  unlet $TESTVAR
34217e0868efSBram Moolenaar  call assert_equal('', $TESTVAR)
34227e0868efSBram Moolenaarendfunc
34237e0868efSBram Moolenaar
3424c3e92c16SBram Moolenaarfunc Test_refcount()
3425c3e92c16SBram Moolenaar    " Immediate values
3426c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(1))
3427c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount('s'))
3428c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(v:true))
3429c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount([]))
3430c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount({}))
3431c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(0zff))
3432c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount({-> line('.')}))
3433c3e92c16SBram Moolenaar    if has('float')
3434c3e92c16SBram Moolenaar        call assert_equal(-1, test_refcount(0.1))
3435c3e92c16SBram Moolenaar    endif
3436c3e92c16SBram Moolenaar    if has('job')
3437c3e92c16SBram Moolenaar        call assert_equal(0, test_refcount(job_start([&shell, &shellcmdflag, 'echo .'])))
3438c3e92c16SBram Moolenaar    endif
3439c3e92c16SBram Moolenaar
3440c3e92c16SBram Moolenaar    " No refcount types
3441c3e92c16SBram Moolenaar    let x = 1
3442c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
3443c3e92c16SBram Moolenaar    let x = 's'
3444c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
3445c3e92c16SBram Moolenaar    let x = v:true
3446c3e92c16SBram Moolenaar    call assert_equal(-1, test_refcount(x))
3447c3e92c16SBram Moolenaar    if has('float')
3448c3e92c16SBram Moolenaar        let x = 0.1
3449c3e92c16SBram Moolenaar        call assert_equal(-1, test_refcount(x))
3450c3e92c16SBram Moolenaar    endif
3451c3e92c16SBram Moolenaar
3452c3e92c16SBram Moolenaar    " Check refcount
3453c3e92c16SBram Moolenaar    let x = []
3454c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(x))
3455c3e92c16SBram Moolenaar
3456c3e92c16SBram Moolenaar    let x = {}
3457ce90e36fSBram Moolenaar    call assert_equal(1, x->test_refcount())
3458c3e92c16SBram Moolenaar
3459c3e92c16SBram Moolenaar    let x = 0zff
3460c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(x))
3461c3e92c16SBram Moolenaar
3462c3e92c16SBram Moolenaar    let X = {-> line('.')}
3463c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(X))
3464c3e92c16SBram Moolenaar    let Y = X
3465c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
3466c3e92c16SBram Moolenaar
3467c3e92c16SBram Moolenaar    if has('job')
3468c3e92c16SBram Moolenaar        let job = job_start([&shell, &shellcmdflag, 'echo .'])
3469c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job))
3470c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job_getchannel(job)))
3471c3e92c16SBram Moolenaar        call assert_equal(1, test_refcount(job))
3472c3e92c16SBram Moolenaar    endif
3473c3e92c16SBram Moolenaar
3474c3e92c16SBram Moolenaar    " Function arguments, copying and unassigning
3475c3e92c16SBram Moolenaar    func ExprCheck(x, i)
3476c3e92c16SBram Moolenaar        let i = a:i + 1
3477c3e92c16SBram Moolenaar        call assert_equal(i, test_refcount(a:x))
3478c3e92c16SBram Moolenaar        let Y = a:x
3479c3e92c16SBram Moolenaar        call assert_equal(i + 1, test_refcount(a:x))
3480c3e92c16SBram Moolenaar        call assert_equal(test_refcount(a:x), test_refcount(Y))
3481c3e92c16SBram Moolenaar        let Y = 0
3482c3e92c16SBram Moolenaar        call assert_equal(i, test_refcount(a:x))
3483c3e92c16SBram Moolenaar    endfunc
3484c3e92c16SBram Moolenaar    call ExprCheck([], 0)
3485c3e92c16SBram Moolenaar    call ExprCheck({}, 0)
3486c3e92c16SBram Moolenaar    call ExprCheck(0zff, 0)
3487c3e92c16SBram Moolenaar    call ExprCheck({-> line('.')}, 0)
3488c3e92c16SBram Moolenaar    if has('job')
3489c3e92c16SBram Moolenaar	call ExprCheck(job, 1)
3490c3e92c16SBram Moolenaar	call ExprCheck(job_getchannel(job), 1)
3491c3e92c16SBram Moolenaar	call job_stop(job)
3492c3e92c16SBram Moolenaar    endif
3493c3e92c16SBram Moolenaar    delfunc ExprCheck
3494c3e92c16SBram Moolenaar
3495c3e92c16SBram Moolenaar    " Regarding function
3496c3e92c16SBram Moolenaar    func Func(x) abort
3497c3e92c16SBram Moolenaar        call assert_equal(2, test_refcount(function('Func')))
3498c3e92c16SBram Moolenaar        call assert_equal(0, test_refcount(funcref('Func')))
3499c3e92c16SBram Moolenaar    endfunc
3500c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(function('Func')))
3501c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(function('Func', [1])))
3502c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(funcref('Func')))
3503c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(funcref('Func', [1])))
3504c3e92c16SBram Moolenaar    let X = function('Func')
3505c3e92c16SBram Moolenaar    let Y = X
3506c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(X))
3507c3e92c16SBram Moolenaar    let X = function('Func', [1])
3508c3e92c16SBram Moolenaar    let Y = X
3509c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
3510c3e92c16SBram Moolenaar    let X = funcref('Func')
3511c3e92c16SBram Moolenaar    let Y = X
3512c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
3513c3e92c16SBram Moolenaar    let X = funcref('Func', [1])
3514c3e92c16SBram Moolenaar    let Y = X
3515c3e92c16SBram Moolenaar    call assert_equal(2, test_refcount(X))
3516c3e92c16SBram Moolenaar    unlet X
3517c3e92c16SBram Moolenaar    unlet Y
3518c3e92c16SBram Moolenaar    call Func(1)
3519c3e92c16SBram Moolenaar    delfunc Func
3520c3e92c16SBram Moolenaar
3521c3e92c16SBram Moolenaar    " Function with dict
3522c3e92c16SBram Moolenaar    func DictFunc() dict
3523c3e92c16SBram Moolenaar        call assert_equal(3, test_refcount(self))
3524c3e92c16SBram Moolenaar    endfunc
3525c3e92c16SBram Moolenaar    let d = {'Func': function('DictFunc')}
3526c3e92c16SBram Moolenaar    call assert_equal(1, test_refcount(d))
3527c3e92c16SBram Moolenaar    call assert_equal(0, test_refcount(d.Func))
3528c3e92c16SBram Moolenaar    call d.Func()
3529c3e92c16SBram Moolenaar    unlet d
3530c3e92c16SBram Moolenaar    delfunc DictFunc
3531c3e92c16SBram Moolenaarendfunc
3532c3e92c16SBram Moolenaar
35339f6277bdSBram Moolenaar" Test for missing :endif, :endfor, :endwhile and :endtry           {{{1
35349f6277bdSBram Moolenaarfunc Test_missing_end()
35359f6277bdSBram Moolenaar  call writefile(['if 2 > 1', 'echo ">"'], 'Xscript')
35369f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E171:')
35379f6277bdSBram Moolenaar  call writefile(['for i in range(5)', 'echo i'], 'Xscript')
35389f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E170:')
35399f6277bdSBram Moolenaar  call writefile(['while v:true', 'echo "."'], 'Xscript')
35409f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E170:')
35419f6277bdSBram Moolenaar  call writefile(['try', 'echo "."'], 'Xscript')
35429f6277bdSBram Moolenaar  call assert_fails('source Xscript', 'E600:')
35439f6277bdSBram Moolenaar  call delete('Xscript')
3544818fc9adSBram Moolenaar
3545818fc9adSBram Moolenaar  " Using endfor with :while
3546818fc9adSBram Moolenaar  let caught_e732 = 0
3547818fc9adSBram Moolenaar  try
3548818fc9adSBram Moolenaar    while v:true
3549818fc9adSBram Moolenaar    endfor
3550818fc9adSBram Moolenaar  catch /E732:/
3551818fc9adSBram Moolenaar    let caught_e732 = 1
3552818fc9adSBram Moolenaar  endtry
3553818fc9adSBram Moolenaar  call assert_equal(1, caught_e732)
3554818fc9adSBram Moolenaar
3555818fc9adSBram Moolenaar  " Using endwhile with :for
3556818fc9adSBram Moolenaar  let caught_e733 = 0
3557818fc9adSBram Moolenaar  try
3558818fc9adSBram Moolenaar    for i in range(1)
3559818fc9adSBram Moolenaar    endwhile
3560818fc9adSBram Moolenaar  catch /E733:/
3561818fc9adSBram Moolenaar    let caught_e733 = 1
3562818fc9adSBram Moolenaar  endtry
3563818fc9adSBram Moolenaar  call assert_equal(1, caught_e733)
3564818fc9adSBram Moolenaar
3565ee4e0c1eSBram Moolenaar  " Using endfunc with :if
3566ee4e0c1eSBram Moolenaar  call assert_fails('exe "if 1 | endfunc | endif"', 'E193:')
3567ee4e0c1eSBram Moolenaar
3568818fc9adSBram Moolenaar  " Missing 'in' in a :for statement
3569818fc9adSBram Moolenaar  call assert_fails('for i range(1) | endfor', 'E690:')
3570ea04a6e8SBram Moolenaar
3571ea04a6e8SBram Moolenaar  " Incorrect number of variables in for
3572ea04a6e8SBram Moolenaar  call assert_fails('for [i,] in range(3) | endfor', 'E475:')
35739f6277bdSBram Moolenaarendfunc
35749f6277bdSBram Moolenaar
35759f6277bdSBram Moolenaar" Test for deep nesting of if/for/while/try statements              {{{1
35769f6277bdSBram Moolenaarfunc Test_deep_nest()
3577494e9069SBram Moolenaar  CheckRunVimInTerminal
35789f6277bdSBram Moolenaar
35799f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
35809f6277bdSBram Moolenaar    " Deep nesting of if ... endif
35819f6277bdSBram Moolenaar    func Test1()
35829f6277bdSBram Moolenaar      let @a = join(repeat(['if v:true'], 51), "\n")
35839f6277bdSBram Moolenaar      let @a ..= "\n"
35849f6277bdSBram Moolenaar      let @a ..= join(repeat(['endif'], 51), "\n")
35859f6277bdSBram Moolenaar      @a
35869f6277bdSBram Moolenaar      let @a = ''
35879f6277bdSBram Moolenaar    endfunc
35889f6277bdSBram Moolenaar
35899f6277bdSBram Moolenaar    " Deep nesting of for ... endfor
35909f6277bdSBram Moolenaar    func Test2()
35919f6277bdSBram Moolenaar      let @a = join(repeat(['for i in [1]'], 51), "\n")
35929f6277bdSBram Moolenaar      let @a ..= "\n"
35939f6277bdSBram Moolenaar      let @a ..= join(repeat(['endfor'], 51), "\n")
35949f6277bdSBram Moolenaar      @a
35959f6277bdSBram Moolenaar      let @a = ''
35969f6277bdSBram Moolenaar    endfunc
35979f6277bdSBram Moolenaar
35989f6277bdSBram Moolenaar    " Deep nesting of while ... endwhile
35999f6277bdSBram Moolenaar    func Test3()
36009f6277bdSBram Moolenaar      let @a = join(repeat(['while v:true'], 51), "\n")
36019f6277bdSBram Moolenaar      let @a ..= "\n"
36029f6277bdSBram Moolenaar      let @a ..= join(repeat(['endwhile'], 51), "\n")
36039f6277bdSBram Moolenaar      @a
36049f6277bdSBram Moolenaar      let @a = ''
36059f6277bdSBram Moolenaar    endfunc
36069f6277bdSBram Moolenaar
36079f6277bdSBram Moolenaar    " Deep nesting of try ... endtry
36089f6277bdSBram Moolenaar    func Test4()
36099f6277bdSBram Moolenaar      let @a = join(repeat(['try'], 51), "\n")
36109f6277bdSBram Moolenaar      let @a ..= "\necho v:true\n"
36119f6277bdSBram Moolenaar      let @a ..= join(repeat(['endtry'], 51), "\n")
36129f6277bdSBram Moolenaar      @a
36139f6277bdSBram Moolenaar      let @a = ''
36149f6277bdSBram Moolenaar    endfunc
3615ee4e0c1eSBram Moolenaar
3616ee4e0c1eSBram Moolenaar    " Deep nesting of function ... endfunction
3617ee4e0c1eSBram Moolenaar    func Test5()
3618ee4e0c1eSBram Moolenaar      let @a = join(repeat(['function X()'], 51), "\n")
3619ee4e0c1eSBram Moolenaar      let @a ..= "\necho v:true\n"
3620ee4e0c1eSBram Moolenaar      let @a ..= join(repeat(['endfunction'], 51), "\n")
3621ee4e0c1eSBram Moolenaar      @a
3622ee4e0c1eSBram Moolenaar      let @a = ''
3623ee4e0c1eSBram Moolenaar    endfunc
36249f6277bdSBram Moolenaar  [SCRIPT]
36259f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
36269f6277bdSBram Moolenaar
36279f6277bdSBram Moolenaar  let buf = RunVimInTerminal('-S Xscript', {'rows': 6})
36289f6277bdSBram Moolenaar
36299f6277bdSBram Moolenaar  " Deep nesting of if ... endif
36309f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test1()\n")
36316a2c5a7dSBram Moolenaar  call TermWait(buf)
36329f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E579:', term_getline(buf, 5))})
36339f6277bdSBram Moolenaar
36349f6277bdSBram Moolenaar  " Deep nesting of for ... endfor
36359f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test2()\n")
36366a2c5a7dSBram Moolenaar  call TermWait(buf)
36379f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))})
36389f6277bdSBram Moolenaar
36399f6277bdSBram Moolenaar  " Deep nesting of while ... endwhile
36409f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test3()\n")
36416a2c5a7dSBram Moolenaar  call TermWait(buf)
36429f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E585:', term_getline(buf, 5))})
36439f6277bdSBram Moolenaar
36449f6277bdSBram Moolenaar  " Deep nesting of try ... endtry
36459f6277bdSBram Moolenaar  call term_sendkeys(buf, ":call Test4()\n")
36466a2c5a7dSBram Moolenaar  call TermWait(buf)
36479f6277bdSBram Moolenaar  call WaitForAssert({-> assert_match('^E601:', term_getline(buf, 5))})
36489f6277bdSBram Moolenaar
3649ee4e0c1eSBram Moolenaar  " Deep nesting of function ... endfunction
3650ee4e0c1eSBram Moolenaar  call term_sendkeys(buf, ":call Test5()\n")
36516a2c5a7dSBram Moolenaar  call TermWait(buf)
3652ee4e0c1eSBram Moolenaar  call WaitForAssert({-> assert_match('^E1058:', term_getline(buf, 4))})
3653ee4e0c1eSBram Moolenaar  call term_sendkeys(buf, "\<C-C>\n")
36546a2c5a7dSBram Moolenaar  call TermWait(buf)
3655ee4e0c1eSBram Moolenaar
36569f6277bdSBram Moolenaar  "let l = ''
36579f6277bdSBram Moolenaar  "for i in range(1, 6)
36589f6277bdSBram Moolenaar  "  let l ..= term_getline(buf, i) . "\n"
36599f6277bdSBram Moolenaar  "endfor
36609f6277bdSBram Moolenaar  "call assert_report(l)
36619f6277bdSBram Moolenaar
36629f6277bdSBram Moolenaar  call StopVimInTerminal(buf)
36639f6277bdSBram Moolenaar  call delete('Xscript')
36649f6277bdSBram Moolenaarendfunc
36659f6277bdSBram Moolenaar
36668b633135SBram Moolenaar" Test for errors in converting to float from various types         {{{1
36678b633135SBram Moolenaarfunc Test_float_conversion_errors()
36688b633135SBram Moolenaar  if has('float')
36698b633135SBram Moolenaar    call assert_fails('let x = 4.0 % 2.0', 'E804')
36708b633135SBram Moolenaar    call assert_fails('echo 1.1[0]', 'E806')
36718b633135SBram Moolenaar    call assert_fails('echo sort([function("min"), 1], "f")', 'E891:')
36728b633135SBram Moolenaar    call assert_fails('echo 3.2 == "vim"', 'E892:')
36738b633135SBram Moolenaar    call assert_fails('echo sort([[], 1], "f")', 'E893:')
36748b633135SBram Moolenaar    call assert_fails('echo sort([{}, 1], "f")', 'E894:')
36758b633135SBram Moolenaar    call assert_fails('echo 3.2 == v:true', 'E362:')
36768b633135SBram Moolenaar    call assert_fails('echo 3.2 == v:none', 'E907:')
36778b633135SBram Moolenaar  endif
36788b633135SBram Moolenaarendfunc
36798b633135SBram Moolenaar
36808e6cbb72SBram Moolenaar" invalid function names               {{{1
368108f4157cSBram Moolenaarfunc Test_invalid_function_names()
368208f4157cSBram Moolenaar  " function name not starting with capital
368308f4157cSBram Moolenaar  let caught_e128 = 0
368408f4157cSBram Moolenaar  try
368508f4157cSBram Moolenaar    func! g:test()
368608f4157cSBram Moolenaar      echo "test"
368708f4157cSBram Moolenaar    endfunc
368808f4157cSBram Moolenaar  catch /E128:/
368908f4157cSBram Moolenaar    let caught_e128 = 1
369008f4157cSBram Moolenaar  endtry
369108f4157cSBram Moolenaar  call assert_equal(1, caught_e128)
369208f4157cSBram Moolenaar
369308f4157cSBram Moolenaar  " function name includes a colon
369408f4157cSBram Moolenaar  let caught_e884 = 0
369508f4157cSBram Moolenaar  try
369608f4157cSBram Moolenaar    func! b:test()
369708f4157cSBram Moolenaar      echo "test"
369808f4157cSBram Moolenaar    endfunc
369908f4157cSBram Moolenaar  catch /E884:/
370008f4157cSBram Moolenaar    let caught_e884 = 1
370108f4157cSBram Moolenaar  endtry
370208f4157cSBram Moolenaar  call assert_equal(1, caught_e884)
370308f4157cSBram Moolenaar
370408f4157cSBram Moolenaar  " function name folowed by #
370508f4157cSBram Moolenaar  let caught_e128 = 0
370608f4157cSBram Moolenaar  try
370708f4157cSBram Moolenaar    func! test2() "#
370808f4157cSBram Moolenaar      echo "test2"
370908f4157cSBram Moolenaar    endfunc
371008f4157cSBram Moolenaar  catch /E128:/
371108f4157cSBram Moolenaar    let caught_e128 = 1
371208f4157cSBram Moolenaar  endtry
371308f4157cSBram Moolenaar  call assert_equal(1, caught_e128)
371408f4157cSBram Moolenaar
371508f4157cSBram Moolenaar  " function name starting with/without "g:", buffer-local funcref.
371608f4157cSBram Moolenaar  function! g:Foo(n)
371708f4157cSBram Moolenaar    return 'called Foo(' . a:n . ')'
371808f4157cSBram Moolenaar  endfunction
371908f4157cSBram Moolenaar  let b:my_func = function('Foo')
372008f4157cSBram Moolenaar  call assert_equal('called Foo(1)', b:my_func(1))
372108f4157cSBram Moolenaar  call assert_equal('called Foo(2)', g:Foo(2))
372208f4157cSBram Moolenaar  call assert_equal('called Foo(3)', Foo(3))
372308f4157cSBram Moolenaar  delfunc g:Foo
372408f4157cSBram Moolenaar
372508f4157cSBram Moolenaar  " script-local function used in Funcref must exist.
372608f4157cSBram Moolenaar  let lines =<< trim END
372708f4157cSBram Moolenaar    func s:Testje()
372808f4157cSBram Moolenaar      return "foo"
372908f4157cSBram Moolenaar    endfunc
373008f4157cSBram Moolenaar    let Bar = function('s:Testje')
373108f4157cSBram Moolenaar    call assert_equal(0, exists('s:Testje'))
373208f4157cSBram Moolenaar    call assert_equal(1, exists('*s:Testje'))
373308f4157cSBram Moolenaar    call assert_equal(1, exists('Bar'))
373408f4157cSBram Moolenaar    call assert_equal(1, exists('*Bar'))
373508f4157cSBram Moolenaar  END
373608f4157cSBram Moolenaar  call writefile(lines, 'Xscript')
373708f4157cSBram Moolenaar  source Xscript
373808f4157cSBram Moolenaar  call delete('Xscript')
373908f4157cSBram Moolenaarendfunc
374008f4157cSBram Moolenaar
37418e6cbb72SBram Moolenaar" substring and variable name              {{{1
374208f4157cSBram Moolenaarfunc Test_substring_var()
374308f4157cSBram Moolenaar  let str = 'abcdef'
374408f4157cSBram Moolenaar  let n = 3
374508f4157cSBram Moolenaar  call assert_equal('def', str[n:])
374608f4157cSBram Moolenaar  call assert_equal('abcd', str[:n])
374708f4157cSBram Moolenaar  call assert_equal('d', str[n:n])
374808f4157cSBram Moolenaar  unlet n
374908f4157cSBram Moolenaar  let nn = 3
375008f4157cSBram Moolenaar  call assert_equal('def', str[nn:])
375108f4157cSBram Moolenaar  call assert_equal('abcd', str[:nn])
375208f4157cSBram Moolenaar  call assert_equal('d', str[nn:nn])
375308f4157cSBram Moolenaar  unlet nn
375408f4157cSBram Moolenaar  let b:nn = 4
375508f4157cSBram Moolenaar  call assert_equal('ef', str[b:nn:])
375608f4157cSBram Moolenaar  call assert_equal('abcde', str[:b:nn])
375708f4157cSBram Moolenaar  call assert_equal('e', str[b:nn:b:nn])
375808f4157cSBram Moolenaar  unlet b:nn
375908f4157cSBram Moolenaarendfunc
376008f4157cSBram Moolenaar
37618e6cbb72SBram Moolenaar" Test using s: with a typed command              {{{1
37628e6cbb72SBram Moolenaarfunc Test_typed_script_var()
37638e6cbb72SBram Moolenaar  CheckRunVimInTerminal
37648e6cbb72SBram Moolenaar
37658e6cbb72SBram Moolenaar  let buf = RunVimInTerminal('', {'rows': 6})
37668e6cbb72SBram Moolenaar
37678e6cbb72SBram Moolenaar  " Deep nesting of if ... endif
37688e6cbb72SBram Moolenaar  call term_sendkeys(buf, ":echo get(s:, 'foo', 'x')\n")
37698e6cbb72SBram Moolenaar  call TermWait(buf)
37708e6cbb72SBram Moolenaar  call WaitForAssert({-> assert_match('^E116:', term_getline(buf, 5))})
37718e6cbb72SBram Moolenaar
37728e6cbb72SBram Moolenaar  call StopVimInTerminal(buf)
37738e6cbb72SBram Moolenaarendfunc
37748e6cbb72SBram Moolenaar
3775863e80b4SBram Moolenaar"-------------------------------------------------------------------------------
3776b544f3c8SBram Moolenaar" Modelines								    {{{1
37771f068233SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
3778b544f3c8SBram Moolenaar"-------------------------------------------------------------------------------
3779