blob: d39584154bc5eabcf46e1a522073297b42edba53 [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 Moolenaarad486a02020-08-01 23:22:18 +0200177
178 lines =<< trim END
179 vim9script
180 def Func()
181 echo 'script'
182 enddef
183 def Outer()
184 def Func()
185 echo 'inner'
186 enddef
187 enddef
188 defcompile
189 END
190 CheckScriptFailure(lines, "E1073:")
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200191enddef
192
Bram Moolenaar333894b2020-08-01 18:53:07 +0200193def Test_global_local_function()
194 let lines =<< trim END
195 vim9script
196 def g:Func(): string
197 return 'global'
198 enddef
199 def Func(): string
200 return 'local'
201 enddef
202 assert_equal('global', g:Func())
203 assert_equal('local', Func())
204 END
205 CheckScriptSuccess(lines)
206enddef
207
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200208func TakesOneArg(arg)
209 echo a:arg
210endfunc
211
212def Test_call_wrong_args()
213 call CheckDefFailure(['TakesOneArg()'], 'E119:')
214 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
215 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaar1c0d44f2020-05-02 19:04:58 +0200216 call CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200217enddef
218
219" Default arg and varargs
220def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
221 let res = one .. ',' .. two
222 for s in rest
223 res ..= ',' .. s
224 endfor
225 return res
226enddef
227
228def Test_call_def_varargs()
229 call assert_fails('call MyDefVarargs()', 'E119:')
230 assert_equal('one,foo', MyDefVarargs('one'))
231 assert_equal('one,two', MyDefVarargs('one', 'two'))
232 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200233 CheckDefFailure(['MyDefVarargs("one", 22)'],
234 'E1013: argument 2: type mismatch, expected string but got number')
235 CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
236 'E1013: argument 3: type mismatch, expected string but got number')
237
238 let lines =<< trim END
239 vim9script
240 def Func(...l: list<string>)
241 echo l
242 enddef
243 Func('a', 'b', 'c')
244 END
245 CheckScriptSuccess(lines)
246
247 lines =<< trim END
248 vim9script
249 def Func(...l: list<string>)
250 echo l
251 enddef
252 Func()
253 END
254 CheckScriptSuccess(lines)
255
256 lines =<< trim END
257 vim9script
258 def Func(...l: list<string>)
259 echo l
260 enddef
261 Func(1, 2, 3)
262 END
263 CheckScriptFailure(lines, 'E1013:')
264
265 lines =<< trim END
266 vim9script
267 def Func(...l: list<string>)
268 echo l
269 enddef
270 Func('a', 9)
271 END
272 CheckScriptFailure(lines, 'E1013:')
273
274 lines =<< trim END
275 vim9script
276 def Func(...l: list<string>)
277 echo l
278 enddef
279 Func(1, 'a')
280 END
281 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200282enddef
283
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200284let s:value = ''
285
286def FuncOneDefArg(opt = 'text')
287 s:value = opt
288enddef
289
290def FuncTwoDefArg(nr = 123, opt = 'text'): string
291 return nr .. opt
292enddef
293
294def FuncVarargs(...arg: list<string>): string
295 return join(arg, ',')
296enddef
297
298def Test_func_type_varargs()
299 let RefDefArg: func(?string)
300 RefDefArg = FuncOneDefArg
301 RefDefArg()
302 assert_equal('text', s:value)
303 RefDefArg('some')
304 assert_equal('some', s:value)
305
306 let RefDef2Arg: func(?number, ?string): string
307 RefDef2Arg = FuncTwoDefArg
308 assert_equal('123text', RefDef2Arg())
309 assert_equal('99text', RefDef2Arg(99))
310 assert_equal('77some', RefDef2Arg(77, 'some'))
311
312 call CheckDefFailure(['let RefWrong: func(string?)'], 'E1010:')
313 call CheckDefFailure(['let RefWrong: func(?string, string)'], 'E1007:')
314
315 let RefVarargs: func(...list<string>): string
316 RefVarargs = FuncVarargs
317 assert_equal('', RefVarargs())
318 assert_equal('one', RefVarargs('one'))
319 assert_equal('one,two', RefVarargs('one', 'two'))
320
321 call CheckDefFailure(['let RefWrong: func(...list<string>, string)'], 'E110:')
322 call CheckDefFailure(['let RefWrong: func(...list<string>, ?string)'], 'E110:')
323enddef
324
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200325" Only varargs
326def MyVarargsOnly(...args: list<string>): string
327 return join(args, ',')
328enddef
329
330def Test_call_varargs_only()
331 assert_equal('', MyVarargsOnly())
332 assert_equal('one', MyVarargsOnly('one'))
333 assert_equal('one,two', MyVarargsOnly('one', 'two'))
334 call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number')
335 call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number')
336enddef
337
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200338def Test_using_var_as_arg()
Bram Moolenaar822ba242020-05-24 23:00:18 +0200339 call writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200340 call assert_fails('so Xdef', 'E1006:')
341 call delete('Xdef')
342enddef
343
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200344def DictArg(arg: dict<string>)
345 arg['key'] = 'value'
346enddef
347
348def ListArg(arg: list<string>)
349 arg[0] = 'value'
350enddef
351
352def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200353 # works for dict and list
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200354 let d: dict<string> = {}
355 DictArg(d)
356 assert_equal('value', d['key'])
357 let l: list<string> = []
358 ListArg(l)
359 assert_equal('value', l[0])
360
Bram Moolenaar822ba242020-05-24 23:00:18 +0200361 call CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200362enddef
363
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200364def Test_call_func_defined_later()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200365 call assert_equal('one', g:DefinedLater('one'))
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200366 call assert_fails('call NotDefined("one")', 'E117:')
367enddef
368
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200369func DefinedLater(arg)
370 return a:arg
371endfunc
372
373def Test_call_funcref()
374 assert_equal(3, g:SomeFunc('abc'))
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200375 assert_fails('NotAFunc()', 'E117:') # comment after call
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200376 assert_fails('g:NotAFunc()', 'E117:')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200377
378 let lines =<< trim END
379 vim9script
380 def RetNumber(): number
381 return 123
382 enddef
383 let Funcref: func: number = function('RetNumber')
384 assert_equal(123, Funcref())
385 END
386 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200387
388 lines =<< trim END
389 vim9script
390 def RetNumber(): number
391 return 123
392 enddef
393 def Bar(F: func: number): number
394 return F()
395 enddef
396 let Funcref = function('RetNumber')
397 assert_equal(123, Bar(Funcref))
398 END
399 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200400
401 lines =<< trim END
402 vim9script
403 def UseNumber(nr: number)
404 echo nr
405 enddef
406 let Funcref: func(number) = function('UseNumber')
407 Funcref(123)
408 END
409 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200410
411 lines =<< trim END
412 vim9script
413 def UseNumber(nr: number)
414 echo nr
415 enddef
416 let Funcref: func(string) = function('UseNumber')
417 END
418 CheckScriptFailure(lines, 'E1013: type mismatch, expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200419
420 lines =<< trim END
421 vim9script
422 def EchoNr(nr = 34)
423 g:echo = nr
424 enddef
425 let Funcref: func(?number) = function('EchoNr')
426 Funcref()
427 assert_equal(34, g:echo)
428 Funcref(123)
429 assert_equal(123, g:echo)
430 END
431 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200432
433 lines =<< trim END
434 vim9script
435 def EchoList(...l: list<number>)
436 g:echo = l
437 enddef
438 let Funcref: func(...list<number>) = function('EchoList')
439 Funcref()
440 assert_equal([], g:echo)
441 Funcref(1, 2, 3)
442 assert_equal([1, 2, 3], g:echo)
443 END
444 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200445
446 lines =<< trim END
447 vim9script
448 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
449 g:optarg = opt
450 g:listarg = l
451 return nr
452 enddef
453 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
454 assert_equal(10, Funcref(10))
455 assert_equal(12, g:optarg)
456 assert_equal([], g:listarg)
457
458 assert_equal(11, Funcref(11, 22))
459 assert_equal(22, g:optarg)
460 assert_equal([], g:listarg)
461
462 assert_equal(17, Funcref(17, 18, 1, 2, 3))
463 assert_equal(18, g:optarg)
464 assert_equal([1, 2, 3], g:listarg)
465 END
466 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200467enddef
468
469let SomeFunc = function('len')
470let NotAFunc = 'text'
471
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200472def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200473 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200474 let Ref1: func(bool): string
475 let Ref2: func(bool): number
476 let Ref3: func(bool): any
477 Ref3 = g:cond ? Ref1 : Ref2
478
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200479 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200480 let Refa1: func(bool): number
481 let Refa2: func(bool, number): number
482 let Refa3: func: number
483 Refa3 = g:cond ? Refa1 : Refa2
484
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200485 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200486 let Refb1: func(bool, string): number
487 let Refb2: func(string, number): number
488 let Refb3: func(any, any): number
489 Refb3 = g:cond ? Refb1 : Refb2
490enddef
491
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200492def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200493 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200494enddef
495
496def DefinedEvenLater(arg: string): string
497 return arg
498enddef
499
500def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200501 # Error in called function requires unwinding the call stack.
Bram Moolenaar05a55512020-07-05 15:52:19 +0200502 assert_fails('call FuncWithForwardCall()', 'E1096')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200503enddef
504
505def Test_return_type_wrong()
Bram Moolenaar822ba242020-05-24 23:00:18 +0200506 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef', 'defcompile'], 'expected number but got string')
507 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef', 'defcompile'], 'expected string but got number')
Bram Moolenaar05a55512020-07-05 15:52:19 +0200508 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef', 'defcompile'], 'E1096: Returning a value in a function without a return type')
509 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 +0200510
Bram Moolenaar822ba242020-05-24 23:00:18 +0200511 CheckScriptFailure(['def Func(): number', 'return', 'enddef', 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200512
513 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
514 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200515 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200516enddef
517
518def Test_arg_type_wrong()
519 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200520 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200521 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200522 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200523enddef
524
525def Test_vim9script_call()
526 let lines =<< trim END
527 vim9script
528 let var = ''
529 def MyFunc(arg: string)
530 var = arg
531 enddef
532 MyFunc('foobar')
533 assert_equal('foobar', var)
534
535 let str = 'barfoo'
536 str->MyFunc()
537 assert_equal('barfoo', var)
538
Bram Moolenaar67979662020-06-20 22:50:47 +0200539 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200540 g:value->MyFunc()
541 assert_equal('value', var)
542
543 let listvar = []
544 def ListFunc(arg: list<number>)
545 listvar = arg
546 enddef
547 [1, 2, 3]->ListFunc()
548 assert_equal([1, 2, 3], listvar)
549
550 let dictvar = {}
551 def DictFunc(arg: dict<number>)
552 dictvar = arg
553 enddef
554 {'a': 1, 'b': 2}->DictFunc()
555 assert_equal(#{a: 1, b: 2}, dictvar)
556 def CompiledDict()
557 {'a': 3, 'b': 4}->DictFunc()
558 enddef
559 CompiledDict()
560 assert_equal(#{a: 3, b: 4}, dictvar)
561
562 #{a: 3, b: 4}->DictFunc()
563 assert_equal(#{a: 3, b: 4}, dictvar)
564
565 ('text')->MyFunc()
566 assert_equal('text', var)
567 ("some")->MyFunc()
568 assert_equal('some', var)
Bram Moolenaare6b53242020-07-01 17:28:33 +0200569
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200570 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200571 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200572 'asdfasdf'->MyFunc()
573 assert_equal('asdfasdf', var)
Bram Moolenaar10409562020-07-29 20:00:38 +0200574 "xyz"->MyFunc()
575 assert_equal('xyz', var)
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200576
577 def UseString()
578 'xyork'->MyFunc()
579 enddef
580 UseString()
581 assert_equal('xyork', var)
582
Bram Moolenaar10409562020-07-29 20:00:38 +0200583 def UseString2()
584 "knife"->MyFunc()
585 enddef
586 UseString2()
587 assert_equal('knife', var)
588
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200589 # prepending a colon makes it a mark
590 new
591 setline(1, ['aaa', 'bbb', 'ccc'])
592 normal! 3Gmt1G
593 :'t
594 assert_equal(3, getcurpos()[1])
595 bwipe!
596
Bram Moolenaare6b53242020-07-01 17:28:33 +0200597 MyFunc(
598 'continued'
599 )
600 assert_equal('continued',
601 var
602 )
603
604 call MyFunc(
605 'more'
606 ..
607 'lines'
608 )
609 assert_equal(
610 'morelines',
611 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200612 END
613 writefile(lines, 'Xcall.vim')
614 source Xcall.vim
615 delete('Xcall.vim')
616enddef
617
618def Test_vim9script_call_fail_decl()
619 let lines =<< trim END
620 vim9script
621 let var = ''
622 def MyFunc(arg: string)
623 let var = 123
624 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200625 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200626 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200627 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200628enddef
629
Bram Moolenaar65b95452020-07-19 14:03:09 +0200630def Test_vim9script_call_fail_type()
631 let lines =<< trim END
632 vim9script
633 def MyFunc(arg: string)
634 echo arg
635 enddef
636 MyFunc(1234)
637 END
638 CheckScriptFailure(lines, 'E1013: type mismatch, expected string but got number')
639enddef
640
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200641def Test_vim9script_call_fail_const()
642 let lines =<< trim END
643 vim9script
644 const var = ''
645 def MyFunc(arg: string)
646 var = 'asdf'
647 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200648 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200649 END
650 writefile(lines, 'Xcall_const.vim')
651 assert_fails('source Xcall_const.vim', 'E46:')
652 delete('Xcall_const.vim')
653enddef
654
655" Test that inside :function a Python function can be defined, :def is not
656" recognized.
657func Test_function_python()
658 CheckFeature python3
659 let py = 'python3'
660 execute py "<< EOF"
661def do_something():
662 return 1
663EOF
664endfunc
665
666def Test_delfunc()
667 let lines =<< trim END
668 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200669 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200670 echo 'hello'
671 enddef
672
673 def CallGoneSoon()
674 GoneSoon()
675 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200676 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200677
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200678 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200679 CallGoneSoon()
680 END
681 writefile(lines, 'XToDelFunc')
682 assert_fails('so XToDelFunc', 'E933')
683 assert_fails('so XToDelFunc', 'E933')
684
685 delete('XToDelFunc')
686enddef
687
688def Test_redef_failure()
689 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
690 so Xdef
691 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
692 so Xdef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200693 call writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200694 call assert_fails('so Xdef', 'E1027:')
695 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
696 so Xdef
697 call delete('Xdef')
698
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200699 call assert_equal(0, g:Func0())
700 call assert_equal('Func1', g:Func1())
701 call assert_equal('Func2', g:Func2())
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200702
703 delfunc! Func0
704 delfunc! Func1
705 delfunc! Func2
706enddef
707
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200708def Test_vim9script_func()
709 let lines =<< trim END
710 vim9script
711 func Func(arg)
712 echo a:arg
713 endfunc
714 Func('text')
715 END
716 writefile(lines, 'XVim9Func')
717 so XVim9Func
718
719 delete('XVim9Func')
720enddef
721
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200722" Test for internal functions returning different types
723func Test_InternalFuncRetType()
724 let lines =<< trim END
725 def RetFloat(): float
726 return ceil(1.456)
727 enddef
728
729 def RetListAny(): list<any>
730 return items({'k' : 'v'})
731 enddef
732
733 def RetListString(): list<string>
734 return split('a:b:c', ':')
735 enddef
736
737 def RetListDictAny(): list<dict<any>>
738 return getbufinfo()
739 enddef
740
741 def RetDictNumber(): dict<number>
742 return wordcount()
743 enddef
744
745 def RetDictString(): dict<string>
746 return environ()
747 enddef
748 END
749 call writefile(lines, 'Xscript')
750 source Xscript
751
752 call assert_equal(2.0, RetFloat())
753 call assert_equal([['k', 'v']], RetListAny())
754 call assert_equal(['a', 'b', 'c'], RetListString())
755 call assert_notequal([], RetListDictAny())
756 call assert_notequal({}, RetDictNumber())
757 call assert_notequal({}, RetDictString())
758 call delete('Xscript')
759endfunc
760
761" Test for passing too many or too few arguments to internal functions
762func Test_internalfunc_arg_error()
763 let l =<< trim END
764 def! FArgErr(): float
765 return ceil(1.1, 2)
766 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200767 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200768 END
769 call writefile(l, 'Xinvalidarg')
770 call assert_fails('so Xinvalidarg', 'E118:')
771 let l =<< trim END
772 def! FArgErr(): float
773 return ceil()
774 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200775 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200776 END
777 call writefile(l, 'Xinvalidarg')
778 call assert_fails('so Xinvalidarg', 'E119:')
779 call delete('Xinvalidarg')
780endfunc
781
782let s:funcResult = 0
783
784def FuncNoArgNoRet()
785 funcResult = 11
786enddef
787
788def FuncNoArgRetNumber(): number
789 funcResult = 22
790 return 1234
791enddef
792
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200793def FuncNoArgRetString(): string
794 funcResult = 45
795 return 'text'
796enddef
797
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200798def FuncOneArgNoRet(arg: number)
799 funcResult = arg
800enddef
801
802def FuncOneArgRetNumber(arg: number): number
803 funcResult = arg
804 return arg
805enddef
806
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200807def FuncTwoArgNoRet(one: bool, two: number)
808 funcResult = two
809enddef
810
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200811def FuncOneArgRetString(arg: string): string
812 return arg
813enddef
814
Bram Moolenaar89228602020-04-05 22:14:54 +0200815def FuncOneArgRetAny(arg: any): any
816 return arg
817enddef
818
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200819def Test_func_type()
820 let Ref1: func()
821 funcResult = 0
822 Ref1 = FuncNoArgNoRet
823 Ref1()
824 assert_equal(11, funcResult)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200825
826 let Ref2: func
827 funcResult = 0
828 Ref2 = FuncNoArgNoRet
829 Ref2()
830 assert_equal(11, funcResult)
831
832 funcResult = 0
833 Ref2 = FuncOneArgNoRet
834 Ref2(12)
835 assert_equal(12, funcResult)
836
837 funcResult = 0
838 Ref2 = FuncNoArgRetNumber
839 assert_equal(1234, Ref2())
840 assert_equal(22, funcResult)
841
842 funcResult = 0
843 Ref2 = FuncOneArgRetNumber
844 assert_equal(13, Ref2(13))
845 assert_equal(13, funcResult)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200846enddef
847
Bram Moolenaar9978d472020-07-05 16:01:56 +0200848def Test_repeat_return_type()
849 let res = 0
850 for n in repeat([1], 3)
851 res += n
852 endfor
853 assert_equal(3, res)
Bram Moolenaarfce82b32020-07-05 16:07:21 +0200854
855 res = 0
856 for n in add([1, 2], 3)
857 res += n
858 endfor
859 assert_equal(6, res)
Bram Moolenaar9978d472020-07-05 16:01:56 +0200860enddef
861
Bram Moolenaar846178a2020-07-05 17:04:13 +0200862def Test_argv_return_type()
863 next fileone filetwo
864 let res = ''
865 for name in argv()
866 res ..= name
867 endfor
868 assert_equal('fileonefiletwo', res)
869enddef
870
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200871def Test_func_type_part()
872 let RefVoid: func: void
873 RefVoid = FuncNoArgNoRet
874 RefVoid = FuncOneArgNoRet
875 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200876 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200877
878 let RefAny: func(): any
879 RefAny = FuncNoArgRetNumber
880 RefAny = FuncNoArgRetString
881 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()')
882 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1013: type mismatch, expected func(): any but got func(number)')
883
884 let RefNr: func: number
885 RefNr = FuncNoArgRetNumber
886 RefNr = FuncOneArgRetNumber
887 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200888 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200889
890 let RefStr: func: string
891 RefStr = FuncNoArgRetString
892 RefStr = FuncOneArgRetString
893 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()')
894 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func(): string but got func(): number')
895enddef
896
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200897def Test_func_type_fails()
898 CheckDefFailure(['let ref1: func()'], 'E704:')
899
900 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
901 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)')
902 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number')
Bram Moolenaar6ff71d82020-05-24 23:45:24 +0200903 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(bool) but got func(bool, number)')
904 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1013: type mismatch, expected func(?bool) but got func(bool, number)')
905 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 +0200906
907 call CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
908 call CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
909 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:')
910 call CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200911enddef
912
Bram Moolenaar89228602020-04-05 22:14:54 +0200913def Test_func_return_type()
914 let nr: number
915 nr = FuncNoArgRetNumber()
916 assert_equal(1234, nr)
917
918 nr = FuncOneArgRetAny(122)
919 assert_equal(122, nr)
920
921 let str: string
922 str = FuncOneArgRetAny('yes')
923 assert_equal('yes', str)
924
925 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1013: type mismatch, expected string but got number')
926enddef
927
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200928def MultiLine(
929 arg1: string,
930 arg2 = 1234,
931 ...rest: list<string>
932 ): string
933 return arg1 .. arg2 .. join(rest, '-')
934enddef
935
Bram Moolenaar2c330432020-04-13 14:41:35 +0200936def MultiLineComment(
937 arg1: string, # comment
938 arg2 = 1234, # comment
939 ...rest: list<string> # comment
940 ): string # comment
941 return arg1 .. arg2 .. join(rest, '-')
942enddef
943
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200944def Test_multiline()
945 assert_equal('text1234', MultiLine('text'))
946 assert_equal('text777', MultiLine('text', 777))
947 assert_equal('text777one', MultiLine('text', 777, 'one'))
948 assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
949enddef
950
Bram Moolenaar23e03252020-04-12 22:22:31 +0200951func Test_multiline_not_vim9()
952 call assert_equal('text1234', MultiLine('text'))
953 call assert_equal('text777', MultiLine('text', 777))
954 call assert_equal('text777one', MultiLine('text', 777, 'one'))
955 call assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
956endfunc
957
Bram Moolenaar5e774c72020-04-12 21:53:00 +0200958
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200959" When using CheckScriptFailure() for the below test, E1010 is generated instead
960" of E1056.
961func Test_E1056_1059()
962 let caught_1056 = 0
963 try
964 def F():
965 return 1
966 enddef
967 catch /E1056:/
968 let caught_1056 = 1
969 endtry
970 call assert_equal(1, caught_1056)
971
972 let caught_1059 = 0
973 try
974 def F5(items : list)
975 echo 'a'
976 enddef
977 catch /E1059:/
978 let caught_1059 = 1
979 endtry
980 call assert_equal(1, caught_1059)
981endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200982
Bram Moolenaar015f4262020-05-05 21:25:22 +0200983func DelMe()
984 echo 'DelMe'
985endfunc
986
Bram Moolenaarbf8feb52020-08-08 14:26:31 +0200987def Test_error_reporting()
988 # comment lines at the start of the function
989 let lines =<< trim END
990 " comment
991 def Func()
992 # comment
993 # comment
994 invalid
995 enddef
996 defcompile
997 END
998 call writefile(lines, 'Xdef')
999 try
1000 source Xdef
1001 catch /E476:/
1002 assert_match('Invalid command: invalid', v:exception)
1003 assert_match(', line 3$', v:throwpoint)
1004 endtry
1005
1006 # comment lines after the start of the function
1007 lines =<< trim END
1008 " comment
1009 def Func()
1010 let x = 1234
1011 # comment
1012 # comment
1013 invalid
1014 enddef
1015 defcompile
1016 END
1017 call writefile(lines, 'Xdef')
1018 try
1019 source Xdef
1020 catch /E476:/
1021 assert_match('Invalid command: invalid', v:exception)
1022 assert_match(', line 4$', v:throwpoint)
1023 endtry
1024
1025 call delete('Xdef')
1026enddef
1027
Bram Moolenaar015f4262020-05-05 21:25:22 +02001028def Test_deleted_function()
1029 CheckDefExecFailure([
1030 'let RefMe: func = function("g:DelMe")',
1031 'delfunc g:DelMe',
1032 'echo RefMe()'], 'E117:')
1033enddef
1034
1035def Test_unknown_function()
1036 CheckDefExecFailure([
1037 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001038 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +02001039enddef
1040
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001041def RefFunc(Ref: func(string): string): string
1042 return Ref('more')
1043enddef
1044
1045def Test_closure_simple()
1046 let local = 'some '
1047 assert_equal('some more', RefFunc({s -> local .. s}))
1048enddef
1049
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001050def MakeRef()
1051 let local = 'some '
1052 g:Ref = {s -> local .. s}
1053enddef
1054
1055def Test_closure_ref_after_return()
1056 MakeRef()
1057 assert_equal('some thing', g:Ref('thing'))
1058 unlet g:Ref
1059enddef
1060
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001061def MakeTwoRefs()
1062 let local = ['some']
1063 g:Extend = {s -> local->add(s)}
1064 g:Read = {-> local}
1065enddef
1066
1067def Test_closure_two_refs()
1068 MakeTwoRefs()
1069 assert_equal('some', join(g:Read(), ' '))
1070 g:Extend('more')
1071 assert_equal('some more', join(g:Read(), ' '))
1072 g:Extend('even')
1073 assert_equal('some more even', join(g:Read(), ' '))
1074
1075 unlet g:Extend
1076 unlet g:Read
1077enddef
1078
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001079def ReadRef(Ref: func(): list<string>): string
1080 return join(Ref(), ' ')
1081enddef
1082
1083def ExtendRef(Ref: func(string), add: string)
1084 Ref(add)
1085enddef
1086
1087def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001088 MakeTwoRefs()
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001089 assert_equal('some', ReadRef(g:Read))
1090 ExtendRef(g:Extend, 'more')
1091 assert_equal('some more', ReadRef(g:Read))
1092 ExtendRef(g:Extend, 'even')
1093 assert_equal('some more even', ReadRef(g:Read))
1094
1095 unlet g:Extend
1096 unlet g:Read
1097enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001098
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001099def MakeArgRefs(theArg: string)
1100 let local = 'loc_val'
1101 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1102enddef
1103
1104def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1105 let local = 'the_loc'
1106 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1107enddef
1108
1109def Test_closure_using_argument()
1110 MakeArgRefs('arg_val')
1111 assert_equal('arg_val/loc_val/call_val', g:UseArg('call_val'))
1112
1113 MakeArgRefsVarargs('arg_val', 'one', 'two')
1114 assert_equal('arg_val/the_loc/call_val/one two', g:UseVararg('call_val'))
1115
1116 unlet g:UseArg
1117 unlet g:UseVararg
1118enddef
1119
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001120def MakeGetAndAppendRefs()
1121 let local = 'a'
1122
1123 def Append(arg: string)
1124 local ..= arg
1125 enddef
1126 g:Append = Append
1127
1128 def Get(): string
1129 return local
1130 enddef
1131 g:Get = Get
1132enddef
1133
1134def Test_closure_append_get()
1135 MakeGetAndAppendRefs()
1136 assert_equal('a', g:Get())
1137 g:Append('-b')
1138 assert_equal('a-b', g:Get())
1139 g:Append('-c')
1140 assert_equal('a-b-c', g:Get())
1141
1142 unlet g:Append
1143 unlet g:Get
1144enddef
1145
Bram Moolenaar04b12692020-05-04 23:24:44 +02001146def Test_nested_closure()
1147 let local = 'text'
1148 def Closure(arg: string): string
1149 return local .. arg
1150 enddef
1151 assert_equal('text!!!', Closure('!!!'))
1152enddef
1153
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001154func GetResult(Ref)
1155 return a:Ref('some')
1156endfunc
1157
1158def Test_call_closure_not_compiled()
1159 let text = 'text'
1160 g:Ref = {s -> s .. text}
1161 assert_equal('sometext', GetResult(g:Ref))
1162enddef
1163
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001164def Test_sort_return_type()
1165 let res: list<number>
1166 res = [1, 2, 3]->sort()
1167enddef
1168
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001169def Test_getqflist_return_type()
1170 let l = getqflist()
1171 assert_equal([], l)
1172
1173 let d = getqflist(#{items: 0})
1174 assert_equal(#{items: []}, d)
1175enddef
1176
1177def Test_getloclist_return_type()
1178 let l = getloclist(1)
1179 assert_equal([], l)
1180
1181 let d = getloclist(1, #{items: 0})
1182 assert_equal(#{items: []}, d)
1183enddef
1184
Bram Moolenaara66ba012020-07-05 18:41:08 +02001185def Test_copy_return_type()
1186 let l = copy([1, 2, 3])
1187 let res = 0
1188 for n in l
1189 res += n
1190 endfor
1191 assert_equal(6, res)
1192
1193 let dl = deepcopy([1, 2, 3])
1194 res = 0
1195 for n in dl
1196 res += n
1197 endfor
1198 assert_equal(6, res)
1199enddef
1200
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001201def Test_extend_return_type()
1202 let l = extend([1, 2], [3])
1203 let res = 0
1204 for n in l
1205 res += n
1206 endfor
1207 assert_equal(6, res)
1208enddef
1209
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001210def Test_insert_return_type()
1211 let l = insert([2, 1], 3)
1212 let res = 0
1213 for n in l
1214 res += n
1215 endfor
1216 assert_equal(6, res)
1217enddef
1218
Bram Moolenaar67627352020-07-05 21:10:24 +02001219def Test_reverse_return_type()
1220 let l = reverse([1, 2, 3])
1221 let res = 0
1222 for n in l
1223 res += n
1224 endfor
1225 assert_equal(6, res)
1226enddef
1227
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001228def Test_remove_return_type()
1229 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1230 let res = 0
1231 for n in l
1232 res += n
1233 endfor
1234 assert_equal(3, res)
1235enddef
1236
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001237def Test_filter_return_type()
1238 let l = filter([1, 2, 3], {-> 1})
1239 let res = 0
1240 for n in l
1241 res += n
1242 endfor
1243 assert_equal(6, res)
1244enddef
1245
Bram Moolenaar3d945cc2020-08-06 21:26:59 +02001246def Test_getreg_return_type()
1247 let s1: string = getreg('"')
1248 let s2: string = getreg('"', 1)
1249 let s3: list<string> = getreg('"', 1, 1)
1250enddef
1251
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001252def Wrong_dict_key_type(items: list<number>): list<number>
1253 return filter(items, {_, val -> get({val: 1}, 'x')})
1254enddef
1255
1256def Test_wrong_dict_key_type()
1257 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1029:')
1258enddef
1259
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001260def Line_continuation_in_def(dir: string = ''): string
1261 let path: string = empty(dir)
1262 \ ? 'empty'
1263 \ : 'full'
1264 return path
1265enddef
1266
1267def Test_line_continuation_in_def()
1268 assert_equal('full', Line_continuation_in_def('.'))
1269enddef
1270
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001271def Line_continuation_in_lambda(): list<number>
1272 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001273 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001274 ->toupper()})
1275 ->reverse()
1276 return x
1277enddef
1278
1279def Test_line_continuation_in_lambda()
1280 assert_equal(['D', 'C', 'B', 'A'], Line_continuation_in_lambda())
1281enddef
1282
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001283func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001284 CheckScreendump
1285
1286 let lines =<< trim END
1287 vim9script
1288 def EchoNothing()
1289 silent echo ''
1290 enddef
1291 defcompile
1292 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001293 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001294
1295 " Check that the balloon shows up after a mouse move
1296 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001297 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001298 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1299
1300 " clean up
1301 call StopVimInTerminal(buf)
1302 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001303endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001304
Bram Moolenaar985116a2020-07-12 17:31:09 +02001305def Fibonacci(n: number): number
1306 if n < 2
1307 return n
1308 else
1309 return Fibonacci(n - 1) + Fibonacci(n - 2)
1310 endif
1311enddef
1312
1313def Test_recursive_call()
1314 assert_equal(6765, Fibonacci(20))
1315enddef
1316
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001317def TreeWalk(dir: string): list<any>
1318 return readdir(dir)->map({_, val ->
1319 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaarbb1b5e22020-08-05 10:53:21 +02001320 ? {val: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001321 : val
1322 })
1323enddef
1324
1325def Test_closure_in_map()
1326 mkdir('XclosureDir/tdir', 'p')
1327 writefile(['111'], 'XclosureDir/file1')
1328 writefile(['222'], 'XclosureDir/file2')
1329 writefile(['333'], 'XclosureDir/tdir/file3')
1330
1331 assert_equal(['file1', 'file2', {'tdir': ['file3']}], TreeWalk('XclosureDir'))
1332
1333 delete('XclosureDir', 'rf')
1334enddef
1335
Bram Moolenaara90afb92020-07-15 22:38:56 +02001336def Test_partial_call()
1337 let Xsetlist = function('setloclist', [0])
1338 Xsetlist([], ' ', {'title': 'test'})
1339 assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
1340
1341 Xsetlist = function('setloclist', [0, [], ' '])
1342 Xsetlist({'title': 'test'})
1343 assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
1344
1345 Xsetlist = function('setqflist')
1346 Xsetlist([], ' ', {'title': 'test'})
1347 assert_equal({'title': 'test'}, getqflist({'title': 1}))
1348
1349 Xsetlist = function('setqflist', [[], ' '])
1350 Xsetlist({'title': 'test'})
1351 assert_equal({'title': 'test'}, getqflist({'title': 1}))
1352enddef
1353
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001354def Test_cmd_modifier()
1355 tab echo '0'
1356 call CheckDefFailure(['5tab echo 3'], 'E16:')
1357enddef
1358
1359def Test_restore_modifiers()
1360 # check that when compiling a :def function command modifiers are not messed
1361 # up.
1362 let lines =<< trim END
1363 vim9script
1364 set eventignore=
1365 autocmd QuickFixCmdPost * copen
1366 def AutocmdsDisabled()
1367 eval 0
1368 enddef
1369 func Func()
1370 noautocmd call s:AutocmdsDisabled()
1371 let g:ei_after = &eventignore
1372 endfunc
1373 Func()
1374 END
1375 CheckScriptSuccess(lines)
1376 assert_equal('', g:ei_after)
1377enddef
1378
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001379
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001380" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker