blob: 3f0773b173afb4a7853c735eda11159f883ba5ca [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
181" Default arg and varargs
182def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
183 let res = one .. ',' .. two
184 for s in rest
185 res ..= ',' .. s
186 endfor
187 return res
188enddef
189
190def Test_call_def_varargs()
191 call assert_fails('call MyDefVarargs()', 'E119:')
192 assert_equal('one,foo', MyDefVarargs('one'))
193 assert_equal('one,two', MyDefVarargs('one', 'two'))
194 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
195enddef
196
197
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100198"def Test_call_func_defined_later()
199" call assert_equal('one', DefineLater('one'))
200" call assert_fails('call NotDefined("one")', 'E99:')
201"enddef
202
203func DefineLater(arg)
204 return a:arg
205endfunc
206
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100207def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100208 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
209 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
210 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
211 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100212enddef
213
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100214def Test_arg_type_wrong()
215 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
216enddef
217
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100218def Test_try_catch()
219 let l = []
220 try
221 add(l, '1')
222 throw 'wrong'
223 add(l, '2')
224 catch
225 add(l, v:exception)
226 finally
227 add(l, '3')
228 endtry
229 assert_equal(['1', 'wrong', '3'], l)
230enddef
231
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100232def ThrowFromDef()
233 throw 'getout'
234enddef
235
236func CatchInFunc()
237 try
238 call ThrowFromDef()
239 catch
240 let g:thrown_func = v:exception
241 endtry
242endfunc
243
244def CatchInDef()
245 try
246 ThrowFromDef()
247 catch
248 g:thrown_def = v:exception
249 endtry
250enddef
251
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100252def ReturnFinally(): string
253 try
254 return 'intry'
255 finally
256 g:in_finally = 'finally'
257 endtry
258 return 'end'
259enddef
260
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100261def Test_try_catch_nested()
262 CatchInFunc()
263 assert_equal('getout', g:thrown_func)
264
265 CatchInDef()
266 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100267
268 assert_equal('intry', ReturnFinally())
269 assert_equal('finally', g:in_finally)
270enddef
271
272def Test_try_catch_match()
273 let seq = 'a'
274 try
275 throw 'something'
276 catch /nothing/
277 seq ..= 'x'
278 catch /some/
279 seq ..= 'b'
280 catch /asdf/
281 seq ..= 'x'
282 finally
283 seq ..= 'c'
284 endtry
285 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100286enddef
287
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100288let s:export_script_lines =<< trim END
289 vim9script
290 let name: string = 'bob'
291 def Concat(arg: string): string
292 return name .. arg
293 enddef
294 let g:result = Concat('bie')
295 let g:localname = name
296
297 export const CONST = 1234
298 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100299 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100300 export def Exported(): string
301 return 'Exported'
302 enddef
303END
304
305def Test_vim9script()
306 let import_script_lines =<< trim END
307 vim9script
308 import {exported, Exported} from './Xexport.vim'
309 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100310 exported += 3
311 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100312 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100313
314 import {exp_name} from './Xexport.vim'
315 g:imported_name = exp_name
316 exp_name ..= ' Doe'
317 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100318 END
319
320 writefile(import_script_lines, 'Ximport.vim')
321 writefile(s:export_script_lines, 'Xexport.vim')
322
323 source Ximport.vim
324
325 assert_equal('bobbie', g:result)
326 assert_equal('bob', g:localname)
327 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100328 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100329 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100330 assert_equal('John', g:imported_name)
331 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100332 assert_false(exists('g:name'))
333
334 unlet g:result
335 unlet g:localname
336 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100337 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100338 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100339 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100340 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100341
342 let import_star_as_lines =<< trim END
343 vim9script
344 import * as Export from './Xexport.vim'
345 def UseExport()
346 g:imported = Export.exported
347 enddef
348 UseExport()
349 END
350 writefile(import_star_as_lines, 'Ximport.vim')
351 source Ximport.vim
352 assert_equal(9876, g:imported)
353
354 let import_star_lines =<< trim END
355 vim9script
356 import * from './Xexport.vim'
357 g:imported = exported
358 END
359 writefile(import_star_lines, 'Ximport.vim')
360 assert_fails('source Ximport.vim', 'E1045:')
361
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100362 " try to import something that exists but is not exported
363 let import_not_exported_lines =<< trim END
364 vim9script
365 import name from './Xexport.vim'
366 END
367 writefile(import_not_exported_lines, 'Ximport.vim')
368 assert_fails('source Ximport.vim', 'E1049:')
369
370 " import a very long name, requires making a copy
371 let import_long_name_lines =<< trim END
372 vim9script
373 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
374 END
375 writefile(import_long_name_lines, 'Ximport.vim')
376 assert_fails('source Ximport.vim', 'E1048:')
377
378 let import_no_from_lines =<< trim END
379 vim9script
380 import name './Xexport.vim'
381 END
382 writefile(import_no_from_lines, 'Ximport.vim')
383 assert_fails('source Ximport.vim', 'E1070:')
384
385 let import_invalid_string_lines =<< trim END
386 vim9script
387 import name from Xexport.vim
388 END
389 writefile(import_invalid_string_lines, 'Ximport.vim')
390 assert_fails('source Ximport.vim', 'E1071:')
391
392 let import_wrong_name_lines =<< trim END
393 vim9script
394 import name from './XnoExport.vim'
395 END
396 writefile(import_wrong_name_lines, 'Ximport.vim')
397 assert_fails('source Ximport.vim', 'E1053:')
398
399 let import_missing_comma_lines =<< trim END
400 vim9script
401 import {exported name} from './Xexport.vim'
402 END
403 writefile(import_missing_comma_lines, 'Ximport.vim')
404 assert_fails('source Ximport.vim', 'E1046:')
405
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100406 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100407 delete('Xexport.vim')
408
Bram Moolenaar750802b2020-02-23 18:08:33 +0100409 " Check that in a Vim9 script 'cpo' is set to the Vim default.
410 set cpo&vi
411 let cpo_before = &cpo
412 let lines =<< trim END
413 vim9script
414 g:cpo_in_vim9script = &cpo
415 END
416 writefile(lines, 'Xvim9_script')
417 source Xvim9_script
418 assert_equal(cpo_before, &cpo)
419 set cpo&vim
420 assert_equal(&cpo, g:cpo_in_vim9script)
421 delete('Xvim9_script')
422enddef
423
424def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100425 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
426 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100427 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100428 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100429 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
430 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
431
432 assert_fails('vim9script', 'E1038')
433 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100434enddef
435
436def Test_vim9script_call()
437 let lines =<< trim END
438 vim9script
439 let var = ''
440 def MyFunc(arg: string)
441 var = arg
442 enddef
443 MyFunc('foobar')
444 assert_equal('foobar', var)
445
446 let str = 'barfoo'
447 str->MyFunc()
448 assert_equal('barfoo', var)
449
450 let g:value = 'value'
451 g:value->MyFunc()
452 assert_equal('value', var)
453
454 let listvar = []
455 def ListFunc(arg: list<number>)
456 listvar = arg
457 enddef
458 [1, 2, 3]->ListFunc()
459 assert_equal([1, 2, 3], listvar)
460
461 let dictvar = {}
462 def DictFunc(arg: dict<number>)
463 dictvar = arg
464 enddef
465 {'a': 1, 'b': 2}->DictFunc()
466 assert_equal(#{a: 1, b: 2}, dictvar)
467 #{a: 3, b: 4}->DictFunc()
468 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100469
470 ('text')->MyFunc()
471 assert_equal('text', var)
472 ("some")->MyFunc()
473 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100474 END
475 writefile(lines, 'Xcall.vim')
476 source Xcall.vim
477 delete('Xcall.vim')
478enddef
479
480def Test_vim9script_call_fail_decl()
481 let lines =<< trim END
482 vim9script
483 let var = ''
484 def MyFunc(arg: string)
485 let var = 123
486 enddef
487 END
488 writefile(lines, 'Xcall_decl.vim')
489 assert_fails('source Xcall_decl.vim', 'E1054:')
490 delete('Xcall_decl.vim')
491enddef
492
493def Test_vim9script_call_fail_const()
494 let lines =<< trim END
495 vim9script
496 const var = ''
497 def MyFunc(arg: string)
498 var = 'asdf'
499 enddef
500 END
501 writefile(lines, 'Xcall_const.vim')
502 assert_fails('source Xcall_const.vim', 'E46:')
503 delete('Xcall_const.vim')
504enddef
505
506def Test_vim9script_reload()
507 let lines =<< trim END
508 vim9script
509 const var = ''
510 let valone = 1234
511 def MyFunc(arg: string)
512 valone = 5678
513 enddef
514 END
515 let morelines =<< trim END
516 let valtwo = 222
517 export def GetValtwo(): number
518 return valtwo
519 enddef
520 END
521 writefile(lines + morelines, 'Xreload.vim')
522 source Xreload.vim
523 source Xreload.vim
524 source Xreload.vim
525
526 let testlines =<< trim END
527 vim9script
528 def TheFunc()
529 import GetValtwo from './Xreload.vim'
530 assert_equal(222, GetValtwo())
531 enddef
532 TheFunc()
533 END
534 writefile(testlines, 'Ximport.vim')
535 source Ximport.vim
536
537 " test that when not using "morelines" valtwo is still defined
538 " need to source Xreload.vim again, import doesn't reload a script
539 writefile(lines, 'Xreload.vim')
540 source Xreload.vim
541 source Ximport.vim
542
543 " cannot declare a var twice
544 lines =<< trim END
545 vim9script
546 let valone = 1234
547 let valone = 5678
548 END
549 writefile(lines, 'Xreload.vim')
550 assert_fails('source Xreload.vim', 'E1041:')
551
552 delete('Xreload.vim')
553 delete('Ximport.vim')
554enddef
555
556def Test_import_absolute()
557 let import_lines = [
558 \ 'vim9script',
559 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100560 \ 'def UseExported()',
561 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100562 \ ' exported = 8888',
563 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100564 \ 'enddef',
565 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100566 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100567 \ ]
568 writefile(import_lines, 'Ximport_abs.vim')
569 writefile(s:export_script_lines, 'Xexport_abs.vim')
570
571 source Ximport_abs.vim
572
573 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100574 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100575 assert_match('<SNR>\d\+_UseExported.*'
576 \ .. 'g:imported_abs = exported.*'
577 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100578 \ .. '1 STOREG g:imported_abs.*'
579 \ .. 'exported = 8888.*'
580 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
581 \ .. 'g:imported_after = exported.*'
582 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
583 \ .. '5 STOREG g:imported_after.*'
584 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100585 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100586 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100587
588 delete('Ximport_abs.vim')
589 delete('Xexport_abs.vim')
590enddef
591
592def Test_import_rtp()
593 let import_lines = [
594 \ 'vim9script',
595 \ 'import exported from "Xexport_rtp.vim"',
596 \ 'g:imported_rtp = exported',
597 \ ]
598 writefile(import_lines, 'Ximport_rtp.vim')
599 mkdir('import')
600 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
601
602 let save_rtp = &rtp
603 &rtp = getcwd()
604 source Ximport_rtp.vim
605 &rtp = save_rtp
606
607 assert_equal(9876, g:imported_rtp)
608 unlet g:imported_rtp
609
610 delete('Ximport_rtp.vim')
611 delete('import/Xexport_rtp.vim')
612 delete('import', 'd')
613enddef
614
615def Test_fixed_size_list()
616 " will be allocated as one piece of memory, check that changes work
617 let l = [1, 2, 3, 4]
618 l->remove(0)
619 l->add(5)
620 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100621 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100622enddef
623
Bram Moolenaar673660a2020-01-26 16:50:05 +0100624" Test that inside :function a Python function can be defined, :def is not
625" recognized.
626func Test_function_python()
627 CheckFeature python3
628 let py = 'python3'
629 execute py "<< EOF"
630def do_something():
631 return 1
632EOF
633endfunc
634
Bram Moolenaar158906c2020-02-06 20:39:45 +0100635def IfElse(what: number): string
636 let res = ''
637 if what == 1
638 res = "one"
639 elseif what == 2
640 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100641 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100642 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100643 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100644 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100645enddef
646
Bram Moolenaar158906c2020-02-06 20:39:45 +0100647def Test_if_elseif_else()
648 assert_equal('one', IfElse(1))
649 assert_equal('two', IfElse(2))
650 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100651enddef
652
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100653def Test_delfunc()
654 let lines =<< trim END
655 vim9script
656 def GoneSoon()
657 echo 'hello'
658 enddef
659
660 def CallGoneSoon()
661 GoneSoon()
662 enddef
663
664 delfunc GoneSoon
665 CallGoneSoon()
666 END
667 writefile(lines, 'XToDelFunc')
668 assert_fails('so XToDelFunc', 'E933')
669 assert_fails('so XToDelFunc', 'E933')
670
671 delete('XToDelFunc')
672enddef
673
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100674def Test_substitute_cmd()
675 new
676 setline(1, 'something')
677 :substitute(some(other(
678 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100679 bwipe!
680
681 " also when the context is Vim9 script
682 let lines =<< trim END
683 vim9script
684 new
685 setline(1, 'something')
686 :substitute(some(other(
687 assert_equal('otherthing', getline(1))
688 bwipe!
689 END
690 writefile(lines, 'Xvim9lines')
691 source Xvim9lines
692
693 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100694enddef
695
Bram Moolenaarad39c092020-02-26 18:23:43 +0100696def Test_execute_cmd()
697 new
698 setline(1, 'default')
699 execute 'call setline(1, "execute-string")'
700 assert_equal('execute-string', getline(1))
701 let cmd1 = 'call setline(1,'
702 let cmd2 = '"execute-var")'
703 execute cmd1 cmd2
704 assert_equal('execute-var', getline(1))
705 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
706 assert_equal('execute-var-string', getline(1))
707 let cmd_first = 'call '
708 let cmd_last = 'setline(1, "execute-var-var")'
709 execute cmd_first .. cmd_last
710 assert_equal('execute-var-var', getline(1))
711 bwipe!
712enddef
713
714def Test_echo_cmd()
715 echo 'something'
716 assert_match('^something$', Screenline(&lines))
717
718 let str1 = 'some'
719 let str2 = 'more'
720 echo str1 str2
721 assert_match('^some more$', Screenline(&lines))
722enddef
723
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100724
725" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker