blob: f1b21d45e39d14441bd0f3478cb66af0fae3483d [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 Moolenaar401d9ff2020-02-19 18:14:44 +010056 g:newvar = 'new'
57 assert_equal('new', g:newvar)
58
59 assert_equal('yes', g:existing)
60 g:existing = 'no'
61 assert_equal('no', g:existing)
62
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010063 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010064 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010065
66 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010067 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010068 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010069
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010070 s:appendToMe ..= 'yyy'
71 assert_equal('xxxyyy', s:appendToMe)
72 s:addToMe += 222
73 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010074 s:newVar = 'new'
75 assert_equal('new', s:newVar)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010076enddef
77
78func Test_assignment_failure()
79 call CheckDefFailure(['let var=234'], 'E1004:')
80 call CheckDefFailure(['let var =234'], 'E1004:')
81 call CheckDefFailure(['let var= 234'], 'E1004:')
82
83 call CheckDefFailure(['let true = 1'], 'E1034:')
84 call CheckDefFailure(['let false = 1'], 'E1034:')
85
86 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
87 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
88
89 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
90 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
91
92 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
93 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
94endfunc
95
96func Test_const()
97 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
98 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
99 call CheckDefFailure(['const two'], 'E1021:')
100endfunc
101
102def Test_block()
103 let outer = 1
104 {
105 let inner = 2
106 assert_equal(1, outer)
107 assert_equal(2, inner)
108 }
109 assert_equal(1, outer)
110enddef
111
112func Test_block_failure()
113 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
114endfunc
115
116def ReturnString(): string
117 return 'string'
118enddef
119
120def ReturnNumber(): number
121 return 123
122enddef
123
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100124let g:notNumber = 'string'
125
126def ReturnGlobal(): number
127 return g:notNumber
128enddef
129
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100130def Test_return_string()
131 assert_equal('string', ReturnString())
132 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100133 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100134enddef
135
136func Increment()
137 let g:counter += 1
138endfunc
139
140def Test_call_ufunc_count()
141 g:counter = 1
142 Increment()
143 Increment()
144 Increment()
145 " works with and without :call
146 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100147 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100148 unlet g:counter
149enddef
150
151def MyVarargs(arg: string, ...rest: list<string>): string
152 let res = arg
153 for s in rest
154 res ..= ',' .. s
155 endfor
156 return res
157enddef
158
159def Test_call_varargs()
160 assert_equal('one', MyVarargs('one'))
161 assert_equal('one,two', MyVarargs('one', 'two'))
162 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
163enddef
164
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100165def MyDefaultArgs(name = 'string'): string
166 return name
167enddef
168
169def Test_call_default_args()
170 assert_equal('string', MyDefaultArgs())
171 assert_equal('one', MyDefaultArgs('one'))
172 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
173enddef
174
175func Test_call_default_args_from_func()
176 call assert_equal('string', MyDefaultArgs())
177 call assert_equal('one', MyDefaultArgs('one'))
178 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
179endfunc
180
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100181func TakesOneArg(arg)
182 echo a:arg
183endfunc
184
185def Test_call_wrong_arg_count()
186 call CheckDefFailure(['TakesOneArg()'], 'E119:')
187 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
188enddef
189
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100190" Default arg and varargs
191def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
192 let res = one .. ',' .. two
193 for s in rest
194 res ..= ',' .. s
195 endfor
196 return res
197enddef
198
199def Test_call_def_varargs()
200 call assert_fails('call MyDefVarargs()', 'E119:')
201 assert_equal('one,foo', MyDefVarargs('one'))
202 assert_equal('one,two', MyDefVarargs('one', 'two'))
203 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
204enddef
205
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100206def Test_call_func_defined_later()
207 call assert_equal('one', DefinedLater('one'))
208 call assert_fails('call NotDefined("one")', 'E117:')
209enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100210
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100211func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100212 return a:arg
213endfunc
214
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100215def FuncWithForwardCall()
216 return DefinedEvenLater("yes")
217enddef
218
219def DefinedEvenLater(arg: string): string
220 return arg
221enddef
222
223def Test_error_in_nested_function()
224 " Error in called function requires unwinding the call stack.
225 assert_fails('call FuncWithForwardCall()', 'E1029')
226enddef
227
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100228def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100229 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
230 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
231 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
232 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100233enddef
234
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100235def Test_arg_type_wrong()
236 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
237enddef
238
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100239def Test_try_catch()
240 let l = []
241 try
242 add(l, '1')
243 throw 'wrong'
244 add(l, '2')
245 catch
246 add(l, v:exception)
247 finally
248 add(l, '3')
249 endtry
250 assert_equal(['1', 'wrong', '3'], l)
251enddef
252
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100253def ThrowFromDef()
254 throw 'getout'
255enddef
256
257func CatchInFunc()
258 try
259 call ThrowFromDef()
260 catch
261 let g:thrown_func = v:exception
262 endtry
263endfunc
264
265def CatchInDef()
266 try
267 ThrowFromDef()
268 catch
269 g:thrown_def = v:exception
270 endtry
271enddef
272
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100273def ReturnFinally(): string
274 try
275 return 'intry'
276 finally
277 g:in_finally = 'finally'
278 endtry
279 return 'end'
280enddef
281
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100282def Test_try_catch_nested()
283 CatchInFunc()
284 assert_equal('getout', g:thrown_func)
285
286 CatchInDef()
287 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100288
289 assert_equal('intry', ReturnFinally())
290 assert_equal('finally', g:in_finally)
291enddef
292
293def Test_try_catch_match()
294 let seq = 'a'
295 try
296 throw 'something'
297 catch /nothing/
298 seq ..= 'x'
299 catch /some/
300 seq ..= 'b'
301 catch /asdf/
302 seq ..= 'x'
303 finally
304 seq ..= 'c'
305 endtry
306 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100307enddef
308
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100309let s:export_script_lines =<< trim END
310 vim9script
311 let name: string = 'bob'
312 def Concat(arg: string): string
313 return name .. arg
314 enddef
315 let g:result = Concat('bie')
316 let g:localname = name
317
318 export const CONST = 1234
319 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100320 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100321 export def Exported(): string
322 return 'Exported'
323 enddef
324END
325
326def Test_vim9script()
327 let import_script_lines =<< trim END
328 vim9script
329 import {exported, Exported} from './Xexport.vim'
330 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100331 exported += 3
332 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100333 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100334
335 import {exp_name} from './Xexport.vim'
336 g:imported_name = exp_name
337 exp_name ..= ' Doe'
338 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100339 END
340
341 writefile(import_script_lines, 'Ximport.vim')
342 writefile(s:export_script_lines, 'Xexport.vim')
343
344 source Ximport.vim
345
346 assert_equal('bobbie', g:result)
347 assert_equal('bob', g:localname)
348 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100349 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100350 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100351 assert_equal('John', g:imported_name)
352 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100353 assert_false(exists('g:name'))
354
355 unlet g:result
356 unlet g:localname
357 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100358 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100359 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100360 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100361 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100362
363 let import_star_as_lines =<< trim END
364 vim9script
365 import * as Export from './Xexport.vim'
366 def UseExport()
367 g:imported = Export.exported
368 enddef
369 UseExport()
370 END
371 writefile(import_star_as_lines, 'Ximport.vim')
372 source Ximport.vim
373 assert_equal(9876, g:imported)
374
375 let import_star_lines =<< trim END
376 vim9script
377 import * from './Xexport.vim'
378 g:imported = exported
379 END
380 writefile(import_star_lines, 'Ximport.vim')
381 assert_fails('source Ximport.vim', 'E1045:')
382
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100383 " try to import something that exists but is not exported
384 let import_not_exported_lines =<< trim END
385 vim9script
386 import name from './Xexport.vim'
387 END
388 writefile(import_not_exported_lines, 'Ximport.vim')
389 assert_fails('source Ximport.vim', 'E1049:')
390
391 " import a very long name, requires making a copy
392 let import_long_name_lines =<< trim END
393 vim9script
394 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
395 END
396 writefile(import_long_name_lines, 'Ximport.vim')
397 assert_fails('source Ximport.vim', 'E1048:')
398
399 let import_no_from_lines =<< trim END
400 vim9script
401 import name './Xexport.vim'
402 END
403 writefile(import_no_from_lines, 'Ximport.vim')
404 assert_fails('source Ximport.vim', 'E1070:')
405
406 let import_invalid_string_lines =<< trim END
407 vim9script
408 import name from Xexport.vim
409 END
410 writefile(import_invalid_string_lines, 'Ximport.vim')
411 assert_fails('source Ximport.vim', 'E1071:')
412
413 let import_wrong_name_lines =<< trim END
414 vim9script
415 import name from './XnoExport.vim'
416 END
417 writefile(import_wrong_name_lines, 'Ximport.vim')
418 assert_fails('source Ximport.vim', 'E1053:')
419
420 let import_missing_comma_lines =<< trim END
421 vim9script
422 import {exported name} from './Xexport.vim'
423 END
424 writefile(import_missing_comma_lines, 'Ximport.vim')
425 assert_fails('source Ximport.vim', 'E1046:')
426
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100427 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100428 delete('Xexport.vim')
429
Bram Moolenaar750802b2020-02-23 18:08:33 +0100430 " Check that in a Vim9 script 'cpo' is set to the Vim default.
431 set cpo&vi
432 let cpo_before = &cpo
433 let lines =<< trim END
434 vim9script
435 g:cpo_in_vim9script = &cpo
436 END
437 writefile(lines, 'Xvim9_script')
438 source Xvim9_script
439 assert_equal(cpo_before, &cpo)
440 set cpo&vim
441 assert_equal(&cpo, g:cpo_in_vim9script)
442 delete('Xvim9_script')
443enddef
444
445def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100446 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
447 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100448 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100449 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100450 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
451 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
452
453 assert_fails('vim9script', 'E1038')
454 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100455enddef
456
457def Test_vim9script_call()
458 let lines =<< trim END
459 vim9script
460 let var = ''
461 def MyFunc(arg: string)
462 var = arg
463 enddef
464 MyFunc('foobar')
465 assert_equal('foobar', var)
466
467 let str = 'barfoo'
468 str->MyFunc()
469 assert_equal('barfoo', var)
470
471 let g:value = 'value'
472 g:value->MyFunc()
473 assert_equal('value', var)
474
475 let listvar = []
476 def ListFunc(arg: list<number>)
477 listvar = arg
478 enddef
479 [1, 2, 3]->ListFunc()
480 assert_equal([1, 2, 3], listvar)
481
482 let dictvar = {}
483 def DictFunc(arg: dict<number>)
484 dictvar = arg
485 enddef
486 {'a': 1, 'b': 2}->DictFunc()
487 assert_equal(#{a: 1, b: 2}, dictvar)
488 #{a: 3, b: 4}->DictFunc()
489 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100490
491 ('text')->MyFunc()
492 assert_equal('text', var)
493 ("some")->MyFunc()
494 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100495 END
496 writefile(lines, 'Xcall.vim')
497 source Xcall.vim
498 delete('Xcall.vim')
499enddef
500
501def Test_vim9script_call_fail_decl()
502 let lines =<< trim END
503 vim9script
504 let var = ''
505 def MyFunc(arg: string)
506 let var = 123
507 enddef
508 END
509 writefile(lines, 'Xcall_decl.vim')
510 assert_fails('source Xcall_decl.vim', 'E1054:')
511 delete('Xcall_decl.vim')
512enddef
513
514def Test_vim9script_call_fail_const()
515 let lines =<< trim END
516 vim9script
517 const var = ''
518 def MyFunc(arg: string)
519 var = 'asdf'
520 enddef
521 END
522 writefile(lines, 'Xcall_const.vim')
523 assert_fails('source Xcall_const.vim', 'E46:')
524 delete('Xcall_const.vim')
525enddef
526
527def Test_vim9script_reload()
528 let lines =<< trim END
529 vim9script
530 const var = ''
531 let valone = 1234
532 def MyFunc(arg: string)
533 valone = 5678
534 enddef
535 END
536 let morelines =<< trim END
537 let valtwo = 222
538 export def GetValtwo(): number
539 return valtwo
540 enddef
541 END
542 writefile(lines + morelines, 'Xreload.vim')
543 source Xreload.vim
544 source Xreload.vim
545 source Xreload.vim
546
547 let testlines =<< trim END
548 vim9script
549 def TheFunc()
550 import GetValtwo from './Xreload.vim'
551 assert_equal(222, GetValtwo())
552 enddef
553 TheFunc()
554 END
555 writefile(testlines, 'Ximport.vim')
556 source Ximport.vim
557
558 " test that when not using "morelines" valtwo is still defined
559 " need to source Xreload.vim again, import doesn't reload a script
560 writefile(lines, 'Xreload.vim')
561 source Xreload.vim
562 source Ximport.vim
563
564 " cannot declare a var twice
565 lines =<< trim END
566 vim9script
567 let valone = 1234
568 let valone = 5678
569 END
570 writefile(lines, 'Xreload.vim')
571 assert_fails('source Xreload.vim', 'E1041:')
572
573 delete('Xreload.vim')
574 delete('Ximport.vim')
575enddef
576
577def Test_import_absolute()
578 let import_lines = [
579 \ 'vim9script',
580 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100581 \ 'def UseExported()',
582 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100583 \ ' exported = 8888',
584 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100585 \ 'enddef',
586 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100587 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100588 \ ]
589 writefile(import_lines, 'Ximport_abs.vim')
590 writefile(s:export_script_lines, 'Xexport_abs.vim')
591
592 source Ximport_abs.vim
593
594 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100595 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100596 assert_match('<SNR>\d\+_UseExported.*'
597 \ .. 'g:imported_abs = exported.*'
598 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100599 \ .. '1 STOREG g:imported_abs.*'
600 \ .. 'exported = 8888.*'
601 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
602 \ .. 'g:imported_after = exported.*'
603 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
604 \ .. '5 STOREG g:imported_after.*'
605 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100606 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100607 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100608
609 delete('Ximport_abs.vim')
610 delete('Xexport_abs.vim')
611enddef
612
613def Test_import_rtp()
614 let import_lines = [
615 \ 'vim9script',
616 \ 'import exported from "Xexport_rtp.vim"',
617 \ 'g:imported_rtp = exported',
618 \ ]
619 writefile(import_lines, 'Ximport_rtp.vim')
620 mkdir('import')
621 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
622
623 let save_rtp = &rtp
624 &rtp = getcwd()
625 source Ximport_rtp.vim
626 &rtp = save_rtp
627
628 assert_equal(9876, g:imported_rtp)
629 unlet g:imported_rtp
630
631 delete('Ximport_rtp.vim')
632 delete('import/Xexport_rtp.vim')
633 delete('import', 'd')
634enddef
635
636def Test_fixed_size_list()
637 " will be allocated as one piece of memory, check that changes work
638 let l = [1, 2, 3, 4]
639 l->remove(0)
640 l->add(5)
641 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100642 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100643enddef
644
Bram Moolenaar673660a2020-01-26 16:50:05 +0100645" Test that inside :function a Python function can be defined, :def is not
646" recognized.
647func Test_function_python()
648 CheckFeature python3
649 let py = 'python3'
650 execute py "<< EOF"
651def do_something():
652 return 1
653EOF
654endfunc
655
Bram Moolenaar158906c2020-02-06 20:39:45 +0100656def IfElse(what: number): string
657 let res = ''
658 if what == 1
659 res = "one"
660 elseif what == 2
661 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100662 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100663 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100664 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100665 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100666enddef
667
Bram Moolenaar158906c2020-02-06 20:39:45 +0100668def Test_if_elseif_else()
669 assert_equal('one', IfElse(1))
670 assert_equal('two', IfElse(2))
671 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100672enddef
673
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100674def Test_delfunc()
675 let lines =<< trim END
676 vim9script
677 def GoneSoon()
678 echo 'hello'
679 enddef
680
681 def CallGoneSoon()
682 GoneSoon()
683 enddef
684
685 delfunc GoneSoon
686 CallGoneSoon()
687 END
688 writefile(lines, 'XToDelFunc')
689 assert_fails('so XToDelFunc', 'E933')
690 assert_fails('so XToDelFunc', 'E933')
691
692 delete('XToDelFunc')
693enddef
694
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100695def Test_substitute_cmd()
696 new
697 setline(1, 'something')
698 :substitute(some(other(
699 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100700 bwipe!
701
702 " also when the context is Vim9 script
703 let lines =<< trim END
704 vim9script
705 new
706 setline(1, 'something')
707 :substitute(some(other(
708 assert_equal('otherthing', getline(1))
709 bwipe!
710 END
711 writefile(lines, 'Xvim9lines')
712 source Xvim9lines
713
714 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100715enddef
716
Bram Moolenaarad39c092020-02-26 18:23:43 +0100717def Test_execute_cmd()
718 new
719 setline(1, 'default')
720 execute 'call setline(1, "execute-string")'
721 assert_equal('execute-string', getline(1))
722 let cmd1 = 'call setline(1,'
723 let cmd2 = '"execute-var")'
724 execute cmd1 cmd2
725 assert_equal('execute-var', getline(1))
726 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
727 assert_equal('execute-var-string', getline(1))
728 let cmd_first = 'call '
729 let cmd_last = 'setline(1, "execute-var-var")'
730 execute cmd_first .. cmd_last
731 assert_equal('execute-var-var', getline(1))
732 bwipe!
733enddef
734
735def Test_echo_cmd()
736 echo 'something'
737 assert_match('^something$', Screenline(&lines))
738
739 let str1 = 'some'
740 let str2 = 'more'
741 echo str1 str2
742 assert_match('^some more$', Screenline(&lines))
743enddef
744
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100745
746" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker