blob: c68d29f883e938a25afcfd257a0e573514b691d0 [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
4
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005" Check that "lines" inside ":def" results in an "error" message.
6func CheckDefFailure(lines, error)
Bram Moolenaar978d1702020-01-26 17:38:12 +01007 call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008 call assert_fails('so Xdef', a:error, a:lines)
9 call delete('Xdef')
10endfunc
11
12func CheckScriptFailure(lines, error)
13 call writefile(a:lines, 'Xdef')
14 call assert_fails('so Xdef', a:error, a:lines)
15 call delete('Xdef')
16endfunc
17
18def Test_syntax()
19 let var = 234
20 let other: list<string> = ['asdf']
21enddef
22
23func Test_def_basic()
24 def SomeFunc(): string
25 return 'yes'
26 enddef
27 call assert_equal('yes', SomeFunc())
28endfunc
29
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010030let s:appendToMe = 'xxx'
31let s:addToMe = 111
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010032let g:existing = 'yes'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010033
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010034def Test_assignment()
35 let bool1: bool = true
36 assert_equal(v:true, bool1)
37 let bool2: bool = false
38 assert_equal(v:false, bool2)
39
40 let list1: list<string> = ['sdf', 'asdf']
41 let list2: list<number> = [1, 2, 3]
42
Bram Moolenaar436472f2020-02-20 22:54:43 +010043 let listS: list<string> = []
44 let listN: list<number> = []
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010045
46 let dict1: dict<string> = #{key: 'value'}
47 let dict2: dict<number> = #{one: 1, two: 2}
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010048
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010049 g:newvar = 'new'
50 assert_equal('new', g:newvar)
51
52 assert_equal('yes', g:existing)
53 g:existing = 'no'
54 assert_equal('no', g:existing)
55
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010056 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010057 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010058
59 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010060 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010061 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010062
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010063 s:appendToMe ..= 'yyy'
64 assert_equal('xxxyyy', s:appendToMe)
65 s:addToMe += 222
66 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010067 s:newVar = 'new'
68 assert_equal('new', s:newVar)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010069enddef
70
71func Test_assignment_failure()
72 call CheckDefFailure(['let var=234'], 'E1004:')
73 call CheckDefFailure(['let var =234'], 'E1004:')
74 call CheckDefFailure(['let var= 234'], 'E1004:')
75
76 call CheckDefFailure(['let true = 1'], 'E1034:')
77 call CheckDefFailure(['let false = 1'], 'E1034:')
78
79 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
80 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
81
82 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
83 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
84
85 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
86 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
87endfunc
88
89func Test_const()
90 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
91 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
92 call CheckDefFailure(['const two'], 'E1021:')
93endfunc
94
95def Test_block()
96 let outer = 1
97 {
98 let inner = 2
99 assert_equal(1, outer)
100 assert_equal(2, inner)
101 }
102 assert_equal(1, outer)
103enddef
104
105func Test_block_failure()
106 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
107endfunc
108
109def ReturnString(): string
110 return 'string'
111enddef
112
113def ReturnNumber(): number
114 return 123
115enddef
116
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100117let g:notNumber = 'string'
118
119def ReturnGlobal(): number
120 return g:notNumber
121enddef
122
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100123def Test_return_string()
124 assert_equal('string', ReturnString())
125 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100126 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100127enddef
128
129func Increment()
130 let g:counter += 1
131endfunc
132
133def Test_call_ufunc_count()
134 g:counter = 1
135 Increment()
136 Increment()
137 Increment()
138 " works with and without :call
139 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100140 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100141 unlet g:counter
142enddef
143
144def MyVarargs(arg: string, ...rest: list<string>): string
145 let res = arg
146 for s in rest
147 res ..= ',' .. s
148 endfor
149 return res
150enddef
151
152def Test_call_varargs()
153 assert_equal('one', MyVarargs('one'))
154 assert_equal('one,two', MyVarargs('one', 'two'))
155 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
156enddef
157
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100158def MyDefaultArgs(name = 'string'): string
159 return name
160enddef
161
162def Test_call_default_args()
163 assert_equal('string', MyDefaultArgs())
164 assert_equal('one', MyDefaultArgs('one'))
165 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
166enddef
167
168func Test_call_default_args_from_func()
169 call assert_equal('string', MyDefaultArgs())
170 call assert_equal('one', MyDefaultArgs('one'))
171 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
172endfunc
173
174" Default arg and varargs
175def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
176 let res = one .. ',' .. two
177 for s in rest
178 res ..= ',' .. s
179 endfor
180 return res
181enddef
182
183def Test_call_def_varargs()
184 call assert_fails('call MyDefVarargs()', 'E119:')
185 assert_equal('one,foo', MyDefVarargs('one'))
186 assert_equal('one,two', MyDefVarargs('one', 'two'))
187 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
188enddef
189
190
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100191"def Test_call_func_defined_later()
192" call assert_equal('one', DefineLater('one'))
193" call assert_fails('call NotDefined("one")', 'E99:')
194"enddef
195
196func DefineLater(arg)
197 return a:arg
198endfunc
199
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100200def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100201 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
202 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
203 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
204 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100205enddef
206
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100207def Test_arg_type_wrong()
208 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
209enddef
210
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100211def Test_try_catch()
212 let l = []
213 try
214 add(l, '1')
215 throw 'wrong'
216 add(l, '2')
217 catch
218 add(l, v:exception)
219 finally
220 add(l, '3')
221 endtry
222 assert_equal(['1', 'wrong', '3'], l)
223enddef
224
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100225def ThrowFromDef()
226 throw 'getout'
227enddef
228
229func CatchInFunc()
230 try
231 call ThrowFromDef()
232 catch
233 let g:thrown_func = v:exception
234 endtry
235endfunc
236
237def CatchInDef()
238 try
239 ThrowFromDef()
240 catch
241 g:thrown_def = v:exception
242 endtry
243enddef
244
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100245def ReturnFinally(): string
246 try
247 return 'intry'
248 finally
249 g:in_finally = 'finally'
250 endtry
251 return 'end'
252enddef
253
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100254def Test_try_catch_nested()
255 CatchInFunc()
256 assert_equal('getout', g:thrown_func)
257
258 CatchInDef()
259 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100260
261 assert_equal('intry', ReturnFinally())
262 assert_equal('finally', g:in_finally)
263enddef
264
265def Test_try_catch_match()
266 let seq = 'a'
267 try
268 throw 'something'
269 catch /nothing/
270 seq ..= 'x'
271 catch /some/
272 seq ..= 'b'
273 catch /asdf/
274 seq ..= 'x'
275 finally
276 seq ..= 'c'
277 endtry
278 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100279enddef
280
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100281let s:export_script_lines =<< trim END
282 vim9script
283 let name: string = 'bob'
284 def Concat(arg: string): string
285 return name .. arg
286 enddef
287 let g:result = Concat('bie')
288 let g:localname = name
289
290 export const CONST = 1234
291 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100292 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100293 export def Exported(): string
294 return 'Exported'
295 enddef
296END
297
298def Test_vim9script()
299 let import_script_lines =<< trim END
300 vim9script
301 import {exported, Exported} from './Xexport.vim'
302 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100303 exported += 3
304 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100305 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100306
307 import {exp_name} from './Xexport.vim'
308 g:imported_name = exp_name
309 exp_name ..= ' Doe'
310 g:imported_name_appended = exp_name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100311 END
312
313 writefile(import_script_lines, 'Ximport.vim')
314 writefile(s:export_script_lines, 'Xexport.vim')
315
316 source Ximport.vim
317
318 assert_equal('bobbie', g:result)
319 assert_equal('bob', g:localname)
320 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100321 assert_equal(9879, g:imported_added)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100322 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100323 assert_equal('John', g:imported_name)
324 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100325 assert_false(exists('g:name'))
326
327 unlet g:result
328 unlet g:localname
329 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100330 unlet g:imported_added
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100331 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100332 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100333 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100334
335 let import_star_as_lines =<< trim END
336 vim9script
337 import * as Export from './Xexport.vim'
338 def UseExport()
339 g:imported = Export.exported
340 enddef
341 UseExport()
342 END
343 writefile(import_star_as_lines, 'Ximport.vim')
344 source Ximport.vim
345 assert_equal(9876, g:imported)
346
347 let import_star_lines =<< trim END
348 vim9script
349 import * from './Xexport.vim'
350 g:imported = exported
351 END
352 writefile(import_star_lines, 'Ximport.vim')
353 assert_fails('source Ximport.vim', 'E1045:')
354
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100355 " try to import something that exists but is not exported
356 let import_not_exported_lines =<< trim END
357 vim9script
358 import name from './Xexport.vim'
359 END
360 writefile(import_not_exported_lines, 'Ximport.vim')
361 assert_fails('source Ximport.vim', 'E1049:')
362
363 " import a very long name, requires making a copy
364 let import_long_name_lines =<< trim END
365 vim9script
366 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
367 END
368 writefile(import_long_name_lines, 'Ximport.vim')
369 assert_fails('source Ximport.vim', 'E1048:')
370
371 let import_no_from_lines =<< trim END
372 vim9script
373 import name './Xexport.vim'
374 END
375 writefile(import_no_from_lines, 'Ximport.vim')
376 assert_fails('source Ximport.vim', 'E1070:')
377
378 let import_invalid_string_lines =<< trim END
379 vim9script
380 import name from Xexport.vim
381 END
382 writefile(import_invalid_string_lines, 'Ximport.vim')
383 assert_fails('source Ximport.vim', 'E1071:')
384
385 let import_wrong_name_lines =<< trim END
386 vim9script
387 import name from './XnoExport.vim'
388 END
389 writefile(import_wrong_name_lines, 'Ximport.vim')
390 assert_fails('source Ximport.vim', 'E1053:')
391
392 let import_missing_comma_lines =<< trim END
393 vim9script
394 import {exported name} from './Xexport.vim'
395 END
396 writefile(import_missing_comma_lines, 'Ximport.vim')
397 assert_fails('source Ximport.vim', 'E1046:')
398
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100399 delete('Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100400 delete('Xexport.vim')
401
Bram Moolenaar750802b2020-02-23 18:08:33 +0100402 " Check that in a Vim9 script 'cpo' is set to the Vim default.
403 set cpo&vi
404 let cpo_before = &cpo
405 let lines =<< trim END
406 vim9script
407 g:cpo_in_vim9script = &cpo
408 END
409 writefile(lines, 'Xvim9_script')
410 source Xvim9_script
411 assert_equal(cpo_before, &cpo)
412 set cpo&vim
413 assert_equal(&cpo, g:cpo_in_vim9script)
414 delete('Xvim9_script')
415enddef
416
417def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100418 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
419 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100420 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100421 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100422 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
423 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
424
425 assert_fails('vim9script', 'E1038')
426 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100427enddef
428
429def Test_vim9script_call()
430 let lines =<< trim END
431 vim9script
432 let var = ''
433 def MyFunc(arg: string)
434 var = arg
435 enddef
436 MyFunc('foobar')
437 assert_equal('foobar', var)
438
439 let str = 'barfoo'
440 str->MyFunc()
441 assert_equal('barfoo', var)
442
443 let g:value = 'value'
444 g:value->MyFunc()
445 assert_equal('value', var)
446
447 let listvar = []
448 def ListFunc(arg: list<number>)
449 listvar = arg
450 enddef
451 [1, 2, 3]->ListFunc()
452 assert_equal([1, 2, 3], listvar)
453
454 let dictvar = {}
455 def DictFunc(arg: dict<number>)
456 dictvar = arg
457 enddef
458 {'a': 1, 'b': 2}->DictFunc()
459 assert_equal(#{a: 1, b: 2}, dictvar)
460 #{a: 3, b: 4}->DictFunc()
461 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100462
463 ('text')->MyFunc()
464 assert_equal('text', var)
465 ("some")->MyFunc()
466 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100467 END
468 writefile(lines, 'Xcall.vim')
469 source Xcall.vim
470 delete('Xcall.vim')
471enddef
472
473def Test_vim9script_call_fail_decl()
474 let lines =<< trim END
475 vim9script
476 let var = ''
477 def MyFunc(arg: string)
478 let var = 123
479 enddef
480 END
481 writefile(lines, 'Xcall_decl.vim')
482 assert_fails('source Xcall_decl.vim', 'E1054:')
483 delete('Xcall_decl.vim')
484enddef
485
486def Test_vim9script_call_fail_const()
487 let lines =<< trim END
488 vim9script
489 const var = ''
490 def MyFunc(arg: string)
491 var = 'asdf'
492 enddef
493 END
494 writefile(lines, 'Xcall_const.vim')
495 assert_fails('source Xcall_const.vim', 'E46:')
496 delete('Xcall_const.vim')
497enddef
498
499def Test_vim9script_reload()
500 let lines =<< trim END
501 vim9script
502 const var = ''
503 let valone = 1234
504 def MyFunc(arg: string)
505 valone = 5678
506 enddef
507 END
508 let morelines =<< trim END
509 let valtwo = 222
510 export def GetValtwo(): number
511 return valtwo
512 enddef
513 END
514 writefile(lines + morelines, 'Xreload.vim')
515 source Xreload.vim
516 source Xreload.vim
517 source Xreload.vim
518
519 let testlines =<< trim END
520 vim9script
521 def TheFunc()
522 import GetValtwo from './Xreload.vim'
523 assert_equal(222, GetValtwo())
524 enddef
525 TheFunc()
526 END
527 writefile(testlines, 'Ximport.vim')
528 source Ximport.vim
529
530 " test that when not using "morelines" valtwo is still defined
531 " need to source Xreload.vim again, import doesn't reload a script
532 writefile(lines, 'Xreload.vim')
533 source Xreload.vim
534 source Ximport.vim
535
536 " cannot declare a var twice
537 lines =<< trim END
538 vim9script
539 let valone = 1234
540 let valone = 5678
541 END
542 writefile(lines, 'Xreload.vim')
543 assert_fails('source Xreload.vim', 'E1041:')
544
545 delete('Xreload.vim')
546 delete('Ximport.vim')
547enddef
548
549def Test_import_absolute()
550 let import_lines = [
551 \ 'vim9script',
552 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100553 \ 'def UseExported()',
554 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100555 \ ' exported = 8888',
556 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100557 \ 'enddef',
558 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100559 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100560 \ ]
561 writefile(import_lines, 'Ximport_abs.vim')
562 writefile(s:export_script_lines, 'Xexport_abs.vim')
563
564 source Ximport_abs.vim
565
566 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100567 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100568 assert_match('<SNR>\d\+_UseExported.*'
569 \ .. 'g:imported_abs = exported.*'
570 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100571 \ .. '1 STOREG g:imported_abs.*'
572 \ .. 'exported = 8888.*'
573 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
574 \ .. 'g:imported_after = exported.*'
575 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
576 \ .. '5 STOREG g:imported_after.*'
577 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100578 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100579 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100580
581 delete('Ximport_abs.vim')
582 delete('Xexport_abs.vim')
583enddef
584
585def Test_import_rtp()
586 let import_lines = [
587 \ 'vim9script',
588 \ 'import exported from "Xexport_rtp.vim"',
589 \ 'g:imported_rtp = exported',
590 \ ]
591 writefile(import_lines, 'Ximport_rtp.vim')
592 mkdir('import')
593 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
594
595 let save_rtp = &rtp
596 &rtp = getcwd()
597 source Ximport_rtp.vim
598 &rtp = save_rtp
599
600 assert_equal(9876, g:imported_rtp)
601 unlet g:imported_rtp
602
603 delete('Ximport_rtp.vim')
604 delete('import/Xexport_rtp.vim')
605 delete('import', 'd')
606enddef
607
608def Test_fixed_size_list()
609 " will be allocated as one piece of memory, check that changes work
610 let l = [1, 2, 3, 4]
611 l->remove(0)
612 l->add(5)
613 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100614 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100615enddef
616
Bram Moolenaar673660a2020-01-26 16:50:05 +0100617" Test that inside :function a Python function can be defined, :def is not
618" recognized.
619func Test_function_python()
620 CheckFeature python3
621 let py = 'python3'
622 execute py "<< EOF"
623def do_something():
624 return 1
625EOF
626endfunc
627
Bram Moolenaar158906c2020-02-06 20:39:45 +0100628def IfElse(what: number): string
629 let res = ''
630 if what == 1
631 res = "one"
632 elseif what == 2
633 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100634 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100635 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100636 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100637 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100638enddef
639
Bram Moolenaar158906c2020-02-06 20:39:45 +0100640def Test_if_elseif_else()
641 assert_equal('one', IfElse(1))
642 assert_equal('two', IfElse(2))
643 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100644enddef
645
Bram Moolenaar63ce4842020-02-19 15:46:48 +0100646def Test_delfunc()
647 let lines =<< trim END
648 vim9script
649 def GoneSoon()
650 echo 'hello'
651 enddef
652
653 def CallGoneSoon()
654 GoneSoon()
655 enddef
656
657 delfunc GoneSoon
658 CallGoneSoon()
659 END
660 writefile(lines, 'XToDelFunc')
661 assert_fails('so XToDelFunc', 'E933')
662 assert_fails('so XToDelFunc', 'E933')
663
664 delete('XToDelFunc')
665enddef
666
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100667def Test_substitute_cmd()
668 new
669 setline(1, 'something')
670 :substitute(some(other(
671 assert_equal('otherthing', getline(1))
Bram Moolenaar83f37b92020-02-23 14:35:01 +0100672 bwipe!
673
674 " also when the context is Vim9 script
675 let lines =<< trim END
676 vim9script
677 new
678 setline(1, 'something')
679 :substitute(some(other(
680 assert_equal('otherthing', getline(1))
681 bwipe!
682 END
683 writefile(lines, 'Xvim9lines')
684 source Xvim9lines
685
686 delete('Xvim9lines')
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100687enddef
688
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100689
690" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker