blob: 85fd8ff4e0acd527d9c70004d41e290fb07ff699 [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 Moolenaar5deeb3f2020-04-05 17:08:17 +0200134enddef
135
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200136func Test_call_default_args_from_func()
137 call assert_equal('string', MyDefaultArgs())
138 call assert_equal('one', MyDefaultArgs('one'))
139 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
140endfunc
141
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200142def Test_nested_global_function()
143 let lines =<< trim END
144 vim9script
145 def Outer()
146 def g:Inner(): string
147 return 'inner'
148 enddef
149 enddef
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200150 defcompile
151 Outer()
152 assert_equal('inner', g:Inner())
153 delfunc g:Inner
154 Outer()
155 assert_equal('inner', g:Inner())
156 delfunc g:Inner
157 Outer()
158 assert_equal('inner', g:Inner())
159 delfunc g:Inner
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200160 END
161 CheckScriptSuccess(lines)
Bram Moolenaar2c79e9d2020-08-01 18:57:52 +0200162
163 lines =<< trim END
164 vim9script
165 def Outer()
166 def g:Inner(): string
167 return 'inner'
168 enddef
169 enddef
170 defcompile
171 Outer()
172 Outer()
173 END
174 CheckScriptFailure(lines, "E122:")
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200175enddef
176
Bram Moolenaar333894b2020-08-01 18:53:07 +0200177def Test_global_local_function()
178 let lines =<< trim END
179 vim9script
180 def g:Func(): string
181 return 'global'
182 enddef
183 def Func(): string
184 return 'local'
185 enddef
186 assert_equal('global', g:Func())
187 assert_equal('local', Func())
188 END
189 CheckScriptSuccess(lines)
190enddef
191
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200192func TakesOneArg(arg)
193 echo a:arg
194endfunc
195
196def Test_call_wrong_args()
197 call CheckDefFailure(['TakesOneArg()'], 'E119:')
198 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
199 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaar1c0d44f2020-05-02 19:04:58 +0200200 call CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200201enddef
202
203" Default arg and varargs
204def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
205 let res = one .. ',' .. two
206 for s in rest
207 res ..= ',' .. s
208 endfor
209 return res
210enddef
211
212def Test_call_def_varargs()
213 call assert_fails('call MyDefVarargs()', 'E119:')
214 assert_equal('one,foo', MyDefVarargs('one'))
215 assert_equal('one,two', MyDefVarargs('one', 'two'))
216 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200217 CheckDefFailure(['MyDefVarargs("one", 22)'],
218 'E1013: argument 2: type mismatch, expected string but got number')
219 CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
220 'E1013: argument 3: type mismatch, expected string but got number')
221
222 let lines =<< trim END
223 vim9script
224 def Func(...l: list<string>)
225 echo l
226 enddef
227 Func('a', 'b', 'c')
228 END
229 CheckScriptSuccess(lines)
230
231 lines =<< trim END
232 vim9script
233 def Func(...l: list<string>)
234 echo l
235 enddef
236 Func()
237 END
238 CheckScriptSuccess(lines)
239
240 lines =<< trim END
241 vim9script
242 def Func(...l: list<string>)
243 echo l
244 enddef
245 Func(1, 2, 3)
246 END
247 CheckScriptFailure(lines, 'E1013:')
248
249 lines =<< trim END
250 vim9script
251 def Func(...l: list<string>)
252 echo l
253 enddef
254 Func('a', 9)
255 END
256 CheckScriptFailure(lines, 'E1013:')
257
258 lines =<< trim END
259 vim9script
260 def Func(...l: list<string>)
261 echo l
262 enddef
263 Func(1, 'a')
264 END
265 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200266enddef
267
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200268let s:value = ''
269
270def FuncOneDefArg(opt = 'text')
271 s:value = opt
272enddef
273
274def FuncTwoDefArg(nr = 123, opt = 'text'): string
275 return nr .. opt
276enddef
277
278def FuncVarargs(...arg: list<string>): string
279 return join(arg, ',')
280enddef
281
282def Test_func_type_varargs()
283 let RefDefArg: func(?string)
284 RefDefArg = FuncOneDefArg
285 RefDefArg()
286 assert_equal('text', s:value)
287 RefDefArg('some')
288 assert_equal('some', s:value)
289
290 let RefDef2Arg: func(?number, ?string): string
291 RefDef2Arg = FuncTwoDefArg
292 assert_equal('123text', RefDef2Arg())
293 assert_equal('99text', RefDef2Arg(99))
294 assert_equal('77some', RefDef2Arg(77, 'some'))
295
296 call CheckDefFailure(['let RefWrong: func(string?)'], 'E1010:')
297 call CheckDefFailure(['let RefWrong: func(?string, string)'], 'E1007:')
298
299 let RefVarargs: func(...list<string>): string
300 RefVarargs = FuncVarargs
301 assert_equal('', RefVarargs())
302 assert_equal('one', RefVarargs('one'))
303 assert_equal('one,two', RefVarargs('one', 'two'))
304
305 call CheckDefFailure(['let RefWrong: func(...list<string>, string)'], 'E110:')
306 call CheckDefFailure(['let RefWrong: func(...list<string>, ?string)'], 'E110:')
307enddef
308
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200309" Only varargs
310def MyVarargsOnly(...args: list<string>): string
311 return join(args, ',')
312enddef
313
314def Test_call_varargs_only()
315 assert_equal('', MyVarargsOnly())
316 assert_equal('one', MyVarargsOnly('one'))
317 assert_equal('one,two', MyVarargsOnly('one', 'two'))
318 call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number')
319 call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number')
320enddef
321
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200322def Test_using_var_as_arg()
Bram Moolenaar822ba242020-05-24 23:00:18 +0200323 call writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200324 call assert_fails('so Xdef', 'E1006:')
325 call delete('Xdef')
326enddef
327
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200328def DictArg(arg: dict<string>)
329 arg['key'] = 'value'
330enddef
331
332def ListArg(arg: list<string>)
333 arg[0] = 'value'
334enddef
335
336def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200337 # works for dict and list
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200338 let d: dict<string> = {}
339 DictArg(d)
340 assert_equal('value', d['key'])
341 let l: list<string> = []
342 ListArg(l)
343 assert_equal('value', l[0])
344
Bram Moolenaar822ba242020-05-24 23:00:18 +0200345 call CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200346enddef
347
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200348def Test_call_func_defined_later()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200349 call assert_equal('one', g:DefinedLater('one'))
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200350 call assert_fails('call NotDefined("one")', 'E117:')
351enddef
352
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200353func DefinedLater(arg)
354 return a:arg
355endfunc
356
357def Test_call_funcref()
358 assert_equal(3, g:SomeFunc('abc'))
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200359 assert_fails('NotAFunc()', 'E117:') # comment after call
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200360 assert_fails('g:NotAFunc()', 'E117:')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200361
362 let lines =<< trim END
363 vim9script
364 def RetNumber(): number
365 return 123
366 enddef
367 let Funcref: func: number = function('RetNumber')
368 assert_equal(123, Funcref())
369 END
370 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200371
372 lines =<< trim END
373 vim9script
374 def RetNumber(): number
375 return 123
376 enddef
377 def Bar(F: func: number): number
378 return F()
379 enddef
380 let Funcref = function('RetNumber')
381 assert_equal(123, Bar(Funcref))
382 END
383 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200384
385 lines =<< trim END
386 vim9script
387 def UseNumber(nr: number)
388 echo nr
389 enddef
390 let Funcref: func(number) = function('UseNumber')
391 Funcref(123)
392 END
393 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200394
395 lines =<< trim END
396 vim9script
397 def UseNumber(nr: number)
398 echo nr
399 enddef
400 let Funcref: func(string) = function('UseNumber')
401 END
402 CheckScriptFailure(lines, 'E1013: type mismatch, expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200403
404 lines =<< trim END
405 vim9script
406 def EchoNr(nr = 34)
407 g:echo = nr
408 enddef
409 let Funcref: func(?number) = function('EchoNr')
410 Funcref()
411 assert_equal(34, g:echo)
412 Funcref(123)
413 assert_equal(123, g:echo)
414 END
415 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200416
417 lines =<< trim END
418 vim9script
419 def EchoList(...l: list<number>)
420 g:echo = l
421 enddef
422 let Funcref: func(...list<number>) = function('EchoList')
423 Funcref()
424 assert_equal([], g:echo)
425 Funcref(1, 2, 3)
426 assert_equal([1, 2, 3], g:echo)
427 END
428 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200429
430 lines =<< trim END
431 vim9script
432 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
433 g:optarg = opt
434 g:listarg = l
435 return nr
436 enddef
437 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
438 assert_equal(10, Funcref(10))
439 assert_equal(12, g:optarg)
440 assert_equal([], g:listarg)
441
442 assert_equal(11, Funcref(11, 22))
443 assert_equal(22, g:optarg)
444 assert_equal([], g:listarg)
445
446 assert_equal(17, Funcref(17, 18, 1, 2, 3))
447 assert_equal(18, g:optarg)
448 assert_equal([1, 2, 3], g:listarg)
449 END
450 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200451enddef
452
453let SomeFunc = function('len')
454let NotAFunc = 'text'
455
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200456def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200457 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200458 let Ref1: func(bool): string
459 let Ref2: func(bool): number
460 let Ref3: func(bool): any
461 Ref3 = g:cond ? Ref1 : Ref2
462
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200463 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200464 let Refa1: func(bool): number
465 let Refa2: func(bool, number): number
466 let Refa3: func: number
467 Refa3 = g:cond ? Refa1 : Refa2
468
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200469 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200470 let Refb1: func(bool, string): number
471 let Refb2: func(string, number): number
472 let Refb3: func(any, any): number
473 Refb3 = g:cond ? Refb1 : Refb2
474enddef
475
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200476def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200477 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200478enddef
479
480def DefinedEvenLater(arg: string): string
481 return arg
482enddef
483
484def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200485 # Error in called function requires unwinding the call stack.
Bram Moolenaar05a55512020-07-05 15:52:19 +0200486 assert_fails('call FuncWithForwardCall()', 'E1096')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200487enddef
488
489def Test_return_type_wrong()
Bram Moolenaar822ba242020-05-24 23:00:18 +0200490 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef', 'defcompile'], 'expected number but got string')
491 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef', 'defcompile'], 'expected string but got number')
Bram Moolenaar05a55512020-07-05 15:52:19 +0200492 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef', 'defcompile'], 'E1096: Returning a value in a function without a return type')
493 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 +0200494
Bram Moolenaar822ba242020-05-24 23:00:18 +0200495 CheckScriptFailure(['def Func(): number', 'return', 'enddef', 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200496
497 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
498 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200499 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200500enddef
501
502def Test_arg_type_wrong()
503 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200504 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200505 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200506 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200507enddef
508
509def Test_vim9script_call()
510 let lines =<< trim END
511 vim9script
512 let var = ''
513 def MyFunc(arg: string)
514 var = arg
515 enddef
516 MyFunc('foobar')
517 assert_equal('foobar', var)
518
519 let str = 'barfoo'
520 str->MyFunc()
521 assert_equal('barfoo', var)
522
Bram Moolenaar67979662020-06-20 22:50:47 +0200523 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200524 g:value->MyFunc()
525 assert_equal('value', var)
526
527 let listvar = []
528 def ListFunc(arg: list<number>)
529 listvar = arg
530 enddef
531 [1, 2, 3]->ListFunc()
532 assert_equal([1, 2, 3], listvar)
533
534 let dictvar = {}
535 def DictFunc(arg: dict<number>)
536 dictvar = arg
537 enddef
538 {'a': 1, 'b': 2}->DictFunc()
539 assert_equal(#{a: 1, b: 2}, dictvar)
540 def CompiledDict()
541 {'a': 3, 'b': 4}->DictFunc()
542 enddef
543 CompiledDict()
544 assert_equal(#{a: 3, b: 4}, dictvar)
545
546 #{a: 3, b: 4}->DictFunc()
547 assert_equal(#{a: 3, b: 4}, dictvar)
548
549 ('text')->MyFunc()
550 assert_equal('text', var)
551 ("some")->MyFunc()
552 assert_equal('some', var)
Bram Moolenaare6b53242020-07-01 17:28:33 +0200553
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200554 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200555 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200556 'asdfasdf'->MyFunc()
557 assert_equal('asdfasdf', var)
Bram Moolenaar10409562020-07-29 20:00:38 +0200558 "xyz"->MyFunc()
559 assert_equal('xyz', var)
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200560
561 def UseString()
562 'xyork'->MyFunc()
563 enddef
564 UseString()
565 assert_equal('xyork', var)
566
Bram Moolenaar10409562020-07-29 20:00:38 +0200567 def UseString2()
568 "knife"->MyFunc()
569 enddef
570 UseString2()
571 assert_equal('knife', var)
572
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200573 # prepending a colon makes it a mark
574 new
575 setline(1, ['aaa', 'bbb', 'ccc'])
576 normal! 3Gmt1G
577 :'t
578 assert_equal(3, getcurpos()[1])
579 bwipe!
580
Bram Moolenaare6b53242020-07-01 17:28:33 +0200581 MyFunc(
582 'continued'
583 )
584 assert_equal('continued',
585 var
586 )
587
588 call MyFunc(
589 'more'
590 ..
591 'lines'
592 )
593 assert_equal(
594 'morelines',
595 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200596 END
597 writefile(lines, 'Xcall.vim')
598 source Xcall.vim
599 delete('Xcall.vim')
600enddef
601
602def Test_vim9script_call_fail_decl()
603 let lines =<< trim END
604 vim9script
605 let var = ''
606 def MyFunc(arg: string)
607 let var = 123
608 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200609 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200610 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200611 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200612enddef
613
Bram Moolenaar65b95452020-07-19 14:03:09 +0200614def Test_vim9script_call_fail_type()
615 let lines =<< trim END
616 vim9script
617 def MyFunc(arg: string)
618 echo arg
619 enddef
620 MyFunc(1234)
621 END
622 CheckScriptFailure(lines, 'E1013: type mismatch, expected string but got number')
623enddef
624
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200625def Test_vim9script_call_fail_const()
626 let lines =<< trim END
627 vim9script
628 const var = ''
629 def MyFunc(arg: string)
630 var = 'asdf'
631 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200632 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200633 END
634 writefile(lines, 'Xcall_const.vim')
635 assert_fails('source Xcall_const.vim', 'E46:')
636 delete('Xcall_const.vim')
637enddef
638
639" Test that inside :function a Python function can be defined, :def is not
640" recognized.
641func Test_function_python()
642 CheckFeature python3
643 let py = 'python3'
644 execute py "<< EOF"
645def do_something():
646 return 1
647EOF
648endfunc
649
650def Test_delfunc()
651 let lines =<< trim END
652 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200653 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200654 echo 'hello'
655 enddef
656
657 def CallGoneSoon()
658 GoneSoon()
659 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200660 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200661
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200662 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200663 CallGoneSoon()
664 END
665 writefile(lines, 'XToDelFunc')
666 assert_fails('so XToDelFunc', 'E933')
667 assert_fails('so XToDelFunc', 'E933')
668
669 delete('XToDelFunc')
670enddef
671
672def Test_redef_failure()
673 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
674 so Xdef
675 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
676 so Xdef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200677 call writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200678 call assert_fails('so Xdef', 'E1027:')
679 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
680 so Xdef
681 call delete('Xdef')
682
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200683 call assert_equal(0, g:Func0())
684 call assert_equal('Func1', g:Func1())
685 call assert_equal('Func2', g:Func2())
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200686
687 delfunc! Func0
688 delfunc! Func1
689 delfunc! Func2
690enddef
691
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200692def Test_vim9script_func()
693 let lines =<< trim END
694 vim9script
695 func Func(arg)
696 echo a:arg
697 endfunc
698 Func('text')
699 END
700 writefile(lines, 'XVim9Func')
701 so XVim9Func
702
703 delete('XVim9Func')
704enddef
705
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200706" Test for internal functions returning different types
707func Test_InternalFuncRetType()
708 let lines =<< trim END
709 def RetFloat(): float
710 return ceil(1.456)
711 enddef
712
713 def RetListAny(): list<any>
714 return items({'k' : 'v'})
715 enddef
716
717 def RetListString(): list<string>
718 return split('a:b:c', ':')
719 enddef
720
721 def RetListDictAny(): list<dict<any>>
722 return getbufinfo()
723 enddef
724
725 def RetDictNumber(): dict<number>
726 return wordcount()
727 enddef
728
729 def RetDictString(): dict<string>
730 return environ()
731 enddef
732 END
733 call writefile(lines, 'Xscript')
734 source Xscript
735
736 call assert_equal(2.0, RetFloat())
737 call assert_equal([['k', 'v']], RetListAny())
738 call assert_equal(['a', 'b', 'c'], RetListString())
739 call assert_notequal([], RetListDictAny())
740 call assert_notequal({}, RetDictNumber())
741 call assert_notequal({}, RetDictString())
742 call delete('Xscript')
743endfunc
744
745" Test for passing too many or too few arguments to internal functions
746func Test_internalfunc_arg_error()
747 let l =<< trim END
748 def! FArgErr(): float
749 return ceil(1.1, 2)
750 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200751 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200752 END
753 call writefile(l, 'Xinvalidarg')
754 call assert_fails('so Xinvalidarg', 'E118:')
755 let l =<< trim END
756 def! FArgErr(): float
757 return ceil()
758 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200759 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200760 END
761 call writefile(l, 'Xinvalidarg')
762 call assert_fails('so Xinvalidarg', 'E119:')
763 call delete('Xinvalidarg')
764endfunc
765
766let s:funcResult = 0
767
768def FuncNoArgNoRet()
769 funcResult = 11
770enddef
771
772def FuncNoArgRetNumber(): number
773 funcResult = 22
774 return 1234
775enddef
776
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200777def FuncNoArgRetString(): string
778 funcResult = 45
779 return 'text'
780enddef
781
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200782def FuncOneArgNoRet(arg: number)
783 funcResult = arg
784enddef
785
786def FuncOneArgRetNumber(arg: number): number
787 funcResult = arg
788 return arg
789enddef
790
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200791def FuncTwoArgNoRet(one: bool, two: number)
792 funcResult = two
793enddef
794
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200795def FuncOneArgRetString(arg: string): string
796 return arg
797enddef
798
Bram Moolenaar89228602020-04-05 22:14:54 +0200799def FuncOneArgRetAny(arg: any): any
800 return arg
801enddef
802
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200803def Test_func_type()
804 let Ref1: func()
805 funcResult = 0
806 Ref1 = FuncNoArgNoRet
807 Ref1()
808 assert_equal(11, funcResult)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200809
810 let Ref2: func
811 funcResult = 0
812 Ref2 = FuncNoArgNoRet
813 Ref2()
814 assert_equal(11, funcResult)
815
816 funcResult = 0
817 Ref2 = FuncOneArgNoRet
818 Ref2(12)
819 assert_equal(12, funcResult)
820
821 funcResult = 0
822 Ref2 = FuncNoArgRetNumber
823 assert_equal(1234, Ref2())
824 assert_equal(22, funcResult)
825
826 funcResult = 0
827 Ref2 = FuncOneArgRetNumber
828 assert_equal(13, Ref2(13))
829 assert_equal(13, funcResult)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200830enddef
831
Bram Moolenaar9978d472020-07-05 16:01:56 +0200832def Test_repeat_return_type()
833 let res = 0
834 for n in repeat([1], 3)
835 res += n
836 endfor
837 assert_equal(3, res)
Bram Moolenaarfce82b32020-07-05 16:07:21 +0200838
839 res = 0
840 for n in add([1, 2], 3)
841 res += n
842 endfor
843 assert_equal(6, res)
Bram Moolenaar9978d472020-07-05 16:01:56 +0200844enddef
845
Bram Moolenaar846178a2020-07-05 17:04:13 +0200846def Test_argv_return_type()
847 next fileone filetwo
848 let res = ''
849 for name in argv()
850 res ..= name
851 endfor
852 assert_equal('fileonefiletwo', res)
853enddef
854
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200855def Test_func_type_part()
856 let RefVoid: func: void
857 RefVoid = FuncNoArgNoRet
858 RefVoid = FuncOneArgNoRet
859 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200860 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200861
862 let RefAny: func(): any
863 RefAny = FuncNoArgRetNumber
864 RefAny = FuncNoArgRetString
865 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()')
866 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1013: type mismatch, expected func(): any but got func(number)')
867
868 let RefNr: func: number
869 RefNr = FuncNoArgRetNumber
870 RefNr = FuncOneArgRetNumber
871 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200872 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200873
874 let RefStr: func: string
875 RefStr = FuncNoArgRetString
876 RefStr = FuncOneArgRetString
877 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()')
878 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func(): string but got func(): number')
879enddef
880
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200881def Test_func_type_fails()
882 CheckDefFailure(['let ref1: func()'], 'E704:')
883
884 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
885 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)')
886 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200887 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(bool) but got func(bool, number)')
888 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(?bool) but got func(bool, number)')
889 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 +0200890
891 call CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
892 call CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
893 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:')
894 call CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200895enddef
896
Bram Moolenaar89228602020-04-05 22:14:54 +0200897def Test_func_return_type()
898 let nr: number
899 nr = FuncNoArgRetNumber()
900 assert_equal(1234, nr)
901
902 nr = FuncOneArgRetAny(122)
903 assert_equal(122, nr)
904
905 let str: string
906 str = FuncOneArgRetAny('yes')
907 assert_equal('yes', str)
908
909 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1013: type mismatch, expected string but got number')
910enddef
911
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200912def MultiLine(
913 arg1: string,
914 arg2 = 1234,
915 ...rest: list<string>
916 ): string
917 return arg1 .. arg2 .. join(rest, '-')
918enddef
919
Bram Moolenaar2c330432020-04-13 14:41:35 +0200920def MultiLineComment(
921 arg1: string, # comment
922 arg2 = 1234, # comment
923 ...rest: list<string> # comment
924 ): string # comment
925 return arg1 .. arg2 .. join(rest, '-')
926enddef
927
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200928def Test_multiline()
929 assert_equal('text1234', MultiLine('text'))
930 assert_equal('text777', MultiLine('text', 777))
931 assert_equal('text777one', MultiLine('text', 777, 'one'))
932 assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
933enddef
934
Bram Moolenaar23e03252020-04-12 22:22:31 +0200935func Test_multiline_not_vim9()
936 call assert_equal('text1234', MultiLine('text'))
937 call assert_equal('text777', MultiLine('text', 777))
938 call assert_equal('text777one', MultiLine('text', 777, 'one'))
939 call assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
940endfunc
941
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200942
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200943" When using CheckScriptFailure() for the below test, E1010 is generated instead
944" of E1056.
945func Test_E1056_1059()
946 let caught_1056 = 0
947 try
948 def F():
949 return 1
950 enddef
951 catch /E1056:/
952 let caught_1056 = 1
953 endtry
954 call assert_equal(1, caught_1056)
955
956 let caught_1059 = 0
957 try
958 def F5(items : list)
959 echo 'a'
960 enddef
961 catch /E1059:/
962 let caught_1059 = 1
963 endtry
964 call assert_equal(1, caught_1059)
965endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200966
Bram Moolenaar015f4262020-05-05 21:25:22 +0200967func DelMe()
968 echo 'DelMe'
969endfunc
970
971def Test_deleted_function()
972 CheckDefExecFailure([
973 'let RefMe: func = function("g:DelMe")',
974 'delfunc g:DelMe',
975 'echo RefMe()'], 'E117:')
976enddef
977
978def Test_unknown_function()
979 CheckDefExecFailure([
980 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200981 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +0200982enddef
983
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +0200984def RefFunc(Ref: func(string): string): string
985 return Ref('more')
986enddef
987
988def Test_closure_simple()
989 let local = 'some '
990 assert_equal('some more', RefFunc({s -> local .. s}))
991enddef
992
Bram Moolenaarbf67ea12020-05-02 17:52:42 +0200993def MakeRef()
994 let local = 'some '
995 g:Ref = {s -> local .. s}
996enddef
997
998def Test_closure_ref_after_return()
999 MakeRef()
1000 assert_equal('some thing', g:Ref('thing'))
1001 unlet g:Ref
1002enddef
1003
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001004def MakeTwoRefs()
1005 let local = ['some']
1006 g:Extend = {s -> local->add(s)}
1007 g:Read = {-> local}
1008enddef
1009
1010def Test_closure_two_refs()
1011 MakeTwoRefs()
1012 assert_equal('some', join(g:Read(), ' '))
1013 g:Extend('more')
1014 assert_equal('some more', join(g:Read(), ' '))
1015 g:Extend('even')
1016 assert_equal('some more even', join(g:Read(), ' '))
1017
1018 unlet g:Extend
1019 unlet g:Read
1020enddef
1021
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001022def ReadRef(Ref: func(): list<string>): string
1023 return join(Ref(), ' ')
1024enddef
1025
1026def ExtendRef(Ref: func(string), add: string)
1027 Ref(add)
1028enddef
1029
1030def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001031 MakeTwoRefs()
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001032 assert_equal('some', ReadRef(g:Read))
1033 ExtendRef(g:Extend, 'more')
1034 assert_equal('some more', ReadRef(g:Read))
1035 ExtendRef(g:Extend, 'even')
1036 assert_equal('some more even', ReadRef(g:Read))
1037
1038 unlet g:Extend
1039 unlet g:Read
1040enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001041
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001042def MakeArgRefs(theArg: string)
1043 let local = 'loc_val'
1044 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1045enddef
1046
1047def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1048 let local = 'the_loc'
1049 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1050enddef
1051
1052def Test_closure_using_argument()
1053 MakeArgRefs('arg_val')
1054 assert_equal('arg_val/loc_val/call_val', g:UseArg('call_val'))
1055
1056 MakeArgRefsVarargs('arg_val', 'one', 'two')
1057 assert_equal('arg_val/the_loc/call_val/one two', g:UseVararg('call_val'))
1058
1059 unlet g:UseArg
1060 unlet g:UseVararg
1061enddef
1062
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001063def MakeGetAndAppendRefs()
1064 let local = 'a'
1065
1066 def Append(arg: string)
1067 local ..= arg
1068 enddef
1069 g:Append = Append
1070
1071 def Get(): string
1072 return local
1073 enddef
1074 g:Get = Get
1075enddef
1076
1077def Test_closure_append_get()
1078 MakeGetAndAppendRefs()
1079 assert_equal('a', g:Get())
1080 g:Append('-b')
1081 assert_equal('a-b', g:Get())
1082 g:Append('-c')
1083 assert_equal('a-b-c', g:Get())
1084
1085 unlet g:Append
1086 unlet g:Get
1087enddef
1088
Bram Moolenaar04b12692020-05-04 23:24:44 +02001089def Test_nested_closure()
1090 let local = 'text'
1091 def Closure(arg: string): string
1092 return local .. arg
1093 enddef
1094 assert_equal('text!!!', Closure('!!!'))
1095enddef
1096
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001097func GetResult(Ref)
1098 return a:Ref('some')
1099endfunc
1100
1101def Test_call_closure_not_compiled()
1102 let text = 'text'
1103 g:Ref = {s -> s .. text}
1104 assert_equal('sometext', GetResult(g:Ref))
1105enddef
1106
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001107def Test_sort_return_type()
1108 let res: list<number>
1109 res = [1, 2, 3]->sort()
1110enddef
1111
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001112def Test_getqflist_return_type()
1113 let l = getqflist()
1114 assert_equal([], l)
1115
1116 let d = getqflist(#{items: 0})
1117 assert_equal(#{items: []}, d)
1118enddef
1119
1120def Test_getloclist_return_type()
1121 let l = getloclist(1)
1122 assert_equal([], l)
1123
1124 let d = getloclist(1, #{items: 0})
1125 assert_equal(#{items: []}, d)
1126enddef
1127
Bram Moolenaara66ba012020-07-05 18:41:08 +02001128def Test_copy_return_type()
1129 let l = copy([1, 2, 3])
1130 let res = 0
1131 for n in l
1132 res += n
1133 endfor
1134 assert_equal(6, res)
1135
1136 let dl = deepcopy([1, 2, 3])
1137 res = 0
1138 for n in dl
1139 res += n
1140 endfor
1141 assert_equal(6, res)
1142enddef
1143
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001144def Test_extend_return_type()
1145 let l = extend([1, 2], [3])
1146 let res = 0
1147 for n in l
1148 res += n
1149 endfor
1150 assert_equal(6, res)
1151enddef
1152
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001153def Test_insert_return_type()
1154 let l = insert([2, 1], 3)
1155 let res = 0
1156 for n in l
1157 res += n
1158 endfor
1159 assert_equal(6, res)
1160enddef
1161
Bram Moolenaar67627352020-07-05 21:10:24 +02001162def Test_reverse_return_type()
1163 let l = reverse([1, 2, 3])
1164 let res = 0
1165 for n in l
1166 res += n
1167 endfor
1168 assert_equal(6, res)
1169enddef
1170
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001171def Test_remove_return_type()
1172 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1173 let res = 0
1174 for n in l
1175 res += n
1176 endfor
1177 assert_equal(3, res)
1178enddef
1179
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001180def Test_filter_return_type()
1181 let l = filter([1, 2, 3], {-> 1})
1182 let res = 0
1183 for n in l
1184 res += n
1185 endfor
1186 assert_equal(6, res)
1187enddef
1188
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001189def Wrong_dict_key_type(items: list<number>): list<number>
1190 return filter(items, {_, val -> get({val: 1}, 'x')})
1191enddef
1192
1193def Test_wrong_dict_key_type()
1194 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1029:')
1195enddef
1196
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001197def Line_continuation_in_def(dir: string = ''): string
1198 let path: string = empty(dir)
1199 \ ? 'empty'
1200 \ : 'full'
1201 return path
1202enddef
1203
1204def Test_line_continuation_in_def()
1205 assert_equal('full', Line_continuation_in_def('.'))
1206enddef
1207
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001208def Line_continuation_in_lambda(): list<number>
1209 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001210 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001211 ->toupper()})
1212 ->reverse()
1213 return x
1214enddef
1215
1216def Test_line_continuation_in_lambda()
1217 assert_equal(['D', 'C', 'B', 'A'], Line_continuation_in_lambda())
1218enddef
1219
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001220func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001221 CheckScreendump
1222
1223 let lines =<< trim END
1224 vim9script
1225 def EchoNothing()
1226 silent echo ''
1227 enddef
1228 defcompile
1229 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001230 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001231
1232 " Check that the balloon shows up after a mouse move
1233 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001234 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001235 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1236
1237 " clean up
1238 call StopVimInTerminal(buf)
1239 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001240endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001241
Bram Moolenaar985116a2020-07-12 17:31:09 +02001242def Fibonacci(n: number): number
1243 if n < 2
1244 return n
1245 else
1246 return Fibonacci(n - 1) + Fibonacci(n - 2)
1247 endif
1248enddef
1249
1250def Test_recursive_call()
1251 assert_equal(6765, Fibonacci(20))
1252enddef
1253
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001254def TreeWalk(dir: string): list<any>
1255 return readdir(dir)->map({_, val ->
1256 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
1257 ? {val : TreeWalk(dir .. '/' .. val)}
1258 : val
1259 })
1260enddef
1261
1262def Test_closure_in_map()
1263 mkdir('XclosureDir/tdir', 'p')
1264 writefile(['111'], 'XclosureDir/file1')
1265 writefile(['222'], 'XclosureDir/file2')
1266 writefile(['333'], 'XclosureDir/tdir/file3')
1267
1268 assert_equal(['file1', 'file2', {'tdir': ['file3']}], TreeWalk('XclosureDir'))
1269
1270 delete('XclosureDir', 'rf')
1271enddef
1272
Bram Moolenaara90afb92020-07-15 22:38:56 +02001273def Test_partial_call()
1274 let Xsetlist = function('setloclist', [0])
1275 Xsetlist([], ' ', {'title': 'test'})
1276 assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
1277
1278 Xsetlist = function('setloclist', [0, [], ' '])
1279 Xsetlist({'title': 'test'})
1280 assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
1281
1282 Xsetlist = function('setqflist')
1283 Xsetlist([], ' ', {'title': 'test'})
1284 assert_equal({'title': 'test'}, getqflist({'title': 1}))
1285
1286 Xsetlist = function('setqflist', [[], ' '])
1287 Xsetlist({'title': 'test'})
1288 assert_equal({'title': 'test'}, getqflist({'title': 1}))
1289enddef
1290
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001291
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001292" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker