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