blob: f50ec85d14402ca2447ed66f300519d378a2e940 [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 Moolenaar28022722020-09-21 22:02:49 +0200377 def Func(..._l: list<string>)
378 echo _l
379 enddef
380 Func('a', 'b', 'c')
381 END
382 CheckScriptSuccess(lines)
383
384 lines =<< trim END
385 vim9script
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200386 def Func(...l: list<string>)
387 echo l
388 enddef
389 Func(1, 2, 3)
390 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200391 CheckScriptFailure(lines, 'E1013: Argument 1: 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('a', 9)
399 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200400 CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200401
402 lines =<< trim END
403 vim9script
404 def Func(...l: list<string>)
405 echo l
406 enddef
407 Func(1, 'a')
408 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200409 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200410enddef
411
Bram Moolenaar575f24b2020-08-12 14:21:11 +0200412def Test_call_call()
413 let l = [3, 2, 1]
414 call('reverse', [l])
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200415 l->assert_equal([1, 2, 3])
Bram Moolenaar575f24b2020-08-12 14:21:11 +0200416enddef
417
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200418let s:value = ''
419
420def FuncOneDefArg(opt = 'text')
421 s:value = opt
422enddef
423
424def FuncTwoDefArg(nr = 123, opt = 'text'): string
425 return nr .. opt
426enddef
427
428def FuncVarargs(...arg: list<string>): string
429 return join(arg, ',')
430enddef
431
432def Test_func_type_varargs()
433 let RefDefArg: func(?string)
434 RefDefArg = FuncOneDefArg
435 RefDefArg()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200436 s:value->assert_equal('text')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200437 RefDefArg('some')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200438 s:value->assert_equal('some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200439
440 let RefDef2Arg: func(?number, ?string): string
441 RefDef2Arg = FuncTwoDefArg
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200442 RefDef2Arg()->assert_equal('123text')
443 RefDef2Arg(99)->assert_equal('99text')
444 RefDef2Arg(77, 'some')->assert_equal('77some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200445
Bram Moolenaard2c61702020-09-06 15:58:36 +0200446 CheckDefFailure(['let RefWrong: func(string?)'], 'E1010:')
447 CheckDefFailure(['let RefWrong: func(?string, string)'], 'E1007:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200448
449 let RefVarargs: func(...list<string>): string
450 RefVarargs = FuncVarargs
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200451 RefVarargs()->assert_equal('')
452 RefVarargs('one')->assert_equal('one')
453 RefVarargs('one', 'two')->assert_equal('one,two')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200454
Bram Moolenaard2c61702020-09-06 15:58:36 +0200455 CheckDefFailure(['let RefWrong: func(...list<string>, string)'], 'E110:')
456 CheckDefFailure(['let RefWrong: func(...list<string>, ?string)'], 'E110:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200457enddef
458
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200459" Only varargs
460def MyVarargsOnly(...args: list<string>): string
461 return join(args, ',')
462enddef
463
464def Test_call_varargs_only()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200465 MyVarargsOnly()->assert_equal('')
466 MyVarargsOnly('one')->assert_equal('one')
467 MyVarargsOnly('one', 'two')->assert_equal('one,two')
Bram Moolenaar77072282020-09-16 17:55:40 +0200468 CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: Argument 1: type mismatch, expected string but got number')
469 CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200470enddef
471
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200472def Test_using_var_as_arg()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200473 writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200474 assert_fails('so Xdef', 'E1006:', '', 1, 'Func')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200475 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200476enddef
477
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200478def DictArg(arg: dict<string>)
479 arg['key'] = 'value'
480enddef
481
482def ListArg(arg: list<string>)
483 arg[0] = 'value'
484enddef
485
486def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200487 # works for dict and list
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200488 let d: dict<string> = {}
489 DictArg(d)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200490 d['key']->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200491 let l: list<string> = []
492 ListArg(l)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200493 l[0]->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200494
Bram Moolenaard2c61702020-09-06 15:58:36 +0200495 CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200496enddef
497
Bram Moolenaarb816dae2020-09-20 22:04:00 +0200498" These argument names are reserved in legacy functions.
499def WithReservedNames(firstline: string, lastline: string): string
500 return firstline .. lastline
501enddef
502
503def Test_argument_names()
504 assert_equal('OK', WithReservedNames('O', 'K'))
505enddef
506
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200507def Test_call_func_defined_later()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200508 g:DefinedLater('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200509 assert_fails('NotDefined("one")', 'E117:', '', 2, 'Test_call_func_defined_later')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200510enddef
511
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200512func DefinedLater(arg)
513 return a:arg
514endfunc
515
516def Test_call_funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200517 g:SomeFunc('abc')->assert_equal(3)
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200518 assert_fails('NotAFunc()', 'E117:', '', 2, 'Test_call_funcref') # comment after call
519 assert_fails('g:NotAFunc()', 'E117:', '', 3, 'Test_call_funcref')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200520
521 let lines =<< trim END
522 vim9script
523 def RetNumber(): number
524 return 123
525 enddef
526 let Funcref: func: number = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200527 Funcref()->assert_equal(123)
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200528 END
529 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200530
531 lines =<< trim END
532 vim9script
533 def RetNumber(): number
534 return 123
535 enddef
536 def Bar(F: func: number): number
537 return F()
538 enddef
539 let Funcref = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200540 Bar(Funcref)->assert_equal(123)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200541 END
542 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200543
544 lines =<< trim END
545 vim9script
546 def UseNumber(nr: number)
547 echo nr
548 enddef
549 let Funcref: func(number) = function('UseNumber')
550 Funcref(123)
551 END
552 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200553
554 lines =<< trim END
555 vim9script
556 def UseNumber(nr: number)
557 echo nr
558 enddef
559 let Funcref: func(string) = function('UseNumber')
560 END
Bram Moolenaar5e654232020-09-16 15:22:00 +0200561 CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200562
563 lines =<< trim END
564 vim9script
565 def EchoNr(nr = 34)
566 g:echo = nr
567 enddef
568 let Funcref: func(?number) = function('EchoNr')
569 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200570 g:echo->assert_equal(34)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200571 Funcref(123)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200572 g:echo->assert_equal(123)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200573 END
574 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200575
576 lines =<< trim END
577 vim9script
578 def EchoList(...l: list<number>)
579 g:echo = l
580 enddef
581 let Funcref: func(...list<number>) = function('EchoList')
582 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200583 g:echo->assert_equal([])
Bram Moolenaarace61322020-07-26 18:16:58 +0200584 Funcref(1, 2, 3)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200585 g:echo->assert_equal([1, 2, 3])
Bram Moolenaarace61322020-07-26 18:16:58 +0200586 END
587 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200588
589 lines =<< trim END
590 vim9script
591 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
592 g:optarg = opt
593 g:listarg = l
594 return nr
595 enddef
596 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200597 Funcref(10)->assert_equal(10)
598 g:optarg->assert_equal(12)
599 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200600
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200601 Funcref(11, 22)->assert_equal(11)
602 g:optarg->assert_equal(22)
603 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200604
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200605 Funcref(17, 18, 1, 2, 3)->assert_equal(17)
606 g:optarg->assert_equal(18)
607 g:listarg->assert_equal([1, 2, 3])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200608 END
609 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200610enddef
611
612let SomeFunc = function('len')
613let NotAFunc = 'text'
614
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200615def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200616 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200617 let Ref1: func(bool): string
618 let Ref2: func(bool): number
619 let Ref3: func(bool): any
620 Ref3 = g:cond ? Ref1 : Ref2
621
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200622 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200623 let Refa1: func(bool): number
624 let Refa2: func(bool, number): number
625 let Refa3: func: number
626 Refa3 = g:cond ? Refa1 : Refa2
627
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200628 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200629 let Refb1: func(bool, string): number
630 let Refb2: func(string, number): number
631 let Refb3: func(any, any): number
632 Refb3 = g:cond ? Refb1 : Refb2
633enddef
634
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200635def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200636 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200637enddef
638
639def DefinedEvenLater(arg: string): string
640 return arg
641enddef
642
643def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200644 # Error in called function requires unwinding the call stack.
Bram Moolenaar44d66522020-09-06 22:26:57 +0200645 assert_fails('FuncWithForwardCall()', 'E1096:', '', 1, 'FuncWithForwardCall')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200646enddef
647
648def Test_return_type_wrong()
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200649 CheckScriptFailure([
650 'def Func(): number',
651 'return "a"',
652 'enddef',
653 'defcompile'], 'expected number but got string')
654 CheckScriptFailure([
655 'def Func(): string',
656 'return 1',
657 'enddef',
658 'defcompile'], 'expected string but got number')
659 CheckScriptFailure([
660 'def Func(): void',
661 'return "a"',
662 'enddef',
663 'defcompile'],
664 'E1096: Returning a value in a function without a return type')
665 CheckScriptFailure([
666 'def Func()',
667 'return "a"',
668 'enddef',
669 'defcompile'],
670 'E1096: Returning a value in a function without a return type')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200671
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200672 CheckScriptFailure([
673 'def Func(): number',
674 'return',
675 'enddef',
676 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200677
678 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
679 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200680 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200681
682 CheckScriptFailure([
683 'vim9script',
684 'def FuncB()',
685 ' return 123',
686 'enddef',
687 'def FuncA()',
688 ' FuncB()',
689 'enddef',
690 'defcompile'], 'E1096:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200691enddef
692
693def Test_arg_type_wrong()
694 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200695 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200696 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200697 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200698enddef
699
700def Test_vim9script_call()
701 let lines =<< trim END
702 vim9script
703 let var = ''
704 def MyFunc(arg: string)
705 var = arg
706 enddef
707 MyFunc('foobar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200708 var->assert_equal('foobar')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200709
710 let str = 'barfoo'
711 str->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200712 var->assert_equal('barfoo')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200713
Bram Moolenaar67979662020-06-20 22:50:47 +0200714 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200715 g:value->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200716 var->assert_equal('value')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200717
718 let listvar = []
719 def ListFunc(arg: list<number>)
720 listvar = arg
721 enddef
722 [1, 2, 3]->ListFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200723 listvar->assert_equal([1, 2, 3])
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200724
725 let dictvar = {}
726 def DictFunc(arg: dict<number>)
727 dictvar = arg
728 enddef
729 {'a': 1, 'b': 2}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200730 dictvar->assert_equal(#{a: 1, b: 2})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200731 def CompiledDict()
732 {'a': 3, 'b': 4}->DictFunc()
733 enddef
734 CompiledDict()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200735 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200736
737 #{a: 3, b: 4}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200738 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200739
740 ('text')->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200741 var->assert_equal('text')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200742 ("some")->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200743 var->assert_equal('some')
Bram Moolenaare6b53242020-07-01 17:28:33 +0200744
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200745 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200746 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200747 'asdfasdf'->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200748 var->assert_equal('asdfasdf')
Bram Moolenaar10409562020-07-29 20:00:38 +0200749 "xyz"->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200750 var->assert_equal('xyz')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200751
752 def UseString()
753 'xyork'->MyFunc()
754 enddef
755 UseString()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200756 var->assert_equal('xyork')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200757
Bram Moolenaar10409562020-07-29 20:00:38 +0200758 def UseString2()
759 "knife"->MyFunc()
760 enddef
761 UseString2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200762 var->assert_equal('knife')
Bram Moolenaar10409562020-07-29 20:00:38 +0200763
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200764 # prepending a colon makes it a mark
765 new
766 setline(1, ['aaa', 'bbb', 'ccc'])
767 normal! 3Gmt1G
768 :'t
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200769 getcurpos()[1]->assert_equal(3)
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200770 bwipe!
771
Bram Moolenaare6b53242020-07-01 17:28:33 +0200772 MyFunc(
773 'continued'
774 )
775 assert_equal('continued',
776 var
777 )
778
779 call MyFunc(
780 'more'
781 ..
782 'lines'
783 )
784 assert_equal(
785 'morelines',
786 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200787 END
788 writefile(lines, 'Xcall.vim')
789 source Xcall.vim
790 delete('Xcall.vim')
791enddef
792
793def Test_vim9script_call_fail_decl()
794 let lines =<< trim END
795 vim9script
796 let var = ''
797 def MyFunc(arg: string)
798 let var = 123
799 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200800 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200801 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200802 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200803enddef
804
Bram Moolenaar65b95452020-07-19 14:03:09 +0200805def Test_vim9script_call_fail_type()
806 let lines =<< trim END
807 vim9script
808 def MyFunc(arg: string)
809 echo arg
810 enddef
811 MyFunc(1234)
812 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200813 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
Bram Moolenaar65b95452020-07-19 14:03:09 +0200814enddef
815
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200816def Test_vim9script_call_fail_const()
817 let lines =<< trim END
818 vim9script
819 const var = ''
820 def MyFunc(arg: string)
821 var = 'asdf'
822 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200823 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200824 END
825 writefile(lines, 'Xcall_const.vim')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200826 assert_fails('source Xcall_const.vim', 'E46:', '', 1, 'MyFunc')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200827 delete('Xcall_const.vim')
828enddef
829
830" Test that inside :function a Python function can be defined, :def is not
831" recognized.
832func Test_function_python()
833 CheckFeature python3
834 let py = 'python3'
835 execute py "<< EOF"
836def do_something():
837 return 1
838EOF
839endfunc
840
841def Test_delfunc()
842 let lines =<< trim END
843 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200844 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200845 echo 'hello'
846 enddef
847
848 def CallGoneSoon()
849 GoneSoon()
850 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200851 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200852
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200853 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200854 CallGoneSoon()
855 END
856 writefile(lines, 'XToDelFunc')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200857 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
858 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200859
860 delete('XToDelFunc')
861enddef
862
863def Test_redef_failure()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200864 writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200865 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200866 writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200867 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200868 writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200869 assert_fails('so Xdef', 'E1027:', '', 1, 'Func0')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200870 writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200871 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200872 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200873
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200874 g:Func0()->assert_equal(0)
875 g:Func1()->assert_equal('Func1')
876 g:Func2()->assert_equal('Func2')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200877
878 delfunc! Func0
879 delfunc! Func1
880 delfunc! Func2
881enddef
882
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200883def Test_vim9script_func()
884 let lines =<< trim END
885 vim9script
886 func Func(arg)
887 echo a:arg
888 endfunc
889 Func('text')
890 END
891 writefile(lines, 'XVim9Func')
892 so XVim9Func
893
894 delete('XVim9Func')
895enddef
896
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200897" Test for internal functions returning different types
898func Test_InternalFuncRetType()
899 let lines =<< trim END
900 def RetFloat(): float
901 return ceil(1.456)
902 enddef
903
904 def RetListAny(): list<any>
Bram Moolenaar17a836c2020-08-12 17:35:58 +0200905 return items({'k': 'v'})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200906 enddef
907
908 def RetListString(): list<string>
909 return split('a:b:c', ':')
910 enddef
911
912 def RetListDictAny(): list<dict<any>>
913 return getbufinfo()
914 enddef
915
916 def RetDictNumber(): dict<number>
917 return wordcount()
918 enddef
919
920 def RetDictString(): dict<string>
921 return environ()
922 enddef
923 END
924 call writefile(lines, 'Xscript')
925 source Xscript
926
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200927 call RetFloat()->assert_equal(2.0)
928 call RetListAny()->assert_equal([['k', 'v']])
929 call RetListString()->assert_equal(['a', 'b', 'c'])
930 call RetListDictAny()->assert_notequal([])
931 call RetDictNumber()->assert_notequal({})
932 call RetDictString()->assert_notequal({})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200933 call delete('Xscript')
934endfunc
935
936" Test for passing too many or too few arguments to internal functions
937func Test_internalfunc_arg_error()
938 let l =<< trim END
939 def! FArgErr(): float
940 return ceil(1.1, 2)
941 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200942 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200943 END
944 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200945 call assert_fails('so Xinvalidarg', 'E118:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200946 let l =<< trim END
947 def! FArgErr(): float
948 return ceil()
949 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200950 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200951 END
952 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200953 call assert_fails('so Xinvalidarg', 'E119:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200954 call delete('Xinvalidarg')
955endfunc
956
957let s:funcResult = 0
958
959def FuncNoArgNoRet()
Bram Moolenaar53900992020-08-22 19:02:02 +0200960 s:funcResult = 11
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200961enddef
962
963def FuncNoArgRetNumber(): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200964 s:funcResult = 22
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200965 return 1234
966enddef
967
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200968def FuncNoArgRetString(): string
Bram Moolenaar53900992020-08-22 19:02:02 +0200969 s:funcResult = 45
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200970 return 'text'
971enddef
972
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200973def FuncOneArgNoRet(arg: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200974 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200975enddef
976
977def FuncOneArgRetNumber(arg: number): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200978 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200979 return arg
980enddef
981
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200982def FuncTwoArgNoRet(one: bool, two: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200983 s:funcResult = two
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200984enddef
985
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200986def FuncOneArgRetString(arg: string): string
987 return arg
988enddef
989
Bram Moolenaar89228602020-04-05 22:14:54 +0200990def FuncOneArgRetAny(arg: any): any
991 return arg
992enddef
993
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200994def Test_func_type()
995 let Ref1: func()
Bram Moolenaar53900992020-08-22 19:02:02 +0200996 s:funcResult = 0
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200997 Ref1 = FuncNoArgNoRet
998 Ref1()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200999 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001000
1001 let Ref2: func
Bram Moolenaar53900992020-08-22 19:02:02 +02001002 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001003 Ref2 = FuncNoArgNoRet
1004 Ref2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001005 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001006
Bram Moolenaar53900992020-08-22 19:02:02 +02001007 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001008 Ref2 = FuncOneArgNoRet
1009 Ref2(12)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001010 s:funcResult->assert_equal(12)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001011
Bram Moolenaar53900992020-08-22 19:02:02 +02001012 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001013 Ref2 = FuncNoArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001014 Ref2()->assert_equal(1234)
1015 s:funcResult->assert_equal(22)
Bram Moolenaar4c683752020-04-05 21:38:23 +02001016
Bram Moolenaar53900992020-08-22 19:02:02 +02001017 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001018 Ref2 = FuncOneArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001019 Ref2(13)->assert_equal(13)
1020 s:funcResult->assert_equal(13)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001021enddef
1022
Bram Moolenaar9978d472020-07-05 16:01:56 +02001023def Test_repeat_return_type()
1024 let res = 0
1025 for n in repeat([1], 3)
1026 res += n
1027 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001028 res->assert_equal(3)
Bram Moolenaarfce82b32020-07-05 16:07:21 +02001029
1030 res = 0
1031 for n in add([1, 2], 3)
1032 res += n
1033 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001034 res->assert_equal(6)
Bram Moolenaar9978d472020-07-05 16:01:56 +02001035enddef
1036
Bram Moolenaar846178a2020-07-05 17:04:13 +02001037def Test_argv_return_type()
1038 next fileone filetwo
1039 let res = ''
1040 for name in argv()
1041 res ..= name
1042 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001043 res->assert_equal('fileonefiletwo')
Bram Moolenaar846178a2020-07-05 17:04:13 +02001044enddef
1045
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001046def Test_func_type_part()
1047 let RefVoid: func: void
1048 RefVoid = FuncNoArgNoRet
1049 RefVoid = FuncOneArgNoRet
Bram Moolenaar5e654232020-09-16 15:22:00 +02001050 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number')
1051 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001052
1053 let RefAny: func(): any
1054 RefAny = FuncNoArgRetNumber
1055 RefAny = FuncNoArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001056 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()')
1057 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001058
1059 let RefNr: func: number
1060 RefNr = FuncNoArgRetNumber
1061 RefNr = FuncOneArgRetNumber
Bram Moolenaar5e654232020-09-16 15:22:00 +02001062 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()')
1063 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001064
1065 let RefStr: func: string
1066 RefStr = FuncNoArgRetString
1067 RefStr = FuncOneArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001068 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()')
1069 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001070enddef
1071
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001072def Test_func_type_fails()
1073 CheckDefFailure(['let ref1: func()'], 'E704:')
1074
Bram Moolenaar5e654232020-09-16 15:22:00 +02001075 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number')
1076 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)')
1077 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
1078 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
1079 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
1080 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 +02001081
Bram Moolenaard2c61702020-09-06 15:58:36 +02001082 CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
1083 CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
1084 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:')
1085 CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001086enddef
1087
Bram Moolenaar89228602020-04-05 22:14:54 +02001088def Test_func_return_type()
1089 let nr: number
1090 nr = FuncNoArgRetNumber()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001091 nr->assert_equal(1234)
Bram Moolenaar89228602020-04-05 22:14:54 +02001092
1093 nr = FuncOneArgRetAny(122)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001094 nr->assert_equal(122)
Bram Moolenaar89228602020-04-05 22:14:54 +02001095
1096 let str: string
1097 str = FuncOneArgRetAny('yes')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001098 str->assert_equal('yes')
Bram Moolenaar89228602020-04-05 22:14:54 +02001099
Bram Moolenaar5e654232020-09-16 15:22:00 +02001100 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number')
Bram Moolenaar89228602020-04-05 22:14:54 +02001101enddef
1102
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001103def MultiLine(
1104 arg1: string,
1105 arg2 = 1234,
1106 ...rest: list<string>
1107 ): string
1108 return arg1 .. arg2 .. join(rest, '-')
1109enddef
1110
Bram Moolenaar2c330432020-04-13 14:41:35 +02001111def MultiLineComment(
1112 arg1: string, # comment
1113 arg2 = 1234, # comment
1114 ...rest: list<string> # comment
1115 ): string # comment
1116 return arg1 .. arg2 .. join(rest, '-')
1117enddef
1118
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001119def Test_multiline()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001120 MultiLine('text')->assert_equal('text1234')
1121 MultiLine('text', 777)->assert_equal('text777')
1122 MultiLine('text', 777, 'one')->assert_equal('text777one')
1123 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001124enddef
1125
Bram Moolenaar23e03252020-04-12 22:22:31 +02001126func Test_multiline_not_vim9()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001127 call MultiLine('text')->assert_equal('text1234')
1128 call MultiLine('text', 777)->assert_equal('text777')
1129 call MultiLine('text', 777, 'one')->assert_equal('text777one')
1130 call MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar23e03252020-04-12 22:22:31 +02001131endfunc
1132
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001133
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001134" When using CheckScriptFailure() for the below test, E1010 is generated instead
1135" of E1056.
1136func Test_E1056_1059()
1137 let caught_1056 = 0
1138 try
1139 def F():
1140 return 1
1141 enddef
1142 catch /E1056:/
1143 let caught_1056 = 1
1144 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001145 eval caught_1056->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001146
1147 let caught_1059 = 0
1148 try
1149 def F5(items : list)
1150 echo 'a'
1151 enddef
1152 catch /E1059:/
1153 let caught_1059 = 1
1154 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001155 eval caught_1059->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001156endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001157
Bram Moolenaar015f4262020-05-05 21:25:22 +02001158func DelMe()
1159 echo 'DelMe'
1160endfunc
1161
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001162def Test_error_reporting()
1163 # comment lines at the start of the function
1164 let lines =<< trim END
1165 " comment
1166 def Func()
1167 # comment
1168 # comment
1169 invalid
1170 enddef
1171 defcompile
1172 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001173 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001174 try
1175 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001176 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001177 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001178 v:exception->assert_match('Invalid command: invalid')
1179 v:throwpoint->assert_match(', line 3$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001180 endtry
1181
1182 # comment lines after the start of the function
1183 lines =<< trim END
1184 " comment
1185 def Func()
1186 let x = 1234
1187 # comment
1188 # comment
1189 invalid
1190 enddef
1191 defcompile
1192 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001193 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001194 try
1195 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001196 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001197 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001198 v:exception->assert_match('Invalid command: invalid')
1199 v:throwpoint->assert_match(', line 4$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001200 endtry
1201
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001202 lines =<< trim END
1203 vim9script
1204 def Func()
1205 let db = #{foo: 1, bar: 2}
1206 # comment
1207 let x = db.asdf
1208 enddef
1209 defcompile
1210 Func()
1211 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001212 writefile(lines, 'Xdef')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001213 try
1214 source Xdef
1215 assert_report('should have failed')
1216 catch /E716:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001217 v:throwpoint->assert_match('_Func, line 3$')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001218 endtry
1219
Bram Moolenaar08052222020-09-14 17:04:31 +02001220 delete('Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001221enddef
1222
Bram Moolenaar015f4262020-05-05 21:25:22 +02001223def Test_deleted_function()
1224 CheckDefExecFailure([
1225 'let RefMe: func = function("g:DelMe")',
1226 'delfunc g:DelMe',
1227 'echo RefMe()'], 'E117:')
1228enddef
1229
1230def Test_unknown_function()
1231 CheckDefExecFailure([
1232 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001233 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +02001234enddef
1235
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001236def RefFunc(Ref: func(string): string): string
1237 return Ref('more')
1238enddef
1239
1240def Test_closure_simple()
1241 let local = 'some '
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001242 RefFunc({s -> local .. s})->assert_equal('some more')
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001243enddef
1244
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001245def MakeRef()
1246 let local = 'some '
1247 g:Ref = {s -> local .. s}
1248enddef
1249
1250def Test_closure_ref_after_return()
1251 MakeRef()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001252 g:Ref('thing')->assert_equal('some thing')
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001253 unlet g:Ref
1254enddef
1255
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001256def MakeTwoRefs()
1257 let local = ['some']
1258 g:Extend = {s -> local->add(s)}
1259 g:Read = {-> local}
1260enddef
1261
1262def Test_closure_two_refs()
1263 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001264 join(g:Read(), ' ')->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001265 g:Extend('more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001266 join(g:Read(), ' ')->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001267 g:Extend('even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001268 join(g:Read(), ' ')->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001269
1270 unlet g:Extend
1271 unlet g:Read
1272enddef
1273
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001274def ReadRef(Ref: func(): list<string>): string
1275 return join(Ref(), ' ')
1276enddef
1277
Bram Moolenaar5e654232020-09-16 15:22:00 +02001278def ExtendRef(Ref: func(string): list<string>, add: string)
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001279 Ref(add)
1280enddef
1281
1282def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001283 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001284 ReadRef(g:Read)->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001285 ExtendRef(g:Extend, 'more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001286 ReadRef(g:Read)->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001287 ExtendRef(g:Extend, 'even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001288 ReadRef(g:Read)->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001289
1290 unlet g:Extend
1291 unlet g:Read
1292enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001293
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001294def MakeArgRefs(theArg: string)
1295 let local = 'loc_val'
1296 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1297enddef
1298
1299def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1300 let local = 'the_loc'
1301 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1302enddef
1303
1304def Test_closure_using_argument()
1305 MakeArgRefs('arg_val')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001306 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001307
1308 MakeArgRefsVarargs('arg_val', 'one', 'two')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001309 g:UseVararg('call_val')->assert_equal('arg_val/the_loc/call_val/one two')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001310
1311 unlet g:UseArg
1312 unlet g:UseVararg
1313enddef
1314
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001315def MakeGetAndAppendRefs()
1316 let local = 'a'
1317
1318 def Append(arg: string)
1319 local ..= arg
1320 enddef
1321 g:Append = Append
1322
1323 def Get(): string
1324 return local
1325 enddef
1326 g:Get = Get
1327enddef
1328
1329def Test_closure_append_get()
1330 MakeGetAndAppendRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001331 g:Get()->assert_equal('a')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001332 g:Append('-b')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001333 g:Get()->assert_equal('a-b')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001334 g:Append('-c')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001335 g:Get()->assert_equal('a-b-c')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001336
1337 unlet g:Append
1338 unlet g:Get
1339enddef
1340
Bram Moolenaar04b12692020-05-04 23:24:44 +02001341def Test_nested_closure()
1342 let local = 'text'
1343 def Closure(arg: string): string
1344 return local .. arg
1345 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001346 Closure('!!!')->assert_equal('text!!!')
Bram Moolenaar04b12692020-05-04 23:24:44 +02001347enddef
1348
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001349func GetResult(Ref)
1350 return a:Ref('some')
1351endfunc
1352
1353def Test_call_closure_not_compiled()
1354 let text = 'text'
1355 g:Ref = {s -> s .. text}
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001356 GetResult(g:Ref)->assert_equal('sometext')
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001357enddef
1358
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001359def Test_double_closure_fails()
1360 let lines =<< trim END
1361 vim9script
1362 def Func()
1363 let var = 0
1364 for i in range(2)
1365 timer_start(0, {-> var})
1366 endfor
1367 enddef
1368 Func()
1369 END
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001370 CheckScriptSuccess(lines)
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001371enddef
1372
Bram Moolenaarc70bdab2020-09-26 19:59:38 +02001373def Test_nested_closure_fails()
1374 let lines =<< trim END
1375 vim9script
1376 def FuncA()
1377 FuncB(0)
1378 enddef
1379 def FuncB(n: number): list<string>
1380 return map([0], {_, v -> n})
1381 enddef
1382 FuncA()
1383 END
1384 CheckScriptFailure(lines, 'E1012:')
1385enddef
1386
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001387def Test_sort_return_type()
1388 let res: list<number>
1389 res = [1, 2, 3]->sort()
1390enddef
1391
Bram Moolenaar08e51f42020-09-16 23:23:36 +02001392def Test_sort_argument()
1393 let res = ['b', 'a', 'c']->sort('i')
1394 res->assert_equal(['a', 'b', 'c'])
1395enddef
1396
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001397def Test_getqflist_return_type()
1398 let l = getqflist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001399 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001400
1401 let d = getqflist(#{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001402 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001403enddef
1404
1405def Test_getloclist_return_type()
1406 let l = getloclist(1)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001407 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001408
1409 let d = getloclist(1, #{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001410 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001411enddef
1412
Bram Moolenaara66ba012020-07-05 18:41:08 +02001413def Test_copy_return_type()
1414 let l = copy([1, 2, 3])
1415 let res = 0
1416 for n in l
1417 res += n
1418 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001419 res->assert_equal(6)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001420
1421 let dl = deepcopy([1, 2, 3])
1422 res = 0
1423 for n in dl
1424 res += n
1425 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001426 res->assert_equal(6)
Bram Moolenaar44b4a242020-09-05 17:18:28 +02001427
1428 dl = deepcopy([1, 2, 3], true)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001429enddef
1430
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001431def Test_extend_return_type()
1432 let l = extend([1, 2], [3])
1433 let res = 0
1434 for n in l
1435 res += n
1436 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001437 res->assert_equal(6)
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001438enddef
1439
Bram Moolenaar2df47312020-09-05 17:30:44 +02001440def Test_garbagecollect()
1441 garbagecollect(true)
1442enddef
1443
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001444def Test_insert_return_type()
1445 let l = insert([2, 1], 3)
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(6)
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001451enddef
1452
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001453def Test_keys_return_type()
1454 const var: list<string> = #{a: 1, b: 2}->keys()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001455 var->assert_equal(['a', 'b'])
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001456enddef
1457
Bram Moolenaar67627352020-07-05 21:10:24 +02001458def Test_reverse_return_type()
1459 let l = reverse([1, 2, 3])
1460 let res = 0
1461 for n in l
1462 res += n
1463 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001464 res->assert_equal(6)
Bram Moolenaar67627352020-07-05 21:10:24 +02001465enddef
1466
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001467def Test_remove_return_type()
1468 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1469 let res = 0
1470 for n in l
1471 res += n
1472 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001473 res->assert_equal(3)
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001474enddef
1475
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001476def Test_filter_return_type()
1477 let l = filter([1, 2, 3], {-> 1})
1478 let res = 0
1479 for n in l
1480 res += n
1481 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001482 res->assert_equal(6)
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001483enddef
1484
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001485def Test_bufnr()
1486 let buf = bufnr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001487 bufnr('%')->assert_equal(buf)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001488
1489 buf = bufnr('Xdummy', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001490 buf->assert_notequal(-1)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001491 exe 'bwipe! ' .. buf
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001492enddef
1493
Bram Moolenaarec65d772020-08-20 22:29:12 +02001494def Test_col()
1495 new
1496 setline(1, 'asdf')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001497 col([1, '$'])->assert_equal(5)
Bram Moolenaarec65d772020-08-20 22:29:12 +02001498enddef
1499
Bram Moolenaar24f77502020-09-04 19:50:57 +02001500def Test_char2nr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001501 char2nr('あ', true)->assert_equal(12354)
Bram Moolenaar24f77502020-09-04 19:50:57 +02001502enddef
1503
Bram Moolenaar3d945cc2020-08-06 21:26:59 +02001504def Test_getreg_return_type()
1505 let s1: string = getreg('"')
1506 let s2: string = getreg('"', 1)
1507 let s3: list<string> = getreg('"', 1, 1)
1508enddef
1509
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001510def Wrong_dict_key_type(items: list<number>): list<number>
1511 return filter(items, {_, val -> get({val: 1}, 'x')})
1512enddef
1513
1514def Test_wrong_dict_key_type()
Bram Moolenaar5e654232020-09-16 15:22:00 +02001515 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:')
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001516enddef
1517
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001518def Line_continuation_in_def(dir: string = ''): string
1519 let path: string = empty(dir)
1520 \ ? 'empty'
1521 \ : 'full'
1522 return path
1523enddef
1524
1525def Test_line_continuation_in_def()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001526 Line_continuation_in_def('.')->assert_equal('full')
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001527enddef
1528
Bram Moolenaar5e654232020-09-16 15:22:00 +02001529def Line_continuation_in_lambda(): list<string>
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001530 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001531 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001532 ->toupper()})
1533 ->reverse()
1534 return x
1535enddef
1536
1537def Test_line_continuation_in_lambda()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001538 Line_continuation_in_lambda()->assert_equal(['D', 'C', 'B', 'A'])
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001539enddef
1540
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001541func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001542 CheckScreendump
1543
1544 let lines =<< trim END
1545 vim9script
1546 def EchoNothing()
1547 silent echo ''
1548 enddef
1549 defcompile
1550 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001551 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001552
1553 " Check that the balloon shows up after a mouse move
1554 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001555 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001556 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1557
1558 " clean up
1559 call StopVimInTerminal(buf)
1560 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001561endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001562
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001563""""""" builtin functions that behave differently in Vim9
Bram Moolenaare15eebd2020-08-18 19:11:38 +02001564
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001565def Test_bufname()
1566 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001567 bufname('%')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001568 edit OtherFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001569 bufname('#')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001570 close
Bram Moolenaar191929b2020-08-19 21:20:49 +02001571enddef
1572
Bram Moolenaara5d38412020-09-02 21:02:35 +02001573def Test_bufwinid()
1574 let origwin = win_getid()
1575 below split SomeFile
1576 let SomeFileID = win_getid()
1577 below split OtherFile
1578 below split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001579 bufwinid('SomeFile')->assert_equal(SomeFileID)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001580
1581 win_gotoid(origwin)
1582 only
1583 bwipe SomeFile
1584 bwipe OtherFile
1585enddef
1586
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001587def Test_count()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001588 count('ABC ABC ABC', 'b', true)->assert_equal(3)
1589 count('ABC ABC ABC', 'b', false)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001590enddef
1591
1592def Test_expand()
1593 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001594 expand('%', true, true)->assert_equal(['SomeFile'])
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001595 close
1596enddef
1597
1598def Test_getbufinfo()
1599 let bufinfo = getbufinfo(bufnr())
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001600 getbufinfo('%')->assert_equal(bufinfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001601
1602 edit Xtestfile1
1603 hide edit Xtestfile2
1604 hide enew
1605 getbufinfo(#{bufloaded: true, buflisted: true, bufmodified: false})
1606 ->len()->assert_equal(3)
1607 bwipe Xtestfile1 Xtestfile2
1608enddef
1609
Bram Moolenaara5d38412020-09-02 21:02:35 +02001610def Test_getbufline()
1611 e SomeFile
1612 let buf = bufnr()
1613 e #
1614 let lines = ['aaa', 'bbb', 'ccc']
1615 setbufline(buf, 1, lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001616 getbufline('#', 1, '$')->assert_equal(lines)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001617
1618 bwipe!
1619enddef
1620
1621def Test_getchangelist()
1622 new
1623 setline(1, 'some text')
1624 let changelist = bufnr()->getchangelist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001625 getchangelist('%')->assert_equal(changelist)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001626 bwipe!
1627enddef
1628
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001629def Test_getchar()
Bram Moolenaar636c5d52020-09-05 18:48:57 +02001630 while getchar(0)
1631 endwhile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001632 getchar(true)->assert_equal(0)
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001633enddef
1634
Bram Moolenaard217a872020-09-05 18:31:33 +02001635def Test_getcompletion()
1636 set wildignore=*.vim,*~
1637 let l = getcompletion('run', 'file', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001638 l->assert_equal([])
Bram Moolenaard217a872020-09-05 18:31:33 +02001639 set wildignore&
1640enddef
1641
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001642def Test_getreg()
1643 let lines = ['aaa', 'bbb', 'ccc']
1644 setreg('a', lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001645 getreg('a', true, true)->assert_equal(lines)
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001646enddef
1647
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001648def Test_glob()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001649 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim'])
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001650enddef
1651
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001652def Test_globpath()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001653 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim'])
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001654enddef
1655
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001656def Test_has()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001657 has('eval', true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001658enddef
1659
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001660def Test_hasmapto()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001661 hasmapto('foobar', 'i', true)->assert_equal(0)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001662 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001663 hasmapto('foobar', 'i', true)->assert_equal(1)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001664 iunabbrev foo
1665enddef
1666
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001667def Test_index()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001668 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001669enddef
1670
1671def Test_list2str_str2list_utf8()
1672 let s = "\u3042\u3044"
1673 let l = [0x3042, 0x3044]
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001674 str2list(s, true)->assert_equal(l)
1675 list2str(l, true)->assert_equal(s)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001676enddef
1677
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001678def SID(): number
1679 return expand('<SID>')
1680 ->matchstr('<SNR>\zs\d\+\ze_$')
1681 ->str2nr()
1682enddef
1683
1684def Test_maparg()
1685 let lnum = str2nr(expand('<sflnum>'))
1686 map foo bar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001687 maparg('foo', '', false, true)->assert_equal(#{
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001688 lnum: lnum + 1,
1689 script: 0,
1690 mode: ' ',
1691 silent: 0,
1692 noremap: 0,
1693 lhs: 'foo',
1694 lhsraw: 'foo',
1695 nowait: 0,
1696 expr: 0,
1697 sid: SID(),
1698 rhs: 'bar',
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001699 buffer: 0})
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001700 unmap foo
1701enddef
1702
1703def Test_mapcheck()
1704 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001705 mapcheck('foo', 'i', true)->assert_equal('foobar')
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001706 iunabbrev foo
1707enddef
1708
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001709def Test_nr2char()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001710 nr2char(97, true)->assert_equal('a')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001711enddef
1712
1713def Test_readdir()
1714 eval expand('sautest')->readdir({e -> e[0] !=# '.'})
1715 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
1716enddef
1717
1718def Test_search()
1719 new
1720 setline(1, ['foo', 'bar'])
1721 let val = 0
1722 # skip expr returns boolean
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001723 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001724 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001725 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001726 # skip expr returns number, only 0 and 1 are accepted
1727 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001728 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001729 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001730 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001731 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1732 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1733enddef
1734
1735def Test_searchcount()
1736 new
1737 setline(1, "foo bar")
1738 :/foo
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001739 searchcount(#{recompute: true})
1740 ->assert_equal(#{
1741 exact_match: 1,
1742 current: 1,
1743 total: 1,
1744 maxcount: 99,
1745 incomplete: 0})
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001746 bwipe!
1747enddef
1748
1749def Test_searchdecl()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001750 searchdecl('blah', true, true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001751enddef
1752
1753def Test_setbufvar()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001754 setbufvar(bufnr('%'), '&syntax', 'vim')
1755 &syntax->assert_equal('vim')
1756 setbufvar(bufnr('%'), '&ts', 16)
1757 &ts->assert_equal(16)
1758 settabwinvar(1, 1, '&syntax', 'vam')
1759 &syntax->assert_equal('vam')
1760 settabwinvar(1, 1, '&ts', 15)
1761 &ts->assert_equal(15)
1762 setlocal ts=8
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001763
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001764 setbufvar('%', 'myvar', 123)
1765 getbufvar('%', 'myvar')->assert_equal(123)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001766enddef
1767
Bram Moolenaar401f0c02020-09-05 22:37:39 +02001768def Test_setloclist()
1769 let items = [#{filename: '/tmp/file', lnum: 1, valid: true}]
1770 let what = #{items: items}
1771 setqflist([], ' ', what)
1772 setloclist(0, [], ' ', what)
1773enddef
1774
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001775def Test_setreg()
1776 setreg('a', ['aaa', 'bbb', 'ccc'])
1777 let reginfo = getreginfo('a')
1778 setreg('a', reginfo)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001779 getreginfo('a')->assert_equal(reginfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001780enddef
1781
Bram Moolenaar7c27f332020-09-05 22:45:55 +02001782def Test_spellsuggest()
1783 if !has('spell')
1784 MissingFeature 'spell'
1785 else
1786 spellsuggest('marrch', 1, true)->assert_equal(['March'])
1787 endif
1788enddef
1789
Bram Moolenaar3986b942020-09-06 16:09:04 +02001790def Test_split()
1791 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', ''])
1792enddef
1793
1794def Test_str2nr()
1795 str2nr("1'000'000", 10, true)->assert_equal(1000000)
1796enddef
1797
1798def Test_strchars()
1799 strchars("A\u20dd", true)->assert_equal(1)
1800enddef
1801
Bram Moolenaarad304702020-09-06 18:22:53 +02001802def Test_submatch()
1803 let pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)'
1804 let Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()}
1805 let actual = substitute('A123456789', pat, Rep, '')
1806 let expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]"
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001807 actual->assert_equal(expected)
Bram Moolenaarad304702020-09-06 18:22:53 +02001808enddef
1809
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001810def Test_synID()
1811 new
1812 setline(1, "text")
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001813 synID(1, 1, true)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001814 bwipe!
1815enddef
1816
Bram Moolenaarad304702020-09-06 18:22:53 +02001817def Test_term_gettty()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001818 if !has('terminal')
1819 MissingFeature 'terminal'
1820 else
1821 let buf = Run_shell_in_terminal({})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001822 term_gettty(buf, true)->assert_notequal('')
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001823 StopShellInTerminal(buf)
1824 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001825enddef
1826
1827def Test_term_start()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001828 if !has('terminal')
1829 MissingFeature 'terminal'
1830 else
1831 botright new
1832 let winnr = winnr()
1833 term_start(&shell, #{curwin: true})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001834 winnr()->assert_equal(winnr)
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001835 bwipe!
1836 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001837enddef
1838
Bram Moolenaar418155d2020-09-06 18:39:38 +02001839def Test_timer_paused()
1840 let id = timer_start(50, {-> 0})
1841 timer_pause(id, true)
1842 let info = timer_info(id)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001843 info[0]['paused']->assert_equal(1)
Bram Moolenaar418155d2020-09-06 18:39:38 +02001844 timer_stop(id)
1845enddef
1846
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001847def Test_win_splitmove()
1848 split
1849 win_splitmove(1, 2, #{vertical: true, rightbelow: true})
1850 close
1851enddef
1852
1853""""""" end of builtin functions
1854
1855def Fibonacci(n: number): number
1856 if n < 2
1857 return n
1858 else
1859 return Fibonacci(n - 1) + Fibonacci(n - 2)
1860 endif
1861enddef
1862
Bram Moolenaar985116a2020-07-12 17:31:09 +02001863def Test_recursive_call()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001864 Fibonacci(20)->assert_equal(6765)
Bram Moolenaar985116a2020-07-12 17:31:09 +02001865enddef
1866
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001867def TreeWalk(dir: string): list<any>
1868 return readdir(dir)->map({_, val ->
1869 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaarbb1b5e22020-08-05 10:53:21 +02001870 ? {val: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001871 : val
1872 })
1873enddef
1874
1875def Test_closure_in_map()
1876 mkdir('XclosureDir/tdir', 'p')
1877 writefile(['111'], 'XclosureDir/file1')
1878 writefile(['222'], 'XclosureDir/file2')
1879 writefile(['333'], 'XclosureDir/tdir/file3')
1880
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001881 TreeWalk('XclosureDir')->assert_equal(['file1', 'file2', {'tdir': ['file3']}])
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001882
1883 delete('XclosureDir', 'rf')
1884enddef
1885
Bram Moolenaara90afb92020-07-15 22:38:56 +02001886def Test_partial_call()
1887 let Xsetlist = function('setloclist', [0])
1888 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001889 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001890
1891 Xsetlist = function('setloclist', [0, [], ' '])
1892 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001893 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001894
1895 Xsetlist = function('setqflist')
1896 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001897 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001898
1899 Xsetlist = function('setqflist', [[], ' '])
1900 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001901 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001902enddef
1903
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001904def Test_cmd_modifier()
1905 tab echo '0'
Bram Moolenaard2c61702020-09-06 15:58:36 +02001906 CheckDefFailure(['5tab echo 3'], 'E16:')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001907enddef
1908
1909def Test_restore_modifiers()
1910 # check that when compiling a :def function command modifiers are not messed
1911 # up.
1912 let lines =<< trim END
1913 vim9script
1914 set eventignore=
1915 autocmd QuickFixCmdPost * copen
1916 def AutocmdsDisabled()
1917 eval 0
1918 enddef
1919 func Func()
1920 noautocmd call s:AutocmdsDisabled()
1921 let g:ei_after = &eventignore
1922 endfunc
1923 Func()
1924 END
1925 CheckScriptSuccess(lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001926 g:ei_after->assert_equal('')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001927enddef
1928
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001929def StackTop()
1930 eval 1
1931 eval 2
1932 # call not on fourth line
1933 StackBot()
1934enddef
1935
1936def StackBot()
1937 # throw an error
1938 eval [][0]
1939enddef
1940
1941def Test_callstack_def()
1942 try
1943 StackTop()
1944 catch
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001945 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001946 endtry
1947enddef
1948
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001949
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001950" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker