blob: 53ee5119c86e10e00cc3bde9c72a346b27d2df2b [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 Moolenaar8a7d6542020-01-26 15:56:19 +0100215def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100216 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
217 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
218 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
219 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100220enddef
221
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100222def Test_arg_type_wrong()
223 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
224enddef
225
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100226def Test_try_catch()
227 let l = []
228 try
229 add(l, '1')
230 throw 'wrong'
231 add(l, '2')
232 catch
233 add(l, v:exception)
234 finally
235 add(l, '3')
236 endtry
237 assert_equal(['1', 'wrong', '3'], l)
238enddef
239
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100240def ThrowFromDef()
241 throw 'getout'
242enddef
243
244func CatchInFunc()
245 try
246 call ThrowFromDef()
247 catch
248 let g:thrown_func = v:exception
249 endtry
250endfunc
251
252def CatchInDef()
253 try
254 ThrowFromDef()
255 catch
256 g:thrown_def = v:exception
257 endtry
258enddef
259
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100260def ReturnFinally(): string
261 try
262 return 'intry'
263 finally
264 g:in_finally = 'finally'
265 endtry
266 return 'end'
267enddef
268
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100269def Test_try_catch_nested()
270 CatchInFunc()
271 assert_equal('getout', g:thrown_func)
272
273 CatchInDef()
274 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100275
276 assert_equal('intry', ReturnFinally())
277 assert_equal('finally', g:in_finally)
278enddef
279
280def Test_try_catch_match()
281 let seq = 'a'
282 try
283 throw 'something'
284 catch /nothing/
285 seq ..= 'x'
286 catch /some/
287 seq ..= 'b'
288 catch /asdf/
289 seq ..= 'x'
290 finally
291 seq ..= 'c'
292 endtry
293 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100294enddef
295
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100296let s:export_script_lines =<< trim END
297 vim9script
298 let name: string = 'bob'
299 def Concat(arg: string): string
300 return name .. arg
301 enddef
302 let g:result = Concat('bie')
303 let g:localname = name
304
305 export const CONST = 1234
306 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100307 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100308 export def Exported(): string
309 return 'Exported'
310 enddef
311END
312
313def Test_vim9script()
314 let import_script_lines =<< trim END
315 vim9script
316 import {exported, Exported} from './Xexport.vim'
317 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100318 exported += 3
319 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100320 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100321
322 import {exp_name} from './Xexport.vim'
323 g:imported_name = exp_name
324 exp_name ..= ' Doe'
325 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100326 END
327
328 writefile(import_script_lines, 'Ximport.vim')
329 writefile(s:export_script_lines, 'Xexport.vim')
330
331 source Ximport.vim
332
333 assert_equal('bobbie', g:result)
334 assert_equal('bob', g:localname)
335 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100336 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100337 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100338 assert_equal('John', g:imported_name)
339 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100340 assert_false(exists('g:name'))
341
342 unlet g:result
343 unlet g:localname
344 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100345 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100346 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100347 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100348 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100349
350 let import_star_as_lines =<< trim END
351 vim9script
352 import * as Export from './Xexport.vim'
353 def UseExport()
354 g:imported = Export.exported
355 enddef
356 UseExport()
357 END
358 writefile(import_star_as_lines, 'Ximport.vim')
359 source Ximport.vim
360 assert_equal(9876, g:imported)
361
362 let import_star_lines =<< trim END
363 vim9script
364 import * from './Xexport.vim'
365 g:imported = exported
366 END
367 writefile(import_star_lines, 'Ximport.vim')
368 assert_fails('source Ximport.vim', 'E1045:')
369
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100370 " try to import something that exists but is not exported
371 let import_not_exported_lines =<< trim END
372 vim9script
373 import name from './Xexport.vim'
374 END
375 writefile(import_not_exported_lines, 'Ximport.vim')
376 assert_fails('source Ximport.vim', 'E1049:')
377
378 " import a very long name, requires making a copy
379 let import_long_name_lines =<< trim END
380 vim9script
381 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
382 END
383 writefile(import_long_name_lines, 'Ximport.vim')
384 assert_fails('source Ximport.vim', 'E1048:')
385
386 let import_no_from_lines =<< trim END
387 vim9script
388 import name './Xexport.vim'
389 END
390 writefile(import_no_from_lines, 'Ximport.vim')
391 assert_fails('source Ximport.vim', 'E1070:')
392
393 let import_invalid_string_lines =<< trim END
394 vim9script
395 import name from Xexport.vim
396 END
397 writefile(import_invalid_string_lines, 'Ximport.vim')
398 assert_fails('source Ximport.vim', 'E1071:')
399
400 let import_wrong_name_lines =<< trim END
401 vim9script
402 import name from './XnoExport.vim'
403 END
404 writefile(import_wrong_name_lines, 'Ximport.vim')
405 assert_fails('source Ximport.vim', 'E1053:')
406
407 let import_missing_comma_lines =<< trim END
408 vim9script
409 import {exported name} from './Xexport.vim'
410 END
411 writefile(import_missing_comma_lines, 'Ximport.vim')
412 assert_fails('source Ximport.vim', 'E1046:')
413
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100414 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100415 delete('Xexport.vim')
416
Bram Moolenaar750802b2020-02-23 18:08:33 +0100417 " Check that in a Vim9 script 'cpo' is set to the Vim default.
418 set cpo&vi
419 let cpo_before = &cpo
420 let lines =<< trim END
421 vim9script
422 g:cpo_in_vim9script = &cpo
423 END
424 writefile(lines, 'Xvim9_script')
425 source Xvim9_script
426 assert_equal(cpo_before, &cpo)
427 set cpo&vim
428 assert_equal(&cpo, g:cpo_in_vim9script)
429 delete('Xvim9_script')
430enddef
431
432def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100433 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
434 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100435 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100436 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100437 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
438 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
439
440 assert_fails('vim9script', 'E1038')
441 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100442enddef
443
444def Test_vim9script_call()
445 let lines =<< trim END
446 vim9script
447 let var = ''
448 def MyFunc(arg: string)
449 var = arg
450 enddef
451 MyFunc('foobar')
452 assert_equal('foobar', var)
453
454 let str = 'barfoo'
455 str->MyFunc()
456 assert_equal('barfoo', var)
457
458 let g:value = 'value'
459 g:value->MyFunc()
460 assert_equal('value', var)
461
462 let listvar = []
463 def ListFunc(arg: list<number>)
464 listvar = arg
465 enddef
466 [1, 2, 3]->ListFunc()
467 assert_equal([1, 2, 3], listvar)
468
469 let dictvar = {}
470 def DictFunc(arg: dict<number>)
471 dictvar = arg
472 enddef
473 {'a': 1, 'b': 2}->DictFunc()
474 assert_equal(#{a: 1, b: 2}, dictvar)
475 #{a: 3, b: 4}->DictFunc()
476 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100477
478 ('text')->MyFunc()
479 assert_equal('text', var)
480 ("some")->MyFunc()
481 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100482 END
483 writefile(lines, 'Xcall.vim')
484 source Xcall.vim
485 delete('Xcall.vim')
486enddef
487
488def Test_vim9script_call_fail_decl()
489 let lines =<< trim END
490 vim9script
491 let var = ''
492 def MyFunc(arg: string)
493 let var = 123
494 enddef
495 END
496 writefile(lines, 'Xcall_decl.vim')
497 assert_fails('source Xcall_decl.vim', 'E1054:')
498 delete('Xcall_decl.vim')
499enddef
500
501def Test_vim9script_call_fail_const()
502 let lines =<< trim END
503 vim9script
504 const var = ''
505 def MyFunc(arg: string)
506 var = 'asdf'
507 enddef
508 END
509 writefile(lines, 'Xcall_const.vim')
510 assert_fails('source Xcall_const.vim', 'E46:')
511 delete('Xcall_const.vim')
512enddef
513
514def Test_vim9script_reload()
515 let lines =<< trim END
516 vim9script
517 const var = ''
518 let valone = 1234
519 def MyFunc(arg: string)
520 valone = 5678
521 enddef
522 END
523 let morelines =<< trim END
524 let valtwo = 222
525 export def GetValtwo(): number
526 return valtwo
527 enddef
528 END
529 writefile(lines + morelines, 'Xreload.vim')
530 source Xreload.vim
531 source Xreload.vim
532 source Xreload.vim
533
534 let testlines =<< trim END
535 vim9script
536 def TheFunc()
537 import GetValtwo from './Xreload.vim'
538 assert_equal(222, GetValtwo())
539 enddef
540 TheFunc()
541 END
542 writefile(testlines, 'Ximport.vim')
543 source Ximport.vim
544
545 " test that when not using "morelines" valtwo is still defined
546 " need to source Xreload.vim again, import doesn't reload a script
547 writefile(lines, 'Xreload.vim')
548 source Xreload.vim
549 source Ximport.vim
550
551 " cannot declare a var twice
552 lines =<< trim END
553 vim9script
554 let valone = 1234
555 let valone = 5678
556 END
557 writefile(lines, 'Xreload.vim')
558 assert_fails('source Xreload.vim', 'E1041:')
559
560 delete('Xreload.vim')
561 delete('Ximport.vim')
562enddef
563
564def Test_import_absolute()
565 let import_lines = [
566 \ 'vim9script',
567 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100568 \ 'def UseExported()',
569 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100570 \ ' exported = 8888',
571 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100572 \ 'enddef',
573 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100574 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100575 \ ]
576 writefile(import_lines, 'Ximport_abs.vim')
577 writefile(s:export_script_lines, 'Xexport_abs.vim')
578
579 source Ximport_abs.vim
580
581 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100582 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100583 assert_match('<SNR>\d\+_UseExported.*'
584 \ .. 'g:imported_abs = exported.*'
585 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100586 \ .. '1 STOREG g:imported_abs.*'
587 \ .. 'exported = 8888.*'
588 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
589 \ .. 'g:imported_after = exported.*'
590 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
591 \ .. '5 STOREG g:imported_after.*'
592 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100593 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100594 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100595
596 delete('Ximport_abs.vim')
597 delete('Xexport_abs.vim')
598enddef
599
600def Test_import_rtp()
601 let import_lines = [
602 \ 'vim9script',
603 \ 'import exported from "Xexport_rtp.vim"',
604 \ 'g:imported_rtp = exported',
605 \ ]
606 writefile(import_lines, 'Ximport_rtp.vim')
607 mkdir('import')
608 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
609
610 let save_rtp = &rtp
611 &rtp = getcwd()
612 source Ximport_rtp.vim
613 &rtp = save_rtp
614
615 assert_equal(9876, g:imported_rtp)
616 unlet g:imported_rtp
617
618 delete('Ximport_rtp.vim')
619 delete('import/Xexport_rtp.vim')
620 delete('import', 'd')
621enddef
622
623def Test_fixed_size_list()
624 " will be allocated as one piece of memory, check that changes work
625 let l = [1, 2, 3, 4]
626 l->remove(0)
627 l->add(5)
628 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100629 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100630enddef
631
Bram Moolenaar673660a2020-01-26 16:50:05 +0100632" Test that inside :function a Python function can be defined, :def is not
633" recognized.
634func Test_function_python()
635 CheckFeature python3
636 let py = 'python3'
637 execute py "<< EOF"
638def do_something():
639 return 1
640EOF
641endfunc
642
Bram Moolenaar158906c2020-02-06 20:39:45 +0100643def IfElse(what: number): string
644 let res = ''
645 if what == 1
646 res = "one"
647 elseif what == 2
648 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100649 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100650 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100651 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100652 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100653enddef
654
Bram Moolenaar158906c2020-02-06 20:39:45 +0100655def Test_if_elseif_else()
656 assert_equal('one', IfElse(1))
657 assert_equal('two', IfElse(2))
658 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100659enddef
660
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100661def Test_delfunc()
662 let lines =<< trim END
663 vim9script
664 def GoneSoon()
665 echo 'hello'
666 enddef
667
668 def CallGoneSoon()
669 GoneSoon()
670 enddef
671
672 delfunc GoneSoon
673 CallGoneSoon()
674 END
675 writefile(lines, 'XToDelFunc')
676 assert_fails('so XToDelFunc', 'E933')
677 assert_fails('so XToDelFunc', 'E933')
678
679 delete('XToDelFunc')
680enddef
681
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100682def Test_substitute_cmd()
683 new
684 setline(1, 'something')
685 :substitute(some(other(
686 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100687 bwipe!
688
689 " also when the context is Vim9 script
690 let lines =<< trim END
691 vim9script
692 new
693 setline(1, 'something')
694 :substitute(some(other(
695 assert_equal('otherthing', getline(1))
696 bwipe!
697 END
698 writefile(lines, 'Xvim9lines')
699 source Xvim9lines
700
701 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100702enddef
703
Bram Moolenaarad39c092020-02-26 18:23:43 +0100704def Test_execute_cmd()
705 new
706 setline(1, 'default')
707 execute 'call setline(1, "execute-string")'
708 assert_equal('execute-string', getline(1))
709 let cmd1 = 'call setline(1,'
710 let cmd2 = '"execute-var")'
711 execute cmd1 cmd2
712 assert_equal('execute-var', getline(1))
713 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
714 assert_equal('execute-var-string', getline(1))
715 let cmd_first = 'call '
716 let cmd_last = 'setline(1, "execute-var-var")'
717 execute cmd_first .. cmd_last
718 assert_equal('execute-var-var', getline(1))
719 bwipe!
720enddef
721
722def Test_echo_cmd()
723 echo 'something'
724 assert_match('^something$', Screenline(&lines))
725
726 let str1 = 'some'
727 let str2 = 'more'
728 echo str1 str2
729 assert_match('^some more$', Screenline(&lines))
730enddef
731
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100732
733" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker