blob: f3aae7c6caa399cf7a1edbe90ef286a46ee0b4c6 [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 Moolenaar865af6b2020-06-18 18:45:49 +02001297def Test_sort_return_type()
1298 let res: list<number>
1299 res = [1, 2, 3]->sort()
1300enddef
1301
Bram Moolenaar08e51f42020-09-16 23:23:36 +02001302def Test_sort_argument()
1303 let res = ['b', 'a', 'c']->sort('i')
1304 res->assert_equal(['a', 'b', 'c'])
1305enddef
1306
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001307def Test_getqflist_return_type()
1308 let l = getqflist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001309 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001310
1311 let d = getqflist(#{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001312 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001313enddef
1314
1315def Test_getloclist_return_type()
1316 let l = getloclist(1)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001317 l->assert_equal([])
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001318
1319 let d = getloclist(1, #{items: 0})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001320 d->assert_equal(#{items: []})
Bram Moolenaarf151ad12020-06-30 13:38:01 +02001321enddef
1322
Bram Moolenaara66ba012020-07-05 18:41:08 +02001323def Test_copy_return_type()
1324 let l = copy([1, 2, 3])
1325 let res = 0
1326 for n in l
1327 res += n
1328 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001329 res->assert_equal(6)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001330
1331 let dl = deepcopy([1, 2, 3])
1332 res = 0
1333 for n in dl
1334 res += n
1335 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001336 res->assert_equal(6)
Bram Moolenaar44b4a242020-09-05 17:18:28 +02001337
1338 dl = deepcopy([1, 2, 3], true)
Bram Moolenaara66ba012020-07-05 18:41:08 +02001339enddef
1340
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001341def Test_extend_return_type()
1342 let l = extend([1, 2], [3])
1343 let res = 0
1344 for n in l
1345 res += n
1346 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001347 res->assert_equal(6)
Bram Moolenaarb3c019c2020-07-05 20:08:39 +02001348enddef
1349
Bram Moolenaar2df47312020-09-05 17:30:44 +02001350def Test_garbagecollect()
1351 garbagecollect(true)
1352enddef
1353
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001354def Test_insert_return_type()
1355 let l = insert([2, 1], 3)
1356 let res = 0
1357 for n in l
1358 res += n
1359 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001360 res->assert_equal(6)
Bram Moolenaar252e88a2020-07-05 20:47:18 +02001361enddef
1362
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001363def Test_keys_return_type()
1364 const var: list<string> = #{a: 1, b: 2}->keys()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001365 var->assert_equal(['a', 'b'])
Bram Moolenaar32f335f2020-08-14 18:56:45 +02001366enddef
1367
Bram Moolenaar67627352020-07-05 21:10:24 +02001368def Test_reverse_return_type()
1369 let l = reverse([1, 2, 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 Moolenaar67627352020-07-05 21:10:24 +02001375enddef
1376
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001377def Test_remove_return_type()
1378 let l = remove(#{one: [1, 2], two: [3, 4]}, 'one')
1379 let res = 0
1380 for n in l
1381 res += n
1382 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001383 res->assert_equal(3)
Bram Moolenaarad7c2492020-07-05 20:55:29 +02001384enddef
1385
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001386def Test_filter_return_type()
1387 let l = filter([1, 2, 3], {-> 1})
1388 let res = 0
1389 for n in l
1390 res += n
1391 endfor
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001392 res->assert_equal(6)
Bram Moolenaar0d94ad62020-07-05 20:16:41 +02001393enddef
1394
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001395def Test_bufnr()
1396 let buf = bufnr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001397 bufnr('%')->assert_equal(buf)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001398
1399 buf = bufnr('Xdummy', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001400 buf->assert_notequal(-1)
Bram Moolenaarfe136c92020-09-04 18:35:26 +02001401 exe 'bwipe! ' .. buf
Bram Moolenaarf39397e2020-08-17 22:21:36 +02001402enddef
1403
Bram Moolenaarec65d772020-08-20 22:29:12 +02001404def Test_col()
1405 new
1406 setline(1, 'asdf')
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001407 col([1, '$'])->assert_equal(5)
Bram Moolenaarec65d772020-08-20 22:29:12 +02001408enddef
1409
Bram Moolenaar24f77502020-09-04 19:50:57 +02001410def Test_char2nr()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001411 char2nr('あ', true)->assert_equal(12354)
Bram Moolenaar24f77502020-09-04 19:50:57 +02001412enddef
1413
Bram Moolenaar3d945cc2020-08-06 21:26:59 +02001414def Test_getreg_return_type()
1415 let s1: string = getreg('"')
1416 let s2: string = getreg('"', 1)
1417 let s3: list<string> = getreg('"', 1, 1)
1418enddef
1419
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001420def Wrong_dict_key_type(items: list<number>): list<number>
1421 return filter(items, {_, val -> get({val: 1}, 'x')})
1422enddef
1423
1424def Test_wrong_dict_key_type()
Bram Moolenaar5e654232020-09-16 15:22:00 +02001425 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:')
Bram Moolenaarf1a23682020-07-13 18:55:48 +02001426enddef
1427
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001428def Line_continuation_in_def(dir: string = ''): string
1429 let path: string = empty(dir)
1430 \ ? 'empty'
1431 \ : 'full'
1432 return path
1433enddef
1434
1435def Test_line_continuation_in_def()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001436 Line_continuation_in_def('.')->assert_equal('full')
Bram Moolenaaracd4c5e2020-06-22 19:39:03 +02001437enddef
1438
Bram Moolenaar5e654232020-09-16 15:22:00 +02001439def Line_continuation_in_lambda(): list<string>
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001440 let x = range(97, 100)
Bram Moolenaar914e7ea2020-07-11 15:20:48 +02001441 ->map({_, v -> nr2char(v)
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001442 ->toupper()})
1443 ->reverse()
1444 return x
1445enddef
1446
1447def Test_line_continuation_in_lambda()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001448 Line_continuation_in_lambda()->assert_equal(['D', 'C', 'B', 'A'])
Bram Moolenaar7a4b8982020-07-08 17:36:21 +02001449enddef
1450
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001451func Test_silent_echo()
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001452 CheckScreendump
1453
1454 let lines =<< trim END
1455 vim9script
1456 def EchoNothing()
1457 silent echo ''
1458 enddef
1459 defcompile
1460 END
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001461 call writefile(lines, 'XTest_silent_echo')
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001462
1463 " Check that the balloon shows up after a mouse move
1464 let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001465 call term_sendkeys(buf, ":abc")
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001466 call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
1467
1468 " clean up
1469 call StopVimInTerminal(buf)
1470 call delete('XTest_silent_echo')
Bram Moolenaar8f510af2020-07-05 18:48:23 +02001471endfunc
Bram Moolenaar47e7d702020-07-05 18:18:42 +02001472
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001473""""""" builtin functions that behave differently in Vim9
Bram Moolenaare15eebd2020-08-18 19:11:38 +02001474
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001475def Test_bufname()
1476 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001477 bufname('%')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001478 edit OtherFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001479 bufname('#')->assert_equal('SomeFile')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001480 close
Bram Moolenaar191929b2020-08-19 21:20:49 +02001481enddef
1482
Bram Moolenaara5d38412020-09-02 21:02:35 +02001483def Test_bufwinid()
1484 let origwin = win_getid()
1485 below split SomeFile
1486 let SomeFileID = win_getid()
1487 below split OtherFile
1488 below split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001489 bufwinid('SomeFile')->assert_equal(SomeFileID)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001490
1491 win_gotoid(origwin)
1492 only
1493 bwipe SomeFile
1494 bwipe OtherFile
1495enddef
1496
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001497def Test_count()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001498 count('ABC ABC ABC', 'b', true)->assert_equal(3)
1499 count('ABC ABC ABC', 'b', false)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001500enddef
1501
1502def Test_expand()
1503 split SomeFile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001504 expand('%', true, true)->assert_equal(['SomeFile'])
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001505 close
1506enddef
1507
1508def Test_getbufinfo()
1509 let bufinfo = getbufinfo(bufnr())
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001510 getbufinfo('%')->assert_equal(bufinfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001511
1512 edit Xtestfile1
1513 hide edit Xtestfile2
1514 hide enew
1515 getbufinfo(#{bufloaded: true, buflisted: true, bufmodified: false})
1516 ->len()->assert_equal(3)
1517 bwipe Xtestfile1 Xtestfile2
1518enddef
1519
Bram Moolenaara5d38412020-09-02 21:02:35 +02001520def Test_getbufline()
1521 e SomeFile
1522 let buf = bufnr()
1523 e #
1524 let lines = ['aaa', 'bbb', 'ccc']
1525 setbufline(buf, 1, lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001526 getbufline('#', 1, '$')->assert_equal(lines)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001527
1528 bwipe!
1529enddef
1530
1531def Test_getchangelist()
1532 new
1533 setline(1, 'some text')
1534 let changelist = bufnr()->getchangelist()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001535 getchangelist('%')->assert_equal(changelist)
Bram Moolenaara5d38412020-09-02 21:02:35 +02001536 bwipe!
1537enddef
1538
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001539def Test_getchar()
Bram Moolenaar636c5d52020-09-05 18:48:57 +02001540 while getchar(0)
1541 endwhile
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001542 getchar(true)->assert_equal(0)
Bram Moolenaarc08cc722020-09-05 17:51:23 +02001543enddef
1544
Bram Moolenaard217a872020-09-05 18:31:33 +02001545def Test_getcompletion()
1546 set wildignore=*.vim,*~
1547 let l = getcompletion('run', 'file', true)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001548 l->assert_equal([])
Bram Moolenaard217a872020-09-05 18:31:33 +02001549 set wildignore&
1550enddef
1551
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001552def Test_getreg()
1553 let lines = ['aaa', 'bbb', 'ccc']
1554 setreg('a', lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001555 getreg('a', true, true)->assert_equal(lines)
Bram Moolenaar67ff97d2020-09-02 21:45:54 +02001556enddef
1557
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001558def Test_glob()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001559 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim'])
Bram Moolenaar5892ea12020-09-02 21:53:11 +02001560enddef
1561
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001562def Test_globpath()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001563 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim'])
Bram Moolenaarf966ce52020-09-02 21:57:07 +02001564enddef
1565
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001566def Test_has()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001567 has('eval', true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001568enddef
1569
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001570def Test_hasmapto()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001571 hasmapto('foobar', 'i', true)->assert_equal(0)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001572 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001573 hasmapto('foobar', 'i', true)->assert_equal(1)
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001574 iunabbrev foo
1575enddef
1576
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001577def Test_index()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001578 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001579enddef
1580
1581def Test_list2str_str2list_utf8()
1582 let s = "\u3042\u3044"
1583 let l = [0x3042, 0x3044]
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001584 str2list(s, true)->assert_equal(l)
1585 list2str(l, true)->assert_equal(s)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001586enddef
1587
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001588def SID(): number
1589 return expand('<SID>')
1590 ->matchstr('<SNR>\zs\d\+\ze_$')
1591 ->str2nr()
1592enddef
1593
1594def Test_maparg()
1595 let lnum = str2nr(expand('<sflnum>'))
1596 map foo bar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001597 maparg('foo', '', false, true)->assert_equal(#{
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001598 lnum: lnum + 1,
1599 script: 0,
1600 mode: ' ',
1601 silent: 0,
1602 noremap: 0,
1603 lhs: 'foo',
1604 lhsraw: 'foo',
1605 nowait: 0,
1606 expr: 0,
1607 sid: SID(),
1608 rhs: 'bar',
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001609 buffer: 0})
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001610 unmap foo
1611enddef
1612
1613def Test_mapcheck()
1614 iabbrev foo foobar
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001615 mapcheck('foo', 'i', true)->assert_equal('foobar')
Bram Moolenaar04d594b2020-09-02 22:25:35 +02001616 iunabbrev foo
1617enddef
1618
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001619def Test_nr2char()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001620 nr2char(97, true)->assert_equal('a')
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001621enddef
1622
1623def Test_readdir()
1624 eval expand('sautest')->readdir({e -> e[0] !=# '.'})
1625 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'})
1626enddef
1627
1628def Test_search()
1629 new
1630 setline(1, ['foo', 'bar'])
1631 let val = 0
1632 # skip expr returns boolean
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001633 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001634 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001635 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001636 # skip expr returns number, only 0 and 1 are accepted
1637 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001638 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001639 :1
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001640 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001641 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1642 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:')
1643enddef
1644
1645def Test_searchcount()
1646 new
1647 setline(1, "foo bar")
1648 :/foo
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001649 searchcount(#{recompute: true})
1650 ->assert_equal(#{
1651 exact_match: 1,
1652 current: 1,
1653 total: 1,
1654 maxcount: 99,
1655 incomplete: 0})
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001656 bwipe!
1657enddef
1658
1659def Test_searchdecl()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001660 searchdecl('blah', true, true)->assert_equal(1)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001661enddef
1662
1663def Test_setbufvar()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001664 setbufvar(bufnr('%'), '&syntax', 'vim')
1665 &syntax->assert_equal('vim')
1666 setbufvar(bufnr('%'), '&ts', 16)
1667 &ts->assert_equal(16)
1668 settabwinvar(1, 1, '&syntax', 'vam')
1669 &syntax->assert_equal('vam')
1670 settabwinvar(1, 1, '&ts', 15)
1671 &ts->assert_equal(15)
1672 setlocal ts=8
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001673
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001674 setbufvar('%', 'myvar', 123)
1675 getbufvar('%', 'myvar')->assert_equal(123)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001676enddef
1677
Bram Moolenaar401f0c02020-09-05 22:37:39 +02001678def Test_setloclist()
1679 let items = [#{filename: '/tmp/file', lnum: 1, valid: true}]
1680 let what = #{items: items}
1681 setqflist([], ' ', what)
1682 setloclist(0, [], ' ', what)
1683enddef
1684
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001685def Test_setreg()
1686 setreg('a', ['aaa', 'bbb', 'ccc'])
1687 let reginfo = getreginfo('a')
1688 setreg('a', reginfo)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001689 getreginfo('a')->assert_equal(reginfo)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001690enddef
1691
Bram Moolenaar7c27f332020-09-05 22:45:55 +02001692def Test_spellsuggest()
1693 if !has('spell')
1694 MissingFeature 'spell'
1695 else
1696 spellsuggest('marrch', 1, true)->assert_equal(['March'])
1697 endif
1698enddef
1699
Bram Moolenaar3986b942020-09-06 16:09:04 +02001700def Test_split()
1701 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', ''])
1702enddef
1703
1704def Test_str2nr()
1705 str2nr("1'000'000", 10, true)->assert_equal(1000000)
1706enddef
1707
1708def Test_strchars()
1709 strchars("A\u20dd", true)->assert_equal(1)
1710enddef
1711
Bram Moolenaarad304702020-09-06 18:22:53 +02001712def Test_submatch()
1713 let pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)'
1714 let Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()}
1715 let actual = substitute('A123456789', pat, Rep, '')
1716 let expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]"
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001717 actual->assert_equal(expected)
Bram Moolenaarad304702020-09-06 18:22:53 +02001718enddef
1719
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001720def Test_synID()
1721 new
1722 setline(1, "text")
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001723 synID(1, 1, true)->assert_equal(0)
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001724 bwipe!
1725enddef
1726
Bram Moolenaarad304702020-09-06 18:22:53 +02001727def Test_term_gettty()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001728 if !has('terminal')
1729 MissingFeature 'terminal'
1730 else
1731 let buf = Run_shell_in_terminal({})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001732 term_gettty(buf, true)->assert_notequal('')
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001733 StopShellInTerminal(buf)
1734 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001735enddef
1736
1737def Test_term_start()
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001738 if !has('terminal')
1739 MissingFeature 'terminal'
1740 else
1741 botright new
1742 let winnr = winnr()
1743 term_start(&shell, #{curwin: true})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001744 winnr()->assert_equal(winnr)
Bram Moolenaar63969ef2020-09-06 20:06:59 +02001745 bwipe!
1746 endif
Bram Moolenaarad304702020-09-06 18:22:53 +02001747enddef
1748
Bram Moolenaar418155d2020-09-06 18:39:38 +02001749def Test_timer_paused()
1750 let id = timer_start(50, {-> 0})
1751 timer_pause(id, true)
1752 let info = timer_info(id)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001753 info[0]['paused']->assert_equal(1)
Bram Moolenaar418155d2020-09-06 18:39:38 +02001754 timer_stop(id)
1755enddef
1756
Bram Moolenaar4b9bd692020-09-05 21:57:53 +02001757def Test_win_splitmove()
1758 split
1759 win_splitmove(1, 2, #{vertical: true, rightbelow: true})
1760 close
1761enddef
1762
1763""""""" end of builtin functions
1764
1765def Fibonacci(n: number): number
1766 if n < 2
1767 return n
1768 else
1769 return Fibonacci(n - 1) + Fibonacci(n - 2)
1770 endif
1771enddef
1772
Bram Moolenaar985116a2020-07-12 17:31:09 +02001773def Test_recursive_call()
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001774 Fibonacci(20)->assert_equal(6765)
Bram Moolenaar985116a2020-07-12 17:31:09 +02001775enddef
1776
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001777def TreeWalk(dir: string): list<any>
1778 return readdir(dir)->map({_, val ->
1779 fnamemodify(dir .. '/' .. val, ':p')->isdirectory()
Bram Moolenaarbb1b5e22020-08-05 10:53:21 +02001780 ? {val: TreeWalk(dir .. '/' .. val)}
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001781 : val
1782 })
1783enddef
1784
1785def Test_closure_in_map()
1786 mkdir('XclosureDir/tdir', 'p')
1787 writefile(['111'], 'XclosureDir/file1')
1788 writefile(['222'], 'XclosureDir/file2')
1789 writefile(['333'], 'XclosureDir/tdir/file3')
1790
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001791 TreeWalk('XclosureDir')->assert_equal(['file1', 'file2', {'tdir': ['file3']}])
Bram Moolenaar08f7a412020-07-13 20:41:08 +02001792
1793 delete('XclosureDir', 'rf')
1794enddef
1795
Bram Moolenaara90afb92020-07-15 22:38:56 +02001796def Test_partial_call()
1797 let Xsetlist = function('setloclist', [0])
1798 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001799 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001800
1801 Xsetlist = function('setloclist', [0, [], ' '])
1802 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001803 getloclist(0, {'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001804
1805 Xsetlist = function('setqflist')
1806 Xsetlist([], ' ', {'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001807 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001808
1809 Xsetlist = function('setqflist', [[], ' '])
1810 Xsetlist({'title': 'test'})
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001811 getqflist({'title': 1})->assert_equal({'title': 'test'})
Bram Moolenaara90afb92020-07-15 22:38:56 +02001812enddef
1813
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001814def Test_cmd_modifier()
1815 tab echo '0'
Bram Moolenaard2c61702020-09-06 15:58:36 +02001816 CheckDefFailure(['5tab echo 3'], 'E16:')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001817enddef
1818
1819def Test_restore_modifiers()
1820 # check that when compiling a :def function command modifiers are not messed
1821 # up.
1822 let lines =<< trim END
1823 vim9script
1824 set eventignore=
1825 autocmd QuickFixCmdPost * copen
1826 def AutocmdsDisabled()
1827 eval 0
1828 enddef
1829 func Func()
1830 noautocmd call s:AutocmdsDisabled()
1831 let g:ei_after = &eventignore
1832 endfunc
1833 Func()
1834 END
1835 CheckScriptSuccess(lines)
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001836 g:ei_after->assert_equal('')
Bram Moolenaar2dd0a2c2020-08-08 15:10:27 +02001837enddef
1838
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001839def StackTop()
1840 eval 1
1841 eval 2
1842 # call not on fourth line
1843 StackBot()
1844enddef
1845
1846def StackBot()
1847 # throw an error
1848 eval [][0]
1849enddef
1850
1851def Test_callstack_def()
1852 try
1853 StackTop()
1854 catch
Bram Moolenaarc0c71e92020-09-11 19:09:48 +02001855 v:throwpoint->assert_match('Test_callstack_def\[2\]..StackTop\[4\]..StackBot, line 2')
Bram Moolenaardfa3d552020-09-10 22:05:08 +02001856 endtry
1857enddef
1858
Bram Moolenaarf7779c62020-05-03 15:38:16 +02001859
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +02001860" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker