blob: 1ccaeb308a1385003578d7ee5b90f7435786b3e1 [file] [log] [blame]
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001" Test various aspects of the Vim9 script language.
2
3source check.vim
4source view_util.vim
Bram Moolenaar04b12692020-05-04 23:24:44 +02005source vim9.vim
Bram Moolenaar47e7d702020-07-05 18:18:42 +02006source screendump.vim
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02007
8func Test_def_basic()
9 def SomeFunc(): string
10 return 'yes'
11 enddef
12 call assert_equal('yes', SomeFunc())
13endfunc
14
15def ReturnString(): string
16 return 'string'
17enddef
18
19def ReturnNumber(): number
20 return 123
21enddef
22
23let g:notNumber = 'string'
24
25def ReturnGlobal(): number
26 return g:notNumber
27enddef
28
29def Test_return_something()
30 assert_equal('string', ReturnString())
31 assert_equal(123, ReturnNumber())
32 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
33enddef
34
Bram Moolenaarefd88552020-06-18 20:50:10 +020035def Test_missing_return()
36 CheckDefFailure(['def Missing(): number',
37 ' if g:cond',
38 ' echo "no return"',
39 ' else',
40 ' return 0',
41 ' endif'
42 'enddef'], 'E1027:')
43 CheckDefFailure(['def Missing(): number',
44 ' if g:cond',
45 ' return 1',
46 ' else',
47 ' echo "no return"',
48 ' endif'
49 'enddef'], 'E1027:')
50 CheckDefFailure(['def Missing(): number',
51 ' if g:cond',
52 ' return 1',
53 ' else',
54 ' return 2',
55 ' endif'
56 ' return 3'
57 'enddef'], 'E1095:')
58enddef
59
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020060let s:nothing = 0
61def ReturnNothing()
62 s:nothing = 1
63 if true
64 return
65 endif
66 s:nothing = 2
67enddef
68
69def Test_return_nothing()
70 ReturnNothing()
71 assert_equal(1, s:nothing)
72enddef
73
74func Increment()
75 let g:counter += 1
76endfunc
77
78def Test_call_ufunc_count()
79 g:counter = 1
80 Increment()
81 Increment()
82 Increment()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020083 # works with and without :call
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020084 assert_equal(4, g:counter)
85 call assert_equal(4, g:counter)
86 unlet g:counter
87enddef
88
89def MyVarargs(arg: string, ...rest: list<string>): string
90 let res = arg
91 for s in rest
92 res ..= ',' .. s
93 endfor
94 return res
95enddef
96
97def Test_call_varargs()
98 assert_equal('one', MyVarargs('one'))
99 assert_equal('one,two', MyVarargs('one', 'two'))
100 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
101enddef
102
103def MyDefaultArgs(name = 'string'): string
104 return name
105enddef
106
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200107def MyDefaultSecond(name: string, second: bool = true): string
108 return second ? name : 'none'
109enddef
110
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200111def Test_call_default_args()
112 assert_equal('string', MyDefaultArgs())
113 assert_equal('one', MyDefaultArgs('one'))
114 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
115
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200116 assert_equal('test', MyDefaultSecond('test'))
117 assert_equal('test', MyDefaultSecond('test', true))
118 assert_equal('none', MyDefaultSecond('test', false))
119
Bram Moolenaar822ba242020-05-24 23:00:18 +0200120 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
121 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 +0200122enddef
123
124def Test_nested_function()
125 def Nested(arg: string): string
126 return 'nested ' .. arg
127 enddef
128 assert_equal('nested function', Nested('function'))
129
Bram Moolenaar0e65d3d2020-05-05 17:53:16 +0200130 CheckDefFailure(['def Nested()', 'enddef', 'Nested(66)'], 'E118:')
131 CheckDefFailure(['def Nested(arg: string)', 'enddef', 'Nested()'], 'E119:')
132
Bram Moolenaar04b12692020-05-04 23:24:44 +0200133 CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
Bram Moolenaarbcbf4132020-08-01 22:35:13 +0200134 CheckDefFailure(['def s:Nested()', 'enddef'], 'E1075:')
135 CheckDefFailure(['def b:Nested()', 'enddef'], 'E1075:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200136enddef
137
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200138func Test_call_default_args_from_func()
139 call assert_equal('string', MyDefaultArgs())
140 call assert_equal('one', MyDefaultArgs('one'))
141 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
142endfunc
143
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200144def Test_nested_global_function()
145 let lines =<< trim END
146 vim9script
147 def Outer()
148 def g:Inner(): string
149 return 'inner'
150 enddef
151 enddef
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200152 defcompile
153 Outer()
154 assert_equal('inner', g:Inner())
155 delfunc g:Inner
156 Outer()
157 assert_equal('inner', g:Inner())
158 delfunc g:Inner
159 Outer()
160 assert_equal('inner', g:Inner())
161 delfunc g:Inner
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200162 END
163 CheckScriptSuccess(lines)
Bram Moolenaar2c79e9d2020-08-01 18:57:52 +0200164
165 lines =<< trim END
166 vim9script
167 def Outer()
168 def g:Inner(): string
169 return 'inner'
170 enddef
171 enddef
172 defcompile
173 Outer()
174 Outer()
175 END
176 CheckScriptFailure(lines, "E122:")
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200177enddef
178
Bram Moolenaar333894b2020-08-01 18:53:07 +0200179def Test_global_local_function()
180 let lines =<< trim END
181 vim9script
182 def g:Func(): string
183 return 'global'
184 enddef
185 def Func(): string
186 return 'local'
187 enddef
188 assert_equal('global', g:Func())
189 assert_equal('local', Func())
190 END
191 CheckScriptSuccess(lines)
192enddef
193
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200194func TakesOneArg(arg)
195 echo a:arg
196endfunc
197
198def Test_call_wrong_args()
199 call CheckDefFailure(['TakesOneArg()'], 'E119:')
200 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
201 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaar1c0d44f2020-05-02 19:04:58 +0200202 call CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200203enddef
204
205" Default arg and varargs
206def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
207 let res = one .. ',' .. two
208 for s in rest
209 res ..= ',' .. s
210 endfor
211 return res
212enddef
213
214def Test_call_def_varargs()
215 call assert_fails('call MyDefVarargs()', 'E119:')
216 assert_equal('one,foo', MyDefVarargs('one'))
217 assert_equal('one,two', MyDefVarargs('one', 'two'))
218 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200219 CheckDefFailure(['MyDefVarargs("one", 22)'],
220 'E1013: argument 2: type mismatch, expected string but got number')
221 CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
222 'E1013: argument 3: type mismatch, expected string but got number')
223
224 let lines =<< trim END
225 vim9script
226 def Func(...l: list<string>)
227 echo l
228 enddef
229 Func('a', 'b', 'c')
230 END
231 CheckScriptSuccess(lines)
232
233 lines =<< trim END
234 vim9script
235 def Func(...l: list<string>)
236 echo l
237 enddef
238 Func()
239 END
240 CheckScriptSuccess(lines)
241
242 lines =<< trim END
243 vim9script
244 def Func(...l: list<string>)
245 echo l
246 enddef
247 Func(1, 2, 3)
248 END
249 CheckScriptFailure(lines, 'E1013:')
250
251 lines =<< trim END
252 vim9script
253 def Func(...l: list<string>)
254 echo l
255 enddef
256 Func('a', 9)
257 END
258 CheckScriptFailure(lines, 'E1013:')
259
260 lines =<< trim END
261 vim9script
262 def Func(...l: list<string>)
263 echo l
264 enddef
265 Func(1, 'a')
266 END
267 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200268enddef
269
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200270let s:value = ''
271
272def FuncOneDefArg(opt = 'text')
273 s:value = opt
274enddef
275
276def FuncTwoDefArg(nr = 123, opt = 'text'): string
277 return nr .. opt
278enddef
279
280def FuncVarargs(...arg: list<string>): string
281 return join(arg, ',')
282enddef
283
284def Test_func_type_varargs()
285 let RefDefArg: func(?string)
286 RefDefArg = FuncOneDefArg
287 RefDefArg()
288 assert_equal('text', s:value)
289 RefDefArg('some')
290 assert_equal('some', s:value)
291
292 let RefDef2Arg: func(?number, ?string): string
293 RefDef2Arg = FuncTwoDefArg
294 assert_equal('123text', RefDef2Arg())
295 assert_equal('99text', RefDef2Arg(99))
296 assert_equal('77some', RefDef2Arg(77, 'some'))
297
298 call CheckDefFailure(['let RefWrong: func(string?)'], 'E1010:')
299 call CheckDefFailure(['let RefWrong: func(?string, string)'], 'E1007:')
300
301 let RefVarargs: func(...list<string>): string
302 RefVarargs = FuncVarargs
303 assert_equal('', RefVarargs())
304 assert_equal('one', RefVarargs('one'))
305 assert_equal('one,two', RefVarargs('one', 'two'))
306
307 call CheckDefFailure(['let RefWrong: func(...list<string>, string)'], 'E110:')
308 call CheckDefFailure(['let RefWrong: func(...list<string>, ?string)'], 'E110:')
309enddef
310
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200311" Only varargs
312def MyVarargsOnly(...args: list<string>): string
313 return join(args, ',')
314enddef
315
316def Test_call_varargs_only()
317 assert_equal('', MyVarargsOnly())
318 assert_equal('one', MyVarargsOnly('one'))
319 assert_equal('one,two', MyVarargsOnly('one', 'two'))
320 call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number')
321 call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number')
322enddef
323
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200324def Test_using_var_as_arg()
Bram Moolenaar822ba242020-05-24 23:00:18 +0200325 call writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200326 call assert_fails('so Xdef', 'E1006:')
327 call delete('Xdef')
328enddef
329
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200330def DictArg(arg: dict<string>)
331 arg['key'] = 'value'
332enddef
333
334def ListArg(arg: list<string>)
335 arg[0] = 'value'
336enddef
337
338def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200339 # works for dict and list
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200340 let d: dict<string> = {}
341 DictArg(d)
342 assert_equal('value', d['key'])
343 let l: list<string> = []
344 ListArg(l)
345 assert_equal('value', l[0])
346
Bram Moolenaar822ba242020-05-24 23:00:18 +0200347 call CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200348enddef
349
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200350def Test_call_func_defined_later()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200351 call assert_equal('one', g:DefinedLater('one'))
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200352 call assert_fails('call NotDefined("one")', 'E117:')
353enddef
354
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200355func DefinedLater(arg)
356 return a:arg
357endfunc
358
359def Test_call_funcref()
360 assert_equal(3, g:SomeFunc('abc'))
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200361 assert_fails('NotAFunc()', 'E117:') # comment after call
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200362 assert_fails('g:NotAFunc()', 'E117:')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200363
364 let lines =<< trim END
365 vim9script
366 def RetNumber(): number
367 return 123
368 enddef
369 let Funcref: func: number = function('RetNumber')
370 assert_equal(123, Funcref())
371 END
372 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200373
374 lines =<< trim END
375 vim9script
376 def RetNumber(): number
377 return 123
378 enddef
379 def Bar(F: func: number): number
380 return F()
381 enddef
382 let Funcref = function('RetNumber')
383 assert_equal(123, Bar(Funcref))
384 END
385 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200386
387 lines =<< trim END
388 vim9script
389 def UseNumber(nr: number)
390 echo nr
391 enddef
392 let Funcref: func(number) = function('UseNumber')
393 Funcref(123)
394 END
395 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200396
397 lines =<< trim END
398 vim9script
399 def UseNumber(nr: number)
400 echo nr
401 enddef
402 let Funcref: func(string) = function('UseNumber')
403 END
404 CheckScriptFailure(lines, 'E1013: type mismatch, expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200405
406 lines =<< trim END
407 vim9script
408 def EchoNr(nr = 34)
409 g:echo = nr
410 enddef
411 let Funcref: func(?number) = function('EchoNr')
412 Funcref()
413 assert_equal(34, g:echo)
414 Funcref(123)
415 assert_equal(123, g:echo)
416 END
417 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200418
419 lines =<< trim END
420 vim9script
421 def EchoList(...l: list<number>)
422 g:echo = l
423 enddef
424 let Funcref: func(...list<number>) = function('EchoList')
425 Funcref()
426 assert_equal([], g:echo)
427 Funcref(1, 2, 3)
428 assert_equal([1, 2, 3], g:echo)
429 END
430 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200431
432 lines =<< trim END
433 vim9script
434 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
435 g:optarg = opt
436 g:listarg = l
437 return nr
438 enddef
439 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
440 assert_equal(10, Funcref(10))
441 assert_equal(12, g:optarg)
442 assert_equal([], g:listarg)
443
444 assert_equal(11, Funcref(11, 22))
445 assert_equal(22, g:optarg)
446 assert_equal([], g:listarg)
447
448 assert_equal(17, Funcref(17, 18, 1, 2, 3))
449 assert_equal(18, g:optarg)
450 assert_equal([1, 2, 3], g:listarg)
451 END
452 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200453enddef
454
455let SomeFunc = function('len')
456let NotAFunc = 'text'
457
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200458def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200459 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200460 let Ref1: func(bool): string
461 let Ref2: func(bool): number
462 let Ref3: func(bool): any
463 Ref3 = g:cond ? Ref1 : Ref2
464
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200465 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200466 let Refa1: func(bool): number
467 let Refa2: func(bool, number): number
468 let Refa3: func: number
469 Refa3 = g:cond ? Refa1 : Refa2
470
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200471 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200472 let Refb1: func(bool, string): number
473 let Refb2: func(string, number): number
474 let Refb3: func(any, any): number
475 Refb3 = g:cond ? Refb1 : Refb2
476enddef
477
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200478def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200479 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200480enddef
481
482def DefinedEvenLater(arg: string): string
483 return arg
484enddef
485
486def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200487 # Error in called function requires unwinding the call stack.
Bram Moolenaar05a55512020-07-05 15:52:19 +0200488 assert_fails('call FuncWithForwardCall()', 'E1096')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200489enddef
490
491def Test_return_type_wrong()
Bram Moolenaar822ba242020-05-24 23:00:18 +0200492 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef', 'defcompile'], 'expected number but got string')
493 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef', 'defcompile'], 'expected string but got number')
Bram Moolenaar05a55512020-07-05 15:52:19 +0200494 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef', 'defcompile'], 'E1096: Returning a value in a function without a return type')
495 CheckScriptFailure(['def Func()', 'return "a"', 'enddef', 'defcompile'], 'E1096: Returning a value in a function without a return type')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200496
Bram Moolenaar822ba242020-05-24 23:00:18 +0200497 CheckScriptFailure(['def Func(): number', 'return', 'enddef', 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200498
499 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
500 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200501 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200502enddef
503
504def Test_arg_type_wrong()
505 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200506 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200507 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200508 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200509enddef
510
511def Test_vim9script_call()
512 let lines =<< trim END
513 vim9script
514 let var = ''
515 def MyFunc(arg: string)
516 var = arg
517 enddef
518 MyFunc('foobar')
519 assert_equal('foobar', var)
520
521 let str = 'barfoo'
522 str->MyFunc()
523 assert_equal('barfoo', var)
524
Bram Moolenaar67979662020-06-20 22:50:47 +0200525 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200526 g:value->MyFunc()
527 assert_equal('value', var)
528
529 let listvar = []
530 def ListFunc(arg: list<number>)
531 listvar = arg
532 enddef
533 [1, 2, 3]->ListFunc()
534 assert_equal([1, 2, 3], listvar)
535
536 let dictvar = {}
537 def DictFunc(arg: dict<number>)
538 dictvar = arg
539 enddef
540 {'a': 1, 'b': 2}->DictFunc()
541 assert_equal(#{a: 1, b: 2}, dictvar)
542 def CompiledDict()
543 {'a': 3, 'b': 4}->DictFunc()
544 enddef
545 CompiledDict()
546 assert_equal(#{a: 3, b: 4}, dictvar)
547
548 #{a: 3, b: 4}->DictFunc()
549 assert_equal(#{a: 3, b: 4}, dictvar)
550
551 ('text')->MyFunc()
552 assert_equal('text', var)
553 ("some")->MyFunc()
554 assert_equal('some', var)
Bram Moolenaare6b53242020-07-01 17:28:33 +0200555
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200556 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200557 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200558 'asdfasdf'->MyFunc()
559 assert_equal('asdfasdf', var)
Bram Moolenaar10409562020-07-29 20:00:38 +0200560 "xyz"->MyFunc()
561 assert_equal('xyz', var)
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200562
563 def UseString()
564 'xyork'->MyFunc()
565 enddef
566 UseString()
567 assert_equal('xyork', var)
568
Bram Moolenaar10409562020-07-29 20:00:38 +0200569 def UseString2()
570 "knife"->MyFunc()
571 enddef
572 UseString2()
573 assert_equal('knife', var)
574
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200575 # prepending a colon makes it a mark
576 new
577 setline(1, ['aaa', 'bbb', 'ccc'])
578 normal! 3Gmt1G
579 :'t
580 assert_equal(3, getcurpos()[1])
581 bwipe!
582
Bram Moolenaare6b53242020-07-01 17:28:33 +0200583 MyFunc(
584 'continued'
585 )
586 assert_equal('continued',
587 var
588 )
589
590 call MyFunc(
591 'more'
592 ..
593 'lines'
594 )
595 assert_equal(
596 'morelines',
597 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200598 END
599 writefile(lines, 'Xcall.vim')
600 source Xcall.vim
601 delete('Xcall.vim')
602enddef
603
604def Test_vim9script_call_fail_decl()
605 let lines =<< trim END
606 vim9script
607 let var = ''
608 def MyFunc(arg: string)
609 let var = 123
610 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200611 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200612 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200613 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200614enddef
615
Bram Moolenaar65b95452020-07-19 14:03:09 +0200616def Test_vim9script_call_fail_type()
617 let lines =<< trim END
618 vim9script
619 def MyFunc(arg: string)
620 echo arg
621 enddef
622 MyFunc(1234)
623 END
624 CheckScriptFailure(lines, 'E1013: type mismatch, expected string but got number')
625enddef
626
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200627def Test_vim9script_call_fail_const()
628 let lines =<< trim END
629 vim9script
630 const var = ''
631 def MyFunc(arg: string)
632 var = 'asdf'
633 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200634 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200635 END
636 writefile(lines, 'Xcall_const.vim')
637 assert_fails('source Xcall_const.vim', 'E46:')
638 delete('Xcall_const.vim')
639enddef
640
641" Test that inside :function a Python function can be defined, :def is not
642" recognized.
643func Test_function_python()
644 CheckFeature python3
645 let py = 'python3'
646 execute py "<< EOF"
647def do_something():
648 return 1
649EOF
650endfunc
651
652def Test_delfunc()
653 let lines =<< trim END
654 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200655 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200656 echo 'hello'
657 enddef
658
659 def CallGoneSoon()
660 GoneSoon()
661 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200662 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200663
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200664 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200665 CallGoneSoon()
666 END
667 writefile(lines, 'XToDelFunc')
668 assert_fails('so XToDelFunc', 'E933')
669 assert_fails('so XToDelFunc', 'E933')
670
671 delete('XToDelFunc')
672enddef
673
674def Test_redef_failure()
675 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
676 so Xdef
677 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
678 so Xdef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200679 call writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200680 call assert_fails('so Xdef', 'E1027:')
681 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
682 so Xdef
683 call delete('Xdef')
684
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200685 call assert_equal(0, g:Func0())
686 call assert_equal('Func1', g:Func1())
687 call assert_equal('Func2', g:Func2())
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200688
689 delfunc! Func0
690 delfunc! Func1
691 delfunc! Func2
692enddef
693
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200694def Test_vim9script_func()
695 let lines =<< trim END
696 vim9script
697 func Func(arg)
698 echo a:arg
699 endfunc
700 Func('text')
701 END
702 writefile(lines, 'XVim9Func')
703 so XVim9Func
704
705 delete('XVim9Func')
706enddef
707
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200708" Test for internal functions returning different types
709func Test_InternalFuncRetType()
710 let lines =<< trim END
711 def RetFloat(): float
712 return ceil(1.456)
713 enddef
714
715 def RetListAny(): list<any>
716 return items({'k' : 'v'})
717 enddef
718
719 def RetListString(): list<string>
720 return split('a:b:c', ':')
721 enddef
722
723 def RetListDictAny(): list<dict<any>>
724 return getbufinfo()
725 enddef
726
727 def RetDictNumber(): dict<number>
728 return wordcount()
729 enddef
730
731 def RetDictString(): dict<string>
732 return environ()
733 enddef
734 END
735 call writefile(lines, 'Xscript')
736 source Xscript
737
738 call assert_equal(2.0, RetFloat())
739 call assert_equal([['k', 'v']], RetListAny())
740 call assert_equal(['a', 'b', 'c'], RetListString())
741 call assert_notequal([], RetListDictAny())
742 call assert_notequal({}, RetDictNumber())
743 call assert_notequal({}, RetDictString())
744 call delete('Xscript')
745endfunc
746
747" Test for passing too many or too few arguments to internal functions
748func Test_internalfunc_arg_error()
749 let l =<< trim END
750 def! FArgErr(): float
751 return ceil(1.1, 2)
752 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200753 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200754 END
755 call writefile(l, 'Xinvalidarg')
756 call assert_fails('so Xinvalidarg', 'E118:')
757 let l =<< trim END
758 def! FArgErr(): float
759 return ceil()
760 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200761 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200762 END
763 call writefile(l, 'Xinvalidarg')
764 call assert_fails('so Xinvalidarg', 'E119:')
765 call delete('Xinvalidarg')
766endfunc
767
768let s:funcResult = 0
769
770def FuncNoArgNoRet()
771 funcResult = 11
772enddef
773
774def FuncNoArgRetNumber(): number
775 funcResult = 22
776 return 1234
777enddef
778
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200779def FuncNoArgRetString(): string
780 funcResult = 45
781 return 'text'
782enddef
783
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200784def FuncOneArgNoRet(arg: number)
785 funcResult = arg
786enddef
787
788def FuncOneArgRetNumber(arg: number): number
789 funcResult = arg
790 return arg
791enddef
792
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200793def FuncTwoArgNoRet(one: bool, two: number)
794 funcResult = two
795enddef
796
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200797def FuncOneArgRetString(arg: string): string
798 return arg
799enddef
800
Bram Moolenaar89228602020-04-05 22:14:54 +0200801def FuncOneArgRetAny(arg: any): any
802 return arg
803enddef
804
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200805def Test_func_type()
806 let Ref1: func()
807 funcResult = 0
808 Ref1 = FuncNoArgNoRet
809 Ref1()
810 assert_equal(11, funcResult)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200811
812 let Ref2: func
813 funcResult = 0
814 Ref2 = FuncNoArgNoRet
815 Ref2()
816 assert_equal(11, funcResult)
817
818 funcResult = 0
819 Ref2 = FuncOneArgNoRet
820 Ref2(12)
821 assert_equal(12, funcResult)
822
823 funcResult = 0
824 Ref2 = FuncNoArgRetNumber
825 assert_equal(1234, Ref2())
826 assert_equal(22, funcResult)
827
828 funcResult = 0
829 Ref2 = FuncOneArgRetNumber
830 assert_equal(13, Ref2(13))
831 assert_equal(13, funcResult)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200832enddef
833
Bram Moolenaar9978d472020-07-05 16:01:56 +0200834def Test_repeat_return_type()
835 let res = 0
836 for n in repeat([1], 3)
837 res += n
838 endfor
839 assert_equal(3, res)
Bram Moolenaarfce82b32020-07-05 16:07:21 +0200840
841 res = 0
842 for n in add([1, 2], 3)
843 res += n
844 endfor
845 assert_equal(6, res)
Bram Moolenaar9978d472020-07-05 16:01:56 +0200846enddef
847
Bram Moolenaar846178a2020-07-05 17:04:13 +0200848def Test_argv_return_type()
849 next fileone filetwo
850 let res = ''
851 for name in argv()
852 res ..= name
853 endfor
854 assert_equal('fileonefiletwo', res)
855enddef
856
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200857def Test_func_type_part()
858 let RefVoid: func: void
859 RefVoid = FuncNoArgNoRet
860 RefVoid = FuncOneArgNoRet
861 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200862 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200863
864 let RefAny: func(): any
865 RefAny = FuncNoArgRetNumber
866 RefAny = FuncNoArgRetString
867 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()')
868 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1013: type mismatch, expected func(): any but got func(number)')
869
870 let RefNr: func: number
871 RefNr = FuncNoArgRetNumber
872 RefNr = FuncOneArgRetNumber
873 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200874 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200875
876 let RefStr: func: string
877 RefStr = FuncNoArgRetString
878 RefStr = FuncOneArgRetString
879 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()')
880 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func(): string but got func(): number')
881enddef
882
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200883def Test_func_type_fails()
884 CheckDefFailure(['let ref1: func()'], 'E704:')
885
886 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
887 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)')
888 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200889 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(bool) but got func(bool, number)')
890 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(?bool) but got func(bool, number)')
891 CheckDefFailure(['let Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(...bool) but got func(bool, number)')
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200892
893 call CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
894 call CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
895 call CheckDefFailure(['let RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E740:')
896 call CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200897enddef
898
Bram Moolenaar89228602020-04-05 22:14:54 +0200899def Test_func_return_type()
900 let nr: number
901 nr = FuncNoArgRetNumber()
902 assert_equal(1234, nr)
903
904 nr = FuncOneArgRetAny(122)
905 assert_equal(122, nr)
906
907 let str: string
908 str = FuncOneArgRetAny('yes')
909 assert_equal('yes', str)
910
911 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1013: type mismatch, expected string but got number')
912enddef
913
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200914def MultiLine(
915 arg1: string,
916 arg2 = 1234,
917 ...rest: list<string>
918 ): string
919 return arg1 .. arg2 .. join(rest, '-')
920enddef
921
Bram Moolenaar2c330432020-04-13 14:41:35 +0200922def MultiLineComment(
923 arg1: string, # comment
924 arg2 = 1234, # comment
925 ...rest: list<string> # comment
926 ): string # comment
927 return arg1 .. arg2 .. join(rest, '-')
928enddef
929
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200930def Test_multiline()
931 assert_equal('text1234', MultiLine('text'))
932 assert_equal('text777', MultiLine('text', 777))
933 assert_equal('text777one', MultiLine('text', 777, 'one'))
934 assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
935enddef
936
Bram Moolenaar23e03252020-04-12 22:22:31 +0200937func Test_multiline_not_vim9()
938 call assert_equal('text1234', MultiLine('text'))
939 call assert_equal('text777', MultiLine('text', 777))
940 call assert_equal('text777one', MultiLine('text', 777, 'one'))
941 call assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
942endfunc
943
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200944
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200945" When using CheckScriptFailure() for the below test, E1010 is generated instead
946" of E1056.
947func Test_E1056_1059()
948 let caught_1056 = 0
949 try
950 def F():
951 return 1
952 enddef
953 catch /E1056:/
954 let caught_1056 = 1
955 endtry
956 call assert_equal(1, caught_1056)
957
958 let caught_1059 = 0
959 try
960 def F5(items : list)
961 echo 'a'
962 enddef
963 catch /E1059:/
964 let caught_1059 = 1
965 endtry
966 call assert_equal(1, caught_1059)
967endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200968
Bram Moolenaar015f4262020-05-05 21:25:22 +0200969func DelMe()
970 echo 'DelMe'
971endfunc
972
973def Test_deleted_function()
974 CheckDefExecFailure([
975 'let RefMe: func = function("g:DelMe")',
976 'delfunc g:DelMe',
977 'echo RefMe()'], 'E117:')
978enddef
979
980def Test_unknown_function()
981 CheckDefExecFailure([
982 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200983 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +0200984enddef
985
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +0200986def RefFunc(Ref: func(string): string): string
987 return Ref('more')
988enddef
989
990def Test_closure_simple()
991 let local = 'some '
992 assert_equal('some more', RefFunc({s -> local .. s}))
993enddef
994
Bram Moolenaarbf67ea12020-05-02 17:52:42 +0200995def MakeRef()
996 let local = 'some '
997 g:Ref = {s -> local .. s}
998enddef
999
1000def Test_closure_ref_after_return()
1001 MakeRef()
1002 assert_equal('some thing', g:Ref('thing'))
1003 unlet g:Ref
1004enddef
1005
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001006def MakeTwoRefs()
1007 let local = ['some']
1008 g:Extend = {s -> local->add(s)}
1009 g:Read = {-> local}
1010enddef
1011
1012def Test_closure_two_refs()
1013 MakeTwoRefs()
1014 assert_equal('some', join(g:Read(), ' '))
1015 g:Extend('more')
1016 assert_equal('some more', join(g:Read(), ' '))
1017 g:Extend('even')
1018 assert_equal('some more even', join(g:Read(), ' '))
1019
1020 unlet g:Extend
1021 unlet g:Read
1022enddef
1023
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001024def ReadRef(Ref: func(): list<string>): string
1025 return join(Ref(), ' ')
1026enddef
1027
1028def ExtendRef(Ref: func(string), add: string)
1029 Ref(add)
1030enddef
1031
1032def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001033 MakeTwoRefs()
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001034 assert_equal('some', ReadRef(g:Read))
1035 ExtendRef(g:Extend, 'more')
1036 assert_equal('some more', ReadRef(g:Read))
1037 ExtendRef(g:Extend, 'even')
1038 assert_equal('some more even', ReadRef(g:Read))
1039
1040 unlet g:Extend
1041 unlet g:Read
1042enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001043
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001044def MakeArgRefs(theArg: string)
1045 let local = 'loc_val'
1046 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1047enddef
1048
1049def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1050 let local = 'the_loc'
1051 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1052enddef
1053
1054def Test_closure_using_argument()
1055 MakeArgRefs('arg_val')
1056 assert_equal('arg_val/loc_val/call_val', g:UseArg('call_val'))
1057
1058 MakeArgRefsVarargs('arg_val', 'one', 'two')
1059 assert_equal('arg_val/the_loc/call_val/one two', g:UseVararg('call_val'))
1060
1061 unlet g:UseArg
1062 unlet g:UseVararg
1063enddef
1064
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001065def MakeGetAndAppendRefs()
1066 let local = 'a'
1067
1068 def Append(arg: string)
1069 local ..= arg
1070 enddef
1071 g:Append = Append
1072
1073 def Get(): string
1074 return local
1075 enddef
1076 g:Get = Get
1077enddef
1078
1079def Test_closure_append_get()
1080 MakeGetAndAppendRefs()
1081 assert_equal('a', g:Get())
1082 g:Append('-b')
1083 assert_equal('a-b', g:Get())
1084 g:Append('-c')
1085 assert_equal('a-b-c', g:Get())
1086
1087 unlet g:Append
1088 unlet g:Get
1089enddef
1090
Bram Moolenaar04b12692020-05-04 23:24:44 +02001091def Test_nested_closure()
1092 let local = 'text'
1093 def Closure(arg: string): string
1094 return local .. arg
1095 enddef
1096 assert_equal('text!!!', Closure('!!!'))
1097enddef
1098
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001099func GetResult(Ref)
1100 return a:Ref('some')
1101endfunc
1102
1103def Test_call_closure_not_compiled()
1104 let text = 'text'
1105 g:Ref = {s -> s .. text}
1106 assert_equal('sometext', GetResult(g:Ref))
1107enddef
1108
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001109def Test_sort_return_type()
1110 let res: list<number>
1111 res = [1, 2, 3]->sort()
1112enddef
1113
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001114def Test_getqflist_return_type()
1115 let l = getqflist()
1116 assert_equal([], l)
1117
1118 let d = getqflist(#{items: 0})
1119 assert_equal(#{items: []}, d)
1120enddef
1121
1122def Test_getloclist_return_type()
1123 let l = getloclist(1)
1124 assert_equal([], l)
1125
1126 let d = getloclist(1, #{items: 0})
1127 assert_equal(#{items: []}, d)
1128enddef
1129
Bram Moolenaara66ba012020-07-05 18:41:08 +02001130def Test_copy_return_type()
1131 let l = copy([1, 2, 3])
1132 let res = 0
1133 for n in l
1134 res += n
1135 endfor
1136 assert_equal(6, res)
1137
1138 let dl = deepcopy([1, 2, 3])
1139 res = 0
1140 for n in dl
1141 res += n
1142 endfor
1143 assert_equal(6, res)
1144enddef
1145
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001146def Test_extend_return_type()
1147 let l = extend([1, 2], [3])
1148 let res = 0
1149 for n in l
1150 res += n
1151 endfor
1152 assert_equal(6, res)
1153enddef
1154
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001155def Test_insert_return_type()
1156 let l = insert([2, 1], 3)
1157 let res = 0
1158 for n in l
1159 res += n
1160 endfor
1161 assert_equal(6, res)
1162enddef
1163
Bram Moolenaar67627352020-07-05 21:10:24 +02001164def Test_reverse_return_type()
1165 let l = reverse([1, 2, 3])
1166 let res = 0
1167 for n in l
1168 res += n
1169 endfor
1170 assert_equal(6, res)
1171enddef
1172
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001173def Test_remove_return_type()
1174 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1175 let res = 0
1176 for n in l
1177 res += n
1178 endfor
1179 assert_equal(3, res)
1180enddef
1181
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001182def Test_filter_return_type()
1183 let l = filter([1, 2, 3], {-> 1})
1184 let res = 0
1185 for n in l
1186 res += n
1187 endfor
1188 assert_equal(6, res)
1189enddef
1190
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001191def Wrong_dict_key_type(items: list<number>): list<number>
1192 return filter(items, {_, val -> get({val: 1}, 'x')})
1193enddef
1194
1195def Test_wrong_dict_key_type()
1196 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1029:')
1197enddef
1198
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001199def Line_continuation_in_def(dir: string = ''): string
1200 let path: string = empty(dir)
1201 \ ? 'empty'
1202 \ : 'full'
1203 return path
1204enddef
1205
1206def Test_line_continuation_in_def()
1207 assert_equal('full', Line_continuation_in_def('.'))
1208enddef
1209
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001210def Line_continuation_in_lambda(): list<number>
1211 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001212 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001213 ->toupper()})
1214 ->reverse()
1215 return x
1216enddef
1217
1218def Test_line_continuation_in_lambda()
1219 assert_equal(['D', 'C', 'B', 'A'], Line_continuation_in_lambda())
1220enddef
1221
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001222func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001223 CheckScreendump
1224
1225 let lines =<< trim END
1226 vim9script
1227 def EchoNothing()
1228 silent echo ''
1229 enddef
1230 defcompile
1231 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001232 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001233
1234 " Check that the balloon shows up after a mouse move
1235 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001236 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001237 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1238
1239 " clean up
1240 call StopVimInTerminal(buf)
1241 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001242endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001243
Bram Moolenaar985116a2020-07-12 17:31:09 +02001244def Fibonacci(n: number): number
1245 if n < 2
1246 return n
1247 else
1248 return Fibonacci(n - 1) + Fibonacci(n - 2)
1249 endif
1250enddef
1251
1252def Test_recursive_call()
1253 assert_equal(6765, Fibonacci(20))
1254enddef
1255
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001256def TreeWalk(dir: string): list<any>
1257 return readdir(dir)->map({_, val ->
1258 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
1259 ? {val : TreeWalk(dir .. '/' .. val)}
1260 : val
1261 })
1262enddef
1263
1264def Test_closure_in_map()
1265 mkdir('XclosureDir/tdir', 'p')
1266 writefile(['111'], 'XclosureDir/file1')
1267 writefile(['222'], 'XclosureDir/file2')
1268 writefile(['333'], 'XclosureDir/tdir/file3')
1269
1270 assert_equal(['file1', 'file2', {'tdir': ['file3']}], TreeWalk('XclosureDir'))
1271
1272 delete('XclosureDir', 'rf')
1273enddef
1274
Bram Moolenaara90afb92020-07-15 22:38:56 +02001275def Test_partial_call()
1276 let Xsetlist = function('setloclist', [0])
1277 Xsetlist([], ' ', {'title': 'test'})
1278 assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
1279
1280 Xsetlist = function('setloclist', [0, [], ' '])
1281 Xsetlist({'title': 'test'})
1282 assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
1283
1284 Xsetlist = function('setqflist')
1285 Xsetlist([], ' ', {'title': 'test'})
1286 assert_equal({'title': 'test'}, getqflist({'title': 1}))
1287
1288 Xsetlist = function('setqflist', [[], ' '])
1289 Xsetlist({'title': 'test'})
1290 assert_equal({'title': 'test'}, getqflist({'title': 1}))
1291enddef
1292
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001293
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001294" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker