blob: c5405a2dc4c480d84d844edac74e94d01685cd7a [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaarad39c092020-02-26 18:23:43 +01004source view_util.vim
Bram Moolenaar673660a2020-01-26 16:50:05 +01005
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01006" Check that "lines" inside ":def" results in an "error" message.
7func CheckDefFailure(lines, error)
Bram Moolenaar978d1702020-01-26 17:38:12 +01008 call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01009 call assert_fails('so Xdef', a:error, a:lines)
10 call delete('Xdef')
11endfunc
12
13func CheckScriptFailure(lines, error)
14 call writefile(a:lines, 'Xdef')
15 call assert_fails('so Xdef', a:error, a:lines)
16 call delete('Xdef')
17endfunc
18
19def Test_syntax()
20 let var = 234
21 let other: list<string> = ['asdf']
22enddef
23
24func Test_def_basic()
25 def SomeFunc(): string
26 return 'yes'
27 enddef
28 call assert_equal('yes', SomeFunc())
29endfunc
30
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010031let s:appendToMe = 'xxx'
32let s:addToMe = 111
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010033let g:existing = 'yes'
Bram Moolenaara8c17702020-04-01 21:17:24 +020034let g:inc_counter = 1
35let $SOME_ENV_VAR = 'some'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010036
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010037def Test_assignment()
38 let bool1: bool = true
39 assert_equal(v:true, bool1)
40 let bool2: bool = false
41 assert_equal(v:false, bool2)
42
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010043 let list1: list<bool> = [false, true, false]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010044 let list2: list<number> = [1, 2, 3]
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010045 let list3: list<string> = ['sdf', 'asdf']
46 let list4: list<any> = ['yes', true, 1234]
47 let list5: list<blob> = [0z01, 0z02]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010048
Bram Moolenaar436472f2020-02-20 22:54:43 +010049 let listS: list<string> = []
50 let listN: list<number> = []
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010051
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010052 let dict1: dict<bool> = #{one: false, two: true}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010053 let dict2: dict<number> = #{one: 1, two: 2}
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010054 let dict3: dict<string> = #{key: 'value'}
55 let dict4: dict<any> = #{one: 1, two: '2'}
56 let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010057
Bram Moolenaar9be61bb2020-03-30 22:51:24 +020058 let a: number = 6
59 assert_equal(6, a)
60
Bram Moolenaar42a480b2020-02-29 23:23:47 +010061 if has('channel')
62 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010063 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010064 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010065 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010066 if has('float')
67 let float1: float = 3.4
68 endif
Bram Moolenaar087d2e12020-03-01 15:36:42 +010069 let funky1: func
70 let funky2: func = function('len')
71 let party1: partial
72 let party2: partial = funcref('Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010073
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010074 " type becomes list<any>
75 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar5381c7a2020-03-02 22:53:32 +010076 " type becomes dict<any>
77 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010078
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010079 g:newvar = 'new'
80 assert_equal('new', g:newvar)
81
82 assert_equal('yes', g:existing)
83 g:existing = 'no'
84 assert_equal('no', g:existing)
85
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010086 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010087 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010088
89 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010090 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010091 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010092
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010093 s:appendToMe ..= 'yyy'
94 assert_equal('xxxyyy', s:appendToMe)
95 s:addToMe += 222
96 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010097 s:newVar = 'new'
98 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +020099
100 set ts=7
101 &ts += 1
102 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200103 &ts -= 3
104 assert_equal(5, &ts)
105 &ts *= 2
106 assert_equal(10, &ts)
107 &ts /= 3
108 assert_equal(3, &ts)
109 set ts=10
110 &ts %= 4
111 assert_equal(2, &ts)
Bram Moolenaara8c17702020-04-01 21:17:24 +0200112 call CheckDefFailure(['&notex += 3'], 'E113:')
113 call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
114 call CheckDefFailure(['&path += 3'], 'E1013:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200115 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +0200116
117 g:inc_counter += 1
118 assert_equal(2, g:inc_counter)
119
120 $SOME_ENV_VAR ..= 'more'
121 assert_equal('somemore', $SOME_ENV_VAR)
122 call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
123 call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
124
125 @a = 'areg'
126 @a ..= 'add'
127 assert_equal('aregadd', @a)
128 call CheckDefFailure(['@a += "more"'], 'E1013:')
129 call CheckDefFailure(['@a += 123'], 'E1013:')
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200130
131 v:errmsg = 'none'
132 v:errmsg ..= 'again'
133 assert_equal('noneagain', v:errmsg)
134 call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
135 call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
136
137 " Test default values.
138 let thebool: bool
139 assert_equal(v:false, thebool)
140
141 let thenumber: number
142 assert_equal(0, thenumber)
143
144 if has('float')
145 let thefloat: float
146 assert_equal(0.0, thefloat)
147 endif
148
149 let thestring: string
150 assert_equal('', thestring)
151
152 let theblob: blob
153 assert_equal(0z, theblob)
154
155 let thefunc: func
156 assert_equal(test_null_function(), thefunc)
157
158 let thepartial: partial
159 assert_equal(test_null_partial(), thepartial)
160
161 let thelist: list<any>
162 assert_equal([], thelist)
163
164 let thedict: dict<any>
165 assert_equal({}, thedict)
166
167 let thejob: job
168 assert_equal(test_null_job(), thejob)
169
170 let thechannel: channel
171 assert_equal(test_null_channel(), thechannel)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100172enddef
173
174func Test_assignment_failure()
175 call CheckDefFailure(['let var=234'], 'E1004:')
176 call CheckDefFailure(['let var =234'], 'E1004:')
177 call CheckDefFailure(['let var= 234'], 'E1004:')
178
179 call CheckDefFailure(['let true = 1'], 'E1034:')
180 call CheckDefFailure(['let false = 1'], 'E1034:')
181
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200182 call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
183
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200184 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200185 call CheckDefFailure(['let &option'], 'E1052:')
186 call CheckDefFailure(['&g:option = 5'], 'E113:')
187
188 call CheckDefFailure(['let $VAR = 5'], 'E1065:')
189
190 call CheckDefFailure(['let @~ = 5'], 'E354:')
191 call CheckDefFailure(['let @a = 5'], 'E1066:')
192
193 call CheckDefFailure(['let g:var = 5'], 'E1016:')
194
195 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
196 call CheckDefFailure(['let xnr += 4'], 'E1020:')
197
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100198 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
199
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100200 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
201 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
202
203 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
204 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
205
206 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
207 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100208
209 call CheckDefFailure(['let var: dict <number>'], 'E1007:')
210 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100211endfunc
212
213func Test_wrong_type()
214 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
215 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
216 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
217 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
218
219 call CheckDefFailure(['let var: dict<number'], 'E1009:')
220 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100221
222 call CheckDefFailure(['let var: ally'], 'E1010:')
223 call CheckDefFailure(['let var: bram'], 'E1010:')
224 call CheckDefFailure(['let var: cathy'], 'E1010:')
225 call CheckDefFailure(['let var: dom'], 'E1010:')
226 call CheckDefFailure(['let var: freddy'], 'E1010:')
227 call CheckDefFailure(['let var: john'], 'E1010:')
228 call CheckDefFailure(['let var: larry'], 'E1010:')
229 call CheckDefFailure(['let var: ned'], 'E1010:')
230 call CheckDefFailure(['let var: pam'], 'E1010:')
231 call CheckDefFailure(['let var: sam'], 'E1010:')
232 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100233endfunc
234
235func Test_const()
236 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
237 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
238 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200239 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100240endfunc
241
242def Test_block()
243 let outer = 1
244 {
245 let inner = 2
246 assert_equal(1, outer)
247 assert_equal(2, inner)
248 }
249 assert_equal(1, outer)
250enddef
251
252func Test_block_failure()
253 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
254endfunc
255
256def ReturnString(): string
257 return 'string'
258enddef
259
260def ReturnNumber(): number
261 return 123
262enddef
263
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100264let g:notNumber = 'string'
265
266def ReturnGlobal(): number
267 return g:notNumber
268enddef
269
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200270def Test_return_something()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100271 assert_equal('string', ReturnString())
272 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100273 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100274enddef
275
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200276let s:nothing = 0
277def ReturnNothing()
278 s:nothing = 1
279 if true
280 return
281 endif
282 s:nothing = 2
283enddef
284
285def Test_return_nothing()
286 ReturnNothing()
287 assert_equal(1, s:nothing)
288enddef
289
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100290func Increment()
291 let g:counter += 1
292endfunc
293
294def Test_call_ufunc_count()
295 g:counter = 1
296 Increment()
297 Increment()
298 Increment()
299 " works with and without :call
300 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100301 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100302 unlet g:counter
303enddef
304
305def MyVarargs(arg: string, ...rest: list<string>): string
306 let res = arg
307 for s in rest
308 res ..= ',' .. s
309 endfor
310 return res
311enddef
312
313def Test_call_varargs()
314 assert_equal('one', MyVarargs('one'))
315 assert_equal('one,two', MyVarargs('one', 'two'))
316 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
317enddef
318
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100319def MyDefaultArgs(name = 'string'): string
320 return name
321enddef
322
323def Test_call_default_args()
324 assert_equal('string', MyDefaultArgs())
325 assert_equal('one', MyDefaultArgs('one'))
326 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
327enddef
328
329func Test_call_default_args_from_func()
330 call assert_equal('string', MyDefaultArgs())
331 call assert_equal('one', MyDefaultArgs('one'))
332 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
333endfunc
334
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100335func TakesOneArg(arg)
336 echo a:arg
337endfunc
338
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200339def Test_call_wrong_args()
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100340 call CheckDefFailure(['TakesOneArg()'], 'E119:')
341 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200342 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100343enddef
344
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100345" Default arg and varargs
346def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
347 let res = one .. ',' .. two
348 for s in rest
349 res ..= ',' .. s
350 endfor
351 return res
352enddef
353
354def Test_call_def_varargs()
355 call assert_fails('call MyDefVarargs()', 'E119:')
356 assert_equal('one,foo', MyDefVarargs('one'))
357 assert_equal('one,two', MyDefVarargs('one', 'two'))
358 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
359enddef
360
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100361def Test_using_var_as_arg()
362 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
363 call assert_fails('so Xdef', 'E1006:')
364 call delete('Xdef')
365enddef
366
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100367def Test_call_func_defined_later()
368 call assert_equal('one', DefinedLater('one'))
369 call assert_fails('call NotDefined("one")', 'E117:')
370enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100371
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100372func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100373 return a:arg
374endfunc
375
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100376def FuncWithForwardCall()
377 return DefinedEvenLater("yes")
378enddef
379
380def DefinedEvenLater(arg: string): string
381 return arg
382enddef
383
384def Test_error_in_nested_function()
385 " Error in called function requires unwinding the call stack.
386 assert_fails('call FuncWithForwardCall()', 'E1029')
387enddef
388
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100389def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100390 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
391 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
392 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
393 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100394
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200395 CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
396
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100397 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
398 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100399enddef
400
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100401def Test_arg_type_wrong()
402 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
403enddef
404
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100405def Test_try_catch()
406 let l = []
407 try
408 add(l, '1')
409 throw 'wrong'
410 add(l, '2')
411 catch
412 add(l, v:exception)
413 finally
414 add(l, '3')
415 endtry
416 assert_equal(['1', 'wrong', '3'], l)
417enddef
418
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100419def ThrowFromDef()
420 throw 'getout'
421enddef
422
423func CatchInFunc()
424 try
425 call ThrowFromDef()
426 catch
427 let g:thrown_func = v:exception
428 endtry
429endfunc
430
431def CatchInDef()
432 try
433 ThrowFromDef()
434 catch
435 g:thrown_def = v:exception
436 endtry
437enddef
438
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100439def ReturnFinally(): string
440 try
441 return 'intry'
442 finally
443 g:in_finally = 'finally'
444 endtry
445 return 'end'
446enddef
447
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100448def Test_try_catch_nested()
449 CatchInFunc()
450 assert_equal('getout', g:thrown_func)
451
452 CatchInDef()
453 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100454
455 assert_equal('intry', ReturnFinally())
456 assert_equal('finally', g:in_finally)
457enddef
458
459def Test_try_catch_match()
460 let seq = 'a'
461 try
462 throw 'something'
463 catch /nothing/
464 seq ..= 'x'
465 catch /some/
466 seq ..= 'b'
467 catch /asdf/
468 seq ..= 'x'
469 finally
470 seq ..= 'c'
471 endtry
472 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100473enddef
474
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100475let s:export_script_lines =<< trim END
476 vim9script
477 let name: string = 'bob'
478 def Concat(arg: string): string
479 return name .. arg
480 enddef
481 let g:result = Concat('bie')
482 let g:localname = name
483
484 export const CONST = 1234
485 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100486 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100487 export def Exported(): string
488 return 'Exported'
489 enddef
490END
491
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100492def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100493 let import_script_lines =<< trim END
494 vim9script
495 import {exported, Exported} from './Xexport.vim'
496 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100497 exported += 3
498 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100499 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100500
501 import {exp_name} from './Xexport.vim'
502 g:imported_name = exp_name
503 exp_name ..= ' Doe'
504 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100505 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100506 END
507
508 writefile(import_script_lines, 'Ximport.vim')
509 writefile(s:export_script_lines, 'Xexport.vim')
510
511 source Ximport.vim
512
513 assert_equal('bobbie', g:result)
514 assert_equal('bob', g:localname)
515 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100516 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100517 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100518 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100519 assert_equal('John', g:imported_name)
520 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100521 assert_false(exists('g:name'))
522
523 unlet g:result
524 unlet g:localname
525 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100526 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100527 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100528 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100529 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100530 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100531
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100532 let import_in_def_lines =<< trim END
533 vim9script
534 def ImportInDef()
535 import exported from './Xexport.vim'
536 g:imported = exported
537 exported += 7
538 g:imported_added = exported
539 enddef
540 ImportInDef()
541 END
542 writefile(import_in_def_lines, 'Ximport2.vim')
543 source Ximport2.vim
544 " TODO: this should be 9879
545 assert_equal(9876, g:imported)
546 assert_equal(9883, g:imported_added)
547 unlet g:imported
548 unlet g:imported_added
549 delete('Ximport2.vim')
550
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100551 let import_star_as_lines =<< trim END
552 vim9script
553 import * as Export from './Xexport.vim'
554 def UseExport()
555 g:imported = Export.exported
556 enddef
557 UseExport()
558 END
559 writefile(import_star_as_lines, 'Ximport.vim')
560 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100561 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100562
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100563 let import_star_as_lines_no_dot =<< trim END
564 vim9script
565 import * as Export from './Xexport.vim'
566 def Func()
567 let dummy = 1
568 let imported = Export + dummy
569 enddef
570 END
571 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
572 assert_fails('source Ximport.vim', 'E1060:')
573
574 let import_star_as_lines_dot_space =<< trim END
575 vim9script
576 import * as Export from './Xexport.vim'
577 def Func()
578 let imported = Export . exported
579 enddef
580 END
581 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
582 assert_fails('source Ximport.vim', 'E1074:')
583
584 let import_star_as_lines_missing_name =<< trim END
585 vim9script
586 import * as Export from './Xexport.vim'
587 def Func()
588 let imported = Export.
589 enddef
590 END
591 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
592 assert_fails('source Ximport.vim', 'E1048:')
593
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100594 let import_star_lines =<< trim END
595 vim9script
596 import * from './Xexport.vim'
597 g:imported = exported
598 END
599 writefile(import_star_lines, 'Ximport.vim')
600 assert_fails('source Ximport.vim', 'E1045:')
601
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100602 " try to import something that exists but is not exported
603 let import_not_exported_lines =<< trim END
604 vim9script
605 import name from './Xexport.vim'
606 END
607 writefile(import_not_exported_lines, 'Ximport.vim')
608 assert_fails('source Ximport.vim', 'E1049:')
609
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100610 " try to import something that is already defined
611 let import_already_defined =<< trim END
612 vim9script
613 let exported = 'something'
614 import exported from './Xexport.vim'
615 END
616 writefile(import_already_defined, 'Ximport.vim')
617 assert_fails('source Ximport.vim', 'E1073:')
618
619 " try to import something that is already defined
620 import_already_defined =<< trim END
621 vim9script
622 let exported = 'something'
623 import * as exported from './Xexport.vim'
624 END
625 writefile(import_already_defined, 'Ximport.vim')
626 assert_fails('source Ximport.vim', 'E1073:')
627
628 " try to import something that is already defined
629 import_already_defined =<< trim END
630 vim9script
631 let exported = 'something'
632 import {exported} from './Xexport.vim'
633 END
634 writefile(import_already_defined, 'Ximport.vim')
635 assert_fails('source Ximport.vim', 'E1073:')
636
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100637 " import a very long name, requires making a copy
638 let import_long_name_lines =<< trim END
639 vim9script
640 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
641 END
642 writefile(import_long_name_lines, 'Ximport.vim')
643 assert_fails('source Ximport.vim', 'E1048:')
644
645 let import_no_from_lines =<< trim END
646 vim9script
647 import name './Xexport.vim'
648 END
649 writefile(import_no_from_lines, 'Ximport.vim')
650 assert_fails('source Ximport.vim', 'E1070:')
651
652 let import_invalid_string_lines =<< trim END
653 vim9script
654 import name from Xexport.vim
655 END
656 writefile(import_invalid_string_lines, 'Ximport.vim')
657 assert_fails('source Ximport.vim', 'E1071:')
658
659 let import_wrong_name_lines =<< trim END
660 vim9script
661 import name from './XnoExport.vim'
662 END
663 writefile(import_wrong_name_lines, 'Ximport.vim')
664 assert_fails('source Ximport.vim', 'E1053:')
665
666 let import_missing_comma_lines =<< trim END
667 vim9script
668 import {exported name} from './Xexport.vim'
669 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100670 writefile(import_missing_comma_lines, 'Ximport3.vim')
671 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100672
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100673 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100674 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100675 delete('Xexport.vim')
676
Bram Moolenaar750802b2020-02-23 18:08:33 +0100677 " Check that in a Vim9 script 'cpo' is set to the Vim default.
678 set cpo&vi
679 let cpo_before = &cpo
680 let lines =<< trim END
681 vim9script
682 g:cpo_in_vim9script = &cpo
683 END
684 writefile(lines, 'Xvim9_script')
685 source Xvim9_script
686 assert_equal(cpo_before, &cpo)
687 set cpo&vim
688 assert_equal(&cpo, g:cpo_in_vim9script)
689 delete('Xvim9_script')
690enddef
691
692def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100693 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
694 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100695 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100696 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100697 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
698 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
699
700 assert_fails('vim9script', 'E1038')
701 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100702enddef
703
704def Test_vim9script_call()
705 let lines =<< trim END
706 vim9script
707 let var = ''
708 def MyFunc(arg: string)
709 var = arg
710 enddef
711 MyFunc('foobar')
712 assert_equal('foobar', var)
713
714 let str = 'barfoo'
715 str->MyFunc()
716 assert_equal('barfoo', var)
717
718 let g:value = 'value'
719 g:value->MyFunc()
720 assert_equal('value', var)
721
722 let listvar = []
723 def ListFunc(arg: list<number>)
724 listvar = arg
725 enddef
726 [1, 2, 3]->ListFunc()
727 assert_equal([1, 2, 3], listvar)
728
729 let dictvar = {}
730 def DictFunc(arg: dict<number>)
731 dictvar = arg
732 enddef
733 {'a': 1, 'b': 2}->DictFunc()
734 assert_equal(#{a: 1, b: 2}, dictvar)
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100735 def CompiledDict()
736 {'a': 3, 'b': 4}->DictFunc()
737 enddef
738 CompiledDict()
739 assert_equal(#{a: 3, b: 4}, dictvar)
740
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100741 #{a: 3, b: 4}->DictFunc()
742 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100743
744 ('text')->MyFunc()
745 assert_equal('text', var)
746 ("some")->MyFunc()
747 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100748 END
749 writefile(lines, 'Xcall.vim')
750 source Xcall.vim
751 delete('Xcall.vim')
752enddef
753
754def Test_vim9script_call_fail_decl()
755 let lines =<< trim END
756 vim9script
757 let var = ''
758 def MyFunc(arg: string)
759 let var = 123
760 enddef
761 END
762 writefile(lines, 'Xcall_decl.vim')
763 assert_fails('source Xcall_decl.vim', 'E1054:')
764 delete('Xcall_decl.vim')
765enddef
766
767def Test_vim9script_call_fail_const()
768 let lines =<< trim END
769 vim9script
770 const var = ''
771 def MyFunc(arg: string)
772 var = 'asdf'
773 enddef
774 END
775 writefile(lines, 'Xcall_const.vim')
776 assert_fails('source Xcall_const.vim', 'E46:')
777 delete('Xcall_const.vim')
778enddef
779
780def Test_vim9script_reload()
781 let lines =<< trim END
782 vim9script
783 const var = ''
784 let valone = 1234
785 def MyFunc(arg: string)
786 valone = 5678
787 enddef
788 END
789 let morelines =<< trim END
790 let valtwo = 222
791 export def GetValtwo(): number
792 return valtwo
793 enddef
794 END
795 writefile(lines + morelines, 'Xreload.vim')
796 source Xreload.vim
797 source Xreload.vim
798 source Xreload.vim
799
800 let testlines =<< trim END
801 vim9script
802 def TheFunc()
803 import GetValtwo from './Xreload.vim'
804 assert_equal(222, GetValtwo())
805 enddef
806 TheFunc()
807 END
808 writefile(testlines, 'Ximport.vim')
809 source Ximport.vim
810
811 " test that when not using "morelines" valtwo is still defined
812 " need to source Xreload.vim again, import doesn't reload a script
813 writefile(lines, 'Xreload.vim')
814 source Xreload.vim
815 source Ximport.vim
816
817 " cannot declare a var twice
818 lines =<< trim END
819 vim9script
820 let valone = 1234
821 let valone = 5678
822 END
823 writefile(lines, 'Xreload.vim')
824 assert_fails('source Xreload.vim', 'E1041:')
825
826 delete('Xreload.vim')
827 delete('Ximport.vim')
828enddef
829
830def Test_import_absolute()
831 let import_lines = [
832 \ 'vim9script',
833 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100834 \ 'def UseExported()',
835 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100836 \ ' exported = 8888',
837 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100838 \ 'enddef',
839 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100840 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100841 \ ]
842 writefile(import_lines, 'Ximport_abs.vim')
843 writefile(s:export_script_lines, 'Xexport_abs.vim')
844
845 source Ximport_abs.vim
846
847 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100848 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100849 assert_match('<SNR>\d\+_UseExported.*'
850 \ .. 'g:imported_abs = exported.*'
851 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100852 \ .. '1 STOREG g:imported_abs.*'
853 \ .. 'exported = 8888.*'
854 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
855 \ .. 'g:imported_after = exported.*'
856 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
857 \ .. '5 STOREG g:imported_after.*'
858 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100859 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100860 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100861
862 delete('Ximport_abs.vim')
863 delete('Xexport_abs.vim')
864enddef
865
866def Test_import_rtp()
867 let import_lines = [
868 \ 'vim9script',
869 \ 'import exported from "Xexport_rtp.vim"',
870 \ 'g:imported_rtp = exported',
871 \ ]
872 writefile(import_lines, 'Ximport_rtp.vim')
873 mkdir('import')
874 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
875
876 let save_rtp = &rtp
877 &rtp = getcwd()
878 source Ximport_rtp.vim
879 &rtp = save_rtp
880
881 assert_equal(9876, g:imported_rtp)
882 unlet g:imported_rtp
883
884 delete('Ximport_rtp.vim')
885 delete('import/Xexport_rtp.vim')
886 delete('import', 'd')
887enddef
888
889def Test_fixed_size_list()
890 " will be allocated as one piece of memory, check that changes work
891 let l = [1, 2, 3, 4]
892 l->remove(0)
893 l->add(5)
894 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100895 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100896enddef
897
Bram Moolenaar673660a2020-01-26 16:50:05 +0100898" Test that inside :function a Python function can be defined, :def is not
899" recognized.
900func Test_function_python()
901 CheckFeature python3
902 let py = 'python3'
903 execute py "<< EOF"
904def do_something():
905 return 1
906EOF
907endfunc
908
Bram Moolenaar158906c2020-02-06 20:39:45 +0100909def IfElse(what: number): string
910 let res = ''
911 if what == 1
912 res = "one"
913 elseif what == 2
914 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100915 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100916 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100917 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100918 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100919enddef
920
Bram Moolenaar158906c2020-02-06 20:39:45 +0100921def Test_if_elseif_else()
922 assert_equal('one', IfElse(1))
923 assert_equal('two', IfElse(2))
924 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100925enddef
926
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100927let g:bool_true = v:true
928let g:bool_false = v:false
929
930def Test_if_const_expr()
931 let res = false
932 if true ? true : false
933 res = true
934 endif
935 assert_equal(true, res)
936
937 res = false
938 if g:bool_true ? true : false
939 res = true
940 endif
941 assert_equal(true, res)
942
943 res = false
944 if true ? g:bool_true : false
945 res = true
946 endif
947 assert_equal(true, res)
948
949 res = false
950 if true ? true : g:bool_false
951 res = true
952 endif
953 assert_equal(true, res)
954
955 res = false
956 if true ? false : true
957 res = true
958 endif
959 assert_equal(false, res)
960
961 res = false
962 if false ? false : true
963 res = true
964 endif
965 assert_equal(true, res)
966
967 res = false
968 if false ? true : false
969 res = true
970 endif
971 assert_equal(false, res)
972
973 res = false
974 if true && true
975 res = true
976 endif
977 assert_equal(true, res)
978
979 res = false
980 if true && false
981 res = true
982 endif
983 assert_equal(false, res)
984
985 res = false
986 if g:bool_true && false
987 res = true
988 endif
989 assert_equal(false, res)
990
991 res = false
992 if true && g:bool_false
993 res = true
994 endif
995 assert_equal(false, res)
996
997 res = false
998 if false && false
999 res = true
1000 endif
1001 assert_equal(false, res)
1002
1003 res = false
1004 if true || false
1005 res = true
1006 endif
1007 assert_equal(true, res)
1008
1009 res = false
1010 if g:bool_true || false
1011 res = true
1012 endif
1013 assert_equal(true, res)
1014
1015 res = false
1016 if true || g:bool_false
1017 res = true
1018 endif
1019 assert_equal(true, res)
1020
1021 res = false
1022 if false || false
1023 res = true
1024 endif
1025 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001026enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001027
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001028def Test_if_const_expr_fails()
1029 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1030 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001031enddef
1032
Bram Moolenaar63ce4842020-02-19 15:46:48 +01001033def Test_delfunc()
1034 let lines =<< trim END
1035 vim9script
1036 def GoneSoon()
1037 echo 'hello'
1038 enddef
1039
1040 def CallGoneSoon()
1041 GoneSoon()
1042 enddef
1043
1044 delfunc GoneSoon
1045 CallGoneSoon()
1046 END
1047 writefile(lines, 'XToDelFunc')
1048 assert_fails('so XToDelFunc', 'E933')
1049 assert_fails('so XToDelFunc', 'E933')
1050
1051 delete('XToDelFunc')
1052enddef
1053
Bram Moolenaarad39c092020-02-26 18:23:43 +01001054def Test_execute_cmd()
1055 new
1056 setline(1, 'default')
1057 execute 'call setline(1, "execute-string")'
1058 assert_equal('execute-string', getline(1))
1059 let cmd1 = 'call setline(1,'
1060 let cmd2 = '"execute-var")'
1061 execute cmd1 cmd2
1062 assert_equal('execute-var', getline(1))
1063 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1064 assert_equal('execute-var-string', getline(1))
1065 let cmd_first = 'call '
1066 let cmd_last = 'setline(1, "execute-var-var")'
1067 execute cmd_first .. cmd_last
1068 assert_equal('execute-var-var', getline(1))
1069 bwipe!
1070enddef
1071
1072def Test_echo_cmd()
1073 echo 'something'
1074 assert_match('^something$', Screenline(&lines))
1075
1076 let str1 = 'some'
1077 let str2 = 'more'
1078 echo str1 str2
1079 assert_match('^some more$', Screenline(&lines))
1080enddef
1081
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001082def Test_for_outside_of_function()
1083 let lines =<< trim END
1084 vim9script
1085 new
1086 for var in range(0, 3)
1087 append(line('$'), var)
1088 endfor
1089 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1090 bwipe!
1091 END
1092 writefile(lines, 'Xvim9for.vim')
1093 source Xvim9for.vim
1094 delete('Xvim9for.vim')
1095enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001096
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001097def Test_while_loop()
1098 let result = ''
1099 let cnt = 0
1100 while cnt < 555
1101 if cnt == 3
1102 break
1103 endif
1104 cnt += 1
1105 if cnt == 2
1106 continue
1107 endif
1108 result ..= cnt .. '_'
1109 endwhile
1110 assert_equal('1_3_', result)
1111enddef
1112
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001113def Test_for_loop_fails()
1114 call CheckDefFailure(['for # in range(5)'], 'E690:')
1115 call CheckDefFailure(['for i In range(5)'], 'E690:')
1116 call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1117 call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1118 call CheckDefFailure(['for i in "text"'], 'E1024:')
1119enddef
1120
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001121def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001122 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001123 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001124 try
1125 while 1
1126 x += 1
1127 if x == 100
1128 feedkeys("\<C-C>", 'Lt')
1129 endif
1130 endwhile
1131 catch
1132 caught = true
1133 assert_equal(100, x)
1134 endtry
1135 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001136enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001137
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001138def Test_substitute_cmd()
1139 new
1140 setline(1, 'something')
1141 :substitute(some(other(
1142 assert_equal('otherthing', getline(1))
1143 bwipe!
1144
1145 " also when the context is Vim9 script
1146 let lines =<< trim END
1147 vim9script
1148 new
1149 setline(1, 'something')
1150 :substitute(some(other(
1151 assert_equal('otherthing', getline(1))
1152 bwipe!
1153 END
1154 writefile(lines, 'Xvim9lines')
1155 source Xvim9lines
1156
1157 delete('Xvim9lines')
1158enddef
1159
Bram Moolenaar20431c92020-03-20 18:39:46 +01001160def Test_redef_failure()
1161 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
1162 so Xdef
1163 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
1164 so Xdef
1165 call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
1166 call assert_fails('so Xdef', 'E1027:')
1167 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
1168 so Xdef
1169 call delete('Xdef')
1170
1171 call assert_equal(0, Func0())
1172 call assert_equal('Func1', Func1())
1173 call assert_equal('Func2', Func2())
1174
1175 delfunc! Func0
1176 delfunc! Func1
1177 delfunc! Func2
1178enddef
1179
Bram Moolenaar7d941ee2020-03-26 14:11:58 +01001180" Test for internal functions returning different types
1181func Test_InternalFuncRetType()
1182 let lines =<< trim END
1183 def RetFloat(): float
1184 return ceil(1.456)
1185 enddef
1186
1187 def RetListAny(): list<any>
1188 return items({'k' : 'v'})
1189 enddef
1190
1191 def RetListString(): list<string>
1192 return split('a:b:c', ':')
1193 enddef
1194
1195 def RetListDictAny(): list<dict<any>>
1196 return getbufinfo()
1197 enddef
1198
1199 def RetDictNumber(): dict<number>
1200 return wordcount()
1201 enddef
1202
1203 def RetDictString(): dict<string>
1204 return environ()
1205 enddef
1206 END
1207 call writefile(lines, 'Xscript')
1208 source Xscript
1209
1210 call assert_equal(2.0, RetFloat())
1211 call assert_equal([['k', 'v']], RetListAny())
1212 call assert_equal(['a', 'b', 'c'], RetListString())
1213 call assert_notequal([], RetListDictAny())
1214 call assert_notequal({}, RetDictNumber())
1215 call assert_notequal({}, RetDictString())
1216 call delete('Xscript')
1217endfunc
1218
1219" Test for passing too many or too few arguments to internal functions
1220func Test_internalfunc_arg_error()
1221 let l =<< trim END
1222 def! FArgErr(): float
1223 return ceil(1.1, 2)
1224 enddef
1225 END
1226 call writefile(l, 'Xinvalidarg')
1227 call assert_fails('so Xinvalidarg', 'E118:')
1228 let l =<< trim END
1229 def! FArgErr(): float
1230 return ceil()
1231 enddef
1232 END
1233 call writefile(l, 'Xinvalidarg')
1234 call assert_fails('so Xinvalidarg', 'E119:')
1235 call delete('Xinvalidarg')
1236endfunc
1237
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001238" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker