blob: ac8bd7512fe3c6c416d07bf6b478967ba1511b4b [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
58 endif
59
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010060 g:newvar = 'new'
61 assert_equal('new', g:newvar)
62
63 assert_equal('yes', g:existing)
64 g:existing = 'no'
65 assert_equal('no', g:existing)
66
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010067 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010068 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010069
70 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010071 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010072 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010073
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010074 s:appendToMe ..= 'yyy'
75 assert_equal('xxxyyy', s:appendToMe)
76 s:addToMe += 222
77 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010078 s:newVar = 'new'
79 assert_equal('new', s:newVar)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010080enddef
81
82func Test_assignment_failure()
83 call CheckDefFailure(['let var=234'], 'E1004:')
84 call CheckDefFailure(['let var =234'], 'E1004:')
85 call CheckDefFailure(['let var= 234'], 'E1004:')
86
87 call CheckDefFailure(['let true = 1'], 'E1034:')
88 call CheckDefFailure(['let false = 1'], 'E1034:')
89
90 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
91 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
92
93 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
94 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
95
96 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
97 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010098
99 call CheckDefFailure(['let var: dict <number>'], 'E1007:')
100 call CheckDefFailure(['let var: dict<number'], 'E1009:')
101
102 call CheckDefFailure(['let var: ally'], 'E1010:')
103 call CheckDefFailure(['let var: bram'], 'E1010:')
104 call CheckDefFailure(['let var: cathy'], 'E1010:')
105 call CheckDefFailure(['let var: dom'], 'E1010:')
106 call CheckDefFailure(['let var: freddy'], 'E1010:')
107 call CheckDefFailure(['let var: john'], 'E1010:')
108 call CheckDefFailure(['let var: larry'], 'E1010:')
109 call CheckDefFailure(['let var: ned'], 'E1010:')
110 call CheckDefFailure(['let var: pam'], 'E1010:')
111 call CheckDefFailure(['let var: sam'], 'E1010:')
112 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100113endfunc
114
115func Test_const()
116 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
117 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
118 call CheckDefFailure(['const two'], 'E1021:')
119endfunc
120
121def Test_block()
122 let outer = 1
123 {
124 let inner = 2
125 assert_equal(1, outer)
126 assert_equal(2, inner)
127 }
128 assert_equal(1, outer)
129enddef
130
131func Test_block_failure()
132 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
133endfunc
134
135def ReturnString(): string
136 return 'string'
137enddef
138
139def ReturnNumber(): number
140 return 123
141enddef
142
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100143let g:notNumber = 'string'
144
145def ReturnGlobal(): number
146 return g:notNumber
147enddef
148
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100149def Test_return_string()
150 assert_equal('string', ReturnString())
151 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100152 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100153enddef
154
155func Increment()
156 let g:counter += 1
157endfunc
158
159def Test_call_ufunc_count()
160 g:counter = 1
161 Increment()
162 Increment()
163 Increment()
164 " works with and without :call
165 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100166 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100167 unlet g:counter
168enddef
169
170def MyVarargs(arg: string, ...rest: list<string>): string
171 let res = arg
172 for s in rest
173 res ..= ',' .. s
174 endfor
175 return res
176enddef
177
178def Test_call_varargs()
179 assert_equal('one', MyVarargs('one'))
180 assert_equal('one,two', MyVarargs('one', 'two'))
181 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
182enddef
183
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100184def MyDefaultArgs(name = 'string'): string
185 return name
186enddef
187
188def Test_call_default_args()
189 assert_equal('string', MyDefaultArgs())
190 assert_equal('one', MyDefaultArgs('one'))
191 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
192enddef
193
194func Test_call_default_args_from_func()
195 call assert_equal('string', MyDefaultArgs())
196 call assert_equal('one', MyDefaultArgs('one'))
197 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
198endfunc
199
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100200func TakesOneArg(arg)
201 echo a:arg
202endfunc
203
204def Test_call_wrong_arg_count()
205 call CheckDefFailure(['TakesOneArg()'], 'E119:')
206 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
207enddef
208
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100209" Default arg and varargs
210def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
211 let res = one .. ',' .. two
212 for s in rest
213 res ..= ',' .. s
214 endfor
215 return res
216enddef
217
218def Test_call_def_varargs()
219 call assert_fails('call MyDefVarargs()', 'E119:')
220 assert_equal('one,foo', MyDefVarargs('one'))
221 assert_equal('one,two', MyDefVarargs('one', 'two'))
222 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
223enddef
224
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100225def Test_using_var_as_arg()
226 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
227 call assert_fails('so Xdef', 'E1006:')
228 call delete('Xdef')
229enddef
230
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100231def Test_call_func_defined_later()
232 call assert_equal('one', DefinedLater('one'))
233 call assert_fails('call NotDefined("one")', 'E117:')
234enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100235
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100236func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100237 return a:arg
238endfunc
239
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100240def FuncWithForwardCall()
241 return DefinedEvenLater("yes")
242enddef
243
244def DefinedEvenLater(arg: string): string
245 return arg
246enddef
247
248def Test_error_in_nested_function()
249 " Error in called function requires unwinding the call stack.
250 assert_fails('call FuncWithForwardCall()', 'E1029')
251enddef
252
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100253def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100254 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
255 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
256 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
257 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100258enddef
259
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100260def Test_arg_type_wrong()
261 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
262enddef
263
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100264def Test_try_catch()
265 let l = []
266 try
267 add(l, '1')
268 throw 'wrong'
269 add(l, '2')
270 catch
271 add(l, v:exception)
272 finally
273 add(l, '3')
274 endtry
275 assert_equal(['1', 'wrong', '3'], l)
276enddef
277
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100278def ThrowFromDef()
279 throw 'getout'
280enddef
281
282func CatchInFunc()
283 try
284 call ThrowFromDef()
285 catch
286 let g:thrown_func = v:exception
287 endtry
288endfunc
289
290def CatchInDef()
291 try
292 ThrowFromDef()
293 catch
294 g:thrown_def = v:exception
295 endtry
296enddef
297
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100298def ReturnFinally(): string
299 try
300 return 'intry'
301 finally
302 g:in_finally = 'finally'
303 endtry
304 return 'end'
305enddef
306
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100307def Test_try_catch_nested()
308 CatchInFunc()
309 assert_equal('getout', g:thrown_func)
310
311 CatchInDef()
312 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100313
314 assert_equal('intry', ReturnFinally())
315 assert_equal('finally', g:in_finally)
316enddef
317
318def Test_try_catch_match()
319 let seq = 'a'
320 try
321 throw 'something'
322 catch /nothing/
323 seq ..= 'x'
324 catch /some/
325 seq ..= 'b'
326 catch /asdf/
327 seq ..= 'x'
328 finally
329 seq ..= 'c'
330 endtry
331 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100332enddef
333
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100334let s:export_script_lines =<< trim END
335 vim9script
336 let name: string = 'bob'
337 def Concat(arg: string): string
338 return name .. arg
339 enddef
340 let g:result = Concat('bie')
341 let g:localname = name
342
343 export const CONST = 1234
344 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100345 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100346 export def Exported(): string
347 return 'Exported'
348 enddef
349END
350
351def Test_vim9script()
352 let import_script_lines =<< trim END
353 vim9script
354 import {exported, Exported} from './Xexport.vim'
355 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100356 exported += 3
357 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100358 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100359
360 import {exp_name} from './Xexport.vim'
361 g:imported_name = exp_name
362 exp_name ..= ' Doe'
363 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100364 END
365
366 writefile(import_script_lines, 'Ximport.vim')
367 writefile(s:export_script_lines, 'Xexport.vim')
368
369 source Ximport.vim
370
371 assert_equal('bobbie', g:result)
372 assert_equal('bob', g:localname)
373 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100374 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100375 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100376 assert_equal('John', g:imported_name)
377 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100378 assert_false(exists('g:name'))
379
380 unlet g:result
381 unlet g:localname
382 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100383 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100385 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100386 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100387
388 let import_star_as_lines =<< trim END
389 vim9script
390 import * as Export from './Xexport.vim'
391 def UseExport()
392 g:imported = Export.exported
393 enddef
394 UseExport()
395 END
396 writefile(import_star_as_lines, 'Ximport.vim')
397 source Ximport.vim
398 assert_equal(9876, g:imported)
399
400 let import_star_lines =<< trim END
401 vim9script
402 import * from './Xexport.vim'
403 g:imported = exported
404 END
405 writefile(import_star_lines, 'Ximport.vim')
406 assert_fails('source Ximport.vim', 'E1045:')
407
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100408 " try to import something that exists but is not exported
409 let import_not_exported_lines =<< trim END
410 vim9script
411 import name from './Xexport.vim'
412 END
413 writefile(import_not_exported_lines, 'Ximport.vim')
414 assert_fails('source Ximport.vim', 'E1049:')
415
416 " import a very long name, requires making a copy
417 let import_long_name_lines =<< trim END
418 vim9script
419 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
420 END
421 writefile(import_long_name_lines, 'Ximport.vim')
422 assert_fails('source Ximport.vim', 'E1048:')
423
424 let import_no_from_lines =<< trim END
425 vim9script
426 import name './Xexport.vim'
427 END
428 writefile(import_no_from_lines, 'Ximport.vim')
429 assert_fails('source Ximport.vim', 'E1070:')
430
431 let import_invalid_string_lines =<< trim END
432 vim9script
433 import name from Xexport.vim
434 END
435 writefile(import_invalid_string_lines, 'Ximport.vim')
436 assert_fails('source Ximport.vim', 'E1071:')
437
438 let import_wrong_name_lines =<< trim END
439 vim9script
440 import name from './XnoExport.vim'
441 END
442 writefile(import_wrong_name_lines, 'Ximport.vim')
443 assert_fails('source Ximport.vim', 'E1053:')
444
445 let import_missing_comma_lines =<< trim END
446 vim9script
447 import {exported name} from './Xexport.vim'
448 END
449 writefile(import_missing_comma_lines, 'Ximport.vim')
450 assert_fails('source Ximport.vim', 'E1046:')
451
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100452 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100453 delete('Xexport.vim')
454
Bram Moolenaar750802b2020-02-23 18:08:33 +0100455 " Check that in a Vim9 script 'cpo' is set to the Vim default.
456 set cpo&vi
457 let cpo_before = &cpo
458 let lines =<< trim END
459 vim9script
460 g:cpo_in_vim9script = &cpo
461 END
462 writefile(lines, 'Xvim9_script')
463 source Xvim9_script
464 assert_equal(cpo_before, &cpo)
465 set cpo&vim
466 assert_equal(&cpo, g:cpo_in_vim9script)
467 delete('Xvim9_script')
468enddef
469
470def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100471 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
472 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100473 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100474 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100475 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
476 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
477
478 assert_fails('vim9script', 'E1038')
479 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100480enddef
481
482def Test_vim9script_call()
483 let lines =<< trim END
484 vim9script
485 let var = ''
486 def MyFunc(arg: string)
487 var = arg
488 enddef
489 MyFunc('foobar')
490 assert_equal('foobar', var)
491
492 let str = 'barfoo'
493 str->MyFunc()
494 assert_equal('barfoo', var)
495
496 let g:value = 'value'
497 g:value->MyFunc()
498 assert_equal('value', var)
499
500 let listvar = []
501 def ListFunc(arg: list<number>)
502 listvar = arg
503 enddef
504 [1, 2, 3]->ListFunc()
505 assert_equal([1, 2, 3], listvar)
506
507 let dictvar = {}
508 def DictFunc(arg: dict<number>)
509 dictvar = arg
510 enddef
511 {'a': 1, 'b': 2}->DictFunc()
512 assert_equal(#{a: 1, b: 2}, dictvar)
513 #{a: 3, b: 4}->DictFunc()
514 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100515
516 ('text')->MyFunc()
517 assert_equal('text', var)
518 ("some")->MyFunc()
519 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100520 END
521 writefile(lines, 'Xcall.vim')
522 source Xcall.vim
523 delete('Xcall.vim')
524enddef
525
526def Test_vim9script_call_fail_decl()
527 let lines =<< trim END
528 vim9script
529 let var = ''
530 def MyFunc(arg: string)
531 let var = 123
532 enddef
533 END
534 writefile(lines, 'Xcall_decl.vim')
535 assert_fails('source Xcall_decl.vim', 'E1054:')
536 delete('Xcall_decl.vim')
537enddef
538
539def Test_vim9script_call_fail_const()
540 let lines =<< trim END
541 vim9script
542 const var = ''
543 def MyFunc(arg: string)
544 var = 'asdf'
545 enddef
546 END
547 writefile(lines, 'Xcall_const.vim')
548 assert_fails('source Xcall_const.vim', 'E46:')
549 delete('Xcall_const.vim')
550enddef
551
552def Test_vim9script_reload()
553 let lines =<< trim END
554 vim9script
555 const var = ''
556 let valone = 1234
557 def MyFunc(arg: string)
558 valone = 5678
559 enddef
560 END
561 let morelines =<< trim END
562 let valtwo = 222
563 export def GetValtwo(): number
564 return valtwo
565 enddef
566 END
567 writefile(lines + morelines, 'Xreload.vim')
568 source Xreload.vim
569 source Xreload.vim
570 source Xreload.vim
571
572 let testlines =<< trim END
573 vim9script
574 def TheFunc()
575 import GetValtwo from './Xreload.vim'
576 assert_equal(222, GetValtwo())
577 enddef
578 TheFunc()
579 END
580 writefile(testlines, 'Ximport.vim')
581 source Ximport.vim
582
583 " test that when not using "morelines" valtwo is still defined
584 " need to source Xreload.vim again, import doesn't reload a script
585 writefile(lines, 'Xreload.vim')
586 source Xreload.vim
587 source Ximport.vim
588
589 " cannot declare a var twice
590 lines =<< trim END
591 vim9script
592 let valone = 1234
593 let valone = 5678
594 END
595 writefile(lines, 'Xreload.vim')
596 assert_fails('source Xreload.vim', 'E1041:')
597
598 delete('Xreload.vim')
599 delete('Ximport.vim')
600enddef
601
602def Test_import_absolute()
603 let import_lines = [
604 \ 'vim9script',
605 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100606 \ 'def UseExported()',
607 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100608 \ ' exported = 8888',
609 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100610 \ 'enddef',
611 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100612 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100613 \ ]
614 writefile(import_lines, 'Ximport_abs.vim')
615 writefile(s:export_script_lines, 'Xexport_abs.vim')
616
617 source Ximport_abs.vim
618
619 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100620 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100621 assert_match('<SNR>\d\+_UseExported.*'
622 \ .. 'g:imported_abs = exported.*'
623 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100624 \ .. '1 STOREG g:imported_abs.*'
625 \ .. 'exported = 8888.*'
626 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
627 \ .. 'g:imported_after = exported.*'
628 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
629 \ .. '5 STOREG g:imported_after.*'
630 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100631 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100632 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100633
634 delete('Ximport_abs.vim')
635 delete('Xexport_abs.vim')
636enddef
637
638def Test_import_rtp()
639 let import_lines = [
640 \ 'vim9script',
641 \ 'import exported from "Xexport_rtp.vim"',
642 \ 'g:imported_rtp = exported',
643 \ ]
644 writefile(import_lines, 'Ximport_rtp.vim')
645 mkdir('import')
646 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
647
648 let save_rtp = &rtp
649 &rtp = getcwd()
650 source Ximport_rtp.vim
651 &rtp = save_rtp
652
653 assert_equal(9876, g:imported_rtp)
654 unlet g:imported_rtp
655
656 delete('Ximport_rtp.vim')
657 delete('import/Xexport_rtp.vim')
658 delete('import', 'd')
659enddef
660
661def Test_fixed_size_list()
662 " will be allocated as one piece of memory, check that changes work
663 let l = [1, 2, 3, 4]
664 l->remove(0)
665 l->add(5)
666 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100667 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100668enddef
669
Bram Moolenaar673660a2020-01-26 16:50:05 +0100670" Test that inside :function a Python function can be defined, :def is not
671" recognized.
672func Test_function_python()
673 CheckFeature python3
674 let py = 'python3'
675 execute py "<< EOF"
676def do_something():
677 return 1
678EOF
679endfunc
680
Bram Moolenaar158906c2020-02-06 20:39:45 +0100681def IfElse(what: number): string
682 let res = ''
683 if what == 1
684 res = "one"
685 elseif what == 2
686 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100687 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100688 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100689 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100690 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100691enddef
692
Bram Moolenaar158906c2020-02-06 20:39:45 +0100693def Test_if_elseif_else()
694 assert_equal('one', IfElse(1))
695 assert_equal('two', IfElse(2))
696 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100697enddef
698
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100699def Test_delfunc()
700 let lines =<< trim END
701 vim9script
702 def GoneSoon()
703 echo 'hello'
704 enddef
705
706 def CallGoneSoon()
707 GoneSoon()
708 enddef
709
710 delfunc GoneSoon
711 CallGoneSoon()
712 END
713 writefile(lines, 'XToDelFunc')
714 assert_fails('so XToDelFunc', 'E933')
715 assert_fails('so XToDelFunc', 'E933')
716
717 delete('XToDelFunc')
718enddef
719
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100720def Test_substitute_cmd()
721 new
722 setline(1, 'something')
723 :substitute(some(other(
724 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100725 bwipe!
726
727 " also when the context is Vim9 script
728 let lines =<< trim END
729 vim9script
730 new
731 setline(1, 'something')
732 :substitute(some(other(
733 assert_equal('otherthing', getline(1))
734 bwipe!
735 END
736 writefile(lines, 'Xvim9lines')
737 source Xvim9lines
738
739 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100740enddef
741
Bram Moolenaarad39c092020-02-26 18:23:43 +0100742def Test_execute_cmd()
743 new
744 setline(1, 'default')
745 execute 'call setline(1, "execute-string")'
746 assert_equal('execute-string', getline(1))
747 let cmd1 = 'call setline(1,'
748 let cmd2 = '"execute-var")'
749 execute cmd1 cmd2
750 assert_equal('execute-var', getline(1))
751 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
752 assert_equal('execute-var-string', getline(1))
753 let cmd_first = 'call '
754 let cmd_last = 'setline(1, "execute-var-var")'
755 execute cmd_first .. cmd_last
756 assert_equal('execute-var-var', getline(1))
757 bwipe!
758enddef
759
760def Test_echo_cmd()
761 echo 'something'
762 assert_match('^something$', Screenline(&lines))
763
764 let str1 = 'some'
765 let str2 = 'more'
766 echo str1 str2
767 assert_match('^some more$', Screenline(&lines))
768enddef
769
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100770
771" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker