blob: 8d36c81ad7054957fb5f892207dfb086b8e0504f [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
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200167 if has('channel')
168 let thejob: job
169 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200170
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200171 let thechannel: channel
172 assert_equal(test_null_channel(), thechannel)
173 endif
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100174enddef
175
176func Test_assignment_failure()
177 call CheckDefFailure(['let var=234'], 'E1004:')
178 call CheckDefFailure(['let var =234'], 'E1004:')
179 call CheckDefFailure(['let var= 234'], 'E1004:')
180
181 call CheckDefFailure(['let true = 1'], 'E1034:')
182 call CheckDefFailure(['let false = 1'], 'E1034:')
183
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200184 call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
185
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200186 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200187 call CheckDefFailure(['let &option'], 'E1052:')
188 call CheckDefFailure(['&g:option = 5'], 'E113:')
189
190 call CheckDefFailure(['let $VAR = 5'], 'E1065:')
191
192 call CheckDefFailure(['let @~ = 5'], 'E354:')
193 call CheckDefFailure(['let @a = 5'], 'E1066:')
194
195 call CheckDefFailure(['let g:var = 5'], 'E1016:')
196
197 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
198 call CheckDefFailure(['let xnr += 4'], 'E1020:')
199
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100200 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
201
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100202 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
203 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
204
205 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
206 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
207
208 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
209 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100210
211 call CheckDefFailure(['let var: dict <number>'], 'E1007:')
212 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100213endfunc
214
215func Test_wrong_type()
216 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
217 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
218 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
219 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
220
221 call CheckDefFailure(['let var: dict<number'], 'E1009:')
222 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100223
224 call CheckDefFailure(['let var: ally'], 'E1010:')
225 call CheckDefFailure(['let var: bram'], 'E1010:')
226 call CheckDefFailure(['let var: cathy'], 'E1010:')
227 call CheckDefFailure(['let var: dom'], 'E1010:')
228 call CheckDefFailure(['let var: freddy'], 'E1010:')
229 call CheckDefFailure(['let var: john'], 'E1010:')
230 call CheckDefFailure(['let var: larry'], 'E1010:')
231 call CheckDefFailure(['let var: ned'], 'E1010:')
232 call CheckDefFailure(['let var: pam'], 'E1010:')
233 call CheckDefFailure(['let var: sam'], 'E1010:')
234 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100235endfunc
236
237func Test_const()
238 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
239 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
240 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200241 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100242endfunc
243
244def Test_block()
245 let outer = 1
246 {
247 let inner = 2
248 assert_equal(1, outer)
249 assert_equal(2, inner)
250 }
251 assert_equal(1, outer)
252enddef
253
254func Test_block_failure()
255 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
256endfunc
257
258def ReturnString(): string
259 return 'string'
260enddef
261
262def ReturnNumber(): number
263 return 123
264enddef
265
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100266let g:notNumber = 'string'
267
268def ReturnGlobal(): number
269 return g:notNumber
270enddef
271
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200272def Test_return_something()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100273 assert_equal('string', ReturnString())
274 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100275 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100276enddef
277
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200278let s:nothing = 0
279def ReturnNothing()
280 s:nothing = 1
281 if true
282 return
283 endif
284 s:nothing = 2
285enddef
286
287def Test_return_nothing()
288 ReturnNothing()
289 assert_equal(1, s:nothing)
290enddef
291
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100292func Increment()
293 let g:counter += 1
294endfunc
295
296def Test_call_ufunc_count()
297 g:counter = 1
298 Increment()
299 Increment()
300 Increment()
301 " works with and without :call
302 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100303 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100304 unlet g:counter
305enddef
306
307def MyVarargs(arg: string, ...rest: list<string>): string
308 let res = arg
309 for s in rest
310 res ..= ',' .. s
311 endfor
312 return res
313enddef
314
315def Test_call_varargs()
316 assert_equal('one', MyVarargs('one'))
317 assert_equal('one,two', MyVarargs('one', 'two'))
318 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
319enddef
320
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100321def MyDefaultArgs(name = 'string'): string
322 return name
323enddef
324
325def Test_call_default_args()
326 assert_equal('string', MyDefaultArgs())
327 assert_equal('one', MyDefaultArgs('one'))
328 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
329enddef
330
331func Test_call_default_args_from_func()
332 call assert_equal('string', MyDefaultArgs())
333 call assert_equal('one', MyDefaultArgs('one'))
334 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
335endfunc
336
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100337func TakesOneArg(arg)
338 echo a:arg
339endfunc
340
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200341def Test_call_wrong_args()
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100342 call CheckDefFailure(['TakesOneArg()'], 'E119:')
343 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200344 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100345enddef
346
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100347" Default arg and varargs
348def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
349 let res = one .. ',' .. two
350 for s in rest
351 res ..= ',' .. s
352 endfor
353 return res
354enddef
355
356def Test_call_def_varargs()
357 call assert_fails('call MyDefVarargs()', 'E119:')
358 assert_equal('one,foo', MyDefVarargs('one'))
359 assert_equal('one,two', MyDefVarargs('one', 'two'))
360 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
361enddef
362
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100363def Test_using_var_as_arg()
364 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
365 call assert_fails('so Xdef', 'E1006:')
366 call delete('Xdef')
367enddef
368
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100369def Test_call_func_defined_later()
370 call assert_equal('one', DefinedLater('one'))
371 call assert_fails('call NotDefined("one")', 'E117:')
372enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100373
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100374func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100375 return a:arg
376endfunc
377
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100378def FuncWithForwardCall()
379 return DefinedEvenLater("yes")
380enddef
381
382def DefinedEvenLater(arg: string): string
383 return arg
384enddef
385
386def Test_error_in_nested_function()
387 " Error in called function requires unwinding the call stack.
388 assert_fails('call FuncWithForwardCall()', 'E1029')
389enddef
390
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100392 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
393 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
394 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
395 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100396
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200397 CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
398
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100399 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
400 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100401enddef
402
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100403def Test_arg_type_wrong()
404 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
405enddef
406
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100407def Test_try_catch()
408 let l = []
409 try
410 add(l, '1')
411 throw 'wrong'
412 add(l, '2')
413 catch
414 add(l, v:exception)
415 finally
416 add(l, '3')
417 endtry
418 assert_equal(['1', 'wrong', '3'], l)
419enddef
420
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100421def ThrowFromDef()
422 throw 'getout'
423enddef
424
425func CatchInFunc()
426 try
427 call ThrowFromDef()
428 catch
429 let g:thrown_func = v:exception
430 endtry
431endfunc
432
433def CatchInDef()
434 try
435 ThrowFromDef()
436 catch
437 g:thrown_def = v:exception
438 endtry
439enddef
440
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100441def ReturnFinally(): string
442 try
443 return 'intry'
444 finally
445 g:in_finally = 'finally'
446 endtry
447 return 'end'
448enddef
449
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100450def Test_try_catch_nested()
451 CatchInFunc()
452 assert_equal('getout', g:thrown_func)
453
454 CatchInDef()
455 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100456
457 assert_equal('intry', ReturnFinally())
458 assert_equal('finally', g:in_finally)
459enddef
460
461def Test_try_catch_match()
462 let seq = 'a'
463 try
464 throw 'something'
465 catch /nothing/
466 seq ..= 'x'
467 catch /some/
468 seq ..= 'b'
469 catch /asdf/
470 seq ..= 'x'
471 finally
472 seq ..= 'c'
473 endtry
474 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100475enddef
476
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100477let s:export_script_lines =<< trim END
478 vim9script
479 let name: string = 'bob'
480 def Concat(arg: string): string
481 return name .. arg
482 enddef
483 let g:result = Concat('bie')
484 let g:localname = name
485
486 export const CONST = 1234
487 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100488 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100489 export def Exported(): string
490 return 'Exported'
491 enddef
492END
493
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100494def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100495 let import_script_lines =<< trim END
496 vim9script
497 import {exported, Exported} from './Xexport.vim'
498 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100499 exported += 3
500 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100501 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100502
503 import {exp_name} from './Xexport.vim'
504 g:imported_name = exp_name
505 exp_name ..= ' Doe'
506 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100507 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100508 END
509
510 writefile(import_script_lines, 'Ximport.vim')
511 writefile(s:export_script_lines, 'Xexport.vim')
512
513 source Ximport.vim
514
515 assert_equal('bobbie', g:result)
516 assert_equal('bob', g:localname)
517 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100518 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100519 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100520 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100521 assert_equal('John', g:imported_name)
522 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100523 assert_false(exists('g:name'))
524
525 unlet g:result
526 unlet g:localname
527 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100528 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100529 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100530 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100531 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100532 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100533
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100534 let import_in_def_lines =<< trim END
535 vim9script
536 def ImportInDef()
537 import exported from './Xexport.vim'
538 g:imported = exported
539 exported += 7
540 g:imported_added = exported
541 enddef
542 ImportInDef()
543 END
544 writefile(import_in_def_lines, 'Ximport2.vim')
545 source Ximport2.vim
546 " TODO: this should be 9879
547 assert_equal(9876, g:imported)
548 assert_equal(9883, g:imported_added)
549 unlet g:imported
550 unlet g:imported_added
551 delete('Ximport2.vim')
552
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100553 let import_star_as_lines =<< trim END
554 vim9script
555 import * as Export from './Xexport.vim'
556 def UseExport()
557 g:imported = Export.exported
558 enddef
559 UseExport()
560 END
561 writefile(import_star_as_lines, 'Ximport.vim')
562 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100563 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100564
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100565 let import_star_as_lines_no_dot =<< trim END
566 vim9script
567 import * as Export from './Xexport.vim'
568 def Func()
569 let dummy = 1
570 let imported = Export + dummy
571 enddef
572 END
573 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
574 assert_fails('source Ximport.vim', 'E1060:')
575
576 let import_star_as_lines_dot_space =<< trim END
577 vim9script
578 import * as Export from './Xexport.vim'
579 def Func()
580 let imported = Export . exported
581 enddef
582 END
583 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
584 assert_fails('source Ximport.vim', 'E1074:')
585
586 let import_star_as_lines_missing_name =<< trim END
587 vim9script
588 import * as Export from './Xexport.vim'
589 def Func()
590 let imported = Export.
591 enddef
592 END
593 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
594 assert_fails('source Ximport.vim', 'E1048:')
595
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100596 let import_star_lines =<< trim END
597 vim9script
598 import * from './Xexport.vim'
599 g:imported = exported
600 END
601 writefile(import_star_lines, 'Ximport.vim')
602 assert_fails('source Ximport.vim', 'E1045:')
603
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100604 " try to import something that exists but is not exported
605 let import_not_exported_lines =<< trim END
606 vim9script
607 import name from './Xexport.vim'
608 END
609 writefile(import_not_exported_lines, 'Ximport.vim')
610 assert_fails('source Ximport.vim', 'E1049:')
611
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100612 " try to import something that is already defined
613 let import_already_defined =<< trim END
614 vim9script
615 let exported = 'something'
616 import exported from './Xexport.vim'
617 END
618 writefile(import_already_defined, 'Ximport.vim')
619 assert_fails('source Ximport.vim', 'E1073:')
620
621 " try to import something that is already defined
622 import_already_defined =<< trim END
623 vim9script
624 let exported = 'something'
625 import * as exported from './Xexport.vim'
626 END
627 writefile(import_already_defined, 'Ximport.vim')
628 assert_fails('source Ximport.vim', 'E1073:')
629
630 " try to import something that is already defined
631 import_already_defined =<< trim END
632 vim9script
633 let exported = 'something'
634 import {exported} from './Xexport.vim'
635 END
636 writefile(import_already_defined, 'Ximport.vim')
637 assert_fails('source Ximport.vim', 'E1073:')
638
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100639 " import a very long name, requires making a copy
640 let import_long_name_lines =<< trim END
641 vim9script
642 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
643 END
644 writefile(import_long_name_lines, 'Ximport.vim')
645 assert_fails('source Ximport.vim', 'E1048:')
646
647 let import_no_from_lines =<< trim END
648 vim9script
649 import name './Xexport.vim'
650 END
651 writefile(import_no_from_lines, 'Ximport.vim')
652 assert_fails('source Ximport.vim', 'E1070:')
653
654 let import_invalid_string_lines =<< trim END
655 vim9script
656 import name from Xexport.vim
657 END
658 writefile(import_invalid_string_lines, 'Ximport.vim')
659 assert_fails('source Ximport.vim', 'E1071:')
660
661 let import_wrong_name_lines =<< trim END
662 vim9script
663 import name from './XnoExport.vim'
664 END
665 writefile(import_wrong_name_lines, 'Ximport.vim')
666 assert_fails('source Ximport.vim', 'E1053:')
667
668 let import_missing_comma_lines =<< trim END
669 vim9script
670 import {exported name} from './Xexport.vim'
671 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100672 writefile(import_missing_comma_lines, 'Ximport3.vim')
673 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100674
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100675 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100676 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100677 delete('Xexport.vim')
678
Bram Moolenaar750802b2020-02-23 18:08:33 +0100679 " Check that in a Vim9 script 'cpo' is set to the Vim default.
680 set cpo&vi
681 let cpo_before = &cpo
682 let lines =<< trim END
683 vim9script
684 g:cpo_in_vim9script = &cpo
685 END
686 writefile(lines, 'Xvim9_script')
687 source Xvim9_script
688 assert_equal(cpo_before, &cpo)
689 set cpo&vim
690 assert_equal(&cpo, g:cpo_in_vim9script)
691 delete('Xvim9_script')
692enddef
693
694def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100695 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
696 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100697 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100698 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100699 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
700 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
701
702 assert_fails('vim9script', 'E1038')
703 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100704enddef
705
706def Test_vim9script_call()
707 let lines =<< trim END
708 vim9script
709 let var = ''
710 def MyFunc(arg: string)
711 var = arg
712 enddef
713 MyFunc('foobar')
714 assert_equal('foobar', var)
715
716 let str = 'barfoo'
717 str->MyFunc()
718 assert_equal('barfoo', var)
719
720 let g:value = 'value'
721 g:value->MyFunc()
722 assert_equal('value', var)
723
724 let listvar = []
725 def ListFunc(arg: list<number>)
726 listvar = arg
727 enddef
728 [1, 2, 3]->ListFunc()
729 assert_equal([1, 2, 3], listvar)
730
731 let dictvar = {}
732 def DictFunc(arg: dict<number>)
733 dictvar = arg
734 enddef
735 {'a': 1, 'b': 2}->DictFunc()
736 assert_equal(#{a: 1, b: 2}, dictvar)
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100737 def CompiledDict()
738 {'a': 3, 'b': 4}->DictFunc()
739 enddef
740 CompiledDict()
741 assert_equal(#{a: 3, b: 4}, dictvar)
742
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100743 #{a: 3, b: 4}->DictFunc()
744 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100745
746 ('text')->MyFunc()
747 assert_equal('text', var)
748 ("some")->MyFunc()
749 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100750 END
751 writefile(lines, 'Xcall.vim')
752 source Xcall.vim
753 delete('Xcall.vim')
754enddef
755
756def Test_vim9script_call_fail_decl()
757 let lines =<< trim END
758 vim9script
759 let var = ''
760 def MyFunc(arg: string)
761 let var = 123
762 enddef
763 END
764 writefile(lines, 'Xcall_decl.vim')
765 assert_fails('source Xcall_decl.vim', 'E1054:')
766 delete('Xcall_decl.vim')
767enddef
768
769def Test_vim9script_call_fail_const()
770 let lines =<< trim END
771 vim9script
772 const var = ''
773 def MyFunc(arg: string)
774 var = 'asdf'
775 enddef
776 END
777 writefile(lines, 'Xcall_const.vim')
778 assert_fails('source Xcall_const.vim', 'E46:')
779 delete('Xcall_const.vim')
780enddef
781
782def Test_vim9script_reload()
783 let lines =<< trim END
784 vim9script
785 const var = ''
786 let valone = 1234
787 def MyFunc(arg: string)
788 valone = 5678
789 enddef
790 END
791 let morelines =<< trim END
792 let valtwo = 222
793 export def GetValtwo(): number
794 return valtwo
795 enddef
796 END
797 writefile(lines + morelines, 'Xreload.vim')
798 source Xreload.vim
799 source Xreload.vim
800 source Xreload.vim
801
802 let testlines =<< trim END
803 vim9script
804 def TheFunc()
805 import GetValtwo from './Xreload.vim'
806 assert_equal(222, GetValtwo())
807 enddef
808 TheFunc()
809 END
810 writefile(testlines, 'Ximport.vim')
811 source Ximport.vim
812
813 " test that when not using "morelines" valtwo is still defined
814 " need to source Xreload.vim again, import doesn't reload a script
815 writefile(lines, 'Xreload.vim')
816 source Xreload.vim
817 source Ximport.vim
818
819 " cannot declare a var twice
820 lines =<< trim END
821 vim9script
822 let valone = 1234
823 let valone = 5678
824 END
825 writefile(lines, 'Xreload.vim')
826 assert_fails('source Xreload.vim', 'E1041:')
827
828 delete('Xreload.vim')
829 delete('Ximport.vim')
830enddef
831
832def Test_import_absolute()
833 let import_lines = [
834 \ 'vim9script',
835 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100836 \ 'def UseExported()',
837 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100838 \ ' exported = 8888',
839 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100840 \ 'enddef',
841 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100842 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100843 \ ]
844 writefile(import_lines, 'Ximport_abs.vim')
845 writefile(s:export_script_lines, 'Xexport_abs.vim')
846
847 source Ximport_abs.vim
848
849 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100850 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100851 assert_match('<SNR>\d\+_UseExported.*'
852 \ .. 'g:imported_abs = exported.*'
853 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100854 \ .. '1 STOREG g:imported_abs.*'
855 \ .. 'exported = 8888.*'
856 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
857 \ .. 'g:imported_after = exported.*'
858 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
859 \ .. '5 STOREG g:imported_after.*'
860 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100861 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100862 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100863
864 delete('Ximport_abs.vim')
865 delete('Xexport_abs.vim')
866enddef
867
868def Test_import_rtp()
869 let import_lines = [
870 \ 'vim9script',
871 \ 'import exported from "Xexport_rtp.vim"',
872 \ 'g:imported_rtp = exported',
873 \ ]
874 writefile(import_lines, 'Ximport_rtp.vim')
875 mkdir('import')
876 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
877
878 let save_rtp = &rtp
879 &rtp = getcwd()
880 source Ximport_rtp.vim
881 &rtp = save_rtp
882
883 assert_equal(9876, g:imported_rtp)
884 unlet g:imported_rtp
885
886 delete('Ximport_rtp.vim')
887 delete('import/Xexport_rtp.vim')
888 delete('import', 'd')
889enddef
890
891def Test_fixed_size_list()
892 " will be allocated as one piece of memory, check that changes work
893 let l = [1, 2, 3, 4]
894 l->remove(0)
895 l->add(5)
896 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100897 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100898enddef
899
Bram Moolenaar673660a2020-01-26 16:50:05 +0100900" Test that inside :function a Python function can be defined, :def is not
901" recognized.
902func Test_function_python()
903 CheckFeature python3
904 let py = 'python3'
905 execute py "<< EOF"
906def do_something():
907 return 1
908EOF
909endfunc
910
Bram Moolenaar158906c2020-02-06 20:39:45 +0100911def IfElse(what: number): string
912 let res = ''
913 if what == 1
914 res = "one"
915 elseif what == 2
916 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100917 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100918 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100919 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100920 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100921enddef
922
Bram Moolenaar158906c2020-02-06 20:39:45 +0100923def Test_if_elseif_else()
924 assert_equal('one', IfElse(1))
925 assert_equal('two', IfElse(2))
926 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100927enddef
928
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100929let g:bool_true = v:true
930let g:bool_false = v:false
931
932def Test_if_const_expr()
933 let res = false
934 if true ? true : false
935 res = true
936 endif
937 assert_equal(true, res)
938
939 res = false
940 if g:bool_true ? true : false
941 res = true
942 endif
943 assert_equal(true, res)
944
945 res = false
946 if true ? g:bool_true : false
947 res = true
948 endif
949 assert_equal(true, res)
950
951 res = false
952 if true ? true : g:bool_false
953 res = true
954 endif
955 assert_equal(true, res)
956
957 res = false
958 if true ? false : true
959 res = true
960 endif
961 assert_equal(false, res)
962
963 res = false
964 if false ? false : true
965 res = true
966 endif
967 assert_equal(true, res)
968
969 res = false
970 if false ? true : false
971 res = true
972 endif
973 assert_equal(false, res)
974
975 res = false
976 if true && true
977 res = true
978 endif
979 assert_equal(true, res)
980
981 res = false
982 if true && false
983 res = true
984 endif
985 assert_equal(false, res)
986
987 res = false
988 if g:bool_true && false
989 res = true
990 endif
991 assert_equal(false, res)
992
993 res = false
994 if true && g:bool_false
995 res = true
996 endif
997 assert_equal(false, res)
998
999 res = false
1000 if false && false
1001 res = true
1002 endif
1003 assert_equal(false, res)
1004
1005 res = false
1006 if true || false
1007 res = true
1008 endif
1009 assert_equal(true, res)
1010
1011 res = false
1012 if g:bool_true || false
1013 res = true
1014 endif
1015 assert_equal(true, res)
1016
1017 res = false
1018 if true || g:bool_false
1019 res = true
1020 endif
1021 assert_equal(true, res)
1022
1023 res = false
1024 if false || false
1025 res = true
1026 endif
1027 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001028enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001029
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001030def Test_if_const_expr_fails()
1031 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1032 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001033enddef
1034
Bram Moolenaar63ce4842020-02-19 15:46:48 +01001035def Test_delfunc()
1036 let lines =<< trim END
1037 vim9script
1038 def GoneSoon()
1039 echo 'hello'
1040 enddef
1041
1042 def CallGoneSoon()
1043 GoneSoon()
1044 enddef
1045
1046 delfunc GoneSoon
1047 CallGoneSoon()
1048 END
1049 writefile(lines, 'XToDelFunc')
1050 assert_fails('so XToDelFunc', 'E933')
1051 assert_fails('so XToDelFunc', 'E933')
1052
1053 delete('XToDelFunc')
1054enddef
1055
Bram Moolenaarad39c092020-02-26 18:23:43 +01001056def Test_execute_cmd()
1057 new
1058 setline(1, 'default')
1059 execute 'call setline(1, "execute-string")'
1060 assert_equal('execute-string', getline(1))
1061 let cmd1 = 'call setline(1,'
1062 let cmd2 = '"execute-var")'
1063 execute cmd1 cmd2
1064 assert_equal('execute-var', getline(1))
1065 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1066 assert_equal('execute-var-string', getline(1))
1067 let cmd_first = 'call '
1068 let cmd_last = 'setline(1, "execute-var-var")'
1069 execute cmd_first .. cmd_last
1070 assert_equal('execute-var-var', getline(1))
1071 bwipe!
1072enddef
1073
1074def Test_echo_cmd()
1075 echo 'something'
1076 assert_match('^something$', Screenline(&lines))
1077
1078 let str1 = 'some'
1079 let str2 = 'more'
1080 echo str1 str2
1081 assert_match('^some more$', Screenline(&lines))
1082enddef
1083
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001084def Test_for_outside_of_function()
1085 let lines =<< trim END
1086 vim9script
1087 new
1088 for var in range(0, 3)
1089 append(line('$'), var)
1090 endfor
1091 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1092 bwipe!
1093 END
1094 writefile(lines, 'Xvim9for.vim')
1095 source Xvim9for.vim
1096 delete('Xvim9for.vim')
1097enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001098
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001099def Test_while_loop()
1100 let result = ''
1101 let cnt = 0
1102 while cnt < 555
1103 if cnt == 3
1104 break
1105 endif
1106 cnt += 1
1107 if cnt == 2
1108 continue
1109 endif
1110 result ..= cnt .. '_'
1111 endwhile
1112 assert_equal('1_3_', result)
1113enddef
1114
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001115def Test_for_loop_fails()
1116 call CheckDefFailure(['for # in range(5)'], 'E690:')
1117 call CheckDefFailure(['for i In range(5)'], 'E690:')
1118 call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1119 call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1120 call CheckDefFailure(['for i in "text"'], 'E1024:')
1121enddef
1122
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001123def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001124 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001125 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001126 try
1127 while 1
1128 x += 1
1129 if x == 100
1130 feedkeys("\<C-C>", 'Lt')
1131 endif
1132 endwhile
1133 catch
1134 caught = true
1135 assert_equal(100, x)
1136 endtry
1137 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001138enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001139
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001140def Test_substitute_cmd()
1141 new
1142 setline(1, 'something')
1143 :substitute(some(other(
1144 assert_equal('otherthing', getline(1))
1145 bwipe!
1146
1147 " also when the context is Vim9 script
1148 let lines =<< trim END
1149 vim9script
1150 new
1151 setline(1, 'something')
1152 :substitute(some(other(
1153 assert_equal('otherthing', getline(1))
1154 bwipe!
1155 END
1156 writefile(lines, 'Xvim9lines')
1157 source Xvim9lines
1158
1159 delete('Xvim9lines')
1160enddef
1161
Bram Moolenaar20431c92020-03-20 18:39:46 +01001162def Test_redef_failure()
1163 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
1164 so Xdef
1165 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
1166 so Xdef
1167 call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
1168 call assert_fails('so Xdef', 'E1027:')
1169 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
1170 so Xdef
1171 call delete('Xdef')
1172
1173 call assert_equal(0, Func0())
1174 call assert_equal('Func1', Func1())
1175 call assert_equal('Func2', Func2())
1176
1177 delfunc! Func0
1178 delfunc! Func1
1179 delfunc! Func2
1180enddef
1181
Bram Moolenaar7d941ee2020-03-26 14:11:58 +01001182" Test for internal functions returning different types
1183func Test_InternalFuncRetType()
1184 let lines =<< trim END
1185 def RetFloat(): float
1186 return ceil(1.456)
1187 enddef
1188
1189 def RetListAny(): list<any>
1190 return items({'k' : 'v'})
1191 enddef
1192
1193 def RetListString(): list<string>
1194 return split('a:b:c', ':')
1195 enddef
1196
1197 def RetListDictAny(): list<dict<any>>
1198 return getbufinfo()
1199 enddef
1200
1201 def RetDictNumber(): dict<number>
1202 return wordcount()
1203 enddef
1204
1205 def RetDictString(): dict<string>
1206 return environ()
1207 enddef
1208 END
1209 call writefile(lines, 'Xscript')
1210 source Xscript
1211
1212 call assert_equal(2.0, RetFloat())
1213 call assert_equal([['k', 'v']], RetListAny())
1214 call assert_equal(['a', 'b', 'c'], RetListString())
1215 call assert_notequal([], RetListDictAny())
1216 call assert_notequal({}, RetDictNumber())
1217 call assert_notequal({}, RetDictString())
1218 call delete('Xscript')
1219endfunc
1220
1221" Test for passing too many or too few arguments to internal functions
1222func Test_internalfunc_arg_error()
1223 let l =<< trim END
1224 def! FArgErr(): float
1225 return ceil(1.1, 2)
1226 enddef
1227 END
1228 call writefile(l, 'Xinvalidarg')
1229 call assert_fails('so Xinvalidarg', 'E118:')
1230 let l =<< trim END
1231 def! FArgErr(): float
1232 return ceil()
1233 enddef
1234 END
1235 call writefile(l, 'Xinvalidarg')
1236 call assert_fails('so Xinvalidarg', 'E119:')
1237 call delete('Xinvalidarg')
1238endfunc
1239
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001240" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker