blob: d5e42e8dc5b0ade31b2822924210e925c559d8a7 [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 Moolenaar6e587dc2020-02-06 13:15:52 +010034
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010035def Test_assignment()
36 let bool1: bool = true
37 assert_equal(v:true, bool1)
38 let bool2: bool = false
39 assert_equal(v:false, bool2)
40
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010041 let list1: list<bool> = [false, true, false]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010042 let list2: list<number> = [1, 2, 3]
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010043 let list3: list<string> = ['sdf', 'asdf']
44 let list4: list<any> = ['yes', true, 1234]
45 let list5: list<blob> = [0z01, 0z02]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010046
Bram Moolenaar436472f2020-02-20 22:54:43 +010047 let listS: list<string> = []
48 let listN: list<number> = []
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010049
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010050 let dict1: dict<bool> = #{one: false, two: true}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010051 let dict2: dict<number> = #{one: 1, two: 2}
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010052 let dict3: dict<string> = #{key: 'value'}
53 let dict4: dict<any> = #{one: 1, two: '2'}
54 let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010055
Bram Moolenaar42a480b2020-02-29 23:23:47 +010056 if has('channel')
57 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010058 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010059 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010060 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010061 if has('float')
62 let float1: float = 3.4
63 endif
Bram Moolenaar087d2e12020-03-01 15:36:42 +010064 let funky1: func
65 let funky2: func = function('len')
66 let party1: partial
67 let party2: partial = funcref('Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010068
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010069 " type becomes list<any>
70 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
71
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010072 g:newvar = 'new'
73 assert_equal('new', g:newvar)
74
75 assert_equal('yes', g:existing)
76 g:existing = 'no'
77 assert_equal('no', g:existing)
78
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010079 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010080 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010081
82 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010083 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010084 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010085
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010086 s:appendToMe ..= 'yyy'
87 assert_equal('xxxyyy', s:appendToMe)
88 s:addToMe += 222
89 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010090 s:newVar = 'new'
91 assert_equal('new', s:newVar)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010092enddef
93
94func Test_assignment_failure()
95 call CheckDefFailure(['let var=234'], 'E1004:')
96 call CheckDefFailure(['let var =234'], 'E1004:')
97 call CheckDefFailure(['let var= 234'], 'E1004:')
98
99 call CheckDefFailure(['let true = 1'], 'E1034:')
100 call CheckDefFailure(['let false = 1'], 'E1034:')
101
102 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
103 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
104
105 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
106 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
107
108 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
109 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100110
111 call CheckDefFailure(['let var: dict <number>'], 'E1007:')
112 call CheckDefFailure(['let var: dict<number'], 'E1009:')
113
114 call CheckDefFailure(['let var: ally'], 'E1010:')
115 call CheckDefFailure(['let var: bram'], 'E1010:')
116 call CheckDefFailure(['let var: cathy'], 'E1010:')
117 call CheckDefFailure(['let var: dom'], 'E1010:')
118 call CheckDefFailure(['let var: freddy'], 'E1010:')
119 call CheckDefFailure(['let var: john'], 'E1010:')
120 call CheckDefFailure(['let var: larry'], 'E1010:')
121 call CheckDefFailure(['let var: ned'], 'E1010:')
122 call CheckDefFailure(['let var: pam'], 'E1010:')
123 call CheckDefFailure(['let var: sam'], 'E1010:')
124 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100125endfunc
126
127func Test_const()
128 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
129 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
130 call CheckDefFailure(['const two'], 'E1021:')
131endfunc
132
133def Test_block()
134 let outer = 1
135 {
136 let inner = 2
137 assert_equal(1, outer)
138 assert_equal(2, inner)
139 }
140 assert_equal(1, outer)
141enddef
142
143func Test_block_failure()
144 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
145endfunc
146
147def ReturnString(): string
148 return 'string'
149enddef
150
151def ReturnNumber(): number
152 return 123
153enddef
154
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100155let g:notNumber = 'string'
156
157def ReturnGlobal(): number
158 return g:notNumber
159enddef
160
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100161def Test_return_string()
162 assert_equal('string', ReturnString())
163 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100164 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100165enddef
166
167func Increment()
168 let g:counter += 1
169endfunc
170
171def Test_call_ufunc_count()
172 g:counter = 1
173 Increment()
174 Increment()
175 Increment()
176 " works with and without :call
177 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100178 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100179 unlet g:counter
180enddef
181
182def MyVarargs(arg: string, ...rest: list<string>): string
183 let res = arg
184 for s in rest
185 res ..= ',' .. s
186 endfor
187 return res
188enddef
189
190def Test_call_varargs()
191 assert_equal('one', MyVarargs('one'))
192 assert_equal('one,two', MyVarargs('one', 'two'))
193 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
194enddef
195
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100196def MyDefaultArgs(name = 'string'): string
197 return name
198enddef
199
200def Test_call_default_args()
201 assert_equal('string', MyDefaultArgs())
202 assert_equal('one', MyDefaultArgs('one'))
203 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
204enddef
205
206func Test_call_default_args_from_func()
207 call assert_equal('string', MyDefaultArgs())
208 call assert_equal('one', MyDefaultArgs('one'))
209 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
210endfunc
211
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100212func TakesOneArg(arg)
213 echo a:arg
214endfunc
215
216def Test_call_wrong_arg_count()
217 call CheckDefFailure(['TakesOneArg()'], 'E119:')
218 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
219enddef
220
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100221" Default arg and varargs
222def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
223 let res = one .. ',' .. two
224 for s in rest
225 res ..= ',' .. s
226 endfor
227 return res
228enddef
229
230def Test_call_def_varargs()
231 call assert_fails('call MyDefVarargs()', 'E119:')
232 assert_equal('one,foo', MyDefVarargs('one'))
233 assert_equal('one,two', MyDefVarargs('one', 'two'))
234 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
235enddef
236
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100237def Test_using_var_as_arg()
238 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
239 call assert_fails('so Xdef', 'E1006:')
240 call delete('Xdef')
241enddef
242
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100243def Test_call_func_defined_later()
244 call assert_equal('one', DefinedLater('one'))
245 call assert_fails('call NotDefined("one")', 'E117:')
246enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100247
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100248func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100249 return a:arg
250endfunc
251
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100252def FuncWithForwardCall()
253 return DefinedEvenLater("yes")
254enddef
255
256def DefinedEvenLater(arg: string): string
257 return arg
258enddef
259
260def Test_error_in_nested_function()
261 " Error in called function requires unwinding the call stack.
262 assert_fails('call FuncWithForwardCall()', 'E1029')
263enddef
264
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100265def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100266 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
267 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
268 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
269 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100270enddef
271
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100272def Test_arg_type_wrong()
273 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
274enddef
275
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100276def Test_try_catch()
277 let l = []
278 try
279 add(l, '1')
280 throw 'wrong'
281 add(l, '2')
282 catch
283 add(l, v:exception)
284 finally
285 add(l, '3')
286 endtry
287 assert_equal(['1', 'wrong', '3'], l)
288enddef
289
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100290def ThrowFromDef()
291 throw 'getout'
292enddef
293
294func CatchInFunc()
295 try
296 call ThrowFromDef()
297 catch
298 let g:thrown_func = v:exception
299 endtry
300endfunc
301
302def CatchInDef()
303 try
304 ThrowFromDef()
305 catch
306 g:thrown_def = v:exception
307 endtry
308enddef
309
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100310def ReturnFinally(): string
311 try
312 return 'intry'
313 finally
314 g:in_finally = 'finally'
315 endtry
316 return 'end'
317enddef
318
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100319def Test_try_catch_nested()
320 CatchInFunc()
321 assert_equal('getout', g:thrown_func)
322
323 CatchInDef()
324 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100325
326 assert_equal('intry', ReturnFinally())
327 assert_equal('finally', g:in_finally)
328enddef
329
330def Test_try_catch_match()
331 let seq = 'a'
332 try
333 throw 'something'
334 catch /nothing/
335 seq ..= 'x'
336 catch /some/
337 seq ..= 'b'
338 catch /asdf/
339 seq ..= 'x'
340 finally
341 seq ..= 'c'
342 endtry
343 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100344enddef
345
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100346let s:export_script_lines =<< trim END
347 vim9script
348 let name: string = 'bob'
349 def Concat(arg: string): string
350 return name .. arg
351 enddef
352 let g:result = Concat('bie')
353 let g:localname = name
354
355 export const CONST = 1234
356 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100357 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100358 export def Exported(): string
359 return 'Exported'
360 enddef
361END
362
363def Test_vim9script()
364 let import_script_lines =<< trim END
365 vim9script
366 import {exported, Exported} from './Xexport.vim'
367 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100368 exported += 3
369 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100370 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100371
372 import {exp_name} from './Xexport.vim'
373 g:imported_name = exp_name
374 exp_name ..= ' Doe'
375 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100376 END
377
378 writefile(import_script_lines, 'Ximport.vim')
379 writefile(s:export_script_lines, 'Xexport.vim')
380
381 source Ximport.vim
382
383 assert_equal('bobbie', g:result)
384 assert_equal('bob', g:localname)
385 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100386 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100387 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100388 assert_equal('John', g:imported_name)
389 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100390 assert_false(exists('g:name'))
391
392 unlet g:result
393 unlet g:localname
394 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100395 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100396 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100397 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100398 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100399
400 let import_star_as_lines =<< trim END
401 vim9script
402 import * as Export from './Xexport.vim'
403 def UseExport()
404 g:imported = Export.exported
405 enddef
406 UseExport()
407 END
408 writefile(import_star_as_lines, 'Ximport.vim')
409 source Ximport.vim
410 assert_equal(9876, g:imported)
411
412 let import_star_lines =<< trim END
413 vim9script
414 import * from './Xexport.vim'
415 g:imported = exported
416 END
417 writefile(import_star_lines, 'Ximport.vim')
418 assert_fails('source Ximport.vim', 'E1045:')
419
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100420 " try to import something that exists but is not exported
421 let import_not_exported_lines =<< trim END
422 vim9script
423 import name from './Xexport.vim'
424 END
425 writefile(import_not_exported_lines, 'Ximport.vim')
426 assert_fails('source Ximport.vim', 'E1049:')
427
428 " import a very long name, requires making a copy
429 let import_long_name_lines =<< trim END
430 vim9script
431 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
432 END
433 writefile(import_long_name_lines, 'Ximport.vim')
434 assert_fails('source Ximport.vim', 'E1048:')
435
436 let import_no_from_lines =<< trim END
437 vim9script
438 import name './Xexport.vim'
439 END
440 writefile(import_no_from_lines, 'Ximport.vim')
441 assert_fails('source Ximport.vim', 'E1070:')
442
443 let import_invalid_string_lines =<< trim END
444 vim9script
445 import name from Xexport.vim
446 END
447 writefile(import_invalid_string_lines, 'Ximport.vim')
448 assert_fails('source Ximport.vim', 'E1071:')
449
450 let import_wrong_name_lines =<< trim END
451 vim9script
452 import name from './XnoExport.vim'
453 END
454 writefile(import_wrong_name_lines, 'Ximport.vim')
455 assert_fails('source Ximport.vim', 'E1053:')
456
457 let import_missing_comma_lines =<< trim END
458 vim9script
459 import {exported name} from './Xexport.vim'
460 END
461 writefile(import_missing_comma_lines, 'Ximport.vim')
462 assert_fails('source Ximport.vim', 'E1046:')
463
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100464 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100465 delete('Xexport.vim')
466
Bram Moolenaar750802b2020-02-23 18:08:33 +0100467 " Check that in a Vim9 script 'cpo' is set to the Vim default.
468 set cpo&vi
469 let cpo_before = &cpo
470 let lines =<< trim END
471 vim9script
472 g:cpo_in_vim9script = &cpo
473 END
474 writefile(lines, 'Xvim9_script')
475 source Xvim9_script
476 assert_equal(cpo_before, &cpo)
477 set cpo&vim
478 assert_equal(&cpo, g:cpo_in_vim9script)
479 delete('Xvim9_script')
480enddef
481
482def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100483 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
484 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100485 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100486 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100487 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
488 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
489
490 assert_fails('vim9script', 'E1038')
491 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100492enddef
493
494def Test_vim9script_call()
495 let lines =<< trim END
496 vim9script
497 let var = ''
498 def MyFunc(arg: string)
499 var = arg
500 enddef
501 MyFunc('foobar')
502 assert_equal('foobar', var)
503
504 let str = 'barfoo'
505 str->MyFunc()
506 assert_equal('barfoo', var)
507
508 let g:value = 'value'
509 g:value->MyFunc()
510 assert_equal('value', var)
511
512 let listvar = []
513 def ListFunc(arg: list<number>)
514 listvar = arg
515 enddef
516 [1, 2, 3]->ListFunc()
517 assert_equal([1, 2, 3], listvar)
518
519 let dictvar = {}
520 def DictFunc(arg: dict<number>)
521 dictvar = arg
522 enddef
523 {'a': 1, 'b': 2}->DictFunc()
524 assert_equal(#{a: 1, b: 2}, dictvar)
525 #{a: 3, b: 4}->DictFunc()
526 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100527
528 ('text')->MyFunc()
529 assert_equal('text', var)
530 ("some")->MyFunc()
531 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100532 END
533 writefile(lines, 'Xcall.vim')
534 source Xcall.vim
535 delete('Xcall.vim')
536enddef
537
538def Test_vim9script_call_fail_decl()
539 let lines =<< trim END
540 vim9script
541 let var = ''
542 def MyFunc(arg: string)
543 let var = 123
544 enddef
545 END
546 writefile(lines, 'Xcall_decl.vim')
547 assert_fails('source Xcall_decl.vim', 'E1054:')
548 delete('Xcall_decl.vim')
549enddef
550
551def Test_vim9script_call_fail_const()
552 let lines =<< trim END
553 vim9script
554 const var = ''
555 def MyFunc(arg: string)
556 var = 'asdf'
557 enddef
558 END
559 writefile(lines, 'Xcall_const.vim')
560 assert_fails('source Xcall_const.vim', 'E46:')
561 delete('Xcall_const.vim')
562enddef
563
564def Test_vim9script_reload()
565 let lines =<< trim END
566 vim9script
567 const var = ''
568 let valone = 1234
569 def MyFunc(arg: string)
570 valone = 5678
571 enddef
572 END
573 let morelines =<< trim END
574 let valtwo = 222
575 export def GetValtwo(): number
576 return valtwo
577 enddef
578 END
579 writefile(lines + morelines, 'Xreload.vim')
580 source Xreload.vim
581 source Xreload.vim
582 source Xreload.vim
583
584 let testlines =<< trim END
585 vim9script
586 def TheFunc()
587 import GetValtwo from './Xreload.vim'
588 assert_equal(222, GetValtwo())
589 enddef
590 TheFunc()
591 END
592 writefile(testlines, 'Ximport.vim')
593 source Ximport.vim
594
595 " test that when not using "morelines" valtwo is still defined
596 " need to source Xreload.vim again, import doesn't reload a script
597 writefile(lines, 'Xreload.vim')
598 source Xreload.vim
599 source Ximport.vim
600
601 " cannot declare a var twice
602 lines =<< trim END
603 vim9script
604 let valone = 1234
605 let valone = 5678
606 END
607 writefile(lines, 'Xreload.vim')
608 assert_fails('source Xreload.vim', 'E1041:')
609
610 delete('Xreload.vim')
611 delete('Ximport.vim')
612enddef
613
614def Test_import_absolute()
615 let import_lines = [
616 \ 'vim9script',
617 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100618 \ 'def UseExported()',
619 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100620 \ ' exported = 8888',
621 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100622 \ 'enddef',
623 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100624 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100625 \ ]
626 writefile(import_lines, 'Ximport_abs.vim')
627 writefile(s:export_script_lines, 'Xexport_abs.vim')
628
629 source Ximport_abs.vim
630
631 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100632 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100633 assert_match('<SNR>\d\+_UseExported.*'
634 \ .. 'g:imported_abs = exported.*'
635 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100636 \ .. '1 STOREG g:imported_abs.*'
637 \ .. 'exported = 8888.*'
638 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
639 \ .. 'g:imported_after = exported.*'
640 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
641 \ .. '5 STOREG g:imported_after.*'
642 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100643 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100644 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100645
646 delete('Ximport_abs.vim')
647 delete('Xexport_abs.vim')
648enddef
649
650def Test_import_rtp()
651 let import_lines = [
652 \ 'vim9script',
653 \ 'import exported from "Xexport_rtp.vim"',
654 \ 'g:imported_rtp = exported',
655 \ ]
656 writefile(import_lines, 'Ximport_rtp.vim')
657 mkdir('import')
658 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
659
660 let save_rtp = &rtp
661 &rtp = getcwd()
662 source Ximport_rtp.vim
663 &rtp = save_rtp
664
665 assert_equal(9876, g:imported_rtp)
666 unlet g:imported_rtp
667
668 delete('Ximport_rtp.vim')
669 delete('import/Xexport_rtp.vim')
670 delete('import', 'd')
671enddef
672
673def Test_fixed_size_list()
674 " will be allocated as one piece of memory, check that changes work
675 let l = [1, 2, 3, 4]
676 l->remove(0)
677 l->add(5)
678 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100679 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100680enddef
681
Bram Moolenaar673660a2020-01-26 16:50:05 +0100682" Test that inside :function a Python function can be defined, :def is not
683" recognized.
684func Test_function_python()
685 CheckFeature python3
686 let py = 'python3'
687 execute py "<< EOF"
688def do_something():
689 return 1
690EOF
691endfunc
692
Bram Moolenaar158906c2020-02-06 20:39:45 +0100693def IfElse(what: number): string
694 let res = ''
695 if what == 1
696 res = "one"
697 elseif what == 2
698 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100699 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100700 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100701 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100702 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100703enddef
704
Bram Moolenaar158906c2020-02-06 20:39:45 +0100705def Test_if_elseif_else()
706 assert_equal('one', IfElse(1))
707 assert_equal('two', IfElse(2))
708 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100709enddef
710
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100711def Test_delfunc()
712 let lines =<< trim END
713 vim9script
714 def GoneSoon()
715 echo 'hello'
716 enddef
717
718 def CallGoneSoon()
719 GoneSoon()
720 enddef
721
722 delfunc GoneSoon
723 CallGoneSoon()
724 END
725 writefile(lines, 'XToDelFunc')
726 assert_fails('so XToDelFunc', 'E933')
727 assert_fails('so XToDelFunc', 'E933')
728
729 delete('XToDelFunc')
730enddef
731
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100732def Test_substitute_cmd()
733 new
734 setline(1, 'something')
735 :substitute(some(other(
736 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100737 bwipe!
738
739 " also when the context is Vim9 script
740 let lines =<< trim END
741 vim9script
742 new
743 setline(1, 'something')
744 :substitute(some(other(
745 assert_equal('otherthing', getline(1))
746 bwipe!
747 END
748 writefile(lines, 'Xvim9lines')
749 source Xvim9lines
750
751 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100752enddef
753
Bram Moolenaarad39c092020-02-26 18:23:43 +0100754def Test_execute_cmd()
755 new
756 setline(1, 'default')
757 execute 'call setline(1, "execute-string")'
758 assert_equal('execute-string', getline(1))
759 let cmd1 = 'call setline(1,'
760 let cmd2 = '"execute-var")'
761 execute cmd1 cmd2
762 assert_equal('execute-var', getline(1))
763 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
764 assert_equal('execute-var-string', getline(1))
765 let cmd_first = 'call '
766 let cmd_last = 'setline(1, "execute-var-var")'
767 execute cmd_first .. cmd_last
768 assert_equal('execute-var-var', getline(1))
769 bwipe!
770enddef
771
772def Test_echo_cmd()
773 echo 'something'
774 assert_match('^something$', Screenline(&lines))
775
776 let str1 = 'some'
777 let str2 = 'more'
778 echo str1 str2
779 assert_match('^some more$', Screenline(&lines))
780enddef
781
Bram Moolenaar41fe0612020-03-01 16:22:40 +0100782def Test_for_outside_of_function()
783 let lines =<< trim END
784 vim9script
785 new
786 for var in range(0, 3)
787 append(line('$'), var)
788 endfor
789 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
790 bwipe!
791 END
792 writefile(lines, 'Xvim9for.vim')
793 source Xvim9for.vim
794 delete('Xvim9for.vim')
795enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100796
797" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker