blob: c01ab8316427406eff35b18940cf2d6960ef16ab [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 Moolenaar401d9ff2020-02-19 18:14:44 +010069 g:newvar = 'new'
70 assert_equal('new', g:newvar)
71
72 assert_equal('yes', g:existing)
73 g:existing = 'no'
74 assert_equal('no', g:existing)
75
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010076 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010077 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010078
79 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010080 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010081 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010082
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010083 s:appendToMe ..= 'yyy'
84 assert_equal('xxxyyy', s:appendToMe)
85 s:addToMe += 222
86 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010087 s:newVar = 'new'
88 assert_equal('new', s:newVar)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010089enddef
90
91func Test_assignment_failure()
92 call CheckDefFailure(['let var=234'], 'E1004:')
93 call CheckDefFailure(['let var =234'], 'E1004:')
94 call CheckDefFailure(['let var= 234'], 'E1004:')
95
96 call CheckDefFailure(['let true = 1'], 'E1034:')
97 call CheckDefFailure(['let false = 1'], 'E1034:')
98
99 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
100 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
101
102 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
103 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
104
105 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
106 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100107
108 call CheckDefFailure(['let var: dict <number>'], 'E1007:')
109 call CheckDefFailure(['let var: dict<number'], 'E1009:')
110
111 call CheckDefFailure(['let var: ally'], 'E1010:')
112 call CheckDefFailure(['let var: bram'], 'E1010:')
113 call CheckDefFailure(['let var: cathy'], 'E1010:')
114 call CheckDefFailure(['let var: dom'], 'E1010:')
115 call CheckDefFailure(['let var: freddy'], 'E1010:')
116 call CheckDefFailure(['let var: john'], 'E1010:')
117 call CheckDefFailure(['let var: larry'], 'E1010:')
118 call CheckDefFailure(['let var: ned'], 'E1010:')
119 call CheckDefFailure(['let var: pam'], 'E1010:')
120 call CheckDefFailure(['let var: sam'], 'E1010:')
121 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100122endfunc
123
124func Test_const()
125 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
126 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
127 call CheckDefFailure(['const two'], 'E1021:')
128endfunc
129
130def Test_block()
131 let outer = 1
132 {
133 let inner = 2
134 assert_equal(1, outer)
135 assert_equal(2, inner)
136 }
137 assert_equal(1, outer)
138enddef
139
140func Test_block_failure()
141 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
142endfunc
143
144def ReturnString(): string
145 return 'string'
146enddef
147
148def ReturnNumber(): number
149 return 123
150enddef
151
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100152let g:notNumber = 'string'
153
154def ReturnGlobal(): number
155 return g:notNumber
156enddef
157
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100158def Test_return_string()
159 assert_equal('string', ReturnString())
160 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100161 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100162enddef
163
164func Increment()
165 let g:counter += 1
166endfunc
167
168def Test_call_ufunc_count()
169 g:counter = 1
170 Increment()
171 Increment()
172 Increment()
173 " works with and without :call
174 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100175 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100176 unlet g:counter
177enddef
178
179def MyVarargs(arg: string, ...rest: list<string>): string
180 let res = arg
181 for s in rest
182 res ..= ',' .. s
183 endfor
184 return res
185enddef
186
187def Test_call_varargs()
188 assert_equal('one', MyVarargs('one'))
189 assert_equal('one,two', MyVarargs('one', 'two'))
190 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
191enddef
192
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100193def MyDefaultArgs(name = 'string'): string
194 return name
195enddef
196
197def Test_call_default_args()
198 assert_equal('string', MyDefaultArgs())
199 assert_equal('one', MyDefaultArgs('one'))
200 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
201enddef
202
203func Test_call_default_args_from_func()
204 call assert_equal('string', MyDefaultArgs())
205 call assert_equal('one', MyDefaultArgs('one'))
206 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
207endfunc
208
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100209func TakesOneArg(arg)
210 echo a:arg
211endfunc
212
213def Test_call_wrong_arg_count()
214 call CheckDefFailure(['TakesOneArg()'], 'E119:')
215 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
216enddef
217
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100218" Default arg and varargs
219def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
220 let res = one .. ',' .. two
221 for s in rest
222 res ..= ',' .. s
223 endfor
224 return res
225enddef
226
227def Test_call_def_varargs()
228 call assert_fails('call MyDefVarargs()', 'E119:')
229 assert_equal('one,foo', MyDefVarargs('one'))
230 assert_equal('one,two', MyDefVarargs('one', 'two'))
231 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
232enddef
233
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100234def Test_using_var_as_arg()
235 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
236 call assert_fails('so Xdef', 'E1006:')
237 call delete('Xdef')
238enddef
239
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100240def Test_call_func_defined_later()
241 call assert_equal('one', DefinedLater('one'))
242 call assert_fails('call NotDefined("one")', 'E117:')
243enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100244
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100245func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100246 return a:arg
247endfunc
248
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100249def FuncWithForwardCall()
250 return DefinedEvenLater("yes")
251enddef
252
253def DefinedEvenLater(arg: string): string
254 return arg
255enddef
256
257def Test_error_in_nested_function()
258 " Error in called function requires unwinding the call stack.
259 assert_fails('call FuncWithForwardCall()', 'E1029')
260enddef
261
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100262def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100263 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
264 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
265 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
266 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100267enddef
268
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100269def Test_arg_type_wrong()
270 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
271enddef
272
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100273def Test_try_catch()
274 let l = []
275 try
276 add(l, '1')
277 throw 'wrong'
278 add(l, '2')
279 catch
280 add(l, v:exception)
281 finally
282 add(l, '3')
283 endtry
284 assert_equal(['1', 'wrong', '3'], l)
285enddef
286
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100287def ThrowFromDef()
288 throw 'getout'
289enddef
290
291func CatchInFunc()
292 try
293 call ThrowFromDef()
294 catch
295 let g:thrown_func = v:exception
296 endtry
297endfunc
298
299def CatchInDef()
300 try
301 ThrowFromDef()
302 catch
303 g:thrown_def = v:exception
304 endtry
305enddef
306
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100307def ReturnFinally(): string
308 try
309 return 'intry'
310 finally
311 g:in_finally = 'finally'
312 endtry
313 return 'end'
314enddef
315
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100316def Test_try_catch_nested()
317 CatchInFunc()
318 assert_equal('getout', g:thrown_func)
319
320 CatchInDef()
321 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100322
323 assert_equal('intry', ReturnFinally())
324 assert_equal('finally', g:in_finally)
325enddef
326
327def Test_try_catch_match()
328 let seq = 'a'
329 try
330 throw 'something'
331 catch /nothing/
332 seq ..= 'x'
333 catch /some/
334 seq ..= 'b'
335 catch /asdf/
336 seq ..= 'x'
337 finally
338 seq ..= 'c'
339 endtry
340 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100341enddef
342
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100343let s:export_script_lines =<< trim END
344 vim9script
345 let name: string = 'bob'
346 def Concat(arg: string): string
347 return name .. arg
348 enddef
349 let g:result = Concat('bie')
350 let g:localname = name
351
352 export const CONST = 1234
353 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100354 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100355 export def Exported(): string
356 return 'Exported'
357 enddef
358END
359
360def Test_vim9script()
361 let import_script_lines =<< trim END
362 vim9script
363 import {exported, Exported} from './Xexport.vim'
364 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100365 exported += 3
366 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100367 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100368
369 import {exp_name} from './Xexport.vim'
370 g:imported_name = exp_name
371 exp_name ..= ' Doe'
372 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100373 END
374
375 writefile(import_script_lines, 'Ximport.vim')
376 writefile(s:export_script_lines, 'Xexport.vim')
377
378 source Ximport.vim
379
380 assert_equal('bobbie', g:result)
381 assert_equal('bob', g:localname)
382 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100383 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100385 assert_equal('John', g:imported_name)
386 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100387 assert_false(exists('g:name'))
388
389 unlet g:result
390 unlet g:localname
391 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100392 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100393 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100394 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100395 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100396
397 let import_star_as_lines =<< trim END
398 vim9script
399 import * as Export from './Xexport.vim'
400 def UseExport()
401 g:imported = Export.exported
402 enddef
403 UseExport()
404 END
405 writefile(import_star_as_lines, 'Ximport.vim')
406 source Ximport.vim
407 assert_equal(9876, g:imported)
408
409 let import_star_lines =<< trim END
410 vim9script
411 import * from './Xexport.vim'
412 g:imported = exported
413 END
414 writefile(import_star_lines, 'Ximport.vim')
415 assert_fails('source Ximport.vim', 'E1045:')
416
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100417 " try to import something that exists but is not exported
418 let import_not_exported_lines =<< trim END
419 vim9script
420 import name from './Xexport.vim'
421 END
422 writefile(import_not_exported_lines, 'Ximport.vim')
423 assert_fails('source Ximport.vim', 'E1049:')
424
425 " import a very long name, requires making a copy
426 let import_long_name_lines =<< trim END
427 vim9script
428 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
429 END
430 writefile(import_long_name_lines, 'Ximport.vim')
431 assert_fails('source Ximport.vim', 'E1048:')
432
433 let import_no_from_lines =<< trim END
434 vim9script
435 import name './Xexport.vim'
436 END
437 writefile(import_no_from_lines, 'Ximport.vim')
438 assert_fails('source Ximport.vim', 'E1070:')
439
440 let import_invalid_string_lines =<< trim END
441 vim9script
442 import name from Xexport.vim
443 END
444 writefile(import_invalid_string_lines, 'Ximport.vim')
445 assert_fails('source Ximport.vim', 'E1071:')
446
447 let import_wrong_name_lines =<< trim END
448 vim9script
449 import name from './XnoExport.vim'
450 END
451 writefile(import_wrong_name_lines, 'Ximport.vim')
452 assert_fails('source Ximport.vim', 'E1053:')
453
454 let import_missing_comma_lines =<< trim END
455 vim9script
456 import {exported name} from './Xexport.vim'
457 END
458 writefile(import_missing_comma_lines, 'Ximport.vim')
459 assert_fails('source Ximport.vim', 'E1046:')
460
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100461 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100462 delete('Xexport.vim')
463
Bram Moolenaar750802b2020-02-23 18:08:33 +0100464 " Check that in a Vim9 script 'cpo' is set to the Vim default.
465 set cpo&vi
466 let cpo_before = &cpo
467 let lines =<< trim END
468 vim9script
469 g:cpo_in_vim9script = &cpo
470 END
471 writefile(lines, 'Xvim9_script')
472 source Xvim9_script
473 assert_equal(cpo_before, &cpo)
474 set cpo&vim
475 assert_equal(&cpo, g:cpo_in_vim9script)
476 delete('Xvim9_script')
477enddef
478
479def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100480 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
481 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100482 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100483 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100484 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
485 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
486
487 assert_fails('vim9script', 'E1038')
488 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100489enddef
490
491def Test_vim9script_call()
492 let lines =<< trim END
493 vim9script
494 let var = ''
495 def MyFunc(arg: string)
496 var = arg
497 enddef
498 MyFunc('foobar')
499 assert_equal('foobar', var)
500
501 let str = 'barfoo'
502 str->MyFunc()
503 assert_equal('barfoo', var)
504
505 let g:value = 'value'
506 g:value->MyFunc()
507 assert_equal('value', var)
508
509 let listvar = []
510 def ListFunc(arg: list<number>)
511 listvar = arg
512 enddef
513 [1, 2, 3]->ListFunc()
514 assert_equal([1, 2, 3], listvar)
515
516 let dictvar = {}
517 def DictFunc(arg: dict<number>)
518 dictvar = arg
519 enddef
520 {'a': 1, 'b': 2}->DictFunc()
521 assert_equal(#{a: 1, b: 2}, dictvar)
522 #{a: 3, b: 4}->DictFunc()
523 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100524
525 ('text')->MyFunc()
526 assert_equal('text', var)
527 ("some")->MyFunc()
528 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100529 END
530 writefile(lines, 'Xcall.vim')
531 source Xcall.vim
532 delete('Xcall.vim')
533enddef
534
535def Test_vim9script_call_fail_decl()
536 let lines =<< trim END
537 vim9script
538 let var = ''
539 def MyFunc(arg: string)
540 let var = 123
541 enddef
542 END
543 writefile(lines, 'Xcall_decl.vim')
544 assert_fails('source Xcall_decl.vim', 'E1054:')
545 delete('Xcall_decl.vim')
546enddef
547
548def Test_vim9script_call_fail_const()
549 let lines =<< trim END
550 vim9script
551 const var = ''
552 def MyFunc(arg: string)
553 var = 'asdf'
554 enddef
555 END
556 writefile(lines, 'Xcall_const.vim')
557 assert_fails('source Xcall_const.vim', 'E46:')
558 delete('Xcall_const.vim')
559enddef
560
561def Test_vim9script_reload()
562 let lines =<< trim END
563 vim9script
564 const var = ''
565 let valone = 1234
566 def MyFunc(arg: string)
567 valone = 5678
568 enddef
569 END
570 let morelines =<< trim END
571 let valtwo = 222
572 export def GetValtwo(): number
573 return valtwo
574 enddef
575 END
576 writefile(lines + morelines, 'Xreload.vim')
577 source Xreload.vim
578 source Xreload.vim
579 source Xreload.vim
580
581 let testlines =<< trim END
582 vim9script
583 def TheFunc()
584 import GetValtwo from './Xreload.vim'
585 assert_equal(222, GetValtwo())
586 enddef
587 TheFunc()
588 END
589 writefile(testlines, 'Ximport.vim')
590 source Ximport.vim
591
592 " test that when not using "morelines" valtwo is still defined
593 " need to source Xreload.vim again, import doesn't reload a script
594 writefile(lines, 'Xreload.vim')
595 source Xreload.vim
596 source Ximport.vim
597
598 " cannot declare a var twice
599 lines =<< trim END
600 vim9script
601 let valone = 1234
602 let valone = 5678
603 END
604 writefile(lines, 'Xreload.vim')
605 assert_fails('source Xreload.vim', 'E1041:')
606
607 delete('Xreload.vim')
608 delete('Ximport.vim')
609enddef
610
611def Test_import_absolute()
612 let import_lines = [
613 \ 'vim9script',
614 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100615 \ 'def UseExported()',
616 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100617 \ ' exported = 8888',
618 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100619 \ 'enddef',
620 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100621 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100622 \ ]
623 writefile(import_lines, 'Ximport_abs.vim')
624 writefile(s:export_script_lines, 'Xexport_abs.vim')
625
626 source Ximport_abs.vim
627
628 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100629 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100630 assert_match('<SNR>\d\+_UseExported.*'
631 \ .. 'g:imported_abs = exported.*'
632 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100633 \ .. '1 STOREG g:imported_abs.*'
634 \ .. 'exported = 8888.*'
635 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
636 \ .. 'g:imported_after = exported.*'
637 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
638 \ .. '5 STOREG g:imported_after.*'
639 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100640 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100641 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100642
643 delete('Ximport_abs.vim')
644 delete('Xexport_abs.vim')
645enddef
646
647def Test_import_rtp()
648 let import_lines = [
649 \ 'vim9script',
650 \ 'import exported from "Xexport_rtp.vim"',
651 \ 'g:imported_rtp = exported',
652 \ ]
653 writefile(import_lines, 'Ximport_rtp.vim')
654 mkdir('import')
655 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
656
657 let save_rtp = &rtp
658 &rtp = getcwd()
659 source Ximport_rtp.vim
660 &rtp = save_rtp
661
662 assert_equal(9876, g:imported_rtp)
663 unlet g:imported_rtp
664
665 delete('Ximport_rtp.vim')
666 delete('import/Xexport_rtp.vim')
667 delete('import', 'd')
668enddef
669
670def Test_fixed_size_list()
671 " will be allocated as one piece of memory, check that changes work
672 let l = [1, 2, 3, 4]
673 l->remove(0)
674 l->add(5)
675 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100676 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100677enddef
678
Bram Moolenaar673660a2020-01-26 16:50:05 +0100679" Test that inside :function a Python function can be defined, :def is not
680" recognized.
681func Test_function_python()
682 CheckFeature python3
683 let py = 'python3'
684 execute py "<< EOF"
685def do_something():
686 return 1
687EOF
688endfunc
689
Bram Moolenaar158906c2020-02-06 20:39:45 +0100690def IfElse(what: number): string
691 let res = ''
692 if what == 1
693 res = "one"
694 elseif what == 2
695 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100696 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100697 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100698 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100699 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100700enddef
701
Bram Moolenaar158906c2020-02-06 20:39:45 +0100702def Test_if_elseif_else()
703 assert_equal('one', IfElse(1))
704 assert_equal('two', IfElse(2))
705 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100706enddef
707
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100708def Test_delfunc()
709 let lines =<< trim END
710 vim9script
711 def GoneSoon()
712 echo 'hello'
713 enddef
714
715 def CallGoneSoon()
716 GoneSoon()
717 enddef
718
719 delfunc GoneSoon
720 CallGoneSoon()
721 END
722 writefile(lines, 'XToDelFunc')
723 assert_fails('so XToDelFunc', 'E933')
724 assert_fails('so XToDelFunc', 'E933')
725
726 delete('XToDelFunc')
727enddef
728
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100729def Test_substitute_cmd()
730 new
731 setline(1, 'something')
732 :substitute(some(other(
733 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100734 bwipe!
735
736 " also when the context is Vim9 script
737 let lines =<< trim END
738 vim9script
739 new
740 setline(1, 'something')
741 :substitute(some(other(
742 assert_equal('otherthing', getline(1))
743 bwipe!
744 END
745 writefile(lines, 'Xvim9lines')
746 source Xvim9lines
747
748 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100749enddef
750
Bram Moolenaarad39c092020-02-26 18:23:43 +0100751def Test_execute_cmd()
752 new
753 setline(1, 'default')
754 execute 'call setline(1, "execute-string")'
755 assert_equal('execute-string', getline(1))
756 let cmd1 = 'call setline(1,'
757 let cmd2 = '"execute-var")'
758 execute cmd1 cmd2
759 assert_equal('execute-var', getline(1))
760 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
761 assert_equal('execute-var-string', getline(1))
762 let cmd_first = 'call '
763 let cmd_last = 'setline(1, "execute-var-var")'
764 execute cmd_first .. cmd_last
765 assert_equal('execute-var-var', getline(1))
766 bwipe!
767enddef
768
769def Test_echo_cmd()
770 echo 'something'
771 assert_match('^something$', Screenline(&lines))
772
773 let str1 = 'some'
774 let str2 = 'more'
775 echo str1 str2
776 assert_match('^some more$', Screenline(&lines))
777enddef
778
Bram Moolenaar41fe0612020-03-01 16:22:40 +0100779def Test_for_outside_of_function()
780 let lines =<< trim END
781 vim9script
782 new
783 for var in range(0, 3)
784 append(line('$'), var)
785 endfor
786 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
787 bwipe!
788 END
789 writefile(lines, 'Xvim9for.vim')
790 source Xvim9for.vim
791 delete('Xvim9for.vim')
792enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100793
794" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker