blob: 40516509cb7e176cba1fd30a6d1de751e3388628 [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
16def ReturnString(): string
17 return 'string'
18enddef
19
20def ReturnNumber(): number
21 return 123
22enddef
23
24let g:notNumber = 'string'
25
26def ReturnGlobal(): number
27 return g:notNumber
28enddef
29
30def Test_return_something()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020031 ReturnString()->assert_equal('string')
32 ReturnNumber()->assert_equal(123)
Bram Moolenaar5e654232020-09-16 15:22:00 +020033 assert_fails('ReturnGlobal()', 'E1012: Type mismatch; expected number but got string', '', 1, 'ReturnGlobal')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020034enddef
35
Bram Moolenaarefd88552020-06-18 20:50:10 +020036def Test_missing_return()
37 CheckDefFailure(['def Missing(): number',
38 ' if g:cond',
39 ' echo "no return"',
40 ' else',
41 ' return 0',
42 ' endif'
43 'enddef'], 'E1027:')
44 CheckDefFailure(['def Missing(): number',
45 ' if g:cond',
46 ' return 1',
47 ' else',
48 ' echo "no return"',
49 ' endif'
50 'enddef'], 'E1027:')
51 CheckDefFailure(['def Missing(): number',
52 ' if g:cond',
53 ' return 1',
54 ' else',
55 ' return 2',
56 ' endif'
57 ' return 3'
58 'enddef'], 'E1095:')
59enddef
60
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020061let s:nothing = 0
62def ReturnNothing()
63 s:nothing = 1
64 if true
65 return
66 endif
67 s:nothing = 2
68enddef
69
70def Test_return_nothing()
71 ReturnNothing()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020072 s:nothing->assert_equal(1)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020073enddef
74
75func Increment()
76 let g:counter += 1
77endfunc
78
79def Test_call_ufunc_count()
80 g:counter = 1
81 Increment()
82 Increment()
83 Increment()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020084 # works with and without :call
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020085 g:counter->assert_equal(4)
86 eval g:counter->assert_equal(4)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020087 unlet g:counter
88enddef
89
90def MyVarargs(arg: string, ...rest: list<string>): string
91 let res = arg
92 for s in rest
93 res ..= ',' .. s
94 endfor
95 return res
96enddef
97
98def Test_call_varargs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020099 MyVarargs('one')->assert_equal('one')
100 MyVarargs('one', 'two')->assert_equal('one,two')
101 MyVarargs('one', 'two', 'three')->assert_equal('one,two,three')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200102enddef
103
104def MyDefaultArgs(name = 'string'): string
105 return name
106enddef
107
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200108def MyDefaultSecond(name: string, second: bool = true): string
109 return second ? name : 'none'
110enddef
111
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200112def Test_call_default_args()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200113 MyDefaultArgs()->assert_equal('string')
114 MyDefaultArgs('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200115 assert_fails('MyDefaultArgs("one", "two")', 'E118:', '', 3, 'Test_call_default_args')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200116
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200117 MyDefaultSecond('test')->assert_equal('test')
118 MyDefaultSecond('test', true)->assert_equal('test')
119 MyDefaultSecond('test', false)->assert_equal('none')
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200120
Bram Moolenaar822ba242020-05-24 23:00:18 +0200121 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
Bram Moolenaar77072282020-09-16 17:55:40 +0200122 CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string')
Bram Moolenaar04b12692020-05-04 23:24:44 +0200123enddef
124
125def Test_nested_function()
126 def Nested(arg: string): string
127 return 'nested ' .. arg
128 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200129 Nested('function')->assert_equal('nested function')
Bram Moolenaar04b12692020-05-04 23:24:44 +0200130
Bram Moolenaar0e65d3d2020-05-05 17:53:16 +0200131 CheckDefFailure(['def Nested()', 'enddef', 'Nested(66)'], 'E118:')
132 CheckDefFailure(['def Nested(arg: string)', 'enddef', 'Nested()'], 'E119:')
133
Bram Moolenaar04b12692020-05-04 23:24:44 +0200134 CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
Bram Moolenaarbcbf4132020-08-01 22:35:13 +0200135 CheckDefFailure(['def s:Nested()', 'enddef'], 'E1075:')
136 CheckDefFailure(['def b:Nested()', 'enddef'], 'E1075:')
Bram Moolenaar8b848ca2020-09-10 22:28:01 +0200137
138 CheckDefFailure([
139 'def Outer()',
140 ' def Inner()',
141 ' # comment',
142 ' enddef',
143 ' def Inner()',
144 ' enddef',
145 'enddef'], 'E1073:')
146 CheckDefFailure([
147 'def Outer()',
148 ' def Inner()',
149 ' # comment',
150 ' enddef',
151 ' def! Inner()',
152 ' enddef',
153 'enddef'], 'E1117:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200154enddef
155
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200156func Test_call_default_args_from_func()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200157 call MyDefaultArgs()->assert_equal('string')
158 call MyDefaultArgs('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200159 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:', '', 3, 'Test_call_default_args_from_func')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200160endfunc
161
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200162def Test_nested_global_function()
163 let lines =<< trim END
164 vim9script
165 def Outer()
166 def g:Inner(): string
167 return 'inner'
168 enddef
169 enddef
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200170 defcompile
171 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200172 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200173 delfunc g:Inner
174 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200175 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200176 delfunc g:Inner
177 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200178 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200179 delfunc g:Inner
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200180 END
181 CheckScriptSuccess(lines)
Bram Moolenaar2c79e9d2020-08-01 18:57:52 +0200182
183 lines =<< trim END
184 vim9script
185 def Outer()
186 def g:Inner(): string
187 return 'inner'
188 enddef
189 enddef
190 defcompile
191 Outer()
192 Outer()
193 END
194 CheckScriptFailure(lines, "E122:")
Bram Moolenaarad486a02020-08-01 23:22:18 +0200195
196 lines =<< trim END
197 vim9script
198 def Func()
199 echo 'script'
200 enddef
201 def Outer()
202 def Func()
203 echo 'inner'
204 enddef
205 enddef
206 defcompile
207 END
208 CheckScriptFailure(lines, "E1073:")
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200209enddef
210
Bram Moolenaar333894b2020-08-01 18:53:07 +0200211def Test_global_local_function()
212 let lines =<< trim END
213 vim9script
214 def g:Func(): string
215 return 'global'
216 enddef
217 def Func(): string
218 return 'local'
219 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200220 g:Func()->assert_equal('global')
221 Func()->assert_equal('local')
Bram Moolenaar333894b2020-08-01 18:53:07 +0200222 END
223 CheckScriptSuccess(lines)
Bram Moolenaar035d6e92020-08-11 22:30:42 +0200224
225 lines =<< trim END
226 vim9script
227 def g:Funcy()
228 echo 'funcy'
229 enddef
230 s:Funcy()
231 END
232 CheckScriptFailure(lines, 'E117:')
Bram Moolenaar333894b2020-08-01 18:53:07 +0200233enddef
234
Bram Moolenaar0f769812020-09-12 18:32:34 +0200235def Test_local_function_shadows_global()
236 let lines =<< trim END
237 vim9script
238 def g:Gfunc(): string
239 return 'global'
240 enddef
241 def AnotherFunc(): number
242 let Gfunc = function('len')
243 return Gfunc('testing')
244 enddef
245 g:Gfunc()->assert_equal('global')
246 AnotherFunc()->assert_equal(7)
247 delfunc g:Gfunc
248 END
249 CheckScriptSuccess(lines)
250
251 lines =<< trim END
252 vim9script
253 def g:Func(): string
254 return 'global'
255 enddef
256 def AnotherFunc()
257 g:Func = function('len')
258 enddef
259 AnotherFunc()
260 END
261 CheckScriptFailure(lines, 'E705:')
262 delfunc g:Func
263enddef
264
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200265func TakesOneArg(arg)
266 echo a:arg
267endfunc
268
269def Test_call_wrong_args()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200270 CheckDefFailure(['TakesOneArg()'], 'E119:')
271 CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
272 CheckDefFailure(['bufnr(xxx)'], 'E1001:')
273 CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
Bram Moolenaaree8580e2020-08-28 17:19:07 +0200274
275 let lines =<< trim END
276 vim9script
277 def Func(s: string)
278 echo s
279 enddef
280 Func([])
281 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200282 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 5)
Bram Moolenaarb185a402020-09-18 22:42:00 +0200283
284 lines =<< trim END
285 vim9script
286 def FuncOne(nr: number)
287 echo nr
288 enddef
289 def FuncTwo()
290 FuncOne()
291 enddef
292 defcompile
293 END
294 writefile(lines, 'Xscript')
295 let didCatch = false
296 try
297 source Xscript
298 catch
299 assert_match('E119: Not enough arguments for function: <SNR>\d\+_FuncOne', v:exception)
300 assert_match('Xscript\[8\]..function <SNR>\d\+_FuncTwo, line 1', v:throwpoint)
301 didCatch = true
302 endtry
303 assert_true(didCatch)
304
305 lines =<< trim END
306 vim9script
307 def FuncOne(nr: number)
308 echo nr
309 enddef
310 def FuncTwo()
311 FuncOne(1, 2)
312 enddef
313 defcompile
314 END
315 writefile(lines, 'Xscript')
316 didCatch = false
317 try
318 source Xscript
319 catch
320 assert_match('E118: Too many arguments for function: <SNR>\d\+_FuncOne', v:exception)
321 assert_match('Xscript\[8\]..function <SNR>\d\+_FuncTwo, line 1', v:throwpoint)
322 didCatch = true
323 endtry
324 assert_true(didCatch)
325
326 delete('Xscript')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200327enddef
328
329" Default arg and varargs
330def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
331 let res = one .. ',' .. two
332 for s in rest
333 res ..= ',' .. s
334 endfor
335 return res
336enddef
337
338def Test_call_def_varargs()
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200339 assert_fails('MyDefVarargs()', 'E119:', '', 1, 'Test_call_def_varargs')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200340 MyDefVarargs('one')->assert_equal('one,foo')
341 MyDefVarargs('one', 'two')->assert_equal('one,two')
342 MyDefVarargs('one', 'two', 'three')->assert_equal('one,two,three')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200343 CheckDefFailure(['MyDefVarargs("one", 22)'],
Bram Moolenaar77072282020-09-16 17:55:40 +0200344 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200345 CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
Bram Moolenaar77072282020-09-16 17:55:40 +0200346 'E1013: Argument 3: type mismatch, expected string but got number')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200347
348 let lines =<< trim END
349 vim9script
350 def Func(...l: list<string>)
351 echo l
352 enddef
353 Func('a', 'b', 'c')
354 END
355 CheckScriptSuccess(lines)
356
357 lines =<< trim END
358 vim9script
359 def Func(...l: list<string>)
360 echo l
361 enddef
362 Func()
363 END
364 CheckScriptSuccess(lines)
365
366 lines =<< trim END
367 vim9script
Bram Moolenaar2f8cbc42020-09-16 17:22:59 +0200368 def Func(...l: any)
369 echo l
370 enddef
371 Func(0)
372 END
373 CheckScriptSuccess(lines)
374
375 lines =<< trim END
376 vim9script
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200377 def Func(...l: list<string>)
378 echo l
379 enddef
380 Func(1, 2, 3)
381 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200382 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200383
384 lines =<< trim END
385 vim9script
386 def Func(...l: list<string>)
387 echo l
388 enddef
389 Func('a', 9)
390 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200391 CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200392
393 lines =<< trim END
394 vim9script
395 def Func(...l: list<string>)
396 echo l
397 enddef
398 Func(1, 'a')
399 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200400 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200401enddef
402
Bram Moolenaar575f24b2020-08-12 14:21:11 +0200403def Test_call_call()
404 let l = [3, 2, 1]
405 call('reverse', [l])
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200406 l->assert_equal([1, 2, 3])
Bram Moolenaar575f24b2020-08-12 14:21:11 +0200407enddef
408
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200409let s:value = ''
410
411def FuncOneDefArg(opt = 'text')
412 s:value = opt
413enddef
414
415def FuncTwoDefArg(nr = 123, opt = 'text'): string
416 return nr .. opt
417enddef
418
419def FuncVarargs(...arg: list<string>): string
420 return join(arg, ',')
421enddef
422
423def Test_func_type_varargs()
424 let RefDefArg: func(?string)
425 RefDefArg = FuncOneDefArg
426 RefDefArg()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200427 s:value->assert_equal('text')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200428 RefDefArg('some')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200429 s:value->assert_equal('some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200430
431 let RefDef2Arg: func(?number, ?string): string
432 RefDef2Arg = FuncTwoDefArg
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200433 RefDef2Arg()->assert_equal('123text')
434 RefDef2Arg(99)->assert_equal('99text')
435 RefDef2Arg(77, 'some')->assert_equal('77some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200436
Bram Moolenaard2c61702020-09-06 15:58:36 +0200437 CheckDefFailure(['let RefWrong: func(string?)'], 'E1010:')
438 CheckDefFailure(['let RefWrong: func(?string, string)'], 'E1007:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200439
440 let RefVarargs: func(...list<string>): string
441 RefVarargs = FuncVarargs
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200442 RefVarargs()->assert_equal('')
443 RefVarargs('one')->assert_equal('one')
444 RefVarargs('one', 'two')->assert_equal('one,two')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200445
Bram Moolenaard2c61702020-09-06 15:58:36 +0200446 CheckDefFailure(['let RefWrong: func(...list<string>, string)'], 'E110:')
447 CheckDefFailure(['let RefWrong: func(...list<string>, ?string)'], 'E110:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200448enddef
449
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200450" Only varargs
451def MyVarargsOnly(...args: list<string>): string
452 return join(args, ',')
453enddef
454
455def Test_call_varargs_only()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200456 MyVarargsOnly()->assert_equal('')
457 MyVarargsOnly('one')->assert_equal('one')
458 MyVarargsOnly('one', 'two')->assert_equal('one,two')
Bram Moolenaar77072282020-09-16 17:55:40 +0200459 CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: Argument 1: type mismatch, expected string but got number')
460 CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200461enddef
462
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200463def Test_using_var_as_arg()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200464 writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200465 assert_fails('so Xdef', 'E1006:', '', 1, 'Func')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200466 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200467enddef
468
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200469def DictArg(arg: dict<string>)
470 arg['key'] = 'value'
471enddef
472
473def ListArg(arg: list<string>)
474 arg[0] = 'value'
475enddef
476
477def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200478 # works for dict and list
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200479 let d: dict<string> = {}
480 DictArg(d)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200481 d['key']->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200482 let l: list<string> = []
483 ListArg(l)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200484 l[0]->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200485
Bram Moolenaard2c61702020-09-06 15:58:36 +0200486 CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200487enddef
488
Bram Moolenaarb816dae2020-09-20 22:04:00 +0200489" These argument names are reserved in legacy functions.
490def WithReservedNames(firstline: string, lastline: string): string
491 return firstline .. lastline
492enddef
493
494def Test_argument_names()
495 assert_equal('OK', WithReservedNames('O', 'K'))
496enddef
497
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200498def Test_call_func_defined_later()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200499 g:DefinedLater('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200500 assert_fails('NotDefined("one")', 'E117:', '', 2, 'Test_call_func_defined_later')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200501enddef
502
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200503func DefinedLater(arg)
504 return a:arg
505endfunc
506
507def Test_call_funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200508 g:SomeFunc('abc')->assert_equal(3)
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200509 assert_fails('NotAFunc()', 'E117:', '', 2, 'Test_call_funcref') # comment after call
510 assert_fails('g:NotAFunc()', 'E117:', '', 3, 'Test_call_funcref')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200511
512 let lines =<< trim END
513 vim9script
514 def RetNumber(): number
515 return 123
516 enddef
517 let Funcref: func: number = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200518 Funcref()->assert_equal(123)
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200519 END
520 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200521
522 lines =<< trim END
523 vim9script
524 def RetNumber(): number
525 return 123
526 enddef
527 def Bar(F: func: number): number
528 return F()
529 enddef
530 let Funcref = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200531 Bar(Funcref)->assert_equal(123)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200532 END
533 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200534
535 lines =<< trim END
536 vim9script
537 def UseNumber(nr: number)
538 echo nr
539 enddef
540 let Funcref: func(number) = function('UseNumber')
541 Funcref(123)
542 END
543 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200544
545 lines =<< trim END
546 vim9script
547 def UseNumber(nr: number)
548 echo nr
549 enddef
550 let Funcref: func(string) = function('UseNumber')
551 END
Bram Moolenaar5e654232020-09-16 15:22:00 +0200552 CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200553
554 lines =<< trim END
555 vim9script
556 def EchoNr(nr = 34)
557 g:echo = nr
558 enddef
559 let Funcref: func(?number) = function('EchoNr')
560 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200561 g:echo->assert_equal(34)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200562 Funcref(123)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200563 g:echo->assert_equal(123)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200564 END
565 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200566
567 lines =<< trim END
568 vim9script
569 def EchoList(...l: list<number>)
570 g:echo = l
571 enddef
572 let Funcref: func(...list<number>) = function('EchoList')
573 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200574 g:echo->assert_equal([])
Bram Moolenaarace61322020-07-26 18:16:58 +0200575 Funcref(1, 2, 3)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200576 g:echo->assert_equal([1, 2, 3])
Bram Moolenaarace61322020-07-26 18:16:58 +0200577 END
578 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200579
580 lines =<< trim END
581 vim9script
582 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
583 g:optarg = opt
584 g:listarg = l
585 return nr
586 enddef
587 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200588 Funcref(10)->assert_equal(10)
589 g:optarg->assert_equal(12)
590 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200591
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200592 Funcref(11, 22)->assert_equal(11)
593 g:optarg->assert_equal(22)
594 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200595
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200596 Funcref(17, 18, 1, 2, 3)->assert_equal(17)
597 g:optarg->assert_equal(18)
598 g:listarg->assert_equal([1, 2, 3])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200599 END
600 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200601enddef
602
603let SomeFunc = function('len')
604let NotAFunc = 'text'
605
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200606def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200607 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200608 let Ref1: func(bool): string
609 let Ref2: func(bool): number
610 let Ref3: func(bool): any
611 Ref3 = g:cond ? Ref1 : Ref2
612
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200613 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200614 let Refa1: func(bool): number
615 let Refa2: func(bool, number): number
616 let Refa3: func: number
617 Refa3 = g:cond ? Refa1 : Refa2
618
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200619 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200620 let Refb1: func(bool, string): number
621 let Refb2: func(string, number): number
622 let Refb3: func(any, any): number
623 Refb3 = g:cond ? Refb1 : Refb2
624enddef
625
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200626def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200627 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200628enddef
629
630def DefinedEvenLater(arg: string): string
631 return arg
632enddef
633
634def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200635 # Error in called function requires unwinding the call stack.
Bram Moolenaar44d66522020-09-06 22:26:57 +0200636 assert_fails('FuncWithForwardCall()', 'E1096:', '', 1, 'FuncWithForwardCall')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200637enddef
638
639def Test_return_type_wrong()
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200640 CheckScriptFailure([
641 'def Func(): number',
642 'return "a"',
643 'enddef',
644 'defcompile'], 'expected number but got string')
645 CheckScriptFailure([
646 'def Func(): string',
647 'return 1',
648 'enddef',
649 'defcompile'], 'expected string but got number')
650 CheckScriptFailure([
651 'def Func(): void',
652 'return "a"',
653 'enddef',
654 'defcompile'],
655 'E1096: Returning a value in a function without a return type')
656 CheckScriptFailure([
657 'def Func()',
658 'return "a"',
659 'enddef',
660 'defcompile'],
661 'E1096: Returning a value in a function without a return type')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200662
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200663 CheckScriptFailure([
664 'def Func(): number',
665 'return',
666 'enddef',
667 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200668
669 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
670 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200671 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200672
673 CheckScriptFailure([
674 'vim9script',
675 'def FuncB()',
676 ' return 123',
677 'enddef',
678 'def FuncA()',
679 ' FuncB()',
680 'enddef',
681 'defcompile'], 'E1096:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200682enddef
683
684def Test_arg_type_wrong()
685 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200686 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200687 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200688 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200689enddef
690
691def Test_vim9script_call()
692 let lines =<< trim END
693 vim9script
694 let var = ''
695 def MyFunc(arg: string)
696 var = arg
697 enddef
698 MyFunc('foobar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200699 var->assert_equal('foobar')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200700
701 let str = 'barfoo'
702 str->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200703 var->assert_equal('barfoo')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200704
Bram Moolenaar67979662020-06-20 22:50:47 +0200705 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200706 g:value->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200707 var->assert_equal('value')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200708
709 let listvar = []
710 def ListFunc(arg: list<number>)
711 listvar = arg
712 enddef
713 [1, 2, 3]->ListFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200714 listvar->assert_equal([1, 2, 3])
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200715
716 let dictvar = {}
717 def DictFunc(arg: dict<number>)
718 dictvar = arg
719 enddef
720 {'a': 1, 'b': 2}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200721 dictvar->assert_equal(#{a: 1, b: 2})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200722 def CompiledDict()
723 {'a': 3, 'b': 4}->DictFunc()
724 enddef
725 CompiledDict()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200726 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200727
728 #{a: 3, b: 4}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200729 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200730
731 ('text')->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200732 var->assert_equal('text')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200733 ("some")->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200734 var->assert_equal('some')
Bram Moolenaare6b53242020-07-01 17:28:33 +0200735
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200736 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200737 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200738 'asdfasdf'->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200739 var->assert_equal('asdfasdf')
Bram Moolenaar10409562020-07-29 20:00:38 +0200740 "xyz"->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200741 var->assert_equal('xyz')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200742
743 def UseString()
744 'xyork'->MyFunc()
745 enddef
746 UseString()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200747 var->assert_equal('xyork')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200748
Bram Moolenaar10409562020-07-29 20:00:38 +0200749 def UseString2()
750 "knife"->MyFunc()
751 enddef
752 UseString2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200753 var->assert_equal('knife')
Bram Moolenaar10409562020-07-29 20:00:38 +0200754
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200755 # prepending a colon makes it a mark
756 new
757 setline(1, ['aaa', 'bbb', 'ccc'])
758 normal! 3Gmt1G
759 :'t
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200760 getcurpos()[1]->assert_equal(3)
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200761 bwipe!
762
Bram Moolenaare6b53242020-07-01 17:28:33 +0200763 MyFunc(
764 'continued'
765 )
766 assert_equal('continued',
767 var
768 )
769
770 call MyFunc(
771 'more'
772 ..
773 'lines'
774 )
775 assert_equal(
776 'morelines',
777 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200778 END
779 writefile(lines, 'Xcall.vim')
780 source Xcall.vim
781 delete('Xcall.vim')
782enddef
783
784def Test_vim9script_call_fail_decl()
785 let lines =<< trim END
786 vim9script
787 let var = ''
788 def MyFunc(arg: string)
789 let var = 123
790 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200791 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200792 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200793 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200794enddef
795
Bram Moolenaar65b95452020-07-19 14:03:09 +0200796def Test_vim9script_call_fail_type()
797 let lines =<< trim END
798 vim9script
799 def MyFunc(arg: string)
800 echo arg
801 enddef
802 MyFunc(1234)
803 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200804 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
Bram Moolenaar65b95452020-07-19 14:03:09 +0200805enddef
806
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200807def Test_vim9script_call_fail_const()
808 let lines =<< trim END
809 vim9script
810 const var = ''
811 def MyFunc(arg: string)
812 var = 'asdf'
813 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200814 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200815 END
816 writefile(lines, 'Xcall_const.vim')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200817 assert_fails('source Xcall_const.vim', 'E46:', '', 1, 'MyFunc')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200818 delete('Xcall_const.vim')
819enddef
820
821" Test that inside :function a Python function can be defined, :def is not
822" recognized.
823func Test_function_python()
824 CheckFeature python3
825 let py = 'python3'
826 execute py "<< EOF"
827def do_something():
828 return 1
829EOF
830endfunc
831
832def Test_delfunc()
833 let lines =<< trim END
834 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200835 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200836 echo 'hello'
837 enddef
838
839 def CallGoneSoon()
840 GoneSoon()
841 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200842 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200843
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200844 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200845 CallGoneSoon()
846 END
847 writefile(lines, 'XToDelFunc')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200848 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
849 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200850
851 delete('XToDelFunc')
852enddef
853
854def Test_redef_failure()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200855 writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200856 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200857 writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200858 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200859 writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200860 assert_fails('so Xdef', 'E1027:', '', 1, 'Func0')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200861 writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200862 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200863 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200864
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200865 g:Func0()->assert_equal(0)
866 g:Func1()->assert_equal('Func1')
867 g:Func2()->assert_equal('Func2')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200868
869 delfunc! Func0
870 delfunc! Func1
871 delfunc! Func2
872enddef
873
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200874def Test_vim9script_func()
875 let lines =<< trim END
876 vim9script
877 func Func(arg)
878 echo a:arg
879 endfunc
880 Func('text')
881 END
882 writefile(lines, 'XVim9Func')
883 so XVim9Func
884
885 delete('XVim9Func')
886enddef
887
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200888" Test for internal functions returning different types
889func Test_InternalFuncRetType()
890 let lines =<< trim END
891 def RetFloat(): float
892 return ceil(1.456)
893 enddef
894
895 def RetListAny(): list<any>
Bram Moolenaar17a836c2020-08-12 17:35:58 +0200896 return items({'k': 'v'})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200897 enddef
898
899 def RetListString(): list<string>
900 return split('a:b:c', ':')
901 enddef
902
903 def RetListDictAny(): list<dict<any>>
904 return getbufinfo()
905 enddef
906
907 def RetDictNumber(): dict<number>
908 return wordcount()
909 enddef
910
911 def RetDictString(): dict<string>
912 return environ()
913 enddef
914 END
915 call writefile(lines, 'Xscript')
916 source Xscript
917
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200918 call RetFloat()->assert_equal(2.0)
919 call RetListAny()->assert_equal([['k', 'v']])
920 call RetListString()->assert_equal(['a', 'b', 'c'])
921 call RetListDictAny()->assert_notequal([])
922 call RetDictNumber()->assert_notequal({})
923 call RetDictString()->assert_notequal({})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200924 call delete('Xscript')
925endfunc
926
927" Test for passing too many or too few arguments to internal functions
928func Test_internalfunc_arg_error()
929 let l =<< trim END
930 def! FArgErr(): float
931 return ceil(1.1, 2)
932 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200933 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200934 END
935 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200936 call assert_fails('so Xinvalidarg', 'E118:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200937 let l =<< trim END
938 def! FArgErr(): float
939 return ceil()
940 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200941 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200942 END
943 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200944 call assert_fails('so Xinvalidarg', 'E119:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200945 call delete('Xinvalidarg')
946endfunc
947
948let s:funcResult = 0
949
950def FuncNoArgNoRet()
Bram Moolenaar53900992020-08-22 19:02:02 +0200951 s:funcResult = 11
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200952enddef
953
954def FuncNoArgRetNumber(): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200955 s:funcResult = 22
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200956 return 1234
957enddef
958
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200959def FuncNoArgRetString(): string
Bram Moolenaar53900992020-08-22 19:02:02 +0200960 s:funcResult = 45
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200961 return 'text'
962enddef
963
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200964def FuncOneArgNoRet(arg: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200965 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200966enddef
967
968def FuncOneArgRetNumber(arg: number): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200969 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200970 return arg
971enddef
972
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200973def FuncTwoArgNoRet(one: bool, two: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200974 s:funcResult = two
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200975enddef
976
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200977def FuncOneArgRetString(arg: string): string
978 return arg
979enddef
980
Bram Moolenaar89228602020-04-05 22:14:54 +0200981def FuncOneArgRetAny(arg: any): any
982 return arg
983enddef
984
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200985def Test_func_type()
986 let Ref1: func()
Bram Moolenaar53900992020-08-22 19:02:02 +0200987 s:funcResult = 0
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200988 Ref1 = FuncNoArgNoRet
989 Ref1()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200990 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200991
992 let Ref2: func
Bram Moolenaar53900992020-08-22 19:02:02 +0200993 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200994 Ref2 = FuncNoArgNoRet
995 Ref2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200996 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200997
Bram Moolenaar53900992020-08-22 19:02:02 +0200998 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200999 Ref2 = FuncOneArgNoRet
1000 Ref2(12)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001001 s:funcResult->assert_equal(12)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001002
Bram Moolenaar53900992020-08-22 19:02:02 +02001003 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001004 Ref2 = FuncNoArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001005 Ref2()->assert_equal(1234)
1006 s:funcResult->assert_equal(22)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001007
Bram Moolenaar53900992020-08-22 19:02:02 +02001008 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001009 Ref2 = FuncOneArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001010 Ref2(13)->assert_equal(13)
1011 s:funcResult->assert_equal(13)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001012enddef
1013
Bram Moolenaar9978d472020-07-05 16:01:56 +02001014def Test_repeat_return_type()
1015 let res = 0
1016 for n in repeat([1], 3)
1017 res += n
1018 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001019 res->assert_equal(3)
Bram Moolenaarfce82b32020-07-05 16:07:21 +02001020
1021 res = 0
1022 for n in add([1, 2], 3)
1023 res += n
1024 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001025 res->assert_equal(6)
Bram Moolenaar9978d472020-07-05 16:01:56 +02001026enddef
1027
Bram Moolenaar846178a2020-07-05 17:04:13 +02001028def Test_argv_return_type()
1029 next fileone filetwo
1030 let res = ''
1031 for name in argv()
1032 res ..= name
1033 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001034 res->assert_equal('fileonefiletwo')
Bram Moolenaar846178a2020-07-05 17:04:13 +02001035enddef
1036
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001037def Test_func_type_part()
1038 let RefVoid: func: void
1039 RefVoid = FuncNoArgNoRet
1040 RefVoid = FuncOneArgNoRet
Bram Moolenaar5e654232020-09-16 15:22:00 +02001041 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number')
1042 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001043
1044 let RefAny: func(): any
1045 RefAny = FuncNoArgRetNumber
1046 RefAny = FuncNoArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001047 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()')
1048 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001049
1050 let RefNr: func: number
1051 RefNr = FuncNoArgRetNumber
1052 RefNr = FuncOneArgRetNumber
Bram Moolenaar5e654232020-09-16 15:22:00 +02001053 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()')
1054 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001055
1056 let RefStr: func: string
1057 RefStr = FuncNoArgRetString
1058 RefStr = FuncOneArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001059 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()')
1060 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001061enddef
1062
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001063def Test_func_type_fails()
1064 CheckDefFailure(['let ref1: func()'], 'E704:')
1065
Bram Moolenaar5e654232020-09-16 15:22:00 +02001066 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number')
1067 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)')
1068 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
1069 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
1070 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
1071 CheckDefFailure(['let Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(...bool) but got func(bool, number)')
Bram Moolenaar08938ee2020-04-11 23:17:17 +02001072
Bram Moolenaard2c61702020-09-06 15:58:36 +02001073 CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
1074 CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
1075 CheckDefFailure(['let RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E1005:')
1076 CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001077enddef
1078
Bram Moolenaar89228602020-04-05 22:14:54 +02001079def Test_func_return_type()
1080 let nr: number
1081 nr = FuncNoArgRetNumber()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001082 nr->assert_equal(1234)
Bram Moolenaar89228602020-04-05 22:14:54 +02001083
1084 nr = FuncOneArgRetAny(122)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001085 nr->assert_equal(122)
Bram Moolenaar89228602020-04-05 22:14:54 +02001086
1087 let str: string
1088 str = FuncOneArgRetAny('yes')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001089 str->assert_equal('yes')
Bram Moolenaar89228602020-04-05 22:14:54 +02001090
Bram Moolenaar5e654232020-09-16 15:22:00 +02001091 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number')
Bram Moolenaar89228602020-04-05 22:14:54 +02001092enddef
1093
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001094def MultiLine(
1095 arg1: string,
1096 arg2 = 1234,
1097 ...rest: list<string>
1098 ): string
1099 return arg1 .. arg2 .. join(rest, '-')
1100enddef
1101
Bram Moolenaar2c330432020-04-13 14:41:35 +02001102def MultiLineComment(
1103 arg1: string, # comment
1104 arg2 = 1234, # comment
1105 ...rest: list<string> # comment
1106 ): string # comment
1107 return arg1 .. arg2 .. join(rest, '-')
1108enddef
1109
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001110def Test_multiline()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001111 MultiLine('text')->assert_equal('text1234')
1112 MultiLine('text', 777)->assert_equal('text777')
1113 MultiLine('text', 777, 'one')->assert_equal('text777one')
1114 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001115enddef
1116
Bram Moolenaar23e03252020-04-12 22:22:31 +02001117func Test_multiline_not_vim9()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001118 call MultiLine('text')->assert_equal('text1234')
1119 call MultiLine('text', 777)->assert_equal('text777')
1120 call MultiLine('text', 777, 'one')->assert_equal('text777one')
1121 call MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar23e03252020-04-12 22:22:31 +02001122endfunc
1123
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001124
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001125" When using CheckScriptFailure() for the below test, E1010 is generated instead
1126" of E1056.
1127func Test_E1056_1059()
1128 let caught_1056 = 0
1129 try
1130 def F():
1131 return 1
1132 enddef
1133 catch /E1056:/
1134 let caught_1056 = 1
1135 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001136 eval caught_1056->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001137
1138 let caught_1059 = 0
1139 try
1140 def F5(items : list)
1141 echo 'a'
1142 enddef
1143 catch /E1059:/
1144 let caught_1059 = 1
1145 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001146 eval caught_1059->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001147endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001148
Bram Moolenaar015f4262020-05-05 21:25:22 +02001149func DelMe()
1150 echo 'DelMe'
1151endfunc
1152
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001153def Test_error_reporting()
1154 # comment lines at the start of the function
1155 let lines =<< trim END
1156 " comment
1157 def Func()
1158 # comment
1159 # comment
1160 invalid
1161 enddef
1162 defcompile
1163 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001164 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001165 try
1166 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001167 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001168 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001169 v:exception->assert_match('Invalid command: invalid')
1170 v:throwpoint->assert_match(', line 3$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001171 endtry
1172
1173 # comment lines after the start of the function
1174 lines =<< trim END
1175 " comment
1176 def Func()
1177 let x = 1234
1178 # comment
1179 # comment
1180 invalid
1181 enddef
1182 defcompile
1183 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001184 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001185 try
1186 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001187 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001188 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001189 v:exception->assert_match('Invalid command: invalid')
1190 v:throwpoint->assert_match(', line 4$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001191 endtry
1192
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001193 lines =<< trim END
1194 vim9script
1195 def Func()
1196 let db = #{foo: 1, bar: 2}
1197 # comment
1198 let x = db.asdf
1199 enddef
1200 defcompile
1201 Func()
1202 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001203 writefile(lines, 'Xdef')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001204 try
1205 source Xdef
1206 assert_report('should have failed')
1207 catch /E716:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001208 v:throwpoint->assert_match('_Func, line 3$')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001209 endtry
1210
Bram Moolenaar08052222020-09-14 17:04:31 +02001211 delete('Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001212enddef
1213
Bram Moolenaar015f4262020-05-05 21:25:22 +02001214def Test_deleted_function()
1215 CheckDefExecFailure([
1216 'let RefMe: func = function("g:DelMe")',
1217 'delfunc g:DelMe',
1218 'echo RefMe()'], 'E117:')
1219enddef
1220
1221def Test_unknown_function()
1222 CheckDefExecFailure([
1223 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001224 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +02001225enddef
1226
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001227def RefFunc(Ref: func(string): string): string
1228 return Ref('more')
1229enddef
1230
1231def Test_closure_simple()
1232 let local = 'some '
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001233 RefFunc({s -> local .. s})->assert_equal('some more')
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001234enddef
1235
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001236def MakeRef()
1237 let local = 'some '
1238 g:Ref = {s -> local .. s}
1239enddef
1240
1241def Test_closure_ref_after_return()
1242 MakeRef()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001243 g:Ref('thing')->assert_equal('some thing')
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001244 unlet g:Ref
1245enddef
1246
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001247def MakeTwoRefs()
1248 let local = ['some']
1249 g:Extend = {s -> local->add(s)}
1250 g:Read = {-> local}
1251enddef
1252
1253def Test_closure_two_refs()
1254 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001255 join(g:Read(), ' ')->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001256 g:Extend('more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001257 join(g:Read(), ' ')->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001258 g:Extend('even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001259 join(g:Read(), ' ')->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001260
1261 unlet g:Extend
1262 unlet g:Read
1263enddef
1264
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001265def ReadRef(Ref: func(): list<string>): string
1266 return join(Ref(), ' ')
1267enddef
1268
Bram Moolenaar5e654232020-09-16 15:22:00 +02001269def ExtendRef(Ref: func(string): list<string>, add: string)
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001270 Ref(add)
1271enddef
1272
1273def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001274 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001275 ReadRef(g:Read)->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001276 ExtendRef(g:Extend, 'more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001277 ReadRef(g:Read)->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001278 ExtendRef(g:Extend, 'even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001279 ReadRef(g:Read)->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001280
1281 unlet g:Extend
1282 unlet g:Read
1283enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001284
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001285def MakeArgRefs(theArg: string)
1286 let local = 'loc_val'
1287 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1288enddef
1289
1290def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1291 let local = 'the_loc'
1292 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1293enddef
1294
1295def Test_closure_using_argument()
1296 MakeArgRefs('arg_val')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001297 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001298
1299 MakeArgRefsVarargs('arg_val', 'one', 'two')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001300 g:UseVararg('call_val')->assert_equal('arg_val/the_loc/call_val/one two')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001301
1302 unlet g:UseArg
1303 unlet g:UseVararg
1304enddef
1305
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001306def MakeGetAndAppendRefs()
1307 let local = 'a'
1308
1309 def Append(arg: string)
1310 local ..= arg
1311 enddef
1312 g:Append = Append
1313
1314 def Get(): string
1315 return local
1316 enddef
1317 g:Get = Get
1318enddef
1319
1320def Test_closure_append_get()
1321 MakeGetAndAppendRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001322 g:Get()->assert_equal('a')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001323 g:Append('-b')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001324 g:Get()->assert_equal('a-b')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001325 g:Append('-c')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001326 g:Get()->assert_equal('a-b-c')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001327
1328 unlet g:Append
1329 unlet g:Get
1330enddef
1331
Bram Moolenaar04b12692020-05-04 23:24:44 +02001332def Test_nested_closure()
1333 let local = 'text'
1334 def Closure(arg: string): string
1335 return local .. arg
1336 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001337 Closure('!!!')->assert_equal('text!!!')
Bram Moolenaar04b12692020-05-04 23:24:44 +02001338enddef
1339
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001340func GetResult(Ref)
1341 return a:Ref('some')
1342endfunc
1343
1344def Test_call_closure_not_compiled()
1345 let text = 'text'
1346 g:Ref = {s -> s .. text}
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001347 GetResult(g:Ref)->assert_equal('sometext')
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001348enddef
1349
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001350def Test_double_closure_fails()
1351 let lines =<< trim END
1352 vim9script
1353 def Func()
1354 let var = 0
1355 for i in range(2)
1356 timer_start(0, {-> var})
1357 endfor
1358 enddef
1359 Func()
1360 END
1361 CheckScriptFailure(lines, 'Multiple closures not supported yet')
1362enddef
1363
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001364def Test_sort_return_type()
1365 let res: list<number>
1366 res = [1, 2, 3]->sort()
1367enddef
1368
Bram Moolenaar08e51f42020-09-16 23:23:36 +02001369def Test_sort_argument()
1370 let res = ['b', 'a', 'c']->sort('i')
1371 res->assert_equal(['a', 'b', 'c'])
1372enddef
1373
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001374def Test_getqflist_return_type()
1375 let l = getqflist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001376 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001377
1378 let d = getqflist(#{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001379 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001380enddef
1381
1382def Test_getloclist_return_type()
1383 let l = getloclist(1)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001384 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001385
1386 let d = getloclist(1, #{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001387 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001388enddef
1389
Bram Moolenaara66ba012020-07-05 18:41:08 +02001390def Test_copy_return_type()
1391 let l = copy([1, 2, 3])
1392 let res = 0
1393 for n in l
1394 res += n
1395 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001396 res->assert_equal(6)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001397
1398 let dl = deepcopy([1, 2, 3])
1399 res = 0
1400 for n in dl
1401 res += n
1402 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001403 res->assert_equal(6)
Bram Moolenaar44b4a242020-09-05 17:18:28 +02001404
1405 dl = deepcopy([1, 2, 3], true)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001406enddef
1407
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001408def Test_extend_return_type()
1409 let l = extend([1, 2], [3])
1410 let res = 0
1411 for n in l
1412 res += n
1413 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001414 res->assert_equal(6)
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001415enddef
1416
Bram Moolenaar2df47312020-09-05 17:30:44 +02001417def Test_garbagecollect()
1418 garbagecollect(true)
1419enddef
1420
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001421def Test_insert_return_type()
1422 let l = insert([2, 1], 3)
1423 let res = 0
1424 for n in l
1425 res += n
1426 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001427 res->assert_equal(6)
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001428enddef
1429
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001430def Test_keys_return_type()
1431 const var: list<string> = #{a: 1, b: 2}->keys()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001432 var->assert_equal(['a', 'b'])
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001433enddef
1434
Bram Moolenaar67627352020-07-05 21:10:24 +02001435def Test_reverse_return_type()
1436 let l = reverse([1, 2, 3])
1437 let res = 0
1438 for n in l
1439 res += n
1440 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001441 res->assert_equal(6)
Bram Moolenaar67627352020-07-05 21:10:24 +02001442enddef
1443
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001444def Test_remove_return_type()
1445 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1446 let res = 0
1447 for n in l
1448 res += n
1449 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001450 res->assert_equal(3)
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001451enddef
1452
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001453def Test_filter_return_type()
1454 let l = filter([1, 2, 3], {-> 1})
1455 let res = 0
1456 for n in l
1457 res += n
1458 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001459 res->assert_equal(6)
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001460enddef
1461
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001462def Test_bufnr()
1463 let buf = bufnr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001464 bufnr('%')->assert_equal(buf)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001465
1466 buf = bufnr('Xdummy', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001467 buf->assert_notequal(-1)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001468 exe 'bwipe! ' .. buf
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001469enddef
1470
Bram Moolenaarec65d772020-08-20 22:29:12 +02001471def Test_col()
1472 new
1473 setline(1, 'asdf')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001474 col([1, '$'])->assert_equal(5)
Bram Moolenaarec65d772020-08-20 22:29:12 +02001475enddef
1476
Bram Moolenaar24f77502020-09-04 19:50:57 +02001477def Test_char2nr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001478 char2nr('あ', true)->assert_equal(12354)
Bram Moolenaar24f77502020-09-04 19:50:57 +02001479enddef
1480
Bram Moolenaar3d945cc2020-08-06 21:26:59 +02001481def Test_getreg_return_type()
1482 let s1: string = getreg('"')
1483 let s2: string = getreg('"', 1)
1484 let s3: list<string> = getreg('"', 1, 1)
1485enddef
1486
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001487def Wrong_dict_key_type(items: list<number>): list<number>
1488 return filter(items, {_, val -> get({val: 1}, 'x')})
1489enddef
1490
1491def Test_wrong_dict_key_type()
Bram Moolenaar5e654232020-09-16 15:22:00 +02001492 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:')
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001493enddef
1494
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001495def Line_continuation_in_def(dir: string = ''): string
1496 let path: string = empty(dir)
1497 \ ? 'empty'
1498 \ : 'full'
1499 return path
1500enddef
1501
1502def Test_line_continuation_in_def()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001503 Line_continuation_in_def('.')->assert_equal('full')
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001504enddef
1505
Bram Moolenaar5e654232020-09-16 15:22:00 +02001506def Line_continuation_in_lambda(): list<string>
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001507 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001508 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001509 ->toupper()})
1510 ->reverse()
1511 return x
1512enddef
1513
1514def Test_line_continuation_in_lambda()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001515 Line_continuation_in_lambda()->assert_equal(['D', 'C', 'B', 'A'])
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001516enddef
1517
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001518func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001519 CheckScreendump
1520
1521 let lines =<< trim END
1522 vim9script
1523 def EchoNothing()
1524 silent echo ''
1525 enddef
1526 defcompile
1527 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001528 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001529
1530 " Check that the balloon shows up after a mouse move
1531 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001532 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001533 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1534
1535 " clean up
1536 call StopVimInTerminal(buf)
1537 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001538endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001539
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001540""""""" builtin functions that behave differently in Vim9
Bram Moolenaare15eebd2020-08-18 19:11:38 +02001541
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001542def Test_bufname()
1543 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001544 bufname('%')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001545 edit OtherFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001546 bufname('#')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001547 close
Bram Moolenaar191929b2020-08-19 21:20:49 +02001548enddef
1549
Bram Moolenaara5d38412020-09-02 21:02:35 +02001550def Test_bufwinid()
1551 let origwin = win_getid()
1552 below split SomeFile
1553 let SomeFileID = win_getid()
1554 below split OtherFile
1555 below split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001556 bufwinid('SomeFile')->assert_equal(SomeFileID)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001557
1558 win_gotoid(origwin)
1559 only
1560 bwipe SomeFile
1561 bwipe OtherFile
1562enddef
1563
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001564def Test_count()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001565 count('ABC ABC ABC', 'b', true)->assert_equal(3)
1566 count('ABC ABC ABC', 'b', false)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001567enddef
1568
1569def Test_expand()
1570 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001571 expand('%', true, true)->assert_equal(['SomeFile'])
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001572 close
1573enddef
1574
1575def Test_getbufinfo()
1576 let bufinfo = getbufinfo(bufnr())
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001577 getbufinfo('%')->assert_equal(bufinfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001578
1579 edit Xtestfile1
1580 hide edit Xtestfile2
1581 hide enew
1582 getbufinfo(#{bufloaded: true, buflisted: true, bufmodified: false})
1583 ->len()->assert_equal(3)
1584 bwipe Xtestfile1 Xtestfile2
1585enddef
1586
Bram Moolenaara5d38412020-09-02 21:02:35 +02001587def Test_getbufline()
1588 e SomeFile
1589 let buf = bufnr()
1590 e #
1591 let lines = ['aaa', 'bbb', 'ccc']
1592 setbufline(buf, 1, lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001593 getbufline('#', 1, '$')->assert_equal(lines)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001594
1595 bwipe!
1596enddef
1597
1598def Test_getchangelist()
1599 new
1600 setline(1, 'some text')
1601 let changelist = bufnr()->getchangelist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001602 getchangelist('%')->assert_equal(changelist)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001603 bwipe!
1604enddef
1605
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001606def Test_getchar()
Bram Moolenaar636c5d52020-09-05 18:48:57 +02001607 while getchar(0)
1608 endwhile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001609 getchar(true)->assert_equal(0)
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001610enddef
1611
Bram Moolenaard217a872020-09-05 18:31:33 +02001612def Test_getcompletion()
1613 set wildignore=*.vim,*~
1614 let l = getcompletion('run', 'file', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001615 l->assert_equal([])
Bram Moolenaard217a872020-09-05 18:31:33 +02001616 set wildignore&
1617enddef
1618
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001619def Test_getreg()
1620 let lines = ['aaa', 'bbb', 'ccc']
1621 setreg('a', lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001622 getreg('a', true, true)->assert_equal(lines)
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001623enddef
1624
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001625def Test_glob()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001626 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim'])
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001627enddef
1628
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001629def Test_globpath()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001630 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim'])
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001631enddef
1632
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001633def Test_has()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001634 has('eval', true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001635enddef
1636
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001637def Test_hasmapto()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001638 hasmapto('foobar', 'i', true)->assert_equal(0)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001639 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001640 hasmapto('foobar', 'i', true)->assert_equal(1)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001641 iunabbrev foo
1642enddef
1643
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001644def Test_index()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001645 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001646enddef
1647
1648def Test_list2str_str2list_utf8()
1649 let s = "\u3042\u3044"
1650 let l = [0x3042, 0x3044]
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001651 str2list(s, true)->assert_equal(l)
1652 list2str(l, true)->assert_equal(s)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001653enddef
1654
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001655def SID(): number
1656 return expand('<SID>')
1657 ->matchstr('<SNR>\zs\d\+\ze_$')
1658 ->str2nr()
1659enddef
1660
1661def Test_maparg()
1662 let lnum = str2nr(expand('<sflnum>'))
1663 map foo bar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001664 maparg('foo', '', false, true)->assert_equal(#{
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001665 lnum: lnum + 1,
1666 script: 0,
1667 mode: ' ',
1668 silent: 0,
1669 noremap: 0,
1670 lhs: 'foo',
1671 lhsraw: 'foo',
1672 nowait: 0,
1673 expr: 0,
1674 sid: SID(),
1675 rhs: 'bar',
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001676 buffer: 0})
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001677 unmap foo
1678enddef
1679
1680def Test_mapcheck()
1681 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001682 mapcheck('foo', 'i', true)->assert_equal('foobar')
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001683 iunabbrev foo
1684enddef
1685
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001686def Test_nr2char()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001687 nr2char(97, true)->assert_equal('a')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001688enddef
1689
1690def Test_readdir()
1691 eval expand('sautest')->readdir({e -> e[0] !=# '.'})
1692 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
1693enddef
1694
1695def Test_search()
1696 new
1697 setline(1, ['foo', 'bar'])
1698 let val = 0
1699 # skip expr returns boolean
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001700 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001701 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001702 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001703 # skip expr returns number, only 0 and 1 are accepted
1704 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001705 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001706 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001707 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001708 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1709 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1710enddef
1711
1712def Test_searchcount()
1713 new
1714 setline(1, "foo bar")
1715 :/foo
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001716 searchcount(#{recompute: true})
1717 ->assert_equal(#{
1718 exact_match: 1,
1719 current: 1,
1720 total: 1,
1721 maxcount: 99,
1722 incomplete: 0})
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001723 bwipe!
1724enddef
1725
1726def Test_searchdecl()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001727 searchdecl('blah', true, true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001728enddef
1729
1730def Test_setbufvar()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001731 setbufvar(bufnr('%'), '&syntax', 'vim')
1732 &syntax->assert_equal('vim')
1733 setbufvar(bufnr('%'), '&ts', 16)
1734 &ts->assert_equal(16)
1735 settabwinvar(1, 1, '&syntax', 'vam')
1736 &syntax->assert_equal('vam')
1737 settabwinvar(1, 1, '&ts', 15)
1738 &ts->assert_equal(15)
1739 setlocal ts=8
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001740
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001741 setbufvar('%', 'myvar', 123)
1742 getbufvar('%', 'myvar')->assert_equal(123)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001743enddef
1744
Bram Moolenaar401f0c02020-09-05 22:37:39 +02001745def Test_setloclist()
1746 let items = [#{filename: '/tmp/file', lnum: 1, valid: true}]
1747 let what = #{items: items}
1748 setqflist([], ' ', what)
1749 setloclist(0, [], ' ', what)
1750enddef
1751
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001752def Test_setreg()
1753 setreg('a', ['aaa', 'bbb', 'ccc'])
1754 let reginfo = getreginfo('a')
1755 setreg('a', reginfo)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001756 getreginfo('a')->assert_equal(reginfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001757enddef
1758
Bram Moolenaar7c27f332020-09-05 22:45:55 +02001759def Test_spellsuggest()
1760 if !has('spell')
1761 MissingFeature 'spell'
1762 else
1763 spellsuggest('marrch', 1, true)->assert_equal(['March'])
1764 endif
1765enddef
1766
Bram Moolenaar3986b942020-09-06 16:09:04 +02001767def Test_split()
1768 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', ''])
1769enddef
1770
1771def Test_str2nr()
1772 str2nr("1'000'000", 10, true)->assert_equal(1000000)
1773enddef
1774
1775def Test_strchars()
1776 strchars("A\u20dd", true)->assert_equal(1)
1777enddef
1778
Bram Moolenaarad304702020-09-06 18:22:53 +02001779def Test_submatch()
1780 let pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)'
1781 let Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()}
1782 let actual = substitute('A123456789', pat, Rep, '')
1783 let expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]"
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001784 actual->assert_equal(expected)
Bram Moolenaarad304702020-09-06 18:22:53 +02001785enddef
1786
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001787def Test_synID()
1788 new
1789 setline(1, "text")
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001790 synID(1, 1, true)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001791 bwipe!
1792enddef
1793
Bram Moolenaarad304702020-09-06 18:22:53 +02001794def Test_term_gettty()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001795 if !has('terminal')
1796 MissingFeature 'terminal'
1797 else
1798 let buf = Run_shell_in_terminal({})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001799 term_gettty(buf, true)->assert_notequal('')
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001800 StopShellInTerminal(buf)
1801 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001802enddef
1803
1804def Test_term_start()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001805 if !has('terminal')
1806 MissingFeature 'terminal'
1807 else
1808 botright new
1809 let winnr = winnr()
1810 term_start(&shell, #{curwin: true})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001811 winnr()->assert_equal(winnr)
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001812 bwipe!
1813 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001814enddef
1815
Bram Moolenaar418155d2020-09-06 18:39:38 +02001816def Test_timer_paused()
1817 let id = timer_start(50, {-> 0})
1818 timer_pause(id, true)
1819 let info = timer_info(id)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001820 info[0]['paused']->assert_equal(1)
Bram Moolenaar418155d2020-09-06 18:39:38 +02001821 timer_stop(id)
1822enddef
1823
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001824def Test_win_splitmove()
1825 split
1826 win_splitmove(1, 2, #{vertical: true, rightbelow: true})
1827 close
1828enddef
1829
1830""""""" end of builtin functions
1831
1832def Fibonacci(n: number): number
1833 if n < 2
1834 return n
1835 else
1836 return Fibonacci(n - 1) + Fibonacci(n - 2)
1837 endif
1838enddef
1839
Bram Moolenaar985116a2020-07-12 17:31:09 +02001840def Test_recursive_call()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001841 Fibonacci(20)->assert_equal(6765)
Bram Moolenaar985116a2020-07-12 17:31:09 +02001842enddef
1843
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001844def TreeWalk(dir: string): list<any>
1845 return readdir(dir)->map({_, val ->
1846 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaarbb1b5e22020-08-05 10:53:21 +02001847 ? {val: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001848 : val
1849 })
1850enddef
1851
1852def Test_closure_in_map()
1853 mkdir('XclosureDir/tdir', 'p')
1854 writefile(['111'], 'XclosureDir/file1')
1855 writefile(['222'], 'XclosureDir/file2')
1856 writefile(['333'], 'XclosureDir/tdir/file3')
1857
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001858 TreeWalk('XclosureDir')->assert_equal(['file1', 'file2', {'tdir': ['file3']}])
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001859
1860 delete('XclosureDir', 'rf')
1861enddef
1862
Bram Moolenaara90afb92020-07-15 22:38:56 +02001863def Test_partial_call()
1864 let Xsetlist = function('setloclist', [0])
1865 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001866 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001867
1868 Xsetlist = function('setloclist', [0, [], ' '])
1869 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001870 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001871
1872 Xsetlist = function('setqflist')
1873 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001874 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001875
1876 Xsetlist = function('setqflist', [[], ' '])
1877 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001878 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001879enddef
1880
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001881def Test_cmd_modifier()
1882 tab echo '0'
Bram Moolenaard2c61702020-09-06 15:58:36 +02001883 CheckDefFailure(['5tab echo 3'], 'E16:')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001884enddef
1885
1886def Test_restore_modifiers()
1887 # check that when compiling a :def function command modifiers are not messed
1888 # up.
1889 let lines =<< trim END
1890 vim9script
1891 set eventignore=
1892 autocmd QuickFixCmdPost * copen
1893 def AutocmdsDisabled()
1894 eval 0
1895 enddef
1896 func Func()
1897 noautocmd call s:AutocmdsDisabled()
1898 let g:ei_after = &eventignore
1899 endfunc
1900 Func()
1901 END
1902 CheckScriptSuccess(lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001903 g:ei_after->assert_equal('')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001904enddef
1905
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001906def StackTop()
1907 eval 1
1908 eval 2
1909 # call not on fourth line
1910 StackBot()
1911enddef
1912
1913def StackBot()
1914 # throw an error
1915 eval [][0]
1916enddef
1917
1918def Test_callstack_def()
1919 try
1920 StackTop()
1921 catch
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001922 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001923 endtry
1924enddef
1925
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001926
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001927" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker