blob: 8c2349c34340c31994dad6dad79ce184de50b682 [file] [log] [blame]
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001" Test various aspects of the Vim9 script language.
2
3source check.vim
Bram Moolenaarad304702020-09-06 18:22:53 +02004source term_util.vim
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02005source view_util.vim
Bram Moolenaar04b12692020-05-04 23:24:44 +02006source vim9.vim
Bram Moolenaar47e7d702020-07-05 18:18:42 +02007source screendump.vim
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02008
9func Test_def_basic()
10 def SomeFunc(): string
11 return 'yes'
12 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020013 call SomeFunc()->assert_equal('yes')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020014endfunc
15
16def ReturnString(): string
17 return 'string'
18enddef
19
20def ReturnNumber(): number
21 return 123
22enddef
23
24let g:notNumber = 'string'
25
26def ReturnGlobal(): number
27 return g:notNumber
28enddef
29
30def Test_return_something()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020031 ReturnString()->assert_equal('string')
32 ReturnNumber()->assert_equal(123)
Bram Moolenaar5e654232020-09-16 15:22:00 +020033 assert_fails('ReturnGlobal()', 'E1012: Type mismatch; expected number but got string', '', 1, 'ReturnGlobal')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020034enddef
35
Bram Moolenaarefd88552020-06-18 20:50:10 +020036def Test_missing_return()
37 CheckDefFailure(['def Missing(): number',
38 ' if g:cond',
39 ' echo "no return"',
40 ' else',
41 ' return 0',
42 ' endif'
43 'enddef'], 'E1027:')
44 CheckDefFailure(['def Missing(): number',
45 ' if g:cond',
46 ' return 1',
47 ' else',
48 ' echo "no return"',
49 ' endif'
50 'enddef'], 'E1027:')
51 CheckDefFailure(['def Missing(): number',
52 ' if g:cond',
53 ' return 1',
54 ' else',
55 ' return 2',
56 ' endif'
57 ' return 3'
58 'enddef'], 'E1095:')
59enddef
60
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020061let s:nothing = 0
62def ReturnNothing()
63 s:nothing = 1
64 if true
65 return
66 endif
67 s:nothing = 2
68enddef
69
70def Test_return_nothing()
71 ReturnNothing()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020072 s:nothing->assert_equal(1)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020073enddef
74
75func Increment()
76 let g:counter += 1
77endfunc
78
79def Test_call_ufunc_count()
80 g:counter = 1
81 Increment()
82 Increment()
83 Increment()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020084 # works with and without :call
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020085 g:counter->assert_equal(4)
86 eval g:counter->assert_equal(4)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020087 unlet g:counter
88enddef
89
90def MyVarargs(arg: string, ...rest: list<string>): string
91 let res = arg
92 for s in rest
93 res ..= ',' .. s
94 endfor
95 return res
96enddef
97
98def Test_call_varargs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +020099 MyVarargs('one')->assert_equal('one')
100 MyVarargs('one', 'two')->assert_equal('one,two')
101 MyVarargs('one', 'two', 'three')->assert_equal('one,two,three')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200102enddef
103
104def MyDefaultArgs(name = 'string'): string
105 return name
106enddef
107
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200108def MyDefaultSecond(name: string, second: bool = true): string
109 return second ? name : 'none'
110enddef
111
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200112def Test_call_default_args()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200113 MyDefaultArgs()->assert_equal('string')
114 MyDefaultArgs('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200115 assert_fails('MyDefaultArgs("one", "two")', 'E118:', '', 3, 'Test_call_default_args')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200116
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200117 MyDefaultSecond('test')->assert_equal('test')
118 MyDefaultSecond('test', true)->assert_equal('test')
119 MyDefaultSecond('test', false)->assert_equal('none')
Bram Moolenaare30f64b2020-07-15 19:48:20 +0200120
Bram Moolenaar822ba242020-05-24 23:00:18 +0200121 CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef', 'defcompile'], 'E1001:')
Bram Moolenaar77072282020-09-16 17:55:40 +0200122 CheckScriptFailure(['def Func(arg: number = "text")', 'enddef', 'defcompile'], 'E1013: Argument 1: type mismatch, expected number but got string')
Bram Moolenaar04b12692020-05-04 23:24:44 +0200123enddef
124
125def Test_nested_function()
126 def Nested(arg: string): string
127 return 'nested ' .. arg
128 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200129 Nested('function')->assert_equal('nested function')
Bram Moolenaar04b12692020-05-04 23:24:44 +0200130
Bram Moolenaar0e65d3d2020-05-05 17:53:16 +0200131 CheckDefFailure(['def Nested()', 'enddef', 'Nested(66)'], 'E118:')
132 CheckDefFailure(['def Nested(arg: string)', 'enddef', 'Nested()'], 'E119:')
133
Bram Moolenaar04b12692020-05-04 23:24:44 +0200134 CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
Bram Moolenaarbcbf4132020-08-01 22:35:13 +0200135 CheckDefFailure(['def s:Nested()', 'enddef'], 'E1075:')
136 CheckDefFailure(['def b:Nested()', 'enddef'], 'E1075:')
Bram Moolenaar8b848ca2020-09-10 22:28:01 +0200137
138 CheckDefFailure([
139 'def Outer()',
140 ' def Inner()',
141 ' # comment',
142 ' enddef',
143 ' def Inner()',
144 ' enddef',
145 'enddef'], 'E1073:')
146 CheckDefFailure([
147 'def Outer()',
148 ' def Inner()',
149 ' # comment',
150 ' enddef',
151 ' def! Inner()',
152 ' enddef',
153 'enddef'], 'E1117:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200154enddef
155
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200156func Test_call_default_args_from_func()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200157 call MyDefaultArgs()->assert_equal('string')
158 call MyDefaultArgs('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200159 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:', '', 3, 'Test_call_default_args_from_func')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200160endfunc
161
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200162def Test_nested_global_function()
163 let lines =<< trim END
164 vim9script
165 def Outer()
166 def g:Inner(): string
167 return 'inner'
168 enddef
169 enddef
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200170 defcompile
171 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200172 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200173 delfunc g:Inner
174 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200175 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200176 delfunc g:Inner
177 Outer()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200178 g:Inner()->assert_equal('inner')
Bram Moolenaaraf8edbb2020-08-01 00:03:09 +0200179 delfunc g:Inner
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200180 END
181 CheckScriptSuccess(lines)
Bram Moolenaar2c79e9d2020-08-01 18:57:52 +0200182
183 lines =<< trim END
184 vim9script
185 def Outer()
186 def g:Inner(): string
187 return 'inner'
188 enddef
189 enddef
190 defcompile
191 Outer()
192 Outer()
193 END
194 CheckScriptFailure(lines, "E122:")
Bram Moolenaarad486a02020-08-01 23:22:18 +0200195
196 lines =<< trim END
197 vim9script
198 def Func()
199 echo 'script'
200 enddef
201 def Outer()
202 def Func()
203 echo 'inner'
204 enddef
205 enddef
206 defcompile
207 END
208 CheckScriptFailure(lines, "E1073:")
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200209enddef
210
Bram Moolenaar333894b2020-08-01 18:53:07 +0200211def Test_global_local_function()
212 let lines =<< trim END
213 vim9script
214 def g:Func(): string
215 return 'global'
216 enddef
217 def Func(): string
218 return 'local'
219 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200220 g:Func()->assert_equal('global')
221 Func()->assert_equal('local')
Bram Moolenaar333894b2020-08-01 18:53:07 +0200222 END
223 CheckScriptSuccess(lines)
Bram Moolenaar035d6e92020-08-11 22:30:42 +0200224
225 lines =<< trim END
226 vim9script
227 def g:Funcy()
228 echo 'funcy'
229 enddef
230 s:Funcy()
231 END
232 CheckScriptFailure(lines, 'E117:')
Bram Moolenaar333894b2020-08-01 18:53:07 +0200233enddef
234
Bram Moolenaar0f769812020-09-12 18:32:34 +0200235def Test_local_function_shadows_global()
236 let lines =<< trim END
237 vim9script
238 def g:Gfunc(): string
239 return 'global'
240 enddef
241 def AnotherFunc(): number
242 let Gfunc = function('len')
243 return Gfunc('testing')
244 enddef
245 g:Gfunc()->assert_equal('global')
246 AnotherFunc()->assert_equal(7)
247 delfunc g:Gfunc
248 END
249 CheckScriptSuccess(lines)
250
251 lines =<< trim END
252 vim9script
253 def g:Func(): string
254 return 'global'
255 enddef
256 def AnotherFunc()
257 g:Func = function('len')
258 enddef
259 AnotherFunc()
260 END
261 CheckScriptFailure(lines, 'E705:')
262 delfunc g:Func
263enddef
264
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200265func TakesOneArg(arg)
266 echo a:arg
267endfunc
268
269def Test_call_wrong_args()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200270 CheckDefFailure(['TakesOneArg()'], 'E119:')
271 CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
272 CheckDefFailure(['bufnr(xxx)'], 'E1001:')
273 CheckScriptFailure(['def Func(Ref: func(s: string))'], 'E475:')
Bram Moolenaaree8580e2020-08-28 17:19:07 +0200274
275 let lines =<< trim END
276 vim9script
277 def Func(s: string)
278 echo s
279 enddef
280 Func([])
281 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200282 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 5)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200283enddef
284
285" Default arg and varargs
286def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
287 let res = one .. ',' .. two
288 for s in rest
289 res ..= ',' .. s
290 endfor
291 return res
292enddef
293
294def Test_call_def_varargs()
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200295 assert_fails('MyDefVarargs()', 'E119:', '', 1, 'Test_call_def_varargs')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200296 MyDefVarargs('one')->assert_equal('one,foo')
297 MyDefVarargs('one', 'two')->assert_equal('one,two')
298 MyDefVarargs('one', 'two', 'three')->assert_equal('one,two,three')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200299 CheckDefFailure(['MyDefVarargs("one", 22)'],
Bram Moolenaar77072282020-09-16 17:55:40 +0200300 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200301 CheckDefFailure(['MyDefVarargs("one", "two", 123)'],
Bram Moolenaar77072282020-09-16 17:55:40 +0200302 'E1013: Argument 3: type mismatch, expected string but got number')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200303
304 let lines =<< trim END
305 vim9script
306 def Func(...l: list<string>)
307 echo l
308 enddef
309 Func('a', 'b', 'c')
310 END
311 CheckScriptSuccess(lines)
312
313 lines =<< trim END
314 vim9script
315 def Func(...l: list<string>)
316 echo l
317 enddef
318 Func()
319 END
320 CheckScriptSuccess(lines)
321
322 lines =<< trim END
323 vim9script
Bram Moolenaar2f8cbc42020-09-16 17:22:59 +0200324 def Func(...l: any)
325 echo l
326 enddef
327 Func(0)
328 END
329 CheckScriptSuccess(lines)
330
331 lines =<< trim END
332 vim9script
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200333 def Func(...l: list<string>)
334 echo l
335 enddef
336 Func(1, 2, 3)
337 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200338 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200339
340 lines =<< trim END
341 vim9script
342 def Func(...l: list<string>)
343 echo l
344 enddef
345 Func('a', 9)
346 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200347 CheckScriptFailure(lines, 'E1013: Argument 2: type mismatch')
Bram Moolenaar24aa48b2020-07-25 16:33:02 +0200348
349 lines =<< trim END
350 vim9script
351 def Func(...l: list<string>)
352 echo l
353 enddef
354 Func(1, 'a')
355 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200356 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200357enddef
358
Bram Moolenaar575f24b2020-08-12 14:21:11 +0200359def Test_call_call()
360 let l = [3, 2, 1]
361 call('reverse', [l])
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200362 l->assert_equal([1, 2, 3])
Bram Moolenaar575f24b2020-08-12 14:21:11 +0200363enddef
364
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200365let s:value = ''
366
367def FuncOneDefArg(opt = 'text')
368 s:value = opt
369enddef
370
371def FuncTwoDefArg(nr = 123, opt = 'text'): string
372 return nr .. opt
373enddef
374
375def FuncVarargs(...arg: list<string>): string
376 return join(arg, ',')
377enddef
378
379def Test_func_type_varargs()
380 let RefDefArg: func(?string)
381 RefDefArg = FuncOneDefArg
382 RefDefArg()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200383 s:value->assert_equal('text')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200384 RefDefArg('some')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200385 s:value->assert_equal('some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200386
387 let RefDef2Arg: func(?number, ?string): string
388 RefDef2Arg = FuncTwoDefArg
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200389 RefDef2Arg()->assert_equal('123text')
390 RefDef2Arg(99)->assert_equal('99text')
391 RefDef2Arg(77, 'some')->assert_equal('77some')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200392
Bram Moolenaard2c61702020-09-06 15:58:36 +0200393 CheckDefFailure(['let RefWrong: func(string?)'], 'E1010:')
394 CheckDefFailure(['let RefWrong: func(?string, string)'], 'E1007:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200395
396 let RefVarargs: func(...list<string>): string
397 RefVarargs = FuncVarargs
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200398 RefVarargs()->assert_equal('')
399 RefVarargs('one')->assert_equal('one')
400 RefVarargs('one', 'two')->assert_equal('one,two')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200401
Bram Moolenaard2c61702020-09-06 15:58:36 +0200402 CheckDefFailure(['let RefWrong: func(...list<string>, string)'], 'E110:')
403 CheckDefFailure(['let RefWrong: func(...list<string>, ?string)'], 'E110:')
Bram Moolenaar1378fbc2020-04-11 20:50:33 +0200404enddef
405
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200406" Only varargs
407def MyVarargsOnly(...args: list<string>): string
408 return join(args, ',')
409enddef
410
411def Test_call_varargs_only()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200412 MyVarargsOnly()->assert_equal('')
413 MyVarargsOnly('one')->assert_equal('one')
414 MyVarargsOnly('one', 'two')->assert_equal('one,two')
Bram Moolenaar77072282020-09-16 17:55:40 +0200415 CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: Argument 1: type mismatch, expected string but got number')
416 CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number')
Bram Moolenaar0b76b422020-04-07 22:05:08 +0200417enddef
418
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200419def Test_using_var_as_arg()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200420 writefile(['def Func(x: number)', 'let x = 234', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200421 assert_fails('so Xdef', 'E1006:', '', 1, 'Func')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200422 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200423enddef
424
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200425def DictArg(arg: dict<string>)
426 arg['key'] = 'value'
427enddef
428
429def ListArg(arg: list<string>)
430 arg[0] = 'value'
431enddef
432
433def Test_assign_to_argument()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200434 # works for dict and list
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200435 let d: dict<string> = {}
436 DictArg(d)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200437 d['key']->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200438 let l: list<string> = []
439 ListArg(l)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200440 l[0]->assert_equal('value')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200441
Bram Moolenaard2c61702020-09-06 15:58:36 +0200442 CheckScriptFailure(['def Func(arg: number)', 'arg = 3', 'enddef', 'defcompile'], 'E1090:')
Bram Moolenaarcb2bdb12020-05-10 22:53:56 +0200443enddef
444
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200445def Test_call_func_defined_later()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200446 g:DefinedLater('one')->assert_equal('one')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200447 assert_fails('NotDefined("one")', 'E117:', '', 2, 'Test_call_func_defined_later')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200448enddef
449
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200450func DefinedLater(arg)
451 return a:arg
452endfunc
453
454def Test_call_funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200455 g:SomeFunc('abc')->assert_equal(3)
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200456 assert_fails('NotAFunc()', 'E117:', '', 2, 'Test_call_funcref') # comment after call
457 assert_fails('g:NotAFunc()', 'E117:', '', 3, 'Test_call_funcref')
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200458
459 let lines =<< trim END
460 vim9script
461 def RetNumber(): number
462 return 123
463 enddef
464 let Funcref: func: number = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200465 Funcref()->assert_equal(123)
Bram Moolenaar2f1980f2020-07-22 19:30:06 +0200466 END
467 CheckScriptSuccess(lines)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200468
469 lines =<< trim END
470 vim9script
471 def RetNumber(): number
472 return 123
473 enddef
474 def Bar(F: func: number): number
475 return F()
476 enddef
477 let Funcref = function('RetNumber')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200478 Bar(Funcref)->assert_equal(123)
Bram Moolenaar0f60e802020-07-22 20:16:11 +0200479 END
480 CheckScriptSuccess(lines)
Bram Moolenaarbfba8652020-07-23 20:09:10 +0200481
482 lines =<< trim END
483 vim9script
484 def UseNumber(nr: number)
485 echo nr
486 enddef
487 let Funcref: func(number) = function('UseNumber')
488 Funcref(123)
489 END
490 CheckScriptSuccess(lines)
Bram Moolenaarb8070e32020-07-23 20:56:04 +0200491
492 lines =<< trim END
493 vim9script
494 def UseNumber(nr: number)
495 echo nr
496 enddef
497 let Funcref: func(string) = function('UseNumber')
498 END
Bram Moolenaar5e654232020-09-16 15:22:00 +0200499 CheckScriptFailure(lines, 'E1012: Type mismatch; expected func(string) but got func(number)')
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200500
501 lines =<< trim END
502 vim9script
503 def EchoNr(nr = 34)
504 g:echo = nr
505 enddef
506 let Funcref: func(?number) = function('EchoNr')
507 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200508 g:echo->assert_equal(34)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200509 Funcref(123)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200510 g:echo->assert_equal(123)
Bram Moolenaar4fc224c2020-07-26 17:56:25 +0200511 END
512 CheckScriptSuccess(lines)
Bram Moolenaarace61322020-07-26 18:16:58 +0200513
514 lines =<< trim END
515 vim9script
516 def EchoList(...l: list<number>)
517 g:echo = l
518 enddef
519 let Funcref: func(...list<number>) = function('EchoList')
520 Funcref()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200521 g:echo->assert_equal([])
Bram Moolenaarace61322020-07-26 18:16:58 +0200522 Funcref(1, 2, 3)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200523 g:echo->assert_equal([1, 2, 3])
Bram Moolenaarace61322020-07-26 18:16:58 +0200524 END
525 CheckScriptSuccess(lines)
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200526
527 lines =<< trim END
528 vim9script
529 def OptAndVar(nr: number, opt = 12, ...l: list<number>): number
530 g:optarg = opt
531 g:listarg = l
532 return nr
533 enddef
534 let Funcref: func(number, ?number, ...list<number>): number = function('OptAndVar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200535 Funcref(10)->assert_equal(10)
536 g:optarg->assert_equal(12)
537 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200538
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200539 Funcref(11, 22)->assert_equal(11)
540 g:optarg->assert_equal(22)
541 g:listarg->assert_equal([])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200542
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200543 Funcref(17, 18, 1, 2, 3)->assert_equal(17)
544 g:optarg->assert_equal(18)
545 g:listarg->assert_equal([1, 2, 3])
Bram Moolenaar01865ad2020-07-26 18:33:09 +0200546 END
547 CheckScriptSuccess(lines)
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200548enddef
549
550let SomeFunc = function('len')
551let NotAFunc = 'text'
552
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200553def CombineFuncrefTypes()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200554 # same arguments, different return type
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200555 let Ref1: func(bool): string
556 let Ref2: func(bool): number
557 let Ref3: func(bool): any
558 Ref3 = g:cond ? Ref1 : Ref2
559
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200560 # different number of arguments
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200561 let Refa1: func(bool): number
562 let Refa2: func(bool, number): number
563 let Refa3: func: number
564 Refa3 = g:cond ? Refa1 : Refa2
565
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200566 # different argument types
Bram Moolenaar99aaf0c2020-04-12 14:39:53 +0200567 let Refb1: func(bool, string): number
568 let Refb2: func(string, number): number
569 let Refb3: func(any, any): number
570 Refb3 = g:cond ? Refb1 : Refb2
571enddef
572
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200573def FuncWithForwardCall()
Bram Moolenaar1df8b3f2020-04-23 18:13:23 +0200574 return g:DefinedEvenLater("yes")
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200575enddef
576
577def DefinedEvenLater(arg: string): string
578 return arg
579enddef
580
581def Test_error_in_nested_function()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200582 # Error in called function requires unwinding the call stack.
Bram Moolenaar44d66522020-09-06 22:26:57 +0200583 assert_fails('FuncWithForwardCall()', 'E1096:', '', 1, 'FuncWithForwardCall')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200584enddef
585
586def Test_return_type_wrong()
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200587 CheckScriptFailure([
588 'def Func(): number',
589 'return "a"',
590 'enddef',
591 'defcompile'], 'expected number but got string')
592 CheckScriptFailure([
593 'def Func(): string',
594 'return 1',
595 'enddef',
596 'defcompile'], 'expected string but got number')
597 CheckScriptFailure([
598 'def Func(): void',
599 'return "a"',
600 'enddef',
601 'defcompile'],
602 'E1096: Returning a value in a function without a return type')
603 CheckScriptFailure([
604 'def Func()',
605 'return "a"',
606 'enddef',
607 'defcompile'],
608 'E1096: Returning a value in a function without a return type')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200609
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200610 CheckScriptFailure([
611 'def Func(): number',
612 'return',
613 'enddef',
614 'defcompile'], 'E1003:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200615
616 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
617 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200618 CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
Bram Moolenaar5a849da2020-08-08 16:47:30 +0200619
620 CheckScriptFailure([
621 'vim9script',
622 'def FuncB()',
623 ' return 123',
624 'enddef',
625 'def FuncA()',
626 ' FuncB()',
627 'enddef',
628 'defcompile'], 'E1096:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200629enddef
630
631def Test_arg_type_wrong()
632 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200633 CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200634 CheckScriptFailure(['def Func5(items:string)', 'echo "a"'], 'E1069:')
Bram Moolenaar6e949782020-04-13 17:21:00 +0200635 CheckScriptFailure(['def Func5(items)', 'echo "a"'], 'E1077:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200636enddef
637
638def Test_vim9script_call()
639 let lines =<< trim END
640 vim9script
641 let var = ''
642 def MyFunc(arg: string)
643 var = arg
644 enddef
645 MyFunc('foobar')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200646 var->assert_equal('foobar')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200647
648 let str = 'barfoo'
649 str->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200650 var->assert_equal('barfoo')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200651
Bram Moolenaar67979662020-06-20 22:50:47 +0200652 g:value = 'value'
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200653 g:value->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200654 var->assert_equal('value')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200655
656 let listvar = []
657 def ListFunc(arg: list<number>)
658 listvar = arg
659 enddef
660 [1, 2, 3]->ListFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200661 listvar->assert_equal([1, 2, 3])
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200662
663 let dictvar = {}
664 def DictFunc(arg: dict<number>)
665 dictvar = arg
666 enddef
667 {'a': 1, 'b': 2}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200668 dictvar->assert_equal(#{a: 1, b: 2})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200669 def CompiledDict()
670 {'a': 3, 'b': 4}->DictFunc()
671 enddef
672 CompiledDict()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200673 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200674
675 #{a: 3, b: 4}->DictFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200676 dictvar->assert_equal(#{a: 3, b: 4})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200677
678 ('text')->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200679 var->assert_equal('text')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200680 ("some")->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200681 var->assert_equal('some')
Bram Moolenaare6b53242020-07-01 17:28:33 +0200682
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200683 # line starting with single quote is not a mark
Bram Moolenaar10409562020-07-29 20:00:38 +0200684 # line starting with double quote can be a method call
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200685 'asdfasdf'->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200686 var->assert_equal('asdfasdf')
Bram Moolenaar10409562020-07-29 20:00:38 +0200687 "xyz"->MyFunc()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200688 var->assert_equal('xyz')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200689
690 def UseString()
691 'xyork'->MyFunc()
692 enddef
693 UseString()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200694 var->assert_equal('xyork')
Bram Moolenaar3d48e252020-07-15 14:15:52 +0200695
Bram Moolenaar10409562020-07-29 20:00:38 +0200696 def UseString2()
697 "knife"->MyFunc()
698 enddef
699 UseString2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200700 var->assert_equal('knife')
Bram Moolenaar10409562020-07-29 20:00:38 +0200701
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200702 # prepending a colon makes it a mark
703 new
704 setline(1, ['aaa', 'bbb', 'ccc'])
705 normal! 3Gmt1G
706 :'t
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200707 getcurpos()[1]->assert_equal(3)
Bram Moolenaar13e12b82020-07-24 18:47:22 +0200708 bwipe!
709
Bram Moolenaare6b53242020-07-01 17:28:33 +0200710 MyFunc(
711 'continued'
712 )
713 assert_equal('continued',
714 var
715 )
716
717 call MyFunc(
718 'more'
719 ..
720 'lines'
721 )
722 assert_equal(
723 'morelines',
724 var)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200725 END
726 writefile(lines, 'Xcall.vim')
727 source Xcall.vim
728 delete('Xcall.vim')
729enddef
730
731def Test_vim9script_call_fail_decl()
732 let lines =<< trim END
733 vim9script
734 let var = ''
735 def MyFunc(arg: string)
736 let var = 123
737 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200738 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200739 END
Bram Moolenaar6c4bfe42020-07-23 18:26:30 +0200740 CheckScriptFailure(lines, 'E1054:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200741enddef
742
Bram Moolenaar65b95452020-07-19 14:03:09 +0200743def Test_vim9script_call_fail_type()
744 let lines =<< trim END
745 vim9script
746 def MyFunc(arg: string)
747 echo arg
748 enddef
749 MyFunc(1234)
750 END
Bram Moolenaar77072282020-09-16 17:55:40 +0200751 CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected string but got number')
Bram Moolenaar65b95452020-07-19 14:03:09 +0200752enddef
753
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200754def Test_vim9script_call_fail_const()
755 let lines =<< trim END
756 vim9script
757 const var = ''
758 def MyFunc(arg: string)
759 var = 'asdf'
760 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200761 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200762 END
763 writefile(lines, 'Xcall_const.vim')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200764 assert_fails('source Xcall_const.vim', 'E46:', '', 1, 'MyFunc')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200765 delete('Xcall_const.vim')
766enddef
767
768" Test that inside :function a Python function can be defined, :def is not
769" recognized.
770func Test_function_python()
771 CheckFeature python3
772 let py = 'python3'
773 execute py "<< EOF"
774def do_something():
775 return 1
776EOF
777endfunc
778
779def Test_delfunc()
780 let lines =<< trim END
781 vim9script
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200782 def g:GoneSoon()
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200783 echo 'hello'
784 enddef
785
786 def CallGoneSoon()
787 GoneSoon()
788 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200789 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200790
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200791 delfunc g:GoneSoon
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200792 CallGoneSoon()
793 END
794 writefile(lines, 'XToDelFunc')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200795 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
796 assert_fails('so XToDelFunc', 'E933:', '', 1, 'CallGoneSoon')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200797
798 delete('XToDelFunc')
799enddef
800
801def Test_redef_failure()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200802 writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200803 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200804 writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200805 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200806 writefile(['def! Func0(): string', 'enddef', 'defcompile'], 'Xdef')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200807 assert_fails('so Xdef', 'E1027:', '', 1, 'Func0')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200808 writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200809 so Xdef
Bram Moolenaard2c61702020-09-06 15:58:36 +0200810 delete('Xdef')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200811
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200812 g:Func0()->assert_equal(0)
813 g:Func1()->assert_equal('Func1')
814 g:Func2()->assert_equal('Func2')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200815
816 delfunc! Func0
817 delfunc! Func1
818 delfunc! Func2
819enddef
820
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +0200821def Test_vim9script_func()
822 let lines =<< trim END
823 vim9script
824 func Func(arg)
825 echo a:arg
826 endfunc
827 Func('text')
828 END
829 writefile(lines, 'XVim9Func')
830 so XVim9Func
831
832 delete('XVim9Func')
833enddef
834
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200835" Test for internal functions returning different types
836func Test_InternalFuncRetType()
837 let lines =<< trim END
838 def RetFloat(): float
839 return ceil(1.456)
840 enddef
841
842 def RetListAny(): list<any>
Bram Moolenaar17a836c2020-08-12 17:35:58 +0200843 return items({'k': 'v'})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200844 enddef
845
846 def RetListString(): list<string>
847 return split('a:b:c', ':')
848 enddef
849
850 def RetListDictAny(): list<dict<any>>
851 return getbufinfo()
852 enddef
853
854 def RetDictNumber(): dict<number>
855 return wordcount()
856 enddef
857
858 def RetDictString(): dict<string>
859 return environ()
860 enddef
861 END
862 call writefile(lines, 'Xscript')
863 source Xscript
864
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200865 call RetFloat()->assert_equal(2.0)
866 call RetListAny()->assert_equal([['k', 'v']])
867 call RetListString()->assert_equal(['a', 'b', 'c'])
868 call RetListDictAny()->assert_notequal([])
869 call RetDictNumber()->assert_notequal({})
870 call RetDictString()->assert_notequal({})
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200871 call delete('Xscript')
872endfunc
873
874" Test for passing too many or too few arguments to internal functions
875func Test_internalfunc_arg_error()
876 let l =<< trim END
877 def! FArgErr(): float
878 return ceil(1.1, 2)
879 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200880 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200881 END
882 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200883 call assert_fails('so Xinvalidarg', 'E118:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200884 let l =<< trim END
885 def! FArgErr(): float
886 return ceil()
887 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200888 defcompile
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200889 END
890 call writefile(l, 'Xinvalidarg')
Bram Moolenaar9bd5d872020-09-06 21:47:48 +0200891 call assert_fails('so Xinvalidarg', 'E119:', '', 1, 'FArgErr')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200892 call delete('Xinvalidarg')
893endfunc
894
895let s:funcResult = 0
896
897def FuncNoArgNoRet()
Bram Moolenaar53900992020-08-22 19:02:02 +0200898 s:funcResult = 11
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200899enddef
900
901def FuncNoArgRetNumber(): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200902 s:funcResult = 22
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200903 return 1234
904enddef
905
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200906def FuncNoArgRetString(): string
Bram Moolenaar53900992020-08-22 19:02:02 +0200907 s:funcResult = 45
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200908 return 'text'
909enddef
910
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200911def FuncOneArgNoRet(arg: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200912 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200913enddef
914
915def FuncOneArgRetNumber(arg: number): number
Bram Moolenaar53900992020-08-22 19:02:02 +0200916 s:funcResult = arg
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200917 return arg
918enddef
919
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200920def FuncTwoArgNoRet(one: bool, two: number)
Bram Moolenaar53900992020-08-22 19:02:02 +0200921 s:funcResult = two
Bram Moolenaar08938ee2020-04-11 23:17:17 +0200922enddef
923
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200924def FuncOneArgRetString(arg: string): string
925 return arg
926enddef
927
Bram Moolenaar89228602020-04-05 22:14:54 +0200928def FuncOneArgRetAny(arg: any): any
929 return arg
930enddef
931
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200932def Test_func_type()
933 let Ref1: func()
Bram Moolenaar53900992020-08-22 19:02:02 +0200934 s:funcResult = 0
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200935 Ref1 = FuncNoArgNoRet
936 Ref1()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200937 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200938
939 let Ref2: func
Bram Moolenaar53900992020-08-22 19:02:02 +0200940 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200941 Ref2 = FuncNoArgNoRet
942 Ref2()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200943 s:funcResult->assert_equal(11)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200944
Bram Moolenaar53900992020-08-22 19:02:02 +0200945 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200946 Ref2 = FuncOneArgNoRet
947 Ref2(12)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200948 s:funcResult->assert_equal(12)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200949
Bram Moolenaar53900992020-08-22 19:02:02 +0200950 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200951 Ref2 = FuncNoArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200952 Ref2()->assert_equal(1234)
953 s:funcResult->assert_equal(22)
Bram Moolenaar4c683752020-04-05 21:38:23 +0200954
Bram Moolenaar53900992020-08-22 19:02:02 +0200955 s:funcResult = 0
Bram Moolenaar4c683752020-04-05 21:38:23 +0200956 Ref2 = FuncOneArgRetNumber
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200957 Ref2(13)->assert_equal(13)
958 s:funcResult->assert_equal(13)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200959enddef
960
Bram Moolenaar9978d472020-07-05 16:01:56 +0200961def Test_repeat_return_type()
962 let res = 0
963 for n in repeat([1], 3)
964 res += n
965 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200966 res->assert_equal(3)
Bram Moolenaarfce82b32020-07-05 16:07:21 +0200967
968 res = 0
969 for n in add([1, 2], 3)
970 res += n
971 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200972 res->assert_equal(6)
Bram Moolenaar9978d472020-07-05 16:01:56 +0200973enddef
974
Bram Moolenaar846178a2020-07-05 17:04:13 +0200975def Test_argv_return_type()
976 next fileone filetwo
977 let res = ''
978 for name in argv()
979 res ..= name
980 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +0200981 res->assert_equal('fileonefiletwo')
Bram Moolenaar846178a2020-07-05 17:04:13 +0200982enddef
983
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200984def Test_func_type_part()
985 let RefVoid: func: void
986 RefVoid = FuncNoArgNoRet
987 RefVoid = FuncOneArgNoRet
Bram Moolenaar5e654232020-09-16 15:22:00 +0200988 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...) but got func(): number')
989 CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...) but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200990
991 let RefAny: func(): any
992 RefAny = FuncNoArgRetNumber
993 RefAny = FuncNoArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +0200994 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func()')
995 CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func(): any but got func(number)')
Bram Moolenaarec5929d2020-04-07 20:53:39 +0200996
997 let RefNr: func: number
998 RefNr = FuncNoArgRetNumber
999 RefNr = FuncOneArgRetNumber
Bram Moolenaar5e654232020-09-16 15:22:00 +02001000 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): number but got func()')
1001 CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1012: Type mismatch; expected func(...): number but got func(): string')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001002
1003 let RefStr: func: string
1004 RefStr = FuncNoArgRetString
1005 RefStr = FuncOneArgRetString
Bram Moolenaar5e654232020-09-16 15:22:00 +02001006 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1012: Type mismatch; expected func(...): string but got func()')
1007 CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func(...): string but got func(): number')
Bram Moolenaarec5929d2020-04-07 20:53:39 +02001008enddef
1009
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001010def Test_func_type_fails()
1011 CheckDefFailure(['let ref1: func()'], 'E704:')
1012
Bram Moolenaar5e654232020-09-16 15:22:00 +02001013 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(): number')
1014 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1012: Type mismatch; expected func() but got func(number)')
1015 CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1012: Type mismatch; expected func() but got func(number): number')
1016 CheckDefFailure(['let Ref1: func(bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(bool) but got func(bool, number)')
1017 CheckDefFailure(['let Ref1: func(?bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(?bool) but got func(bool, number)')
1018 CheckDefFailure(['let Ref1: func(...bool)', 'Ref1 = FuncTwoArgNoRet'], 'E1012: Type mismatch; expected func(...bool) but got func(bool, number)')
Bram Moolenaar08938ee2020-04-11 23:17:17 +02001019
Bram Moolenaard2c61702020-09-06 15:58:36 +02001020 CheckDefFailure(['let RefWrong: func(string ,number)'], 'E1068:')
1021 CheckDefFailure(['let RefWrong: func(string,number)'], 'E1069:')
1022 CheckDefFailure(['let RefWrong: func(bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool)'], 'E1005:')
1023 CheckDefFailure(['let RefWrong: func(bool):string'], 'E1069:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001024enddef
1025
Bram Moolenaar89228602020-04-05 22:14:54 +02001026def Test_func_return_type()
1027 let nr: number
1028 nr = FuncNoArgRetNumber()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001029 nr->assert_equal(1234)
Bram Moolenaar89228602020-04-05 22:14:54 +02001030
1031 nr = FuncOneArgRetAny(122)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001032 nr->assert_equal(122)
Bram Moolenaar89228602020-04-05 22:14:54 +02001033
1034 let str: string
1035 str = FuncOneArgRetAny('yes')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001036 str->assert_equal('yes')
Bram Moolenaar89228602020-04-05 22:14:54 +02001037
Bram Moolenaar5e654232020-09-16 15:22:00 +02001038 CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1012: Type mismatch; expected string but got number')
Bram Moolenaar89228602020-04-05 22:14:54 +02001039enddef
1040
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001041def MultiLine(
1042 arg1: string,
1043 arg2 = 1234,
1044 ...rest: list<string>
1045 ): string
1046 return arg1 .. arg2 .. join(rest, '-')
1047enddef
1048
Bram Moolenaar2c330432020-04-13 14:41:35 +02001049def MultiLineComment(
1050 arg1: string, # comment
1051 arg2 = 1234, # comment
1052 ...rest: list<string> # comment
1053 ): string # comment
1054 return arg1 .. arg2 .. join(rest, '-')
1055enddef
1056
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001057def Test_multiline()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001058 MultiLine('text')->assert_equal('text1234')
1059 MultiLine('text', 777)->assert_equal('text777')
1060 MultiLine('text', 777, 'one')->assert_equal('text777one')
1061 MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001062enddef
1063
Bram Moolenaar23e03252020-04-12 22:22:31 +02001064func Test_multiline_not_vim9()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001065 call MultiLine('text')->assert_equal('text1234')
1066 call MultiLine('text', 777)->assert_equal('text777')
1067 call MultiLine('text', 777, 'one')->assert_equal('text777one')
1068 call MultiLine('text', 777, 'one', 'two')->assert_equal('text777one-two')
Bram Moolenaar23e03252020-04-12 22:22:31 +02001069endfunc
1070
Bram Moolenaar5e774c72020-04-12 21:53:00 +02001071
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001072" When using CheckScriptFailure() for the below test, E1010 is generated instead
1073" of E1056.
1074func Test_E1056_1059()
1075 let caught_1056 = 0
1076 try
1077 def F():
1078 return 1
1079 enddef
1080 catch /E1056:/
1081 let caught_1056 = 1
1082 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001083 eval caught_1056->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001084
1085 let caught_1059 = 0
1086 try
1087 def F5(items : list)
1088 echo 'a'
1089 enddef
1090 catch /E1059:/
1091 let caught_1059 = 1
1092 endtry
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001093 eval caught_1059->assert_equal(1)
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001094endfunc
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001095
Bram Moolenaar015f4262020-05-05 21:25:22 +02001096func DelMe()
1097 echo 'DelMe'
1098endfunc
1099
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001100def Test_error_reporting()
1101 # comment lines at the start of the function
1102 let lines =<< trim END
1103 " comment
1104 def Func()
1105 # comment
1106 # comment
1107 invalid
1108 enddef
1109 defcompile
1110 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001111 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001112 try
1113 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001114 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001115 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001116 v:exception->assert_match('Invalid command: invalid')
1117 v:throwpoint->assert_match(', line 3$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001118 endtry
1119
1120 # comment lines after the start of the function
1121 lines =<< trim END
1122 " comment
1123 def Func()
1124 let x = 1234
1125 # comment
1126 # comment
1127 invalid
1128 enddef
1129 defcompile
1130 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001131 writefile(lines, 'Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001132 try
1133 source Xdef
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001134 assert_report('should have failed')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001135 catch /E476:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001136 v:exception->assert_match('Invalid command: invalid')
1137 v:throwpoint->assert_match(', line 4$')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001138 endtry
1139
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001140 lines =<< trim END
1141 vim9script
1142 def Func()
1143 let db = #{foo: 1, bar: 2}
1144 # comment
1145 let x = db.asdf
1146 enddef
1147 defcompile
1148 Func()
1149 END
Bram Moolenaar08052222020-09-14 17:04:31 +02001150 writefile(lines, 'Xdef')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001151 try
1152 source Xdef
1153 assert_report('should have failed')
1154 catch /E716:/
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001155 v:throwpoint->assert_match('_Func, line 3$')
Bram Moolenaar7517ffd2020-08-14 18:35:07 +02001156 endtry
1157
Bram Moolenaar08052222020-09-14 17:04:31 +02001158 delete('Xdef')
Bram Moolenaarbf8feb52020-08-08 14:26:31 +02001159enddef
1160
Bram Moolenaar015f4262020-05-05 21:25:22 +02001161def Test_deleted_function()
1162 CheckDefExecFailure([
1163 'let RefMe: func = function("g:DelMe")',
1164 'delfunc g:DelMe',
1165 'echo RefMe()'], 'E117:')
1166enddef
1167
1168def Test_unknown_function()
1169 CheckDefExecFailure([
1170 'let Ref: func = function("NotExist")',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001171 'delfunc g:NotExist'], 'E700:')
Bram Moolenaar015f4262020-05-05 21:25:22 +02001172enddef
1173
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001174def RefFunc(Ref: func(string): string): string
1175 return Ref('more')
1176enddef
1177
1178def Test_closure_simple()
1179 let local = 'some '
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001180 RefFunc({s -> local .. s})->assert_equal('some more')
Bram Moolenaarc8cd2b32020-05-01 19:29:08 +02001181enddef
1182
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001183def MakeRef()
1184 let local = 'some '
1185 g:Ref = {s -> local .. s}
1186enddef
1187
1188def Test_closure_ref_after_return()
1189 MakeRef()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001190 g:Ref('thing')->assert_equal('some thing')
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001191 unlet g:Ref
1192enddef
1193
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001194def MakeTwoRefs()
1195 let local = ['some']
1196 g:Extend = {s -> local->add(s)}
1197 g:Read = {-> local}
1198enddef
1199
1200def Test_closure_two_refs()
1201 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001202 join(g:Read(), ' ')->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001203 g:Extend('more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001204 join(g:Read(), ' ')->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001205 g:Extend('even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001206 join(g:Read(), ' ')->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001207
1208 unlet g:Extend
1209 unlet g:Read
1210enddef
1211
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001212def ReadRef(Ref: func(): list<string>): string
1213 return join(Ref(), ' ')
1214enddef
1215
Bram Moolenaar5e654232020-09-16 15:22:00 +02001216def ExtendRef(Ref: func(string): list<string>, add: string)
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001217 Ref(add)
1218enddef
1219
1220def Test_closure_two_indirect_refs()
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001221 MakeTwoRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001222 ReadRef(g:Read)->assert_equal('some')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001223 ExtendRef(g:Extend, 'more')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001224 ReadRef(g:Read)->assert_equal('some more')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001225 ExtendRef(g:Extend, 'even')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001226 ReadRef(g:Read)->assert_equal('some more even')
Bram Moolenaar5adc55c2020-05-02 23:12:58 +02001227
1228 unlet g:Extend
1229 unlet g:Read
1230enddef
Bram Moolenaarbf67ea12020-05-02 17:52:42 +02001231
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001232def MakeArgRefs(theArg: string)
1233 let local = 'loc_val'
1234 g:UseArg = {s -> theArg .. '/' .. local .. '/' .. s}
1235enddef
1236
1237def MakeArgRefsVarargs(theArg: string, ...rest: list<string>)
1238 let local = 'the_loc'
1239 g:UseVararg = {s -> theArg .. '/' .. local .. '/' .. s .. '/' .. join(rest)}
1240enddef
1241
1242def Test_closure_using_argument()
1243 MakeArgRefs('arg_val')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001244 g:UseArg('call_val')->assert_equal('arg_val/loc_val/call_val')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001245
1246 MakeArgRefsVarargs('arg_val', 'one', 'two')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001247 g:UseVararg('call_val')->assert_equal('arg_val/the_loc/call_val/one two')
Bram Moolenaar2fd4cd72020-05-03 22:30:49 +02001248
1249 unlet g:UseArg
1250 unlet g:UseVararg
1251enddef
1252
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001253def MakeGetAndAppendRefs()
1254 let local = 'a'
1255
1256 def Append(arg: string)
1257 local ..= arg
1258 enddef
1259 g:Append = Append
1260
1261 def Get(): string
1262 return local
1263 enddef
1264 g:Get = Get
1265enddef
1266
1267def Test_closure_append_get()
1268 MakeGetAndAppendRefs()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001269 g:Get()->assert_equal('a')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001270 g:Append('-b')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001271 g:Get()->assert_equal('a-b')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001272 g:Append('-c')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001273 g:Get()->assert_equal('a-b-c')
Bram Moolenaarb68b3462020-05-06 21:06:30 +02001274
1275 unlet g:Append
1276 unlet g:Get
1277enddef
1278
Bram Moolenaar04b12692020-05-04 23:24:44 +02001279def Test_nested_closure()
1280 let local = 'text'
1281 def Closure(arg: string): string
1282 return local .. arg
1283 enddef
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001284 Closure('!!!')->assert_equal('text!!!')
Bram Moolenaar04b12692020-05-04 23:24:44 +02001285enddef
1286
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001287func GetResult(Ref)
1288 return a:Ref('some')
1289endfunc
1290
1291def Test_call_closure_not_compiled()
1292 let text = 'text'
1293 g:Ref = {s -> s .. text}
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001294 GetResult(g:Ref)->assert_equal('sometext')
Bram Moolenaar6f5b6df2020-05-16 21:20:12 +02001295enddef
1296
Bram Moolenaar7cbfaa52020-09-18 21:25:32 +02001297def Test_double_closure_fails()
1298 let lines =<< trim END
1299 vim9script
1300 def Func()
1301 let var = 0
1302 for i in range(2)
1303 timer_start(0, {-> var})
1304 endfor
1305 enddef
1306 Func()
1307 END
1308 CheckScriptFailure(lines, 'Multiple closures not supported yet')
1309enddef
1310
Bram Moolenaar865af6b2020-06-18 18:45:49 +02001311def Test_sort_return_type()
1312 let res: list<number>
1313 res = [1, 2, 3]->sort()
1314enddef
1315
Bram Moolenaar08e51f42020-09-16 23:23:36 +02001316def Test_sort_argument()
1317 let res = ['b', 'a', 'c']->sort('i')
1318 res->assert_equal(['a', 'b', 'c'])
1319enddef
1320
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001321def Test_getqflist_return_type()
1322 let l = getqflist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001323 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001324
1325 let d = getqflist(#{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001326 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001327enddef
1328
1329def Test_getloclist_return_type()
1330 let l = getloclist(1)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001331 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001332
1333 let d = getloclist(1, #{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001334 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001335enddef
1336
Bram Moolenaara66ba012020-07-05 18:41:08 +02001337def Test_copy_return_type()
1338 let l = copy([1, 2, 3])
1339 let res = 0
1340 for n in l
1341 res += n
1342 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001343 res->assert_equal(6)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001344
1345 let dl = deepcopy([1, 2, 3])
1346 res = 0
1347 for n in dl
1348 res += n
1349 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001350 res->assert_equal(6)
Bram Moolenaar44b4a242020-09-05 17:18:28 +02001351
1352 dl = deepcopy([1, 2, 3], true)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001353enddef
1354
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001355def Test_extend_return_type()
1356 let l = extend([1, 2], [3])
1357 let res = 0
1358 for n in l
1359 res += n
1360 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001361 res->assert_equal(6)
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001362enddef
1363
Bram Moolenaar2df47312020-09-05 17:30:44 +02001364def Test_garbagecollect()
1365 garbagecollect(true)
1366enddef
1367
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001368def Test_insert_return_type()
1369 let l = insert([2, 1], 3)
1370 let res = 0
1371 for n in l
1372 res += n
1373 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001374 res->assert_equal(6)
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001375enddef
1376
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001377def Test_keys_return_type()
1378 const var: list<string> = #{a: 1, b: 2}->keys()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001379 var->assert_equal(['a', 'b'])
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001380enddef
1381
Bram Moolenaar67627352020-07-05 21:10:24 +02001382def Test_reverse_return_type()
1383 let l = reverse([1, 2, 3])
1384 let res = 0
1385 for n in l
1386 res += n
1387 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001388 res->assert_equal(6)
Bram Moolenaar67627352020-07-05 21:10:24 +02001389enddef
1390
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001391def Test_remove_return_type()
1392 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1393 let res = 0
1394 for n in l
1395 res += n
1396 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001397 res->assert_equal(3)
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001398enddef
1399
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001400def Test_filter_return_type()
1401 let l = filter([1, 2, 3], {-> 1})
1402 let res = 0
1403 for n in l
1404 res += n
1405 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001406 res->assert_equal(6)
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001407enddef
1408
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001409def Test_bufnr()
1410 let buf = bufnr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001411 bufnr('%')->assert_equal(buf)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001412
1413 buf = bufnr('Xdummy', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001414 buf->assert_notequal(-1)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001415 exe 'bwipe! ' .. buf
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001416enddef
1417
Bram Moolenaarec65d772020-08-20 22:29:12 +02001418def Test_col()
1419 new
1420 setline(1, 'asdf')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001421 col([1, '$'])->assert_equal(5)
Bram Moolenaarec65d772020-08-20 22:29:12 +02001422enddef
1423
Bram Moolenaar24f77502020-09-04 19:50:57 +02001424def Test_char2nr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001425 char2nr('あ', true)->assert_equal(12354)
Bram Moolenaar24f77502020-09-04 19:50:57 +02001426enddef
1427
Bram Moolenaar3d945cc2020-08-06 21:26:59 +02001428def Test_getreg_return_type()
1429 let s1: string = getreg('"')
1430 let s2: string = getreg('"', 1)
1431 let s3: list<string> = getreg('"', 1, 1)
1432enddef
1433
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001434def Wrong_dict_key_type(items: list<number>): list<number>
1435 return filter(items, {_, val -> get({val: 1}, 'x')})
1436enddef
1437
1438def Test_wrong_dict_key_type()
Bram Moolenaar5e654232020-09-16 15:22:00 +02001439 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:')
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001440enddef
1441
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001442def Line_continuation_in_def(dir: string = ''): string
1443 let path: string = empty(dir)
1444 \ ? 'empty'
1445 \ : 'full'
1446 return path
1447enddef
1448
1449def Test_line_continuation_in_def()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001450 Line_continuation_in_def('.')->assert_equal('full')
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001451enddef
1452
Bram Moolenaar5e654232020-09-16 15:22:00 +02001453def Line_continuation_in_lambda(): list<string>
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001454 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001455 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001456 ->toupper()})
1457 ->reverse()
1458 return x
1459enddef
1460
1461def Test_line_continuation_in_lambda()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001462 Line_continuation_in_lambda()->assert_equal(['D', 'C', 'B', 'A'])
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001463enddef
1464
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001465func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001466 CheckScreendump
1467
1468 let lines =<< trim END
1469 vim9script
1470 def EchoNothing()
1471 silent echo ''
1472 enddef
1473 defcompile
1474 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001475 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001476
1477 " Check that the balloon shows up after a mouse move
1478 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001479 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001480 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1481
1482 " clean up
1483 call StopVimInTerminal(buf)
1484 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001485endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001486
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001487""""""" builtin functions that behave differently in Vim9
Bram Moolenaare15eebd2020-08-18 19:11:38 +02001488
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001489def Test_bufname()
1490 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001491 bufname('%')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001492 edit OtherFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001493 bufname('#')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001494 close
Bram Moolenaar191929b2020-08-19 21:20:49 +02001495enddef
1496
Bram Moolenaara5d38412020-09-02 21:02:35 +02001497def Test_bufwinid()
1498 let origwin = win_getid()
1499 below split SomeFile
1500 let SomeFileID = win_getid()
1501 below split OtherFile
1502 below split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001503 bufwinid('SomeFile')->assert_equal(SomeFileID)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001504
1505 win_gotoid(origwin)
1506 only
1507 bwipe SomeFile
1508 bwipe OtherFile
1509enddef
1510
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001511def Test_count()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001512 count('ABC ABC ABC', 'b', true)->assert_equal(3)
1513 count('ABC ABC ABC', 'b', false)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001514enddef
1515
1516def Test_expand()
1517 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001518 expand('%', true, true)->assert_equal(['SomeFile'])
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001519 close
1520enddef
1521
1522def Test_getbufinfo()
1523 let bufinfo = getbufinfo(bufnr())
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001524 getbufinfo('%')->assert_equal(bufinfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001525
1526 edit Xtestfile1
1527 hide edit Xtestfile2
1528 hide enew
1529 getbufinfo(#{bufloaded: true, buflisted: true, bufmodified: false})
1530 ->len()->assert_equal(3)
1531 bwipe Xtestfile1 Xtestfile2
1532enddef
1533
Bram Moolenaara5d38412020-09-02 21:02:35 +02001534def Test_getbufline()
1535 e SomeFile
1536 let buf = bufnr()
1537 e #
1538 let lines = ['aaa', 'bbb', 'ccc']
1539 setbufline(buf, 1, lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001540 getbufline('#', 1, '$')->assert_equal(lines)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001541
1542 bwipe!
1543enddef
1544
1545def Test_getchangelist()
1546 new
1547 setline(1, 'some text')
1548 let changelist = bufnr()->getchangelist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001549 getchangelist('%')->assert_equal(changelist)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001550 bwipe!
1551enddef
1552
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001553def Test_getchar()
Bram Moolenaar636c5d52020-09-05 18:48:57 +02001554 while getchar(0)
1555 endwhile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001556 getchar(true)->assert_equal(0)
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001557enddef
1558
Bram Moolenaard217a872020-09-05 18:31:33 +02001559def Test_getcompletion()
1560 set wildignore=*.vim,*~
1561 let l = getcompletion('run', 'file', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001562 l->assert_equal([])
Bram Moolenaard217a872020-09-05 18:31:33 +02001563 set wildignore&
1564enddef
1565
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001566def Test_getreg()
1567 let lines = ['aaa', 'bbb', 'ccc']
1568 setreg('a', lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001569 getreg('a', true, true)->assert_equal(lines)
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001570enddef
1571
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001572def Test_glob()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001573 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim'])
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001574enddef
1575
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001576def Test_globpath()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001577 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim'])
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001578enddef
1579
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001580def Test_has()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001581 has('eval', true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001582enddef
1583
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001584def Test_hasmapto()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001585 hasmapto('foobar', 'i', true)->assert_equal(0)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001586 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001587 hasmapto('foobar', 'i', true)->assert_equal(1)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001588 iunabbrev foo
1589enddef
1590
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001591def Test_index()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001592 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001593enddef
1594
1595def Test_list2str_str2list_utf8()
1596 let s = "\u3042\u3044"
1597 let l = [0x3042, 0x3044]
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001598 str2list(s, true)->assert_equal(l)
1599 list2str(l, true)->assert_equal(s)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001600enddef
1601
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001602def SID(): number
1603 return expand('<SID>')
1604 ->matchstr('<SNR>\zs\d\+\ze_$')
1605 ->str2nr()
1606enddef
1607
1608def Test_maparg()
1609 let lnum = str2nr(expand('<sflnum>'))
1610 map foo bar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001611 maparg('foo', '', false, true)->assert_equal(#{
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001612 lnum: lnum + 1,
1613 script: 0,
1614 mode: ' ',
1615 silent: 0,
1616 noremap: 0,
1617 lhs: 'foo',
1618 lhsraw: 'foo',
1619 nowait: 0,
1620 expr: 0,
1621 sid: SID(),
1622 rhs: 'bar',
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001623 buffer: 0})
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001624 unmap foo
1625enddef
1626
1627def Test_mapcheck()
1628 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001629 mapcheck('foo', 'i', true)->assert_equal('foobar')
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001630 iunabbrev foo
1631enddef
1632
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001633def Test_nr2char()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001634 nr2char(97, true)->assert_equal('a')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001635enddef
1636
1637def Test_readdir()
1638 eval expand('sautest')->readdir({e -> e[0] !=# '.'})
1639 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
1640enddef
1641
1642def Test_search()
1643 new
1644 setline(1, ['foo', 'bar'])
1645 let val = 0
1646 # skip expr returns boolean
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001647 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001648 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001649 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001650 # skip expr returns number, only 0 and 1 are accepted
1651 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001652 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001653 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001654 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001655 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1656 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1657enddef
1658
1659def Test_searchcount()
1660 new
1661 setline(1, "foo bar")
1662 :/foo
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001663 searchcount(#{recompute: true})
1664 ->assert_equal(#{
1665 exact_match: 1,
1666 current: 1,
1667 total: 1,
1668 maxcount: 99,
1669 incomplete: 0})
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001670 bwipe!
1671enddef
1672
1673def Test_searchdecl()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001674 searchdecl('blah', true, true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001675enddef
1676
1677def Test_setbufvar()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001678 setbufvar(bufnr('%'), '&syntax', 'vim')
1679 &syntax->assert_equal('vim')
1680 setbufvar(bufnr('%'), '&ts', 16)
1681 &ts->assert_equal(16)
1682 settabwinvar(1, 1, '&syntax', 'vam')
1683 &syntax->assert_equal('vam')
1684 settabwinvar(1, 1, '&ts', 15)
1685 &ts->assert_equal(15)
1686 setlocal ts=8
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001687
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001688 setbufvar('%', 'myvar', 123)
1689 getbufvar('%', 'myvar')->assert_equal(123)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001690enddef
1691
Bram Moolenaar401f0c02020-09-05 22:37:39 +02001692def Test_setloclist()
1693 let items = [#{filename: '/tmp/file', lnum: 1, valid: true}]
1694 let what = #{items: items}
1695 setqflist([], ' ', what)
1696 setloclist(0, [], ' ', what)
1697enddef
1698
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001699def Test_setreg()
1700 setreg('a', ['aaa', 'bbb', 'ccc'])
1701 let reginfo = getreginfo('a')
1702 setreg('a', reginfo)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001703 getreginfo('a')->assert_equal(reginfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001704enddef
1705
Bram Moolenaar7c27f332020-09-05 22:45:55 +02001706def Test_spellsuggest()
1707 if !has('spell')
1708 MissingFeature 'spell'
1709 else
1710 spellsuggest('marrch', 1, true)->assert_equal(['March'])
1711 endif
1712enddef
1713
Bram Moolenaar3986b942020-09-06 16:09:04 +02001714def Test_split()
1715 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', ''])
1716enddef
1717
1718def Test_str2nr()
1719 str2nr("1'000'000", 10, true)->assert_equal(1000000)
1720enddef
1721
1722def Test_strchars()
1723 strchars("A\u20dd", true)->assert_equal(1)
1724enddef
1725
Bram Moolenaarad304702020-09-06 18:22:53 +02001726def Test_submatch()
1727 let pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)'
1728 let Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()}
1729 let actual = substitute('A123456789', pat, Rep, '')
1730 let expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]"
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001731 actual->assert_equal(expected)
Bram Moolenaarad304702020-09-06 18:22:53 +02001732enddef
1733
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001734def Test_synID()
1735 new
1736 setline(1, "text")
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001737 synID(1, 1, true)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001738 bwipe!
1739enddef
1740
Bram Moolenaarad304702020-09-06 18:22:53 +02001741def Test_term_gettty()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001742 if !has('terminal')
1743 MissingFeature 'terminal'
1744 else
1745 let buf = Run_shell_in_terminal({})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001746 term_gettty(buf, true)->assert_notequal('')
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001747 StopShellInTerminal(buf)
1748 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001749enddef
1750
1751def Test_term_start()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001752 if !has('terminal')
1753 MissingFeature 'terminal'
1754 else
1755 botright new
1756 let winnr = winnr()
1757 term_start(&shell, #{curwin: true})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001758 winnr()->assert_equal(winnr)
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001759 bwipe!
1760 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001761enddef
1762
Bram Moolenaar418155d2020-09-06 18:39:38 +02001763def Test_timer_paused()
1764 let id = timer_start(50, {-> 0})
1765 timer_pause(id, true)
1766 let info = timer_info(id)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001767 info[0]['paused']->assert_equal(1)
Bram Moolenaar418155d2020-09-06 18:39:38 +02001768 timer_stop(id)
1769enddef
1770
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001771def Test_win_splitmove()
1772 split
1773 win_splitmove(1, 2, #{vertical: true, rightbelow: true})
1774 close
1775enddef
1776
1777""""""" end of builtin functions
1778
1779def Fibonacci(n: number): number
1780 if n < 2
1781 return n
1782 else
1783 return Fibonacci(n - 1) + Fibonacci(n - 2)
1784 endif
1785enddef
1786
Bram Moolenaar985116a2020-07-12 17:31:09 +02001787def Test_recursive_call()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001788 Fibonacci(20)->assert_equal(6765)
Bram Moolenaar985116a2020-07-12 17:31:09 +02001789enddef
1790
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001791def TreeWalk(dir: string): list<any>
1792 return readdir(dir)->map({_, val ->
1793 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaarbb1b5e22020-08-05 10:53:21 +02001794 ? {val: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001795 : val
1796 })
1797enddef
1798
1799def Test_closure_in_map()
1800 mkdir('XclosureDir/tdir', 'p')
1801 writefile(['111'], 'XclosureDir/file1')
1802 writefile(['222'], 'XclosureDir/file2')
1803 writefile(['333'], 'XclosureDir/tdir/file3')
1804
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001805 TreeWalk('XclosureDir')->assert_equal(['file1', 'file2', {'tdir': ['file3']}])
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001806
1807 delete('XclosureDir', 'rf')
1808enddef
1809
Bram Moolenaara90afb92020-07-15 22:38:56 +02001810def Test_partial_call()
1811 let Xsetlist = function('setloclist', [0])
1812 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001813 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001814
1815 Xsetlist = function('setloclist', [0, [], ' '])
1816 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001817 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001818
1819 Xsetlist = function('setqflist')
1820 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001821 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001822
1823 Xsetlist = function('setqflist', [[], ' '])
1824 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001825 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001826enddef
1827
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001828def Test_cmd_modifier()
1829 tab echo '0'
Bram Moolenaard2c61702020-09-06 15:58:36 +02001830 CheckDefFailure(['5tab echo 3'], 'E16:')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001831enddef
1832
1833def Test_restore_modifiers()
1834 # check that when compiling a :def function command modifiers are not messed
1835 # up.
1836 let lines =<< trim END
1837 vim9script
1838 set eventignore=
1839 autocmd QuickFixCmdPost * copen
1840 def AutocmdsDisabled()
1841 eval 0
1842 enddef
1843 func Func()
1844 noautocmd call s:AutocmdsDisabled()
1845 let g:ei_after = &eventignore
1846 endfunc
1847 Func()
1848 END
1849 CheckScriptSuccess(lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001850 g:ei_after->assert_equal('')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001851enddef
1852
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001853def StackTop()
1854 eval 1
1855 eval 2
1856 # call not on fourth line
1857 StackBot()
1858enddef
1859
1860def StackBot()
1861 # throw an error
1862 eval [][0]
1863enddef
1864
1865def Test_callstack_def()
1866 try
1867 StackTop()
1868 catch
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001869 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001870 endtry
1871enddef
1872
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001873
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001874" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker