blob: fe7bf69b856ba3df2f37e819440f39986c6cfbd0 [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 Moolenaar5deeb3f2020-04-05 17:08:17 +0200489def Test_call_func_defined_later()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200490 g:DefinedLater('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200491 assert_fails('NotDefined("one")', 'E117:', '', 2, 'Test_call_func_defined_later')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200492enddef
493
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200494func DefinedLater(arg)
495 return a:arg
496endfunc
497
498def Test_call_funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200499 g:SomeFunc('abc')->assert_equal(3)
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200500 assert_fails('NotAFunc()', 'E117:', '', 2, 'Test_call_funcref') # comment after call
501 assert_fails('g:NotAFunc()', 'E117:', '', 3, 'Test_call_funcref')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200502
503 let lines =<< trim END
504 vim9script
505 def RetNumber(): number
506 return 123
507 enddef
508 let Funcref: func: number = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200509 Funcref()->assert_equal(123)
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200510 END
511 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200512
513 lines =<< trim END
514 vim9script
515 def RetNumber(): number
516 return 123
517 enddef
518 def Bar(F: func: number): number
519 return F()
520 enddef
521 let Funcref = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200522 Bar(Funcref)->assert_equal(123)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200523 END
524 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200525
526 lines =<< trim END
527 vim9script
528 def UseNumber(nr: number)
529 echo nr
530 enddef
531 let Funcref: func(number) = function('UseNumber')
532 Funcref(123)
533 END
534 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200535
536 lines =<< trim END
537 vim9script
538 def UseNumber(nr: number)
539 echo nr
540 enddef
541 let Funcref: func(string) = function('UseNumber')
542 END
Bram Moolenaar5e654232020-09-16 15:22:00 +0200543 CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200544
545 lines =<< trim END
546 vim9script
547 def EchoNr(nr = 34)
548 g:echo = nr
549 enddef
550 let Funcref: func(?number) = function('EchoNr')
551 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200552 g:echo->assert_equal(34)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200553 Funcref(123)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200554 g:echo->assert_equal(123)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200555 END
556 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200557
558 lines =<< trim END
559 vim9script
560 def EchoList(...l: list<number>)
561 g:echo = l
562 enddef
563 let Funcref: func(...list<number>) = function('EchoList')
564 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200565 g:echo->assert_equal([])
Bram Moolenaarace61322020-07-26 18:16:58 +0200566 Funcref(1, 2, 3)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200567 g:echo->assert_equal([1, 2, 3])
Bram Moolenaarace61322020-07-26 18:16:58 +0200568 END
569 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200570
571 lines =<< trim END
572 vim9script
573 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
574 g:optarg = opt
575 g:listarg = l
576 return nr
577 enddef
578 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200579 Funcref(10)->assert_equal(10)
580 g:optarg->assert_equal(12)
581 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200582
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200583 Funcref(11, 22)->assert_equal(11)
584 g:optarg->assert_equal(22)
585 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200586
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200587 Funcref(17, 18, 1, 2, 3)->assert_equal(17)
588 g:optarg->assert_equal(18)
589 g:listarg->assert_equal([1, 2, 3])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200590 END
591 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200592enddef
593
594let SomeFunc = function('len')
595let NotAFunc = 'text'
596
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200597def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200598 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200599 let Ref1: func(bool): string
600 let Ref2: func(bool): number
601 let Ref3: func(bool): any
602 Ref3 = g:cond ? Ref1 : Ref2
603
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200604 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200605 let Refa1: func(bool): number
606 let Refa2: func(bool, number): number
607 let Refa3: func: number
608 Refa3 = g:cond ? Refa1 : Refa2
609
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200610 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200611 let Refb1: func(bool, string): number
612 let Refb2: func(string, number): number
613 let Refb3: func(any, any): number
614 Refb3 = g:cond ? Refb1 : Refb2
615enddef
616
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200617def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200618 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200619enddef
620
621def DefinedEvenLater(arg: string): string
622 return arg
623enddef
624
625def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200626 # Error in called function requires unwinding the call stack.
Bram Moolenaar44d66522020-09-06 22:26:57 +0200627 assert_fails('FuncWithForwardCall()', 'E1096:', '', 1, 'FuncWithForwardCall')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200628enddef
629
630def Test_return_type_wrong()
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200631 CheckScriptFailure([
632 'def Func(): number',
633 'return "a"',
634 'enddef',
635 'defcompile'], 'expected number but got string')
636 CheckScriptFailure([
637 'def Func(): string',
638 'return 1',
639 'enddef',
640 'defcompile'], 'expected string but got number')
641 CheckScriptFailure([
642 'def Func(): void',
643 'return "a"',
644 'enddef',
645 'defcompile'],
646 'E1096: Returning a value in a function without a return type')
647 CheckScriptFailure([
648 'def Func()',
649 'return "a"',
650 'enddef',
651 'defcompile'],
652 'E1096: Returning a value in a function without a return type')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200653
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200654 CheckScriptFailure([
655 'def Func(): number',
656 'return',
657 'enddef',
658 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200659
660 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
661 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200662 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200663
664 CheckScriptFailure([
665 'vim9script',
666 'def FuncB()',
667 ' return 123',
668 'enddef',
669 'def FuncA()',
670 ' FuncB()',
671 'enddef',
672 'defcompile'], 'E1096:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200673enddef
674
675def Test_arg_type_wrong()
676 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200677 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200678 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200679 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200680enddef
681
682def Test_vim9script_call()
683 let lines =<< trim END
684 vim9script
685 let var = ''
686 def MyFunc(arg: string)
687 var = arg
688 enddef
689 MyFunc('foobar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200690 var->assert_equal('foobar')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200691
692 let str = 'barfoo'
693 str->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200694 var->assert_equal('barfoo')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200695
Bram Moolenaar67979662020-06-20 22:50:47 +0200696 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200697 g:value->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200698 var->assert_equal('value')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200699
700 let listvar = []
701 def ListFunc(arg: list<number>)
702 listvar = arg
703 enddef
704 [1, 2, 3]->ListFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200705 listvar->assert_equal([1, 2, 3])
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200706
707 let dictvar = {}
708 def DictFunc(arg: dict<number>)
709 dictvar = arg
710 enddef
711 {'a': 1, 'b': 2}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200712 dictvar->assert_equal(#{a: 1, b: 2})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200713 def CompiledDict()
714 {'a': 3, 'b': 4}->DictFunc()
715 enddef
716 CompiledDict()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200717 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200718
719 #{a: 3, b: 4}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200720 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200721
722 ('text')->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200723 var->assert_equal('text')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200724 ("some")->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200725 var->assert_equal('some')
Bram Moolenaare6b53242020-07-01 17:28:33 +0200726
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200727 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200728 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200729 'asdfasdf'->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200730 var->assert_equal('asdfasdf')
Bram Moolenaar10409562020-07-29 20:00:38 +0200731 "xyz"->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200732 var->assert_equal('xyz')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200733
734 def UseString()
735 'xyork'->MyFunc()
736 enddef
737 UseString()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200738 var->assert_equal('xyork')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200739
Bram Moolenaar10409562020-07-29 20:00:38 +0200740 def UseString2()
741 "knife"->MyFunc()
742 enddef
743 UseString2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200744 var->assert_equal('knife')
Bram Moolenaar10409562020-07-29 20:00:38 +0200745
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200746 # prepending a colon makes it a mark
747 new
748 setline(1, ['aaa', 'bbb', 'ccc'])
749 normal! 3Gmt1G
750 :'t
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200751 getcurpos()[1]->assert_equal(3)
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200752 bwipe!
753
Bram Moolenaare6b53242020-07-01 17:28:33 +0200754 MyFunc(
755 'continued'
756 )
757 assert_equal('continued',
758 var
759 )
760
761 call MyFunc(
762 'more'
763 ..
764 'lines'
765 )
766 assert_equal(
767 'morelines',
768 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200769 END
770 writefile(lines, 'Xcall.vim')
771 source Xcall.vim
772 delete('Xcall.vim')
773enddef
774
775def Test_vim9script_call_fail_decl()
776 let lines =<< trim END
777 vim9script
778 let var = ''
779 def MyFunc(arg: string)
780 let var = 123
781 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200782 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200783 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200784 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200785enddef
786
Bram Moolenaar65b95452020-07-19 14:03:09 +0200787def Test_vim9script_call_fail_type()
788 let lines =<< trim END
789 vim9script
790 def MyFunc(arg: string)
791 echo arg
792 enddef
793 MyFunc(1234)
794 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200795 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
Bram Moolenaar65b95452020-07-19 14:03:09 +0200796enddef
797
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200798def Test_vim9script_call_fail_const()
799 let lines =<< trim END
800 vim9script
801 const var = ''
802 def MyFunc(arg: string)
803 var = 'asdf'
804 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200805 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200806 END
807 writefile(lines, 'Xcall_const.vim')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200808 assert_fails('source Xcall_const.vim', 'E46:', '', 1, 'MyFunc')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200809 delete('Xcall_const.vim')
810enddef
811
812" Test that inside :function a Python function can be defined, :def is not
813" recognized.
814func Test_function_python()
815 CheckFeature python3
816 let py = 'python3'
817 execute py "<< EOF"
818def do_something():
819 return 1
820EOF
821endfunc
822
823def Test_delfunc()
824 let lines =<< trim END
825 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200826 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200827 echo 'hello'
828 enddef
829
830 def CallGoneSoon()
831 GoneSoon()
832 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200833 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200834
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200835 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200836 CallGoneSoon()
837 END
838 writefile(lines, 'XToDelFunc')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200839 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
840 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200841
842 delete('XToDelFunc')
843enddef
844
845def Test_redef_failure()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200846 writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200847 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200848 writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200849 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200850 writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200851 assert_fails('so Xdef', 'E1027:', '', 1, 'Func0')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200852 writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200853 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200854 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200855
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200856 g:Func0()->assert_equal(0)
857 g:Func1()->assert_equal('Func1')
858 g:Func2()->assert_equal('Func2')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200859
860 delfunc! Func0
861 delfunc! Func1
862 delfunc! Func2
863enddef
864
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200865def Test_vim9script_func()
866 let lines =<< trim END
867 vim9script
868 func Func(arg)
869 echo a:arg
870 endfunc
871 Func('text')
872 END
873 writefile(lines, 'XVim9Func')
874 so XVim9Func
875
876 delete('XVim9Func')
877enddef
878
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200879" Test for internal functions returning different types
880func Test_InternalFuncRetType()
881 let lines =<< trim END
882 def RetFloat(): float
883 return ceil(1.456)
884 enddef
885
886 def RetListAny(): list<any>
Bram Moolenaar17a836c2020-08-12 17:35:58 +0200887 return items({'k': 'v'})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200888 enddef
889
890 def RetListString(): list<string>
891 return split('a:b:c', ':')
892 enddef
893
894 def RetListDictAny(): list<dict<any>>
895 return getbufinfo()
896 enddef
897
898 def RetDictNumber(): dict<number>
899 return wordcount()
900 enddef
901
902 def RetDictString(): dict<string>
903 return environ()
904 enddef
905 END
906 call writefile(lines, 'Xscript')
907 source Xscript
908
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200909 call RetFloat()->assert_equal(2.0)
910 call RetListAny()->assert_equal([['k', 'v']])
911 call RetListString()->assert_equal(['a', 'b', 'c'])
912 call RetListDictAny()->assert_notequal([])
913 call RetDictNumber()->assert_notequal({})
914 call RetDictString()->assert_notequal({})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200915 call delete('Xscript')
916endfunc
917
918" Test for passing too many or too few arguments to internal functions
919func Test_internalfunc_arg_error()
920 let l =<< trim END
921 def! FArgErr(): float
922 return ceil(1.1, 2)
923 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200924 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200925 END
926 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200927 call assert_fails('so Xinvalidarg', 'E118:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200928 let l =<< trim END
929 def! FArgErr(): float
930 return ceil()
931 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200932 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200933 END
934 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200935 call assert_fails('so Xinvalidarg', 'E119:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200936 call delete('Xinvalidarg')
937endfunc
938
939let s:funcResult = 0
940
941def FuncNoArgNoRet()
Bram Moolenaar53900992020-08-22 19:02:02 +0200942 s:funcResult = 11
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200943enddef
944
945def FuncNoArgRetNumber(): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200946 s:funcResult = 22
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200947 return 1234
948enddef
949
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200950def FuncNoArgRetString(): string
Bram Moolenaar53900992020-08-22 19:02:02 +0200951 s:funcResult = 45
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200952 return 'text'
953enddef
954
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200955def FuncOneArgNoRet(arg: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200956 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200957enddef
958
959def FuncOneArgRetNumber(arg: number): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200960 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200961 return arg
962enddef
963
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200964def FuncTwoArgNoRet(one: bool, two: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200965 s:funcResult = two
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200966enddef
967
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200968def FuncOneArgRetString(arg: string): string
969 return arg
970enddef
971
Bram Moolenaar89228602020-04-05 22:14:54 +0200972def FuncOneArgRetAny(arg: any): any
973 return arg
974enddef
975
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200976def Test_func_type()
977 let Ref1: func()
Bram Moolenaar53900992020-08-22 19:02:02 +0200978 s:funcResult = 0
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200979 Ref1 = FuncNoArgNoRet
980 Ref1()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200981 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200982
983 let Ref2: func
Bram Moolenaar53900992020-08-22 19:02:02 +0200984 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200985 Ref2 = FuncNoArgNoRet
986 Ref2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200987 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200988
Bram Moolenaar53900992020-08-22 19:02:02 +0200989 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200990 Ref2 = FuncOneArgNoRet
991 Ref2(12)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200992 s:funcResult->assert_equal(12)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200993
Bram Moolenaar53900992020-08-22 19:02:02 +0200994 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200995 Ref2 = FuncNoArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200996 Ref2()->assert_equal(1234)
997 s:funcResult->assert_equal(22)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200998
Bram Moolenaar53900992020-08-22 19:02:02 +0200999 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +02001000 Ref2 = FuncOneArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001001 Ref2(13)->assert_equal(13)
1002 s:funcResult->assert_equal(13)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001003enddef
1004
Bram Moolenaar9978d472020-07-05 16:01:56 +02001005def Test_repeat_return_type()
1006 let res = 0
1007 for n in repeat([1], 3)
1008 res += n
1009 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001010 res->assert_equal(3)
Bram Moolenaarfce82b32020-07-05 16:07:21 +02001011
1012 res = 0
1013 for n in add([1, 2], 3)
1014 res += n
1015 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001016 res->assert_equal(6)
Bram Moolenaar9978d472020-07-05 16:01:56 +02001017enddef
1018
Bram Moolenaar846178a2020-07-05 17:04:13 +02001019def Test_argv_return_type()
1020 next fileone filetwo
1021 let res = ''
1022 for name in argv()
1023 res ..= name
1024 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001025 res->assert_equal('fileonefiletwo')
Bram Moolenaar846178a2020-07-05 17:04:13 +02001026enddef
1027
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001028def Test_func_type_part()
1029 let RefVoid: func: void
1030 RefVoid = FuncNoArgNoRet
1031 RefVoid = FuncOneArgNoRet
Bram Moolenaar5e654232020-09-16 15:22:00 +02001032 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number')
1033 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001034
1035 let RefAny: func(): any
1036 RefAny = FuncNoArgRetNumber
1037 RefAny = FuncNoArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001038 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()')
1039 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001040
1041 let RefNr: func: number
1042 RefNr = FuncNoArgRetNumber
1043 RefNr = FuncOneArgRetNumber
Bram Moolenaar5e654232020-09-16 15:22:00 +02001044 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()')
1045 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001046
1047 let RefStr: func: string
1048 RefStr = FuncNoArgRetString
1049 RefStr = FuncOneArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001050 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()')
1051 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001052enddef
1053
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001054def Test_func_type_fails()
1055 CheckDefFailure(['let ref1: func()'], 'E704:')
1056
Bram Moolenaar5e654232020-09-16 15:22:00 +02001057 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number')
1058 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)')
1059 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
1060 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
1061 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
1062 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 +02001063
Bram Moolenaard2c61702020-09-06 15:58:36 +02001064 CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
1065 CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
1066 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:')
1067 CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001068enddef
1069
Bram Moolenaar89228602020-04-05 22:14:54 +02001070def Test_func_return_type()
1071 let nr: number
1072 nr = FuncNoArgRetNumber()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001073 nr->assert_equal(1234)
Bram Moolenaar89228602020-04-05 22:14:54 +02001074
1075 nr = FuncOneArgRetAny(122)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001076 nr->assert_equal(122)
Bram Moolenaar89228602020-04-05 22:14:54 +02001077
1078 let str: string
1079 str = FuncOneArgRetAny('yes')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001080 str->assert_equal('yes')
Bram Moolenaar89228602020-04-05 22:14:54 +02001081
Bram Moolenaar5e654232020-09-16 15:22:00 +02001082 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number')
Bram Moolenaar89228602020-04-05 22:14:54 +02001083enddef
1084
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001085def MultiLine(
1086 arg1: string,
1087 arg2 = 1234,
1088 ...rest: list<string>
1089 ): string
1090 return arg1 .. arg2 .. join(rest, '-')
1091enddef
1092
Bram Moolenaar2c330432020-04-13 14:41:35 +02001093def MultiLineComment(
1094 arg1: string, # comment
1095 arg2 = 1234, # comment
1096 ...rest: list<string> # comment
1097 ): string # comment
1098 return arg1 .. arg2 .. join(rest, '-')
1099enddef
1100
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001101def Test_multiline()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001102 MultiLine('text')->assert_equal('text1234')
1103 MultiLine('text', 777)->assert_equal('text777')
1104 MultiLine('text', 777, 'one')->assert_equal('text777one')
1105 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001106enddef
1107
Bram Moolenaar23e03252020-04-12 22:22:31 +02001108func Test_multiline_not_vim9()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001109 call MultiLine('text')->assert_equal('text1234')
1110 call MultiLine('text', 777)->assert_equal('text777')
1111 call MultiLine('text', 777, 'one')->assert_equal('text777one')
1112 call MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar23e03252020-04-12 22:22:31 +02001113endfunc
1114
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001115
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001116" When using CheckScriptFailure() for the below test, E1010 is generated instead
1117" of E1056.
1118func Test_E1056_1059()
1119 let caught_1056 = 0
1120 try
1121 def F():
1122 return 1
1123 enddef
1124 catch /E1056:/
1125 let caught_1056 = 1
1126 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001127 eval caught_1056->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001128
1129 let caught_1059 = 0
1130 try
1131 def F5(items : list)
1132 echo 'a'
1133 enddef
1134 catch /E1059:/
1135 let caught_1059 = 1
1136 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001137 eval caught_1059->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001138endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001139
Bram Moolenaar015f4262020-05-05 21:25:22 +02001140func DelMe()
1141 echo 'DelMe'
1142endfunc
1143
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001144def Test_error_reporting()
1145 # comment lines at the start of the function
1146 let lines =<< trim END
1147 " comment
1148 def Func()
1149 # comment
1150 # comment
1151 invalid
1152 enddef
1153 defcompile
1154 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001155 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001156 try
1157 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001158 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001159 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001160 v:exception->assert_match('Invalid command: invalid')
1161 v:throwpoint->assert_match(', line 3$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001162 endtry
1163
1164 # comment lines after the start of the function
1165 lines =<< trim END
1166 " comment
1167 def Func()
1168 let x = 1234
1169 # comment
1170 # comment
1171 invalid
1172 enddef
1173 defcompile
1174 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001175 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001176 try
1177 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001178 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001179 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001180 v:exception->assert_match('Invalid command: invalid')
1181 v:throwpoint->assert_match(', line 4$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001182 endtry
1183
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001184 lines =<< trim END
1185 vim9script
1186 def Func()
1187 let db = #{foo: 1, bar: 2}
1188 # comment
1189 let x = db.asdf
1190 enddef
1191 defcompile
1192 Func()
1193 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001194 writefile(lines, 'Xdef')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001195 try
1196 source Xdef
1197 assert_report('should have failed')
1198 catch /E716:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001199 v:throwpoint->assert_match('_Func, line 3$')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001200 endtry
1201
Bram Moolenaar08052222020-09-14 17:04:31 +02001202 delete('Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001203enddef
1204
Bram Moolenaar015f4262020-05-05 21:25:22 +02001205def Test_deleted_function()
1206 CheckDefExecFailure([
1207 'let RefMe: func = function("g:DelMe")',
1208 'delfunc g:DelMe',
1209 'echo RefMe()'], 'E117:')
1210enddef
1211
1212def Test_unknown_function()
1213 CheckDefExecFailure([
1214 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001215 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +02001216enddef
1217
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001218def RefFunc(Ref: func(string): string): string
1219 return Ref('more')
1220enddef
1221
1222def Test_closure_simple()
1223 let local = 'some '
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001224 RefFunc({s -> local .. s})->assert_equal('some more')
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001225enddef
1226
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001227def MakeRef()
1228 let local = 'some '
1229 g:Ref = {s -> local .. s}
1230enddef
1231
1232def Test_closure_ref_after_return()
1233 MakeRef()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001234 g:Ref('thing')->assert_equal('some thing')
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001235 unlet g:Ref
1236enddef
1237
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001238def MakeTwoRefs()
1239 let local = ['some']
1240 g:Extend = {s -> local->add(s)}
1241 g:Read = {-> local}
1242enddef
1243
1244def Test_closure_two_refs()
1245 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001246 join(g:Read(), ' ')->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001247 g:Extend('more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001248 join(g:Read(), ' ')->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001249 g:Extend('even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001250 join(g:Read(), ' ')->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001251
1252 unlet g:Extend
1253 unlet g:Read
1254enddef
1255
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001256def ReadRef(Ref: func(): list<string>): string
1257 return join(Ref(), ' ')
1258enddef
1259
Bram Moolenaar5e654232020-09-16 15:22:00 +02001260def ExtendRef(Ref: func(string): list<string>, add: string)
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001261 Ref(add)
1262enddef
1263
1264def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001265 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001266 ReadRef(g:Read)->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001267 ExtendRef(g:Extend, 'more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001268 ReadRef(g:Read)->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001269 ExtendRef(g:Extend, 'even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001270 ReadRef(g:Read)->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001271
1272 unlet g:Extend
1273 unlet g:Read
1274enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001275
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001276def MakeArgRefs(theArg: string)
1277 let local = 'loc_val'
1278 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1279enddef
1280
1281def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1282 let local = 'the_loc'
1283 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1284enddef
1285
1286def Test_closure_using_argument()
1287 MakeArgRefs('arg_val')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001288 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001289
1290 MakeArgRefsVarargs('arg_val', 'one', 'two')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001291 g:UseVararg('call_val')->assert_equal('arg_val/the_loc/call_val/one two')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001292
1293 unlet g:UseArg
1294 unlet g:UseVararg
1295enddef
1296
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001297def MakeGetAndAppendRefs()
1298 let local = 'a'
1299
1300 def Append(arg: string)
1301 local ..= arg
1302 enddef
1303 g:Append = Append
1304
1305 def Get(): string
1306 return local
1307 enddef
1308 g:Get = Get
1309enddef
1310
1311def Test_closure_append_get()
1312 MakeGetAndAppendRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001313 g:Get()->assert_equal('a')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001314 g:Append('-b')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001315 g:Get()->assert_equal('a-b')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001316 g:Append('-c')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001317 g:Get()->assert_equal('a-b-c')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001318
1319 unlet g:Append
1320 unlet g:Get
1321enddef
1322
Bram Moolenaar04b12692020-05-04 23:24:44 +02001323def Test_nested_closure()
1324 let local = 'text'
1325 def Closure(arg: string): string
1326 return local .. arg
1327 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001328 Closure('!!!')->assert_equal('text!!!')
Bram Moolenaar04b12692020-05-04 23:24:44 +02001329enddef
1330
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001331func GetResult(Ref)
1332 return a:Ref('some')
1333endfunc
1334
1335def Test_call_closure_not_compiled()
1336 let text = 'text'
1337 g:Ref = {s -> s .. text}
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001338 GetResult(g:Ref)->assert_equal('sometext')
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001339enddef
1340
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001341def Test_double_closure_fails()
1342 let lines =<< trim END
1343 vim9script
1344 def Func()
1345 let var = 0
1346 for i in range(2)
1347 timer_start(0, {-> var})
1348 endfor
1349 enddef
1350 Func()
1351 END
1352 CheckScriptFailure(lines, 'Multiple closures not supported yet')
1353enddef
1354
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001355def Test_sort_return_type()
1356 let res: list<number>
1357 res = [1, 2, 3]->sort()
1358enddef
1359
Bram Moolenaar08e51f42020-09-16 23:23:36 +02001360def Test_sort_argument()
1361 let res = ['b', 'a', 'c']->sort('i')
1362 res->assert_equal(['a', 'b', 'c'])
1363enddef
1364
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001365def Test_getqflist_return_type()
1366 let l = getqflist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001367 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001368
1369 let d = getqflist(#{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001370 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001371enddef
1372
1373def Test_getloclist_return_type()
1374 let l = getloclist(1)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001375 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001376
1377 let d = getloclist(1, #{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001378 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001379enddef
1380
Bram Moolenaara66ba012020-07-05 18:41:08 +02001381def Test_copy_return_type()
1382 let l = copy([1, 2, 3])
1383 let res = 0
1384 for n in l
1385 res += n
1386 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001387 res->assert_equal(6)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001388
1389 let dl = deepcopy([1, 2, 3])
1390 res = 0
1391 for n in dl
1392 res += n
1393 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001394 res->assert_equal(6)
Bram Moolenaar44b4a242020-09-05 17:18:28 +02001395
1396 dl = deepcopy([1, 2, 3], true)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001397enddef
1398
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001399def Test_extend_return_type()
1400 let l = extend([1, 2], [3])
1401 let res = 0
1402 for n in l
1403 res += n
1404 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001405 res->assert_equal(6)
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001406enddef
1407
Bram Moolenaar2df47312020-09-05 17:30:44 +02001408def Test_garbagecollect()
1409 garbagecollect(true)
1410enddef
1411
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001412def Test_insert_return_type()
1413 let l = insert([2, 1], 3)
1414 let res = 0
1415 for n in l
1416 res += n
1417 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001418 res->assert_equal(6)
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001419enddef
1420
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001421def Test_keys_return_type()
1422 const var: list<string> = #{a: 1, b: 2}->keys()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001423 var->assert_equal(['a', 'b'])
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001424enddef
1425
Bram Moolenaar67627352020-07-05 21:10:24 +02001426def Test_reverse_return_type()
1427 let l = reverse([1, 2, 3])
1428 let res = 0
1429 for n in l
1430 res += n
1431 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001432 res->assert_equal(6)
Bram Moolenaar67627352020-07-05 21:10:24 +02001433enddef
1434
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001435def Test_remove_return_type()
1436 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
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(3)
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001442enddef
1443
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001444def Test_filter_return_type()
1445 let l = filter([1, 2, 3], {-> 1})
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 Moolenaar0d94ad62020-07-05 20:16:41 +02001451enddef
1452
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001453def Test_bufnr()
1454 let buf = bufnr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001455 bufnr('%')->assert_equal(buf)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001456
1457 buf = bufnr('Xdummy', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001458 buf->assert_notequal(-1)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001459 exe 'bwipe! ' .. buf
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001460enddef
1461
Bram Moolenaarec65d772020-08-20 22:29:12 +02001462def Test_col()
1463 new
1464 setline(1, 'asdf')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001465 col([1, '$'])->assert_equal(5)
Bram Moolenaarec65d772020-08-20 22:29:12 +02001466enddef
1467
Bram Moolenaar24f77502020-09-04 19:50:57 +02001468def Test_char2nr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001469 char2nr('あ', true)->assert_equal(12354)
Bram Moolenaar24f77502020-09-04 19:50:57 +02001470enddef
1471
Bram Moolenaar3d945cc2020-08-06 21:26:59 +02001472def Test_getreg_return_type()
1473 let s1: string = getreg('"')
1474 let s2: string = getreg('"', 1)
1475 let s3: list<string> = getreg('"', 1, 1)
1476enddef
1477
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001478def Wrong_dict_key_type(items: list<number>): list<number>
1479 return filter(items, {_, val -> get({val: 1}, 'x')})
1480enddef
1481
1482def Test_wrong_dict_key_type()
Bram Moolenaar5e654232020-09-16 15:22:00 +02001483 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:')
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001484enddef
1485
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001486def Line_continuation_in_def(dir: string = ''): string
1487 let path: string = empty(dir)
1488 \ ? 'empty'
1489 \ : 'full'
1490 return path
1491enddef
1492
1493def Test_line_continuation_in_def()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001494 Line_continuation_in_def('.')->assert_equal('full')
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001495enddef
1496
Bram Moolenaar5e654232020-09-16 15:22:00 +02001497def Line_continuation_in_lambda(): list<string>
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001498 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001499 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001500 ->toupper()})
1501 ->reverse()
1502 return x
1503enddef
1504
1505def Test_line_continuation_in_lambda()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001506 Line_continuation_in_lambda()->assert_equal(['D', 'C', 'B', 'A'])
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001507enddef
1508
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001509func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001510 CheckScreendump
1511
1512 let lines =<< trim END
1513 vim9script
1514 def EchoNothing()
1515 silent echo ''
1516 enddef
1517 defcompile
1518 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001519 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001520
1521 " Check that the balloon shows up after a mouse move
1522 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001523 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001524 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1525
1526 " clean up
1527 call StopVimInTerminal(buf)
1528 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001529endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001530
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001531""""""" builtin functions that behave differently in Vim9
Bram Moolenaare15eebd2020-08-18 19:11:38 +02001532
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001533def Test_bufname()
1534 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001535 bufname('%')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001536 edit OtherFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001537 bufname('#')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001538 close
Bram Moolenaar191929b2020-08-19 21:20:49 +02001539enddef
1540
Bram Moolenaara5d38412020-09-02 21:02:35 +02001541def Test_bufwinid()
1542 let origwin = win_getid()
1543 below split SomeFile
1544 let SomeFileID = win_getid()
1545 below split OtherFile
1546 below split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001547 bufwinid('SomeFile')->assert_equal(SomeFileID)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001548
1549 win_gotoid(origwin)
1550 only
1551 bwipe SomeFile
1552 bwipe OtherFile
1553enddef
1554
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001555def Test_count()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001556 count('ABC ABC ABC', 'b', true)->assert_equal(3)
1557 count('ABC ABC ABC', 'b', false)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001558enddef
1559
1560def Test_expand()
1561 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001562 expand('%', true, true)->assert_equal(['SomeFile'])
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001563 close
1564enddef
1565
1566def Test_getbufinfo()
1567 let bufinfo = getbufinfo(bufnr())
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001568 getbufinfo('%')->assert_equal(bufinfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001569
1570 edit Xtestfile1
1571 hide edit Xtestfile2
1572 hide enew
1573 getbufinfo(#{bufloaded: true, buflisted: true, bufmodified: false})
1574 ->len()->assert_equal(3)
1575 bwipe Xtestfile1 Xtestfile2
1576enddef
1577
Bram Moolenaara5d38412020-09-02 21:02:35 +02001578def Test_getbufline()
1579 e SomeFile
1580 let buf = bufnr()
1581 e #
1582 let lines = ['aaa', 'bbb', 'ccc']
1583 setbufline(buf, 1, lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001584 getbufline('#', 1, '$')->assert_equal(lines)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001585
1586 bwipe!
1587enddef
1588
1589def Test_getchangelist()
1590 new
1591 setline(1, 'some text')
1592 let changelist = bufnr()->getchangelist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001593 getchangelist('%')->assert_equal(changelist)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001594 bwipe!
1595enddef
1596
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001597def Test_getchar()
Bram Moolenaar636c5d52020-09-05 18:48:57 +02001598 while getchar(0)
1599 endwhile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001600 getchar(true)->assert_equal(0)
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001601enddef
1602
Bram Moolenaard217a872020-09-05 18:31:33 +02001603def Test_getcompletion()
1604 set wildignore=*.vim,*~
1605 let l = getcompletion('run', 'file', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001606 l->assert_equal([])
Bram Moolenaard217a872020-09-05 18:31:33 +02001607 set wildignore&
1608enddef
1609
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001610def Test_getreg()
1611 let lines = ['aaa', 'bbb', 'ccc']
1612 setreg('a', lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001613 getreg('a', true, true)->assert_equal(lines)
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001614enddef
1615
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001616def Test_glob()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001617 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim'])
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001618enddef
1619
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001620def Test_globpath()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001621 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim'])
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001622enddef
1623
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001624def Test_has()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001625 has('eval', true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001626enddef
1627
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001628def Test_hasmapto()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001629 hasmapto('foobar', 'i', true)->assert_equal(0)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001630 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001631 hasmapto('foobar', 'i', true)->assert_equal(1)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001632 iunabbrev foo
1633enddef
1634
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001635def Test_index()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001636 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001637enddef
1638
1639def Test_list2str_str2list_utf8()
1640 let s = "\u3042\u3044"
1641 let l = [0x3042, 0x3044]
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001642 str2list(s, true)->assert_equal(l)
1643 list2str(l, true)->assert_equal(s)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001644enddef
1645
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001646def SID(): number
1647 return expand('<SID>')
1648 ->matchstr('<SNR>\zs\d\+\ze_$')
1649 ->str2nr()
1650enddef
1651
1652def Test_maparg()
1653 let lnum = str2nr(expand('<sflnum>'))
1654 map foo bar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001655 maparg('foo', '', false, true)->assert_equal(#{
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001656 lnum: lnum + 1,
1657 script: 0,
1658 mode: ' ',
1659 silent: 0,
1660 noremap: 0,
1661 lhs: 'foo',
1662 lhsraw: 'foo',
1663 nowait: 0,
1664 expr: 0,
1665 sid: SID(),
1666 rhs: 'bar',
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001667 buffer: 0})
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001668 unmap foo
1669enddef
1670
1671def Test_mapcheck()
1672 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001673 mapcheck('foo', 'i', true)->assert_equal('foobar')
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001674 iunabbrev foo
1675enddef
1676
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001677def Test_nr2char()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001678 nr2char(97, true)->assert_equal('a')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001679enddef
1680
1681def Test_readdir()
1682 eval expand('sautest')->readdir({e -> e[0] !=# '.'})
1683 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
1684enddef
1685
1686def Test_search()
1687 new
1688 setline(1, ['foo', 'bar'])
1689 let val = 0
1690 # skip expr returns boolean
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001691 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001692 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001693 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001694 # skip expr returns number, only 0 and 1 are accepted
1695 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001696 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001697 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001698 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001699 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1700 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1701enddef
1702
1703def Test_searchcount()
1704 new
1705 setline(1, "foo bar")
1706 :/foo
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001707 searchcount(#{recompute: true})
1708 ->assert_equal(#{
1709 exact_match: 1,
1710 current: 1,
1711 total: 1,
1712 maxcount: 99,
1713 incomplete: 0})
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001714 bwipe!
1715enddef
1716
1717def Test_searchdecl()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001718 searchdecl('blah', true, true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001719enddef
1720
1721def Test_setbufvar()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001722 setbufvar(bufnr('%'), '&syntax', 'vim')
1723 &syntax->assert_equal('vim')
1724 setbufvar(bufnr('%'), '&ts', 16)
1725 &ts->assert_equal(16)
1726 settabwinvar(1, 1, '&syntax', 'vam')
1727 &syntax->assert_equal('vam')
1728 settabwinvar(1, 1, '&ts', 15)
1729 &ts->assert_equal(15)
1730 setlocal ts=8
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001731
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001732 setbufvar('%', 'myvar', 123)
1733 getbufvar('%', 'myvar')->assert_equal(123)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001734enddef
1735
Bram Moolenaar401f0c02020-09-05 22:37:39 +02001736def Test_setloclist()
1737 let items = [#{filename: '/tmp/file', lnum: 1, valid: true}]
1738 let what = #{items: items}
1739 setqflist([], ' ', what)
1740 setloclist(0, [], ' ', what)
1741enddef
1742
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001743def Test_setreg()
1744 setreg('a', ['aaa', 'bbb', 'ccc'])
1745 let reginfo = getreginfo('a')
1746 setreg('a', reginfo)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001747 getreginfo('a')->assert_equal(reginfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001748enddef
1749
Bram Moolenaar7c27f332020-09-05 22:45:55 +02001750def Test_spellsuggest()
1751 if !has('spell')
1752 MissingFeature 'spell'
1753 else
1754 spellsuggest('marrch', 1, true)->assert_equal(['March'])
1755 endif
1756enddef
1757
Bram Moolenaar3986b942020-09-06 16:09:04 +02001758def Test_split()
1759 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', ''])
1760enddef
1761
1762def Test_str2nr()
1763 str2nr("1'000'000", 10, true)->assert_equal(1000000)
1764enddef
1765
1766def Test_strchars()
1767 strchars("A\u20dd", true)->assert_equal(1)
1768enddef
1769
Bram Moolenaarad304702020-09-06 18:22:53 +02001770def Test_submatch()
1771 let pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)'
1772 let Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()}
1773 let actual = substitute('A123456789', pat, Rep, '')
1774 let expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]"
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001775 actual->assert_equal(expected)
Bram Moolenaarad304702020-09-06 18:22:53 +02001776enddef
1777
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001778def Test_synID()
1779 new
1780 setline(1, "text")
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001781 synID(1, 1, true)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001782 bwipe!
1783enddef
1784
Bram Moolenaarad304702020-09-06 18:22:53 +02001785def Test_term_gettty()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001786 if !has('terminal')
1787 MissingFeature 'terminal'
1788 else
1789 let buf = Run_shell_in_terminal({})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001790 term_gettty(buf, true)->assert_notequal('')
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001791 StopShellInTerminal(buf)
1792 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001793enddef
1794
1795def Test_term_start()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001796 if !has('terminal')
1797 MissingFeature 'terminal'
1798 else
1799 botright new
1800 let winnr = winnr()
1801 term_start(&shell, #{curwin: true})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001802 winnr()->assert_equal(winnr)
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001803 bwipe!
1804 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001805enddef
1806
Bram Moolenaar418155d2020-09-06 18:39:38 +02001807def Test_timer_paused()
1808 let id = timer_start(50, {-> 0})
1809 timer_pause(id, true)
1810 let info = timer_info(id)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001811 info[0]['paused']->assert_equal(1)
Bram Moolenaar418155d2020-09-06 18:39:38 +02001812 timer_stop(id)
1813enddef
1814
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001815def Test_win_splitmove()
1816 split
1817 win_splitmove(1, 2, #{vertical: true, rightbelow: true})
1818 close
1819enddef
1820
1821""""""" end of builtin functions
1822
1823def Fibonacci(n: number): number
1824 if n < 2
1825 return n
1826 else
1827 return Fibonacci(n - 1) + Fibonacci(n - 2)
1828 endif
1829enddef
1830
Bram Moolenaar985116a2020-07-12 17:31:09 +02001831def Test_recursive_call()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001832 Fibonacci(20)->assert_equal(6765)
Bram Moolenaar985116a2020-07-12 17:31:09 +02001833enddef
1834
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001835def TreeWalk(dir: string): list<any>
1836 return readdir(dir)->map({_, val ->
1837 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaarbb1b5e22020-08-05 10:53:21 +02001838 ? {val: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001839 : val
1840 })
1841enddef
1842
1843def Test_closure_in_map()
1844 mkdir('XclosureDir/tdir', 'p')
1845 writefile(['111'], 'XclosureDir/file1')
1846 writefile(['222'], 'XclosureDir/file2')
1847 writefile(['333'], 'XclosureDir/tdir/file3')
1848
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001849 TreeWalk('XclosureDir')->assert_equal(['file1', 'file2', {'tdir': ['file3']}])
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001850
1851 delete('XclosureDir', 'rf')
1852enddef
1853
Bram Moolenaara90afb92020-07-15 22:38:56 +02001854def Test_partial_call()
1855 let Xsetlist = function('setloclist', [0])
1856 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001857 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001858
1859 Xsetlist = function('setloclist', [0, [], ' '])
1860 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001861 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001862
1863 Xsetlist = function('setqflist')
1864 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001865 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001866
1867 Xsetlist = function('setqflist', [[], ' '])
1868 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001869 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001870enddef
1871
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001872def Test_cmd_modifier()
1873 tab echo '0'
Bram Moolenaard2c61702020-09-06 15:58:36 +02001874 CheckDefFailure(['5tab echo 3'], 'E16:')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001875enddef
1876
1877def Test_restore_modifiers()
1878 # check that when compiling a :def function command modifiers are not messed
1879 # up.
1880 let lines =<< trim END
1881 vim9script
1882 set eventignore=
1883 autocmd QuickFixCmdPost * copen
1884 def AutocmdsDisabled()
1885 eval 0
1886 enddef
1887 func Func()
1888 noautocmd call s:AutocmdsDisabled()
1889 let g:ei_after = &eventignore
1890 endfunc
1891 Func()
1892 END
1893 CheckScriptSuccess(lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001894 g:ei_after->assert_equal('')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001895enddef
1896
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001897def StackTop()
1898 eval 1
1899 eval 2
1900 # call not on fourth line
1901 StackBot()
1902enddef
1903
1904def StackBot()
1905 # throw an error
1906 eval [][0]
1907enddef
1908
1909def Test_callstack_def()
1910 try
1911 StackTop()
1912 catch
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001913 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001914 endtry
1915enddef
1916
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001917
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001918" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker