blob: aabc373333da8076794925cd9d980b0c3f8909ac [file] [log] [blame]
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001" Test various aspects of the Vim9 script language.
2
3source check.vim
Bram Moolenaarad304702020-09-06 18:22:53 +02004source term_util.vim
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02005source view_util.vim
Bram Moolenaar04b12692020-05-04 23:24:44 +02006source vim9.vim
Bram Moolenaar47e7d702020-07-05 18:18:42 +02007source screendump.vim
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02008
9func Test_def_basic()
10 def SomeFunc(): string
11 return 'yes'
12 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020013 call SomeFunc()->assert_equal('yes')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020014endfunc
15
Bram Moolenaar2b9b17e2020-10-13 18:38:11 +020016func Test_compiling_error()
17 " use a terminal to see the whole error message
Bram Moolenaarf4e8cdd2020-10-12 22:07:13 +020018 CheckRunVimInTerminal
19
Bram Moolenaar2b9b17e2020-10-13 18:38:11 +020020 call TestCompilingError()
21endfunc
22
23def TestCompilingError()
Bram Moolenaarf4e8cdd2020-10-12 22:07:13 +020024 var lines =<< trim END
25 vim9script
26 def Fails()
27 echo nothing
28 enddef
29 defcompile
30 END
31 call writefile(lines, 'XTest_compile_error')
32 var buf = RunVimInTerminal('-S XTest_compile_error',
Bram Moolenaare0de1712020-12-02 17:36:54 +010033 {rows: 10, wait_for_ruler: 0})
Bram Moolenaarf4e8cdd2020-10-12 22:07:13 +020034 var text = ''
35 for loop in range(100)
36 text = ''
37 for i in range(1, 9)
38 text ..= term_getline(buf, i)
39 endfor
Bram Moolenaar18dc3552020-11-22 14:24:00 +010040 if text =~ 'Variable not found: nothing'
Bram Moolenaarf4e8cdd2020-10-12 22:07:13 +020041 break
42 endif
43 sleep 20m
44 endfor
45 assert_match('Error detected while compiling command line.*Fails.*Variable not found: nothing', text)
46
47 # clean up
48 call StopVimInTerminal(buf)
49 call delete('XTest_compile_error')
50enddef
51
Bram Moolenaar0ba48e82020-11-17 18:23:19 +010052def CallRecursive(n: number): number
53 return CallRecursive(n + 1)
54enddef
55
56def CallMapRecursive(l: list<number>): number
57 return map(l, {_, v -> CallMapRecursive([v])})[0]
58enddef
59
60def Test_funcdepth_error()
61 set maxfuncdepth=10
62
63 var caught = false
64 try
65 CallRecursive(1)
66 catch /E132:/
67 caught = true
68 endtry
69 assert_true(caught)
70
71 caught = false
72 try
73 CallMapRecursive([1])
74 catch /E132:/
75 caught = true
76 endtry
77 assert_true(caught)
78
79 set maxfuncdepth&
80enddef
81
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020082def ReturnString(): string
83 return 'string'
84enddef
85
86def ReturnNumber(): number
87 return 123
88enddef
89
90let g:notNumber = 'string'
91
92def ReturnGlobal(): number
93 return g:notNumber
94enddef
95
96def Test_return_something()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020097 ReturnString()->assert_equal('string')
98 ReturnNumber()->assert_equal(123)
Bram Moolenaar5e654232020-09-16 15:22:00 +020099 assert_fails('ReturnGlobal()', 'E1012: Type mismatch; expected number but got string', '', 1, 'ReturnGlobal')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200100enddef
101
Bram Moolenaarefd88552020-06-18 20:50:10 +0200102def Test_missing_return()
103 CheckDefFailure(['def Missing(): number',
104 ' if g:cond',
105 ' echo "no return"',
106 ' else',
107 ' return 0',
108 ' endif'
109 'enddef'], 'E1027:')
110 CheckDefFailure(['def Missing(): number',
111 ' if g:cond',
112 ' return 1',
113 ' else',
114 ' echo "no return"',
115 ' endif'
116 'enddef'], 'E1027:')
117 CheckDefFailure(['def Missing(): number',
118 ' if g:cond',
119 ' return 1',
120 ' else',
121 ' return 2',
122 ' endif'
123 ' return 3'
124 'enddef'], 'E1095:')
125enddef
126
Bram Moolenaar403dc312020-10-17 19:29:51 +0200127def Test_return_bool()
128 var lines =<< trim END
129 vim9script
130 def MenuFilter(id: number, key: string): bool
131 return popup_filter_menu(id, key)
132 enddef
133 def YesnoFilter(id: number, key: string): bool
134 return popup_filter_yesno(id, key)
135 enddef
136 defcompile
137 END
138 CheckScriptSuccess(lines)
139enddef
140
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200141let s:nothing = 0
142def ReturnNothing()
143 s:nothing = 1
144 if true
145 return
146 endif
147 s:nothing = 2
148enddef
149
150def Test_return_nothing()
151 ReturnNothing()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200152 s:nothing->assert_equal(1)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200153enddef
154
155func Increment()
156 let g:counter += 1
157endfunc
158
159def Test_call_ufunc_count()
160 g:counter = 1
161 Increment()
162 Increment()
163 Increment()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200164 # works with and without :call
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200165 g:counter->assert_equal(4)
166 eval g:counter->assert_equal(4)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200167 unlet g:counter
168enddef
169
170def MyVarargs(arg: string, ...rest: list<string>): string
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200171 var res = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200172 for s in rest
173 res ..= ',' .. s
174 endfor
175 return res
176enddef
177
178def Test_call_varargs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200179 MyVarargs('one')->assert_equal('one')
180 MyVarargs('one', 'two')->assert_equal('one,two')
181 MyVarargs('one', 'two', 'three')->assert_equal('one,two,three')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200182enddef
183
184def MyDefaultArgs(name = 'string'): string
185 return name
186enddef
187
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200188def MyDefaultSecond(name: string, second: bool = true): string
189 return second ? name : 'none'
190enddef
191
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200192def Test_call_default_args()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200193 MyDefaultArgs()->assert_equal('string')
194 MyDefaultArgs('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200195 assert_fails('MyDefaultArgs("one", "two")', 'E118:', '', 3, 'Test_call_default_args')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200196
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200197 MyDefaultSecond('test')->assert_equal('test')
198 MyDefaultSecond('test', true)->assert_equal('test')
199 MyDefaultSecond('test', false)->assert_equal('none')
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200200
Bram Moolenaar822ba242020-05-24 23:00:18 +0200201 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100202 delfunc g:Func
Bram Moolenaar77072282020-09-16 17:55:40 +0200203 CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100204 delfunc g:Func
Bram Moolenaar04b12692020-05-04 23:24:44 +0200205enddef
206
207def Test_nested_function()
208 def Nested(arg: string): string
209 return 'nested ' .. arg
210 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200211 Nested('function')->assert_equal('nested function')
Bram Moolenaar04b12692020-05-04 23:24:44 +0200212
Bram Moolenaar0e65d3d2020-05-05 17:53:16 +0200213 CheckDefFailure(['def Nested()', 'enddef', 'Nested(66)'], 'E118:')
214 CheckDefFailure(['def Nested(arg: string)', 'enddef', 'Nested()'], 'E119:')
215
Bram Moolenaar04b12692020-05-04 23:24:44 +0200216 CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
Bram Moolenaarbcbf4132020-08-01 22:35:13 +0200217 CheckDefFailure(['def s:Nested()', 'enddef'], 'E1075:')
218 CheckDefFailure(['def b:Nested()', 'enddef'], 'E1075:')
Bram Moolenaar8b848ca2020-09-10 22:28:01 +0200219
Bram Moolenaar54021752020-12-06 18:50:36 +0100220 var lines =<< trim END
221 def Outer()
222 def Inner()
223 # comment
224 enddef
225 def Inner()
226 enddef
227 enddef
228 END
229 CheckDefFailure(lines, 'E1073:')
230
231 lines =<< trim END
232 def Outer()
233 def Inner()
234 # comment
235 enddef
236 def! Inner()
237 enddef
238 enddef
239 END
240 CheckDefFailure(lines, 'E1117:')
241
242 # nested function inside conditional
243 # TODO: should it work when "thecount" is inside the "if"?
244 lines =<< trim END
245 vim9script
246 var thecount = 0
247 if true
248 def Test(): number
249 def TheFunc(): number
250 thecount += 1
251 return thecount
252 enddef
253 return TheFunc()
254 enddef
255 endif
256 defcompile
257 assert_equal(1, Test())
258 assert_equal(2, Test())
259 END
260 CheckScriptSuccess(lines)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200261enddef
262
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200263func Test_call_default_args_from_func()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200264 call MyDefaultArgs()->assert_equal('string')
265 call MyDefaultArgs('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200266 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:', '', 3, 'Test_call_default_args_from_func')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200267endfunc
268
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200269def Test_nested_global_function()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200270 var lines =<< trim END
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200271 vim9script
272 def Outer()
273 def g:Inner(): string
274 return 'inner'
275 enddef
276 enddef
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200277 defcompile
278 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200279 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200280 delfunc g:Inner
281 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200282 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200283 delfunc g:Inner
284 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200285 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200286 delfunc g:Inner
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200287 END
288 CheckScriptSuccess(lines)
Bram Moolenaar2c79e9d2020-08-01 18:57:52 +0200289
290 lines =<< trim END
291 vim9script
292 def Outer()
293 def g:Inner(): string
294 return 'inner'
295 enddef
296 enddef
297 defcompile
298 Outer()
299 Outer()
300 END
301 CheckScriptFailure(lines, "E122:")
Bram Moolenaarad486a02020-08-01 23:22:18 +0200302
303 lines =<< trim END
304 vim9script
305 def Func()
306 echo 'script'
307 enddef
308 def Outer()
309 def Func()
310 echo 'inner'
311 enddef
312 enddef
313 defcompile
314 END
315 CheckScriptFailure(lines, "E1073:")
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200316enddef
317
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100318def DefListAll()
319 def
320enddef
321
322def DefListOne()
323 def DefListOne
324enddef
325
326def DefListMatches()
327 def /DefList
328enddef
329
330def Test_nested_def_list()
331 var funcs = split(execute('call DefListAll()'), "\n")
332 assert_true(len(funcs) > 10)
333 assert_true(funcs->index('def DefListAll()') >= 0)
334
335 funcs = split(execute('call DefListOne()'), "\n")
336 assert_equal([' def DefListOne()', '1 def DefListOne', ' enddef'], funcs)
337
338 funcs = split(execute('call DefListMatches()'), "\n")
339 assert_true(len(funcs) >= 3)
340 assert_true(funcs->index('def DefListAll()') >= 0)
341 assert_true(funcs->index('def DefListOne()') >= 0)
342 assert_true(funcs->index('def DefListMatches()') >= 0)
Bram Moolenaar54021752020-12-06 18:50:36 +0100343
344 var lines =<< trim END
345 vim9script
346 def Func()
347 def +Func+
348 enddef
349 defcompile
350 END
351 CheckScriptFailure(lines, 'E476:', 1)
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100352enddef
353
Bram Moolenaar333894b2020-08-01 18:53:07 +0200354def Test_global_local_function()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200355 var lines =<< trim END
Bram Moolenaar333894b2020-08-01 18:53:07 +0200356 vim9script
357 def g:Func(): string
358 return 'global'
359 enddef
360 def Func(): string
361 return 'local'
362 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200363 g:Func()->assert_equal('global')
364 Func()->assert_equal('local')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100365 delfunc g:Func
Bram Moolenaar333894b2020-08-01 18:53:07 +0200366 END
367 CheckScriptSuccess(lines)
Bram Moolenaar035d6e92020-08-11 22:30:42 +0200368
369 lines =<< trim END
370 vim9script
371 def g:Funcy()
372 echo 'funcy'
373 enddef
374 s:Funcy()
375 END
376 CheckScriptFailure(lines, 'E117:')
Bram Moolenaar333894b2020-08-01 18:53:07 +0200377enddef
378
Bram Moolenaar0f769812020-09-12 18:32:34 +0200379def Test_local_function_shadows_global()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200380 var lines =<< trim END
Bram Moolenaar0f769812020-09-12 18:32:34 +0200381 vim9script
382 def g:Gfunc(): string
383 return 'global'
384 enddef
385 def AnotherFunc(): number
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200386 var Gfunc = function('len')
Bram Moolenaar0f769812020-09-12 18:32:34 +0200387 return Gfunc('testing')
388 enddef
389 g:Gfunc()->assert_equal('global')
390 AnotherFunc()->assert_equal(7)
391 delfunc g:Gfunc
392 END
393 CheckScriptSuccess(lines)
394
395 lines =<< trim END
396 vim9script
397 def g:Func(): string
398 return 'global'
399 enddef
400 def AnotherFunc()
401 g:Func = function('len')
402 enddef
403 AnotherFunc()
404 END
405 CheckScriptFailure(lines, 'E705:')
406 delfunc g:Func
407enddef
408
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200409func TakesOneArg(arg)
410 echo a:arg
411endfunc
412
413def Test_call_wrong_args()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200414 CheckDefFailure(['TakesOneArg()'], 'E119:')
415 CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
416 CheckDefFailure(['bufnr(xxx)'], 'E1001:')
417 CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
Bram Moolenaaree8580e2020-08-28 17:19:07 +0200418
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200419 var lines =<< trim END
Bram Moolenaaree8580e2020-08-28 17:19:07 +0200420 vim9script
421 def Func(s: string)
422 echo s
423 enddef
424 Func([])
425 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200426 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 5)
Bram Moolenaarb185a402020-09-18 22:42:00 +0200427
428 lines =<< trim END
429 vim9script
430 def FuncOne(nr: number)
431 echo nr
432 enddef
433 def FuncTwo()
434 FuncOne()
435 enddef
436 defcompile
437 END
438 writefile(lines, 'Xscript')
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200439 var didCatch = false
Bram Moolenaarb185a402020-09-18 22:42:00 +0200440 try
441 source Xscript
442 catch
443 assert_match('E119: Not enough arguments for function: <SNR>\d\+_FuncOne', v:exception)
444 assert_match('Xscript\[8\]..function <SNR>\d\+_FuncTwo, line 1', v:throwpoint)
445 didCatch = true
446 endtry
447 assert_true(didCatch)
448
449 lines =<< trim END
450 vim9script
451 def FuncOne(nr: number)
452 echo nr
453 enddef
454 def FuncTwo()
455 FuncOne(1, 2)
456 enddef
457 defcompile
458 END
459 writefile(lines, 'Xscript')
460 didCatch = false
461 try
462 source Xscript
463 catch
464 assert_match('E118: Too many arguments for function: <SNR>\d\+_FuncOne', v:exception)
465 assert_match('Xscript\[8\]..function <SNR>\d\+_FuncTwo, line 1', v:throwpoint)
466 didCatch = true
467 endtry
468 assert_true(didCatch)
469
470 delete('Xscript')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200471enddef
472
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100473def Test_call_lambda_args()
474 CheckDefFailure(['echo {i -> 0}()'],
475 'E119: Not enough arguments for function: {i -> 0}()')
476
477 var lines =<< trim END
478 var Ref = {x: number, y: number -> x + y}
479 echo Ref(1, 'x')
480 END
481 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected number but got string')
482enddef
483
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200484" Default arg and varargs
485def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200486 var res = one .. ',' .. two
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200487 for s in rest
488 res ..= ',' .. s
489 endfor
490 return res
491enddef
492
493def Test_call_def_varargs()
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200494 assert_fails('MyDefVarargs()', 'E119:', '', 1, 'Test_call_def_varargs')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200495 MyDefVarargs('one')->assert_equal('one,foo')
496 MyDefVarargs('one', 'two')->assert_equal('one,two')
497 MyDefVarargs('one', 'two', 'three')->assert_equal('one,two,three')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200498 CheckDefFailure(['MyDefVarargs("one", 22)'],
Bram Moolenaar77072282020-09-16 17:55:40 +0200499 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200500 CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
Bram Moolenaar77072282020-09-16 17:55:40 +0200501 'E1013: Argument 3: type mismatch, expected string but got number')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200502
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200503 var lines =<< trim END
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200504 vim9script
505 def Func(...l: list<string>)
506 echo l
507 enddef
508 Func('a', 'b', 'c')
509 END
510 CheckScriptSuccess(lines)
511
512 lines =<< trim END
513 vim9script
514 def Func(...l: list<string>)
515 echo l
516 enddef
517 Func()
518 END
519 CheckScriptSuccess(lines)
520
521 lines =<< trim END
522 vim9script
Bram Moolenaar2f8cbc42020-09-16 17:22:59 +0200523 def Func(...l: any)
524 echo l
525 enddef
526 Func(0)
527 END
528 CheckScriptSuccess(lines)
529
530 lines =<< trim END
531 vim9script
Bram Moolenaar28022722020-09-21 22:02:49 +0200532 def Func(..._l: list<string>)
533 echo _l
534 enddef
535 Func('a', 'b', 'c')
536 END
537 CheckScriptSuccess(lines)
538
539 lines =<< trim END
540 vim9script
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200541 def Func(...l: list<string>)
542 echo l
543 enddef
544 Func(1, 2, 3)
545 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200546 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200547
548 lines =<< trim END
549 vim9script
550 def Func(...l: list<string>)
551 echo l
552 enddef
553 Func('a', 9)
554 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200555 CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200556
557 lines =<< trim END
558 vim9script
559 def Func(...l: list<string>)
560 echo l
561 enddef
562 Func(1, 'a')
563 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200564 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200565enddef
566
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200567let s:value = ''
568
569def FuncOneDefArg(opt = 'text')
570 s:value = opt
571enddef
572
573def FuncTwoDefArg(nr = 123, opt = 'text'): string
574 return nr .. opt
575enddef
576
577def FuncVarargs(...arg: list<string>): string
578 return join(arg, ',')
579enddef
580
581def Test_func_type_varargs()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200582 var RefDefArg: func(?string)
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200583 RefDefArg = FuncOneDefArg
584 RefDefArg()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200585 s:value->assert_equal('text')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200586 RefDefArg('some')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200587 s:value->assert_equal('some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200588
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200589 var RefDef2Arg: func(?number, ?string): string
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200590 RefDef2Arg = FuncTwoDefArg
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200591 RefDef2Arg()->assert_equal('123text')
592 RefDef2Arg(99)->assert_equal('99text')
593 RefDef2Arg(77, 'some')->assert_equal('77some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200594
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200595 CheckDefFailure(['var RefWrong: func(string?)'], 'E1010:')
596 CheckDefFailure(['var RefWrong: func(?string, string)'], 'E1007:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200597
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200598 var RefVarargs: func(...list<string>): string
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200599 RefVarargs = FuncVarargs
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200600 RefVarargs()->assert_equal('')
601 RefVarargs('one')->assert_equal('one')
602 RefVarargs('one', 'two')->assert_equal('one,two')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200603
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200604 CheckDefFailure(['var RefWrong: func(...list<string>, string)'], 'E110:')
605 CheckDefFailure(['var RefWrong: func(...list<string>, ?string)'], 'E110:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200606enddef
607
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200608" Only varargs
609def MyVarargsOnly(...args: list<string>): string
610 return join(args, ',')
611enddef
612
613def Test_call_varargs_only()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200614 MyVarargsOnly()->assert_equal('')
615 MyVarargsOnly('one')->assert_equal('one')
616 MyVarargsOnly('one', 'two')->assert_equal('one,two')
Bram Moolenaar77072282020-09-16 17:55:40 +0200617 CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: Argument 1: type mismatch, expected string but got number')
618 CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200619enddef
620
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200621def Test_using_var_as_arg()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200622 writefile(['def Func(x: number)', 'var x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200623 assert_fails('so Xdef', 'E1006:', '', 1, 'Func')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200624 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200625enddef
626
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200627def DictArg(arg: dict<string>)
628 arg['key'] = 'value'
629enddef
630
631def ListArg(arg: list<string>)
632 arg[0] = 'value'
633enddef
634
635def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200636 # works for dict and list
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200637 var d: dict<string> = {}
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200638 DictArg(d)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200639 d['key']->assert_equal('value')
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200640 var l: list<string> = []
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200641 ListArg(l)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200642 l[0]->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200643
Bram Moolenaard2c61702020-09-06 15:58:36 +0200644 CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100645 delfunc! g:Func
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200646enddef
647
Bram Moolenaarb816dae2020-09-20 22:04:00 +0200648" These argument names are reserved in legacy functions.
649def WithReservedNames(firstline: string, lastline: string): string
650 return firstline .. lastline
651enddef
652
653def Test_argument_names()
654 assert_equal('OK', WithReservedNames('O', 'K'))
655enddef
656
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200657def Test_call_func_defined_later()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200658 g:DefinedLater('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200659 assert_fails('NotDefined("one")', 'E117:', '', 2, 'Test_call_func_defined_later')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200660enddef
661
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200662func DefinedLater(arg)
663 return a:arg
664endfunc
665
666def Test_call_funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200667 g:SomeFunc('abc')->assert_equal(3)
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200668 assert_fails('NotAFunc()', 'E117:', '', 2, 'Test_call_funcref') # comment after call
669 assert_fails('g:NotAFunc()', 'E117:', '', 3, 'Test_call_funcref')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200670
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200671 var lines =<< trim END
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200672 vim9script
673 def RetNumber(): number
674 return 123
675 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200676 var Funcref: func: number = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200677 Funcref()->assert_equal(123)
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200678 END
679 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200680
681 lines =<< trim END
682 vim9script
683 def RetNumber(): number
684 return 123
685 enddef
686 def Bar(F: func: number): number
687 return F()
688 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200689 var Funcref = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200690 Bar(Funcref)->assert_equal(123)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200691 END
692 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200693
694 lines =<< trim END
695 vim9script
696 def UseNumber(nr: number)
697 echo nr
698 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200699 var Funcref: func(number) = function('UseNumber')
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200700 Funcref(123)
701 END
702 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200703
704 lines =<< trim END
705 vim9script
706 def UseNumber(nr: number)
707 echo nr
708 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200709 var Funcref: func(string) = function('UseNumber')
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200710 END
Bram Moolenaar5e654232020-09-16 15:22:00 +0200711 CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200712
713 lines =<< trim END
714 vim9script
715 def EchoNr(nr = 34)
716 g:echo = nr
717 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200718 var Funcref: func(?number) = function('EchoNr')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200719 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200720 g:echo->assert_equal(34)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200721 Funcref(123)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200722 g:echo->assert_equal(123)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200723 END
724 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200725
726 lines =<< trim END
727 vim9script
728 def EchoList(...l: list<number>)
729 g:echo = l
730 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200731 var Funcref: func(...list<number>) = function('EchoList')
Bram Moolenaarace61322020-07-26 18:16:58 +0200732 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200733 g:echo->assert_equal([])
Bram Moolenaarace61322020-07-26 18:16:58 +0200734 Funcref(1, 2, 3)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200735 g:echo->assert_equal([1, 2, 3])
Bram Moolenaarace61322020-07-26 18:16:58 +0200736 END
737 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200738
739 lines =<< trim END
740 vim9script
741 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
742 g:optarg = opt
743 g:listarg = l
744 return nr
745 enddef
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200746 var Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200747 Funcref(10)->assert_equal(10)
748 g:optarg->assert_equal(12)
749 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200750
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200751 Funcref(11, 22)->assert_equal(11)
752 g:optarg->assert_equal(22)
753 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200754
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200755 Funcref(17, 18, 1, 2, 3)->assert_equal(17)
756 g:optarg->assert_equal(18)
757 g:listarg->assert_equal([1, 2, 3])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200758 END
759 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200760enddef
761
762let SomeFunc = function('len')
763let NotAFunc = 'text'
764
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200765def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200766 # same arguments, different return type
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200767 var Ref1: func(bool): string
768 var Ref2: func(bool): number
769 var Ref3: func(bool): any
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200770 Ref3 = g:cond ? Ref1 : Ref2
771
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200772 # different number of arguments
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200773 var Refa1: func(bool): number
774 var Refa2: func(bool, number): number
775 var Refa3: func: number
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200776 Refa3 = g:cond ? Refa1 : Refa2
777
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200778 # different argument types
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200779 var Refb1: func(bool, string): number
780 var Refb2: func(string, number): number
781 var Refb3: func(any, any): number
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200782 Refb3 = g:cond ? Refb1 : Refb2
783enddef
784
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200785def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200786 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200787enddef
788
789def DefinedEvenLater(arg: string): string
790 return arg
791enddef
792
793def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200794 # Error in called function requires unwinding the call stack.
Bram Moolenaar44d66522020-09-06 22:26:57 +0200795 assert_fails('FuncWithForwardCall()', 'E1096:', '', 1, 'FuncWithForwardCall')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200796enddef
797
798def Test_return_type_wrong()
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200799 CheckScriptFailure([
800 'def Func(): number',
801 'return "a"',
802 'enddef',
803 'defcompile'], 'expected number but got string')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100804 delfunc! g:Func
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200805 CheckScriptFailure([
806 'def Func(): string',
807 'return 1',
808 'enddef',
809 'defcompile'], 'expected string but got number')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100810 delfunc! g:Func
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200811 CheckScriptFailure([
812 'def Func(): void',
813 'return "a"',
814 'enddef',
815 'defcompile'],
816 'E1096: Returning a value in a function without a return type')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100817 delfunc! g:Func
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200818 CheckScriptFailure([
819 'def Func()',
820 'return "a"',
821 'enddef',
822 'defcompile'],
823 'E1096: Returning a value in a function without a return type')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100824 delfunc! g:Func
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200825
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200826 CheckScriptFailure([
827 'def Func(): number',
828 'return',
829 'enddef',
830 'defcompile'], 'E1003:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100831 delfunc! g:Func
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200832
833 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100834 delfunc! g:Func
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200835 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100836 delfunc! g:Func
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200837 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +0100838 delfunc! g:Func
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200839
840 CheckScriptFailure([
841 'vim9script',
842 'def FuncB()',
843 ' return 123',
844 'enddef',
845 'def FuncA()',
846 ' FuncB()',
847 'enddef',
848 'defcompile'], 'E1096:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200849enddef
850
851def Test_arg_type_wrong()
852 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200853 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200854 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200855 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200856enddef
857
858def Test_vim9script_call()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200859 var lines =<< trim END
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200860 vim9script
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200861 var name = ''
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200862 def MyFunc(arg: string)
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200863 name = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200864 enddef
865 MyFunc('foobar')
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200866 name->assert_equal('foobar')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200867
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200868 var str = 'barfoo'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200869 str->MyFunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200870 name->assert_equal('barfoo')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200871
Bram Moolenaar67979662020-06-20 22:50:47 +0200872 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200873 g:value->MyFunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200874 name->assert_equal('value')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200875
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200876 var listvar = []
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200877 def ListFunc(arg: list<number>)
878 listvar = arg
879 enddef
880 [1, 2, 3]->ListFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200881 listvar->assert_equal([1, 2, 3])
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200882
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200883 var dictvar = {}
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200884 def DictFunc(arg: dict<number>)
885 dictvar = arg
886 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +0100887 {a: 1, b: 2}->DictFunc()
888 dictvar->assert_equal({a: 1, b: 2})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200889 def CompiledDict()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100890 {a: 3, b: 4}->DictFunc()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200891 enddef
892 CompiledDict()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100893 dictvar->assert_equal({a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200894
Bram Moolenaare0de1712020-12-02 17:36:54 +0100895 {a: 3, b: 4}->DictFunc()
896 dictvar->assert_equal({a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200897
898 ('text')->MyFunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200899 name->assert_equal('text')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200900 ("some")->MyFunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200901 name->assert_equal('some')
Bram Moolenaare6b53242020-07-01 17:28:33 +0200902
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200903 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200904 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200905 'asdfasdf'->MyFunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200906 name->assert_equal('asdfasdf')
Bram Moolenaar10409562020-07-29 20:00:38 +0200907 "xyz"->MyFunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200908 name->assert_equal('xyz')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200909
910 def UseString()
911 'xyork'->MyFunc()
912 enddef
913 UseString()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200914 name->assert_equal('xyork')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200915
Bram Moolenaar10409562020-07-29 20:00:38 +0200916 def UseString2()
917 "knife"->MyFunc()
918 enddef
919 UseString2()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200920 name->assert_equal('knife')
Bram Moolenaar10409562020-07-29 20:00:38 +0200921
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200922 # prepending a colon makes it a mark
923 new
924 setline(1, ['aaa', 'bbb', 'ccc'])
925 normal! 3Gmt1G
926 :'t
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200927 getcurpos()[1]->assert_equal(3)
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200928 bwipe!
929
Bram Moolenaare6b53242020-07-01 17:28:33 +0200930 MyFunc(
931 'continued'
932 )
933 assert_equal('continued',
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200934 name
Bram Moolenaare6b53242020-07-01 17:28:33 +0200935 )
936
937 call MyFunc(
938 'more'
939 ..
940 'lines'
941 )
942 assert_equal(
943 'morelines',
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200944 name)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200945 END
946 writefile(lines, 'Xcall.vim')
947 source Xcall.vim
948 delete('Xcall.vim')
949enddef
950
951def Test_vim9script_call_fail_decl()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200952 var lines =<< trim END
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200953 vim9script
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200954 var name = ''
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200955 def MyFunc(arg: string)
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200956 var name = 123
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200957 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200958 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200959 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200960 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200961enddef
962
Bram Moolenaar65b95452020-07-19 14:03:09 +0200963def Test_vim9script_call_fail_type()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200964 var lines =<< trim END
Bram Moolenaar65b95452020-07-19 14:03:09 +0200965 vim9script
966 def MyFunc(arg: string)
967 echo arg
968 enddef
969 MyFunc(1234)
970 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200971 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
Bram Moolenaar65b95452020-07-19 14:03:09 +0200972enddef
973
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200974def Test_vim9script_call_fail_const()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +0200975 var lines =<< trim END
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200976 vim9script
977 const var = ''
978 def MyFunc(arg: string)
979 var = 'asdf'
980 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200981 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200982 END
983 writefile(lines, 'Xcall_const.vim')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200984 assert_fails('source Xcall_const.vim', 'E46:', '', 1, 'MyFunc')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200985 delete('Xcall_const.vim')
986enddef
987
988" Test that inside :function a Python function can be defined, :def is not
989" recognized.
990func Test_function_python()
991 CheckFeature python3
Bram Moolenaar727345e2020-09-27 23:33:59 +0200992 let py = 'python3'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200993 execute py "<< EOF"
994def do_something():
995 return 1
996EOF
997endfunc
998
999def Test_delfunc()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001000 var lines =<< trim END
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001001 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001002 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001003 echo 'hello'
1004 enddef
1005
1006 def CallGoneSoon()
1007 GoneSoon()
1008 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001009 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001010
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001011 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001012 CallGoneSoon()
1013 END
1014 writefile(lines, 'XToDelFunc')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +02001015 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
1016 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001017
1018 delete('XToDelFunc')
1019enddef
1020
1021def Test_redef_failure()
Bram Moolenaard2c61702020-09-06 15:58:36 +02001022 writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001023 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +02001024 writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001025 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +02001026 writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +02001027 assert_fails('so Xdef', 'E1027:', '', 1, 'Func0')
Bram Moolenaard2c61702020-09-06 15:58:36 +02001028 writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001029 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +02001030 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001031
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001032 g:Func0()->assert_equal(0)
1033 g:Func1()->assert_equal('Func1')
1034 g:Func2()->assert_equal('Func2')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001035
1036 delfunc! Func0
1037 delfunc! Func1
1038 delfunc! Func2
1039enddef
1040
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001041def Test_vim9script_func()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001042 var lines =<< trim END
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001043 vim9script
1044 func Func(arg)
1045 echo a:arg
1046 endfunc
1047 Func('text')
1048 END
1049 writefile(lines, 'XVim9Func')
1050 so XVim9Func
1051
1052 delete('XVim9Func')
1053enddef
1054
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001055let s:funcResult = 0
1056
1057def FuncNoArgNoRet()
Bram Moolenaar53900992020-08-22 19:02:02 +02001058 s:funcResult = 11
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001059enddef
1060
1061def FuncNoArgRetNumber(): number
Bram Moolenaar53900992020-08-22 19:02:02 +02001062 s:funcResult = 22
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001063 return 1234
1064enddef
1065
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001066def FuncNoArgRetString(): string
Bram Moolenaar53900992020-08-22 19:02:02 +02001067 s:funcResult = 45
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001068 return 'text'
1069enddef
1070
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001071def FuncOneArgNoRet(arg: number)
Bram Moolenaar53900992020-08-22 19:02:02 +02001072 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001073enddef
1074
1075def FuncOneArgRetNumber(arg: number): number
Bram Moolenaar53900992020-08-22 19:02:02 +02001076 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001077 return arg
1078enddef
1079
Bram Moolenaar08938ee2020-04-11 23:17:17 +02001080def FuncTwoArgNoRet(one: bool, two: number)
Bram Moolenaar53900992020-08-22 19:02:02 +02001081 s:funcResult = two
Bram Moolenaar08938ee2020-04-11 23:17:17 +02001082enddef
1083
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001084def FuncOneArgRetString(arg: string): string
1085 return arg
1086enddef
1087
Bram Moolenaar89228602020-04-05 22:14:54 +02001088def FuncOneArgRetAny(arg: any): any
1089 return arg
1090enddef
1091
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001092def Test_func_type()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001093 var Ref1: func()
Bram Moolenaar53900992020-08-22 19:02:02 +02001094 s:funcResult = 0
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001095 Ref1 = FuncNoArgNoRet
1096 Ref1()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001097 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001098
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001099 var Ref2: func
Bram Moolenaar53900992020-08-22 19:02:02 +02001100 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001101 Ref2 = FuncNoArgNoRet
1102 Ref2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001103 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001104
Bram Moolenaar53900992020-08-22 19:02:02 +02001105 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001106 Ref2 = FuncOneArgNoRet
1107 Ref2(12)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001108 s:funcResult->assert_equal(12)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001109
Bram Moolenaar53900992020-08-22 19:02:02 +02001110 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001111 Ref2 = FuncNoArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001112 Ref2()->assert_equal(1234)
1113 s:funcResult->assert_equal(22)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001114
Bram Moolenaar53900992020-08-22 19:02:02 +02001115 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001116 Ref2 = FuncOneArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001117 Ref2(13)->assert_equal(13)
1118 s:funcResult->assert_equal(13)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001119enddef
1120
Bram Moolenaar9978d472020-07-05 16:01:56 +02001121def Test_repeat_return_type()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001122 var res = 0
Bram Moolenaar9978d472020-07-05 16:01:56 +02001123 for n in repeat([1], 3)
1124 res += n
1125 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001126 res->assert_equal(3)
Bram Moolenaarfce82b32020-07-05 16:07:21 +02001127
1128 res = 0
1129 for n in add([1, 2], 3)
1130 res += n
1131 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001132 res->assert_equal(6)
Bram Moolenaar9978d472020-07-05 16:01:56 +02001133enddef
1134
Bram Moolenaar846178a2020-07-05 17:04:13 +02001135def Test_argv_return_type()
1136 next fileone filetwo
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001137 var res = ''
Bram Moolenaar846178a2020-07-05 17:04:13 +02001138 for name in argv()
1139 res ..= name
1140 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001141 res->assert_equal('fileonefiletwo')
Bram Moolenaar846178a2020-07-05 17:04:13 +02001142enddef
1143
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001144def Test_func_type_part()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001145 var RefVoid: func: void
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001146 RefVoid = FuncNoArgNoRet
1147 RefVoid = FuncOneArgNoRet
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001148 CheckDefFailure(['var RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number')
1149 CheckDefFailure(['var RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001150
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001151 var RefAny: func(): any
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001152 RefAny = FuncNoArgRetNumber
1153 RefAny = FuncNoArgRetString
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001154 CheckDefFailure(['var RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()')
1155 CheckDefFailure(['var RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001156
Bram Moolenaar6abd3dc2020-10-04 14:17:32 +02001157 var RefAnyNoArgs: func: any = RefAny
1158
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001159 var RefNr: func: number
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001160 RefNr = FuncNoArgRetNumber
1161 RefNr = FuncOneArgRetNumber
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001162 CheckDefFailure(['var RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()')
1163 CheckDefFailure(['var RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001164
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001165 var RefStr: func: string
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001166 RefStr = FuncNoArgRetString
1167 RefStr = FuncOneArgRetString
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001168 CheckDefFailure(['var RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()')
1169 CheckDefFailure(['var RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001170enddef
1171
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001172def Test_func_type_fails()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001173 CheckDefFailure(['var ref1: func()'], 'E704:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001174
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001175 CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number')
1176 CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)')
1177 CheckDefFailure(['var Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
1178 CheckDefFailure(['var Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
1179 CheckDefFailure(['var Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
1180 CheckDefFailure(['var Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(...bool) but got func(bool, number)')
Bram Moolenaar08938ee2020-04-11 23:17:17 +02001181
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001182 CheckDefFailure(['var RefWrong: func(string ,number)'], 'E1068:')
1183 CheckDefFailure(['var RefWrong: func(string,number)'], 'E1069:')
1184 CheckDefFailure(['var RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E1005:')
1185 CheckDefFailure(['var RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001186enddef
1187
Bram Moolenaar89228602020-04-05 22:14:54 +02001188def Test_func_return_type()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001189 var nr: number
Bram Moolenaar89228602020-04-05 22:14:54 +02001190 nr = FuncNoArgRetNumber()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001191 nr->assert_equal(1234)
Bram Moolenaar89228602020-04-05 22:14:54 +02001192
1193 nr = FuncOneArgRetAny(122)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001194 nr->assert_equal(122)
Bram Moolenaar89228602020-04-05 22:14:54 +02001195
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001196 var str: string
Bram Moolenaar89228602020-04-05 22:14:54 +02001197 str = FuncOneArgRetAny('yes')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001198 str->assert_equal('yes')
Bram Moolenaar89228602020-04-05 22:14:54 +02001199
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001200 CheckDefFailure(['var str: string', 'str = FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number')
Bram Moolenaar89228602020-04-05 22:14:54 +02001201enddef
1202
Bram Moolenaar6abd3dc2020-10-04 14:17:32 +02001203def Test_func_common_type()
1204 def FuncOne(n: number): number
1205 return n
1206 enddef
1207 def FuncTwo(s: string): number
1208 return len(s)
1209 enddef
1210 def FuncThree(n: number, s: string): number
1211 return n + len(s)
1212 enddef
1213 var list = [FuncOne, FuncTwo, FuncThree]
1214 assert_equal(8, list[0](8))
1215 assert_equal(4, list[1]('word'))
1216 assert_equal(7, list[2](3, 'word'))
1217enddef
1218
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001219def MultiLine(
1220 arg1: string,
1221 arg2 = 1234,
1222 ...rest: list<string>
1223 ): string
1224 return arg1 .. arg2 .. join(rest, '-')
1225enddef
1226
Bram Moolenaar2c330432020-04-13 14:41:35 +02001227def MultiLineComment(
1228 arg1: string, # comment
1229 arg2 = 1234, # comment
1230 ...rest: list<string> # comment
1231 ): string # comment
1232 return arg1 .. arg2 .. join(rest, '-')
1233enddef
1234
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001235def Test_multiline()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001236 MultiLine('text')->assert_equal('text1234')
1237 MultiLine('text', 777)->assert_equal('text777')
1238 MultiLine('text', 777, 'one')->assert_equal('text777one')
1239 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001240enddef
1241
Bram Moolenaar23e03252020-04-12 22:22:31 +02001242func Test_multiline_not_vim9()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001243 call MultiLine('text')->assert_equal('text1234')
1244 call MultiLine('text', 777)->assert_equal('text777')
1245 call MultiLine('text', 777, 'one')->assert_equal('text777one')
1246 call MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar23e03252020-04-12 22:22:31 +02001247endfunc
1248
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001249
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001250" When using CheckScriptFailure() for the below test, E1010 is generated instead
1251" of E1056.
1252func Test_E1056_1059()
1253 let caught_1056 = 0
1254 try
1255 def F():
1256 return 1
1257 enddef
1258 catch /E1056:/
1259 let caught_1056 = 1
1260 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001261 eval caught_1056->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001262
1263 let caught_1059 = 0
1264 try
1265 def F5(items : list)
1266 echo 'a'
1267 enddef
1268 catch /E1059:/
1269 let caught_1059 = 1
1270 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001271 eval caught_1059->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001272endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001273
Bram Moolenaar015f4262020-05-05 21:25:22 +02001274func DelMe()
1275 echo 'DelMe'
1276endfunc
1277
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001278def Test_error_reporting()
1279 # comment lines at the start of the function
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001280 var lines =<< trim END
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001281 " comment
1282 def Func()
1283 # comment
1284 # comment
1285 invalid
1286 enddef
1287 defcompile
1288 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001289 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001290 try
1291 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001292 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001293 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001294 v:exception->assert_match('Invalid command: invalid')
1295 v:throwpoint->assert_match(', line 3$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001296 endtry
Bram Moolenaar2d870f82020-12-05 13:41:01 +01001297 delfunc! g:Func
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001298
1299 # comment lines after the start of the function
1300 lines =<< trim END
1301 " comment
1302 def Func()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001303 var x = 1234
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001304 # comment
1305 # comment
1306 invalid
1307 enddef
1308 defcompile
1309 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001310 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001311 try
1312 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001313 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001314 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001315 v:exception->assert_match('Invalid command: invalid')
1316 v:throwpoint->assert_match(', line 4$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001317 endtry
Bram Moolenaar2d870f82020-12-05 13:41:01 +01001318 delfunc! g:Func
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001319
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001320 lines =<< trim END
1321 vim9script
1322 def Func()
Bram Moolenaare0de1712020-12-02 17:36:54 +01001323 var db = {foo: 1, bar: 2}
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001324 # comment
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001325 var x = db.asdf
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001326 enddef
1327 defcompile
1328 Func()
1329 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001330 writefile(lines, 'Xdef')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001331 try
1332 source Xdef
1333 assert_report('should have failed')
1334 catch /E716:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001335 v:throwpoint->assert_match('_Func, line 3$')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001336 endtry
Bram Moolenaar2d870f82020-12-05 13:41:01 +01001337 delfunc! g:Func
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001338
Bram Moolenaar08052222020-09-14 17:04:31 +02001339 delete('Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001340enddef
1341
Bram Moolenaar015f4262020-05-05 21:25:22 +02001342def Test_deleted_function()
1343 CheckDefExecFailure([
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001344 'var RefMe: func = function("g:DelMe")',
Bram Moolenaar015f4262020-05-05 21:25:22 +02001345 'delfunc g:DelMe',
1346 'echo RefMe()'], 'E117:')
1347enddef
1348
1349def Test_unknown_function()
1350 CheckDefExecFailure([
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001351 'var Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001352 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +02001353enddef
1354
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001355def RefFunc(Ref: func(string): string): string
1356 return Ref('more')
1357enddef
1358
1359def Test_closure_simple()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001360 var local = 'some '
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001361 RefFunc({s -> local .. s})->assert_equal('some more')
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001362enddef
1363
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001364def MakeRef()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001365 var local = 'some '
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001366 g:Ref = {s -> local .. s}
1367enddef
1368
1369def Test_closure_ref_after_return()
1370 MakeRef()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001371 g:Ref('thing')->assert_equal('some thing')
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001372 unlet g:Ref
1373enddef
1374
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001375def MakeTwoRefs()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001376 var local = ['some']
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001377 g:Extend = {s -> local->add(s)}
1378 g:Read = {-> local}
1379enddef
1380
1381def Test_closure_two_refs()
1382 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001383 join(g:Read(), ' ')->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001384 g:Extend('more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001385 join(g:Read(), ' ')->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001386 g:Extend('even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001387 join(g:Read(), ' ')->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001388
1389 unlet g:Extend
1390 unlet g:Read
1391enddef
1392
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001393def ReadRef(Ref: func(): list<string>): string
1394 return join(Ref(), ' ')
1395enddef
1396
Bram Moolenaar5e654232020-09-16 15:22:00 +02001397def ExtendRef(Ref: func(string): list<string>, add: string)
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001398 Ref(add)
1399enddef
1400
1401def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001402 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001403 ReadRef(g:Read)->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001404 ExtendRef(g:Extend, 'more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001405 ReadRef(g:Read)->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001406 ExtendRef(g:Extend, 'even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001407 ReadRef(g:Read)->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001408
1409 unlet g:Extend
1410 unlet g:Read
1411enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001412
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001413def MakeArgRefs(theArg: string)
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001414 var local = 'loc_val'
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001415 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1416enddef
1417
1418def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001419 var local = 'the_loc'
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001420 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1421enddef
1422
1423def Test_closure_using_argument()
1424 MakeArgRefs('arg_val')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001425 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001426
1427 MakeArgRefsVarargs('arg_val', 'one', 'two')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001428 g:UseVararg('call_val')->assert_equal('arg_val/the_loc/call_val/one two')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001429
1430 unlet g:UseArg
1431 unlet g:UseVararg
1432enddef
1433
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +02001434def MakeGetAndAppendRefs()
1435 var local = 'a'
1436
1437 def Append(arg: string)
1438 local ..= arg
1439 enddef
1440 g:Append = Append
1441
1442 def Get(): string
1443 return local
1444 enddef
1445 g:Get = Get
1446enddef
1447
1448def Test_closure_append_get()
1449 MakeGetAndAppendRefs()
1450 g:Get()->assert_equal('a')
1451 g:Append('-b')
1452 g:Get()->assert_equal('a-b')
1453 g:Append('-c')
1454 g:Get()->assert_equal('a-b-c')
1455
1456 unlet g:Append
1457 unlet g:Get
1458enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001459
Bram Moolenaar04b12692020-05-04 23:24:44 +02001460def Test_nested_closure()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001461 var local = 'text'
Bram Moolenaar04b12692020-05-04 23:24:44 +02001462 def Closure(arg: string): string
1463 return local .. arg
1464 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001465 Closure('!!!')->assert_equal('text!!!')
Bram Moolenaar04b12692020-05-04 23:24:44 +02001466enddef
1467
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001468func GetResult(Ref)
1469 return a:Ref('some')
1470endfunc
1471
1472def Test_call_closure_not_compiled()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001473 var text = 'text'
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001474 g:Ref = {s -> s .. text}
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001475 GetResult(g:Ref)->assert_equal('sometext')
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001476enddef
1477
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001478def Test_double_closure_fails()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001479 var lines =<< trim END
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001480 vim9script
1481 def Func()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001482 var name = 0
1483 for i in range(2)
1484 timer_start(0, {-> name})
1485 endfor
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001486 enddef
1487 Func()
1488 END
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001489 CheckScriptSuccess(lines)
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001490enddef
1491
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +02001492def Test_nested_closure_used()
1493 var lines =<< trim END
1494 vim9script
1495 def Func()
1496 var x = 'hello'
1497 var Closure = {-> x}
1498 g:Myclosure = {-> Closure()}
1499 enddef
1500 Func()
1501 assert_equal('hello', g:Myclosure())
1502 END
1503 CheckScriptSuccess(lines)
1504enddef
Bram Moolenaar0876c782020-10-07 19:08:04 +02001505
Bram Moolenaarc70bdab2020-09-26 19:59:38 +02001506def Test_nested_closure_fails()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001507 var lines =<< trim END
Bram Moolenaarc70bdab2020-09-26 19:59:38 +02001508 vim9script
1509 def FuncA()
1510 FuncB(0)
1511 enddef
1512 def FuncB(n: number): list<string>
1513 return map([0], {_, v -> n})
1514 enddef
1515 FuncA()
1516 END
1517 CheckScriptFailure(lines, 'E1012:')
1518enddef
1519
Bram Moolenaar34c54eb2020-11-25 19:15:19 +01001520def Test_failure_in_called_function()
1521 # this was using the frame index as the return value
1522 var lines =<< trim END
1523 vim9script
1524 au TerminalWinOpen * eval [][0]
1525 def PopupTerm(a: any)
1526 # make sure typvals on stack are string
1527 ['a', 'b', 'c', 'd', 'e', 'f', 'g']->join()
1528 FireEvent()
1529 enddef
1530 def FireEvent()
1531 do TerminalWinOpen
1532 enddef
1533 # use try/catch to make eval fail
1534 try
1535 call PopupTerm(0)
1536 catch
1537 endtry
1538 au! TerminalWinOpen
1539 END
1540 CheckScriptSuccess(lines)
1541enddef
1542
Bram Moolenaar5366e1a2020-10-01 13:01:34 +02001543def Test_nested_lambda()
1544 var lines =<< trim END
1545 vim9script
1546 def Func()
1547 var x = 4
1548 var Lambda1 = {-> 7}
1549 var Lambda2 = {-> [Lambda1(), x]}
1550 var res = Lambda2()
1551 assert_equal([7, 4], res)
1552 enddef
1553 Func()
1554 END
1555 CheckScriptSuccess(lines)
1556enddef
1557
Bram Moolenaar52bf81c2020-11-17 18:50:44 +01001558def Shadowed(): list<number>
1559 var FuncList: list<func: number> = [{ -> 42}]
1560 return FuncList->map({_, Shadowed -> Shadowed()})
1561enddef
1562
1563def Test_lambda_arg_shadows_func()
1564 assert_equal([42], Shadowed())
1565enddef
1566
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001567def Line_continuation_in_def(dir: string = ''): string
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001568 var path: string = empty(dir)
1569 \ ? 'empty'
1570 \ : 'full'
1571 return path
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001572enddef
1573
1574def Test_line_continuation_in_def()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001575 Line_continuation_in_def('.')->assert_equal('full')
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001576enddef
1577
Bram Moolenaar2ea95b62020-11-19 21:47:56 +01001578def Test_script_var_in_lambda()
1579 var lines =<< trim END
1580 vim9script
1581 var script = 'test'
1582 assert_equal(['test'], map(['one'], {-> script}))
1583 END
1584 CheckScriptSuccess(lines)
1585enddef
1586
Bram Moolenaar5e654232020-09-16 15:22:00 +02001587def Line_continuation_in_lambda(): list<string>
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001588 var x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001589 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001590 ->toupper()})
1591 ->reverse()
1592 return x
1593enddef
1594
1595def Test_line_continuation_in_lambda()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001596 Line_continuation_in_lambda()->assert_equal(['D', 'C', 'B', 'A'])
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001597enddef
1598
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001599func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001600 CheckScreendump
1601
1602 let lines =<< trim END
1603 vim9script
1604 def EchoNothing()
1605 silent echo ''
1606 enddef
1607 defcompile
1608 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001609 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001610
1611 " Check that the balloon shows up after a mouse move
1612 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001613 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001614 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1615
1616 " clean up
1617 call StopVimInTerminal(buf)
1618 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001619endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001620
Bram Moolenaar171fb922020-10-28 16:54:47 +01001621def SilentlyError()
1622 execute('silent! invalid')
1623 g:did_it = 'yes'
1624enddef
1625
Bram Moolenaar28ee8922020-10-28 20:20:00 +01001626func UserError()
1627 silent! invalid
1628endfunc
1629
1630def SilentlyUserError()
1631 UserError()
1632 g:did_it = 'yes'
1633enddef
Bram Moolenaar171fb922020-10-28 16:54:47 +01001634
1635" This can't be a :def function, because the assert would not be reached.
Bram Moolenaar171fb922020-10-28 16:54:47 +01001636func Test_ignore_silent_error()
1637 let g:did_it = 'no'
1638 call SilentlyError()
1639 call assert_equal('yes', g:did_it)
1640
Bram Moolenaar28ee8922020-10-28 20:20:00 +01001641 let g:did_it = 'no'
1642 call SilentlyUserError()
1643 call assert_equal('yes', g:did_it)
Bram Moolenaar171fb922020-10-28 16:54:47 +01001644
1645 unlet g:did_it
1646endfunc
1647
Bram Moolenaarcd030c42020-10-30 21:49:40 +01001648def Test_ignore_silent_error_in_filter()
1649 var lines =<< trim END
1650 vim9script
1651 def Filter(winid: number, key: string): bool
1652 if key == 'o'
1653 silent! eval [][0]
1654 return true
1655 endif
1656 return popup_filter_menu(winid, key)
1657 enddef
1658
Bram Moolenaare0de1712020-12-02 17:36:54 +01001659 popup_create('popup', {filter: Filter})
Bram Moolenaarcd030c42020-10-30 21:49:40 +01001660 feedkeys("o\r", 'xnt')
1661 END
1662 CheckScriptSuccess(lines)
1663enddef
1664
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001665def Fibonacci(n: number): number
1666 if n < 2
1667 return n
1668 else
1669 return Fibonacci(n - 1) + Fibonacci(n - 2)
1670 endif
1671enddef
1672
Bram Moolenaar985116a2020-07-12 17:31:09 +02001673def Test_recursive_call()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001674 Fibonacci(20)->assert_equal(6765)
Bram Moolenaar985116a2020-07-12 17:31:09 +02001675enddef
1676
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001677def TreeWalk(dir: string): list<any>
1678 return readdir(dir)->map({_, val ->
1679 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaar2bede172020-11-19 18:53:18 +01001680 ? {[val]: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001681 : val
1682 })
1683enddef
1684
1685def Test_closure_in_map()
1686 mkdir('XclosureDir/tdir', 'p')
1687 writefile(['111'], 'XclosureDir/file1')
1688 writefile(['222'], 'XclosureDir/file2')
1689 writefile(['333'], 'XclosureDir/tdir/file3')
1690
Bram Moolenaare0de1712020-12-02 17:36:54 +01001691 TreeWalk('XclosureDir')->assert_equal(['file1', 'file2', {tdir: ['file3']}])
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001692
1693 delete('XclosureDir', 'rf')
1694enddef
1695
Bram Moolenaar7b5d5442020-10-04 13:42:34 +02001696def Test_invalid_function_name()
1697 var lines =<< trim END
1698 vim9script
1699 def s: list<string>
1700 END
1701 CheckScriptFailure(lines, 'E129:')
1702
1703 lines =<< trim END
1704 vim9script
1705 def g: list<string>
1706 END
1707 CheckScriptFailure(lines, 'E129:')
1708
1709 lines =<< trim END
1710 vim9script
1711 def <SID>: list<string>
1712 END
1713 CheckScriptFailure(lines, 'E884:')
1714
1715 lines =<< trim END
1716 vim9script
1717 def F list<string>
1718 END
1719 CheckScriptFailure(lines, 'E488:')
1720enddef
1721
Bram Moolenaara90afb92020-07-15 22:38:56 +02001722def Test_partial_call()
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001723 var Xsetlist = function('setloclist', [0])
Bram Moolenaare0de1712020-12-02 17:36:54 +01001724 Xsetlist([], ' ', {title: 'test'})
1725 getloclist(0, {title: 1})->assert_equal({title: 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001726
1727 Xsetlist = function('setloclist', [0, [], ' '])
Bram Moolenaare0de1712020-12-02 17:36:54 +01001728 Xsetlist({title: 'test'})
1729 getloclist(0, {title: 1})->assert_equal({title: 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001730
1731 Xsetlist = function('setqflist')
Bram Moolenaare0de1712020-12-02 17:36:54 +01001732 Xsetlist([], ' ', {title: 'test'})
1733 getqflist({title: 1})->assert_equal({title: 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001734
1735 Xsetlist = function('setqflist', [[], ' '])
Bram Moolenaare0de1712020-12-02 17:36:54 +01001736 Xsetlist({title: 'test'})
1737 getqflist({title: 1})->assert_equal({title: 'test'})
Bram Moolenaar6abd3dc2020-10-04 14:17:32 +02001738
1739 var Len: func: number = function('len', ['word'])
1740 assert_equal(4, Len())
Bram Moolenaara90afb92020-07-15 22:38:56 +02001741enddef
1742
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001743def Test_cmd_modifier()
1744 tab echo '0'
Bram Moolenaard2c61702020-09-06 15:58:36 +02001745 CheckDefFailure(['5tab echo 3'], 'E16:')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001746enddef
1747
1748def Test_restore_modifiers()
1749 # check that when compiling a :def function command modifiers are not messed
1750 # up.
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02001751 var lines =<< trim END
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001752 vim9script
1753 set eventignore=
1754 autocmd QuickFixCmdPost * copen
1755 def AutocmdsDisabled()
Bram Moolenaar6cf7e3b2020-10-28 14:31:16 +01001756 eval 0
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001757 enddef
1758 func Func()
1759 noautocmd call s:AutocmdsDisabled()
1760 let g:ei_after = &eventignore
1761 endfunc
1762 Func()
1763 END
1764 CheckScriptSuccess(lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001765 g:ei_after->assert_equal('')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001766enddef
1767
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001768def StackTop()
1769 eval 1
1770 eval 2
1771 # call not on fourth line
1772 StackBot()
1773enddef
1774
1775def StackBot()
1776 # throw an error
1777 eval [][0]
1778enddef
1779
1780def Test_callstack_def()
1781 try
1782 StackTop()
1783 catch
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001784 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001785 endtry
1786enddef
1787
Bram Moolenaare8211a32020-10-09 22:04:29 +02001788" Re-using spot for variable used in block
1789def Test_block_scoped_var()
1790 var lines =<< trim END
1791 vim9script
1792 def Func()
1793 var x = ['a', 'b', 'c']
1794 if 1
1795 var y = 'x'
1796 map(x, {-> y})
1797 endif
1798 var z = x
1799 assert_equal(['x', 'x', 'x'], z)
1800 enddef
1801 Func()
1802 END
1803 CheckScriptSuccess(lines)
1804enddef
1805
Bram Moolenaareeece9e2020-11-20 19:26:48 +01001806def Test_reset_did_emsg()
1807 var lines =<< trim END
1808 @s = 'blah'
1809 au BufWinLeave * #
1810 def Func()
1811 var winid = popup_create('popup', {})
1812 exe '*s'
1813 popup_close(winid)
1814 enddef
1815 Func()
1816 END
1817 CheckScriptFailure(lines, 'E492:', 8)
Bram Moolenaar2d870f82020-12-05 13:41:01 +01001818 delfunc! g:Func
Bram Moolenaareeece9e2020-11-20 19:26:48 +01001819enddef
1820
Bram Moolenaar56602ba2020-12-05 21:22:08 +01001821def Test_abort_with_silent_call()
1822 var lines =<< trim END
1823 vim9script
1824 g:result = 'none'
1825 def Func()
1826 g:result += 3
1827 g:result = 'yes'
1828 enddef
1829 # error is silenced, but function aborts on error
1830 silent! Func()
1831 assert_equal('none', g:result)
1832 unlet g:result
1833 END
1834 CheckScriptSuccess(lines)
1835enddef
1836
Bram Moolenaarf665e972020-12-05 19:17:16 +01001837def Test_continues_with_silent_error()
1838 var lines =<< trim END
1839 vim9script
1840 g:result = 'none'
1841 def Func()
1842 silent! g:result += 3
1843 g:result = 'yes'
1844 enddef
1845 # error is silenced, function does not abort
1846 Func()
1847 assert_equal('yes', g:result)
1848 unlet g:result
1849 END
1850 CheckScriptSuccess(lines)
1851enddef
1852
Bram Moolenaaraf0df472020-12-02 20:51:22 +01001853def Test_abort_even_with_silent()
1854 var lines =<< trim END
1855 vim9script
1856 g:result = 'none'
1857 def Func()
1858 eval {-> ''}() .. '' .. {}['X']
1859 g:result = 'yes'
1860 enddef
Bram Moolenaarf665e972020-12-05 19:17:16 +01001861 silent! Func()
Bram Moolenaaraf0df472020-12-02 20:51:22 +01001862 assert_equal('none', g:result)
Bram Moolenaar4029cab2020-12-05 18:13:27 +01001863 unlet g:result
1864 END
1865 CheckScriptSuccess(lines)
1866enddef
1867
Bram Moolenaarf665e972020-12-05 19:17:16 +01001868def Test_cmdmod_silent_restored()
1869 var lines =<< trim END
1870 vim9script
1871 def Func()
1872 g:result = 'none'
1873 silent! g:result += 3
1874 g:result = 'none'
1875 g:result += 3
1876 enddef
1877 Func()
1878 END
1879 # can't use CheckScriptFailure, it ignores the :silent!
1880 var fname = 'Xdefsilent'
1881 writefile(lines, fname)
1882 var caught = 'no'
1883 try
1884 exe 'source ' .. fname
1885 catch /E1030:/
1886 caught = 'yes'
1887 assert_match('Func, line 4', v:throwpoint)
1888 endtry
1889 assert_equal('yes', caught)
1890 delete(fname)
1891enddef
1892
Bram Moolenaar4029cab2020-12-05 18:13:27 +01001893def Test_dict_member_with_silent()
1894 var lines =<< trim END
1895 vim9script
1896 g:result = 'none'
1897 var d: dict<any>
1898 def Func()
1899 try
1900 g:result = map([], {_, v -> {}[v]})->join() .. d['']
1901 catch
1902 endtry
1903 enddef
1904 silent! Func()
1905 assert_equal('0', g:result)
1906 unlet g:result
Bram Moolenaaraf0df472020-12-02 20:51:22 +01001907 END
1908 CheckScriptSuccess(lines)
1909enddef
1910
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001911
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001912" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker