blob: 79f19f0389a0d777019945512cb92d52ca325e1e [file] [log] [blame]
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02001" Test commands that are not compiled in a :def function
2
Bram Moolenaar6378c4f2020-04-26 13:50:41 +02003source check.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00004import './vim9.vim' as v9
Bram Moolenaare88c8e82020-11-01 17:03:37 +01005source term_util.vim
Bram Moolenaare9f262b2020-07-05 14:57:51 +02006source view_util.vim
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02007
Bram Moolenaar39f3b142021-02-14 12:57:36 +01008def Test_vim9cmd()
9 var lines =<< trim END
10 vim9cmd var x = 123
11 let s:y = 'yes'
12 vim9c assert_equal(123, x)
13 vim9cm assert_equal('yes', y)
14 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000015 v9.CheckScriptSuccess(lines)
Bram Moolenaardd9de502021-08-15 13:49:42 +020016
Dominique Pelle6d37e8e2021-05-06 17:36:55 +020017 assert_fails('vim9cmd', 'E1164:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020018 assert_fails('legacy', 'E1234:')
Bram Moolenaar2596a4e2021-08-14 21:35:40 +020019 assert_fails('vim9cmd echo "con" . "cat"', 'E15:')
Bram Moolenaar678b2072021-07-26 21:10:11 +020020
21 lines =<< trim END
Bram Moolenaardd9de502021-08-15 13:49:42 +020022 let str = 'con'
23 vim9cmd str .= 'cat'
24 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000025 v9.CheckScriptFailure(lines, 'E492:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020026
27 lines =<< trim END
28 vim9script
29 legacy echo "con" . "cat"
30 legacy let str = 'con'
31 legacy let str .= 'cat'
32 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000033 v9.CheckScriptSuccess(lines)
Bram Moolenaardd9de502021-08-15 13:49:42 +020034
35 lines =<< trim END
Bram Moolenaar678b2072021-07-26 21:10:11 +020036 vim9script
37 def Foo()
38 g:found_bar = "bar"
39 enddef
40 nmap ,; :vim9cmd <SID>Foo()<CR>
41 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000042 v9.CheckScriptSuccess(lines)
Bram Moolenaardd9de502021-08-15 13:49:42 +020043
Bram Moolenaar678b2072021-07-26 21:10:11 +020044 feedkeys(',;', 'xt')
45 assert_equal("bar", g:found_bar)
Bram Moolenaar678b2072021-07-26 21:10:11 +020046 nunmap ,;
47 unlet g:found_bar
Bram Moolenaardd9de502021-08-15 13:49:42 +020048
49 lines =<< trim END
50 vim9script
51 legacy echo 1'000
52 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000053 v9.CheckScriptFailure(lines, 'E115:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020054
55 if has('float')
56 lines =<< trim END
57 vim9script
58 echo .10
59 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000060 v9.CheckScriptSuccess(lines)
Bram Moolenaardd9de502021-08-15 13:49:42 +020061 lines =<< trim END
62 vim9cmd echo .10
63 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000064 v9.CheckScriptSuccess(lines)
Bram Moolenaardd9de502021-08-15 13:49:42 +020065 lines =<< trim END
66 vim9script
67 legacy echo .10
68 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000069 v9.CheckScriptFailure(lines, 'E15:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020070 endif
71
72 echo v:version
73 assert_fails('vim9cmd echo version', 'E121:')
74 lines =<< trim END
75 vim9script
76 echo version
77 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000078 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020079 lines =<< trim END
80 vim9script
81 legacy echo version
82 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000083 v9.CheckScriptSuccess(lines)
Bram Moolenaar39f3b142021-02-14 12:57:36 +010084enddef
85
Bram Moolenaarf79d9dd2022-05-21 15:39:02 +010086def Test_defcompile_fails()
87 assert_fails('defcompile NotExists', 'E1061:')
88 assert_fails('defcompile debug debug Test_defcompile_fails', 'E488:')
89 assert_fails('defcompile profile profile Test_defcompile_fails', 'E488:')
90enddef
91
92defcompile Test_defcompile_fails
93defcompile debug Test_defcompile_fails
94defcompile profile Test_defcompile_fails
95
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +000096def Test_cmdmod_execute()
97 # "legacy" applies not only to the "exe" argument but also to the commands
98 var lines =<< trim END
99 vim9script
100
101 b:undo = 'let g:undone = 1 | let g:undtwo = 2'
102 legacy exe b:undo
103 assert_equal(1, g:undone)
104 assert_equal(2, g:undtwo)
105 END
106 v9.CheckScriptSuccess(lines)
107
108 # same for "vim9cmd" modifier
109 lines =<< trim END
110 let b:undo = 'g:undone = 11 | g:undtwo = 22'
111 vim9cmd exe b:undo
112 call assert_equal(11, g:undone)
113 call assert_equal(22, g:undtwo)
114 END
115 v9.CheckScriptSuccess(lines)
116 unlet b:undo
117 unlet g:undone
118 unlet g:undtwo
Bram Moolenaar2a9b62d2022-02-12 13:30:17 +0000119
120 # "legacy" does not apply to a loaded script
121 lines =<< trim END
122 vim9script
123 export var exported = 'x'
124 END
125 writefile(lines, 'Xvim9import.vim')
126 lines =<< trim END
127 legacy exe "import './Xvim9import.vim'"
128 END
129 v9.CheckScriptSuccess(lines)
130 delete('Xvim9import.vim')
Bram Moolenaarcdf04852022-02-12 22:13:06 +0000131
132 # "legacy" does not aply to a called function
133 lines =<< trim END
134 vim9script
135
136 def g:TheFunc()
137 if exists('something')
138 echo 'yes'
139 endif
140 enddef
141 legacy exe 'call g:TheFunc()'
142 END
143 v9.CheckScriptSuccess(lines)
144 delfunc g:TheFunc
Kota Kato3d3f6ac2022-08-04 18:50:14 +0100145
146 # vim9cmd execute(cmd) executes code in vim9 script context
147 lines =<< trim END
148 vim9cmd execute("g:vim9executetest = 'bar'")
149 call assert_equal('bar', g:vim9executetest)
150 END
151 v9.CheckScriptSuccess(lines)
152 unlet g:vim9executetest
153
154 lines =<< trim END
155 vim9cmd execute(["g:vim9executetest1 = 'baz'", "g:vim9executetest2 = 'foo'"])
156 call assert_equal('baz', g:vim9executetest1)
157 call assert_equal('foo', g:vim9executetest2)
158 END
159 v9.CheckScriptSuccess(lines)
160 unlet g:vim9executetest1
161 unlet g:vim9executetest2
162
163 # legacy call execute(cmd) executes code in vim script context
164 lines =<< trim END
165 vim9script
166 legacy call execute("let g:vim9executetest = 'bar'")
167 assert_equal('bar', g:vim9executetest)
168 END
169 v9.CheckScriptSuccess(lines)
170 unlet g:vim9executetest
171
172 lines =<< trim END
173 vim9script
174 legacy call execute(["let g:vim9executetest1 = 'baz'", "let g:vim9executetest2 = 'foo'"])
175 assert_equal('baz', g:vim9executetest1)
176 assert_equal('foo', g:vim9executetest2)
177 END
178 v9.CheckScriptSuccess(lines)
179 unlet g:vim9executetest1
180 unlet g:vim9executetest2
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +0000181enddef
182
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200183def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +0200184 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200185 edit `=filename`
186 assert_equal('Xtest', bufname())
187
Bram Moolenaarac564082020-09-27 19:05:33 +0200188 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200189 edit Xtest`=filenr`
190 assert_equal('Xtest123', bufname())
191
192 filenr = 77
193 edit `=filename``=filenr`
194 assert_equal('Xtest77', bufname())
195
196 edit X`=filename`xx`=filenr`yy
197 assert_equal('XXtestxx77yy', bufname())
Bram Moolenaar025cb1c2020-12-14 18:31:27 +0100198
Bram Moolenaar62aec932022-01-29 21:45:34 +0000199 v9.CheckDefFailure(['edit `=xxx`'], 'E1001:')
200 v9.CheckDefFailure(['edit `="foo"'], 'E1083:')
Bram Moolenaarb288ba92021-06-05 17:10:55 +0200201
202 var files = ['file 1', 'file%2', 'file# 3']
203 args `=files`
204 assert_equal(files, argv())
Bram Moolenaar279d7332021-11-27 11:42:50 +0000205
206 filename = 'Xwindo'
207 windo edit `=filename`
208 assert_equal('Xwindo', bufname())
209
210 filename = 'Xtabdo'
211 tabdo edit `=filename`
212 assert_equal('Xtabdo', bufname())
213
214 filename = 'Xargdo'
215 argdo edit `=filename`
216 assert_equal('Xargdo', bufname())
217
218 :%bwipe!
219 filename = 'Xbufdo'
220 bufdo file `=filename`
221 assert_equal('Xbufdo', bufname())
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200222enddef
223
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100224def Test_expand_alternate_file()
225 var lines =<< trim END
226 edit Xfileone
227 var bone = bufnr()
228 edit Xfiletwo
229 var btwo = bufnr()
230 edit Xfilethree
231 var bthree = bufnr()
232
233 edit #
234 assert_equal(bthree, bufnr())
235 edit %%
236 assert_equal(btwo, bufnr())
237 edit %% # comment
238 assert_equal(bthree, bufnr())
239 edit %%yy
240 assert_equal('Xfiletwoyy', bufname())
241
242 exe "edit %%" .. bone
243 assert_equal(bone, bufnr())
244 exe "edit %%" .. btwo .. "xx"
245 assert_equal('Xfiletwoxx', bufname())
246
247 next Xfileone Xfiletwo Xfilethree
248 assert_equal('Xfileone', argv(0))
249 assert_equal('Xfiletwo', argv(1))
250 assert_equal('Xfilethree', argv(2))
251 next %%%zz
252 assert_equal('Xfileone', argv(0))
253 assert_equal('Xfiletwo', argv(1))
254 assert_equal('Xfilethreezz', argv(2))
255
256 v:oldfiles = ['Xonefile', 'Xtwofile']
257 edit %%<1
258 assert_equal('Xonefile', bufname())
259 edit %%<2
260 assert_equal('Xtwofile', bufname())
261 assert_fails('edit %%<3', 'E684:')
262
263 edit Xfileone.vim
264 edit Xfiletwo
265 edit %%:r
266 assert_equal('Xfileone', bufname())
Bram Moolenaardfbc5fd2021-01-23 15:15:01 +0100267
268 assert_false(bufexists('altfoo'))
269 edit altfoo
270 edit bar
271 assert_true(bufexists('altfoo'))
272 assert_true(buflisted('altfoo'))
273 bdel %%
274 assert_true(bufexists('altfoo'))
275 assert_false(buflisted('altfoo'))
276 bwipe! altfoo
277 bwipe! bar
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100278 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000279 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100280enddef
281
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100282def Test_global_backtick_expansion()
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000283 var name = 'xxx'
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100284 new
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000285 setline(1, ['one', 'two', 'three'])
286 set nomod
287 g/two/edit `=name`
288 assert_equal('xxx', bufname())
289 bwipe!
290
291 new
292 setline(1, ['one', 'two', 'three'])
293 g/two/s/^/`=name`/
294 assert_equal('`=name`two', getline(2))
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100295 bwipe!
296enddef
297
Bram Moolenaarecac5912021-01-05 19:23:28 +0100298def Test_folddo_backtick_expansion()
299 new
300 var name = 'xxx'
301 folddoopen edit `=name`
302 assert_equal('xxx', bufname())
303 bwipe!
304
305 new
306 setline(1, ['one', 'two'])
307 set nomodified
308 :1,2fold
309 foldclose
310 folddoclose edit `=name`
311 assert_equal('xxx', bufname())
312 bwipe!
Bram Moolenaarfad27422021-11-30 21:58:19 +0000313
314 var lines =<< trim END
315 g:val = 'value'
316 def Test()
317 folddoopen echo `=g:val`
318 enddef
319 call Test()
320 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000321 v9.CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
Bram Moolenaarecac5912021-01-05 19:23:28 +0100322enddef
323
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200324def Test_hardcopy_wildcards()
325 CheckUnix
326 CheckFeature postscript
327
Bram Moolenaarac564082020-09-27 19:05:33 +0200328 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200329 hardcopy > X`=outfile`.ps
330 assert_true(filereadable('Xprint.ps'))
331
332 delete('Xprint.ps')
333enddef
334
335def Test_syn_include_wildcards()
336 writefile(['syn keyword Found found'], 'Xthemine.vim')
Bram Moolenaarac564082020-09-27 19:05:33 +0200337 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200338 &rtp = '.'
339
Bram Moolenaarac564082020-09-27 19:05:33 +0200340 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200341 syn include @Group Xthe`=fname`.vim
342 assert_match('Found.* contained found', execute('syn list Found'))
343
344 &rtp = save_rtp
345 delete('Xthemine.vim')
346enddef
347
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200348def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200349 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200350 vim9script
351 redir @a
352 echo 'one'
353 .. 'two'
354 redir END
355 assert_equal("\nonetwo", @a)
356 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000357 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200358
359 lines =<< trim END
360 vim9script
361 redir @a
362 echo 11 +
363 77
364 - 22
365 redir END
366 assert_equal("\n66", @a)
367 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000368 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200369enddef
370
Bram Moolenaar13106602020-10-04 16:06:05 +0200371def Test_condition_types()
372 var lines =<< trim END
373 if 'text'
374 endif
375 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000376 v9.CheckDefAndScriptFailure(lines, 'E1135:', 1)
Bram Moolenaar13106602020-10-04 16:06:05 +0200377
378 lines =<< trim END
379 if [1]
380 endif
381 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000382 v9.CheckDefFailure(lines, 'E1012:', 1)
383 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200384
385 lines =<< trim END
386 g:cond = 'text'
387 if g:cond
388 endif
389 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000390 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200391
392 lines =<< trim END
393 g:cond = 0
394 if g:cond
395 elseif 'text'
396 endif
397 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000398 v9.CheckDefAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200399
400 lines =<< trim END
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000401 g:cond = 0
402 if g:cond
403 elseif 'text' garbage
404 endif
405 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000406 v9.CheckDefAndScriptFailure(lines, 'E488:', 3)
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000407
408 lines =<< trim END
409 g:cond = 0
Bram Moolenaar13106602020-10-04 16:06:05 +0200410 if g:cond
411 elseif [1]
412 endif
413 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000414 v9.CheckDefFailure(lines, 'E1012:', 3)
415 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 4)
Bram Moolenaar13106602020-10-04 16:06:05 +0200416
417 lines =<< trim END
418 g:cond = 'text'
419 if 0
420 elseif g:cond
421 endif
422 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000423 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200424
425 lines =<< trim END
426 while 'text'
427 endwhile
428 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000429 v9.CheckDefFailure(lines, 'E1012:', 1)
430 v9.CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200431
432 lines =<< trim END
433 while [1]
434 endwhile
435 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000436 v9.CheckDefFailure(lines, 'E1012:', 1)
437 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200438
439 lines =<< trim END
440 g:cond = 'text'
441 while g:cond
442 endwhile
443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000444 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200445enddef
446
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200447def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200448 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200449 vim9script
450 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200451 true
452 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200453 g:res = 42
454 endif
455 assert_equal(42, g:res)
456 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200458 unlet g:res
459
460 lines =<< trim END
461 vim9script
462 if 1 &&
463 0
464 g:res = 0
465 elseif 0 ||
466 0
467 || 1
468 g:res = 12
469 endif
470 assert_equal(12, g:res)
471 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000472 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200473 unlet g:res
474enddef
475
476def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200477 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200478 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200479 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200480 while nr <
481 10 + 3
482 nr = nr
483 + 4
484 endwhile
485 assert_equal(16, nr)
486 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000487 v9.CheckScriptSuccess(lines)
Bram Moolenaard5053d02020-06-28 15:51:16 +0200488
489 lines =<< trim END
490 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200491 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200492 while nr
493 <
494 10
495 +
496 3
497 nr = nr
498 +
499 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200500 endwhile
501 assert_equal(16, nr)
502 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000503 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200504enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200505
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200506def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200507 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200508 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200509 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200510 for x
511 in
512 [1, 2, 3, 4]
513 nr = nr + x
514 endfor
515 assert_equal(10, nr)
516 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000517 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200518
519 lines =<< trim END
520 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200521 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200522 for x
523 in
524 [1, 2,
525 3, 4
526 ]
527 nr = nr
528 +
529 x
530 endfor
531 assert_equal(10, nr)
532 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000533 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200534enddef
535
Bram Moolenaar62aec932022-01-29 21:45:34 +0000536def s:MethodAfterLinebreak(arg: string)
Bram Moolenaare0890d62021-02-17 14:52:14 +0100537 arg
538 ->setline(1)
539enddef
540
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200541def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200542 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200543 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200544 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200545 func RetArg(
546 arg
547 )
548 let s:res = a:arg
549 endfunc
550 [1,
551 2,
552 3]->RetArg()
553 assert_equal([1, 2, 3], res)
554 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000555 v9.CheckScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100556
557 lines =<< trim END
558 new
559 var name = [1, 2]
560 name
561 ->copy()
562 ->setline(1)
563 assert_equal(['1', '2'], getline(1, 2))
564 bwipe!
565 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000566 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100567
568 lines =<< trim END
569 new
Bram Moolenaar6914e872021-03-06 21:01:09 +0100570 def Foo(): string
571 return 'the text'
572 enddef
573 def Bar(F: func): string
574 return F()
575 enddef
576 def Test()
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100577 Foo ->Bar()
578 ->setline(1)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100579 enddef
580 Test()
581 assert_equal('the text', getline(1))
582 bwipe!
583 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000584 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100585
586 lines =<< trim END
587 new
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100588 g:shortlist
589 ->copy()
590 ->setline(1)
591 assert_equal(['1', '2'], getline(1, 2))
592 bwipe!
593 END
594 g:shortlist = [1, 2]
Bram Moolenaar62aec932022-01-29 21:45:34 +0000595 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100596 unlet g:shortlist
Bram Moolenaare0890d62021-02-17 14:52:14 +0100597
598 new
599 MethodAfterLinebreak('foobar')
600 assert_equal('foobar', getline(1))
601 bwipe!
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100602
603 lines =<< trim END
604 vim9script
605 def Foo(): string
606 return '# some text'
607 enddef
608
609 def Bar(F: func): string
610 return F()
611 enddef
612
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100613 Foo->Bar()
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100614 ->setline(1)
615 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000616 v9.CheckScriptSuccess(lines)
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100617 assert_equal('# some text', getline(1))
618 bwipe!
Bram Moolenaar5f195932020-07-01 20:07:14 +0200619enddef
620
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100621def Test_method_call_whitespace()
622 var lines =<< trim END
623 new
624 var yank = 'text'
625 yank->setline(1)
626 yank ->setline(2)
627 yank-> setline(3)
628 yank -> setline(4)
629 assert_equal(['text', 'text', 'text', 'text'], getline(1, 4))
630 bwipe!
631 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000632 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100633enddef
634
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100635def Test_method_and_user_command()
636 var lines =<< trim END
637 vim9script
638 def Cmd()
639 g:didFunc = 1
640 enddef
641 command Cmd g:didCmd = 1
642 Cmd
643 assert_equal(1, g:didCmd)
644 Cmd()
645 assert_equal(1, g:didFunc)
646 unlet g:didFunc
647 unlet g:didCmd
648
649 def InDefFunc()
650 Cmd
651 assert_equal(1, g:didCmd)
652 Cmd()
653 assert_equal(1, g:didFunc)
654 unlet g:didFunc
655 unlet g:didCmd
656 enddef
657 InDefFunc()
658 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000659 v9.CheckScriptSuccess(lines)
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100660enddef
661
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200662def Test_option_use_linebreak()
663 var lines =<< trim END
664 new
665 &matchpairs = '(:)'
666 &matchpairs->setline(1)
667 &matchpairs = '[:]'
668 &matchpairs ->setline(2)
669 &matchpairs = '{:}'
670 &matchpairs
671 ->setline(3)
672 assert_equal(['(:)', '[:]', '{:}'], getline(1, '$'))
673 bwipe!
674 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000675 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200676enddef
677
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200678def Test_use_register()
Bram Moolenaar73170912021-08-22 22:44:11 +0200679 var lines =<< trim END
680 new
681 @a = 'one'
682 @a->setline(1)
683 @b = 'two'
684 @b ->setline(2)
685 @c = 'three'
686 @c
687 ->setline(3)
688 assert_equal(['one', 'two', 'three'], getline(1, '$'))
689 bwipe!
690 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000691 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200692
693 lines =<< trim END
694 @a = 'echo "text"'
695 @a
696 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000697 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000698
699 lines =<< trim END
Bram Moolenaarea720382022-05-05 16:08:55 +0100700 @a = 'echo "text"'
701 @a
702
703 END
704 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
705
706 lines =<< trim END
707 @a = 'echo "text"'
708 @a
709 # comment
710 END
711 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
712
713 lines =<< trim END
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000714 @/ = 'pattern'
715 @/
716 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000717 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000718
719 lines =<< trim END
720 &opfunc = 'nothing'
721 &opfunc
722 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000723 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000724 &opfunc = ''
725
726 lines =<< trim END
727 &l:showbreak = 'nothing'
728 &l:showbreak
729 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000730 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000731 &l:showbreak = ''
732
733 lines =<< trim END
734 &g:showbreak = 'nothing'
735 &g:showbreak
736 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000737 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000738 &g:showbreak = ''
Bram Moolenaar65259b52021-11-23 14:52:06 +0000739
740 lines =<< trim END
741 $SomeEnv = 'value'
742 $SomeEnv
743 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000744 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar65259b52021-11-23 14:52:06 +0000745 $SomeEnv = ''
Bram Moolenaar0d032632022-05-17 12:45:15 +0100746
747 lines =<< trim END
748 eval 'value'
749 END
750 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
751
752 lines =<< trim END
753 eval "value"
754 END
755 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
Bram Moolenaar73170912021-08-22 22:44:11 +0200756enddef
757
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200758def Test_environment_use_linebreak()
759 var lines =<< trim END
760 new
761 $TESTENV = 'one'
762 $TESTENV->setline(1)
763 $TESTENV = 'two'
764 $TESTENV ->setline(2)
765 $TESTENV = 'three'
766 $TESTENV
767 ->setline(3)
768 assert_equal(['one', 'two', 'three'], getline(1, '$'))
769 bwipe!
770 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000771 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200772enddef
773
Bram Moolenaar683581e2020-10-22 21:22:58 +0200774def Test_skipped_expr_linebreak()
775 if 0
776 var x = []
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100777 ->map(() => 0)
Bram Moolenaar683581e2020-10-22 21:22:58 +0200778 endif
779enddef
780
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200781def Test_dict_member()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100782 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200783 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100784 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200785 test.data
786 ->reverse()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100787 assert_equal({data: [3, 2, 1]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200788
Bram Moolenaarac564082020-09-27 19:05:33 +0200789 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200790 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100791 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200792 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100793 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200794 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000795 v9.CheckScriptSuccess(lines)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200796enddef
797
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200798def Test_bar_after_command()
799 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200800 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200801 redraw | echo x
802 enddef
803 RedrawAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000804 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200805
Bram Moolenaar788123c2020-07-05 15:32:17 +0200806 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200807 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200808 reg_executing() | echo x
809 enddef
810 CallAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000811 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaar788123c2020-07-05 15:32:17 +0200812
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200813 if has('unix')
814 # bar in filter write command does not start new command
815 def WriteToShell()
816 new
817 setline(1, 'some text')
818 w !cat | cat > Xoutfile
819 bwipe!
820 enddef
821 WriteToShell()
822 assert_equal(['some text'], readfile('Xoutfile'))
823 delete('Xoutfile')
824
825 # bar in filter read command does not start new command
826 def ReadFromShell()
827 new
828 r! echo hello there | cat > Xoutfile
829 r !echo again | cat >> Xoutfile
830 bwipe!
831 enddef
832 ReadFromShell()
833 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
834 delete('Xoutfile')
835 endif
836enddef
837
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200838def Test_filter_is_not_modifier()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100839 var tags = [{a: 1, b: 2}, {x: 3, y: 4}]
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100840 filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 )
Bram Moolenaare0de1712020-12-02 17:36:54 +0100841 assert_equal([{x: 3, y: 4}], tags)
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200842enddef
843
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100844def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100845 var lines =<< trim END
846 final expected = "\nType Name Content\n c \"c piyo"
847 @a = 'hoge'
848 @b = 'fuga'
849 @c = 'piyo'
850
851 assert_equal(execute('filter /piyo/ registers abc'), expected)
852 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000853 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare729ce22021-06-06 21:38:09 +0200854
855 # also do this compiled
856 lines =<< trim END
857 @a = 'very specific z3d37dh234 string'
858 filter z3d37dh234 registers
Bram Moolenaar62aec932022-01-29 21:45:34 +0000859 assert_match('very specific z3d37dh234 string', g:Screenline(&lines))
Bram Moolenaare729ce22021-06-06 21:38:09 +0200860 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000861 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar06bffe82021-11-28 20:24:17 +0000862
863 lines =<< trim END
864 edit foobar
865 redir => g:filter_out
866 filter #foobar# ls
867 redir END
868 assert_match('"foobar"', g:filter_out)
869 unlet g:filter_out
870 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000871 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100872enddef
873
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100874def Test_win_command_modifiers()
875 assert_equal(1, winnr('$'))
876
877 set splitright
878 vsplit
879 assert_equal(2, winnr())
880 close
881 aboveleft vsplit
882 assert_equal(1, winnr())
883 close
884 set splitright&
885
886 vsplit
887 assert_equal(1, winnr())
888 close
889 belowright vsplit
890 assert_equal(2, winnr())
891 close
892 rightbelow vsplit
893 assert_equal(2, winnr())
894 close
895
Bram Moolenaar97a19002020-11-01 22:15:44 +0100896 if has('browse')
897 browse set
898 assert_equal('option-window', expand('%'))
899 close
900 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100901
902 vsplit
903 botright split
904 assert_equal(3, winnr())
905 assert_equal(&columns, winwidth(0))
906 close
907 close
908
909 vsplit
910 topleft split
911 assert_equal(1, winnr())
912 assert_equal(&columns, winwidth(0))
913 close
914 close
915
916 gettabinfo()->len()->assert_equal(1)
917 tab split
918 gettabinfo()->len()->assert_equal(2)
919 tabclose
920
921 vertical new
922 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
923 close
924enddef
925
926func Test_command_modifier_confirm()
927 CheckNotGui
928 CheckRunVimInTerminal
929
930 " Test for saving all the modified buffers
931 let lines =<< trim END
932 call setline(1, 'changed')
933 def Getout()
934 confirm write Xfile
935 enddef
936 END
937 call writefile(lines, 'Xconfirmscript')
938 call writefile(['empty'], 'Xfile')
939 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
940 call term_sendkeys(buf, ":call Getout()\n")
941 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
942 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100943 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
944 call term_sendkeys(buf, "\<CR>")
945 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100946 call StopVimInTerminal(buf)
947
948 call assert_equal(['changed'], readfile('Xfile'))
949 call delete('Xfile')
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100950 call delete('.Xfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100951 call delete('Xconfirmscript')
952endfunc
953
954def Test_command_modifiers_keep()
955 if has('unix')
956 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
957 new
958 setline(1, ['one', 'two', 'three'])
959 normal 1Gma
960 normal 2Gmb
961 normal 3Gmc
962 if addRflag
963 set cpo+=R
964 else
965 set cpo-=R
966 endif
967 if keepMarks
968 keepmarks :%!cat
969 else
970 :%!cat
971 endif
972 if hasMarks
973 assert_equal(1, line("'a"))
974 assert_equal(2, line("'b"))
975 assert_equal(3, line("'c"))
976 else
977 assert_equal(0, line("'a"))
978 assert_equal(0, line("'b"))
979 assert_equal(0, line("'c"))
980 endif
981 quit!
982 enddef
983 DoTest(false, false, true)
984 DoTest(true, false, false)
985 DoTest(false, true, true)
986 DoTest(true, true, true)
987 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100988
989 new
990 setline(1, ['one', 'two', 'three', 'four'])
991 assert_equal(4, line("$"))
992 normal 1Gma
993 normal 2Gmb
994 normal 3Gmc
995 lockmarks :1,2!wc
996 # line is deleted, marks don't move
997 assert_equal(3, line("$"))
998 assert_equal('four', getline(3))
999 assert_equal(1, line("'a"))
1000 assert_equal(2, line("'b"))
1001 assert_equal(3, line("'c"))
1002 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001003 endif
1004
Bram Moolenaarf65b35b2020-11-04 18:02:44 +01001005 edit Xone
1006 edit Xtwo
1007 assert_equal('Xone', expand('#'))
1008 keepalt edit Xthree
1009 assert_equal('Xone', expand('#'))
1010
1011 normal /a*b*
1012 assert_equal('a*b*', histget("search"))
1013 keeppatterns normal /c*d*
1014 assert_equal('a*b*', histget("search"))
1015
1016 new
1017 setline(1, range(10))
1018 :10
1019 normal gg
1020 assert_equal(10, getpos("''")[1])
1021 keepjumps normal 5G
1022 assert_equal(10, getpos("''")[1])
1023 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001024enddef
1025
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001026def Test_bar_line_continuation()
1027 var lines =<< trim END
1028 au BufNewFile Xfile g:readFile = 1
1029 | g:readExtra = 2
1030 g:readFile = 0
1031 g:readExtra = 0
1032 edit Xfile
1033 assert_equal(1, g:readFile)
1034 assert_equal(2, g:readExtra)
1035 bwipe!
1036 au! BufNewFile
1037
1038 au BufNewFile Xfile g:readFile = 1
1039 | g:readExtra = 2
1040 | g:readMore = 3
1041 g:readFile = 0
1042 g:readExtra = 0
1043 g:readMore = 0
1044 edit Xfile
1045 assert_equal(1, g:readFile)
1046 assert_equal(2, g:readExtra)
1047 assert_equal(3, g:readMore)
1048 bwipe!
1049 au! BufNewFile
1050 unlet g:readFile
1051 unlet g:readExtra
1052 unlet g:readMore
1053 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001054 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001055enddef
1056
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001057def Test_command_modifier_other()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001058 new Xsomefile
1059 setline(1, 'changed')
1060 var buf = bufnr()
1061 hide edit Xotherfile
1062 var info = getbufinfo(buf)
1063 assert_equal(1, info[0].hidden)
1064 assert_equal(1, info[0].changed)
1065 edit Xsomefile
1066 bwipe!
1067
1068 au BufNewFile Xfile g:readFile = 1
1069 g:readFile = 0
1070 edit Xfile
1071 assert_equal(1, g:readFile)
1072 bwipe!
1073 g:readFile = 0
1074 noautocmd edit Xfile
1075 assert_equal(0, g:readFile)
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001076 au! BufNewFile
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001077 unlet g:readFile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001078
1079 noswapfile edit XnoSwap
Bram Moolenaardd1f4262020-12-31 17:41:01 +01001080 assert_equal(false, &l:swapfile)
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001081 bwipe!
1082
1083 var caught = false
1084 try
1085 sandbox !ls
1086 catch /E48:/
1087 caught = true
1088 endtry
1089 assert_true(caught)
1090
1091 :8verbose g:verbose_now = &verbose
1092 assert_equal(8, g:verbose_now)
1093 unlet g:verbose_now
1094enddef
1095
Bram Moolenaar62aec932022-01-29 21:45:34 +00001096def s:EchoHere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001097 echomsg 'here'
1098enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001099def s:EchoThere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001100 unsilent echomsg 'there'
1101enddef
1102
1103def Test_modifier_silent_unsilent()
1104 echomsg 'last one'
1105 silent echomsg "text"
1106 assert_equal("\nlast one", execute(':1messages'))
1107
1108 silent! echoerr "error"
1109
1110 echomsg 'last one'
1111 silent EchoHere()
1112 assert_equal("\nlast one", execute(':1messages'))
1113
1114 silent EchoThere()
1115 assert_equal("\nthere", execute(':1messages'))
Bram Moolenaar20a76292020-12-25 19:47:24 +01001116
1117 try
1118 silent eval [][0]
1119 catch
1120 echomsg "caught"
1121 endtry
1122 assert_equal("\ncaught", execute(':1messages'))
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001123
1124 var lines =<< trim END
1125 vim9script
1126 set history=11
1127 silent! while 0
1128 set history=22
1129 silent! endwhile
1130 assert_equal(11, &history)
1131 set history&
1132 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001133 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001134enddef
1135
Bram Moolenaar36113e42020-11-02 21:08:47 +01001136def Test_range_after_command_modifier()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001137 v9.CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2)
Bram Moolenaar36113e42020-11-02 21:08:47 +01001138 new
1139 setline(1, 'xxx')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001140 v9.CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
Bram Moolenaar36113e42020-11-02 21:08:47 +01001141 assert_equal('', getline(1))
1142 bwipe!
Bram Moolenaarb579f6e2021-12-04 11:57:00 +00001143
1144 var lines =<< trim END
1145 legacy /pat/
1146 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001147 v9.CheckDefExecAndScriptFailure(lines, 'E486: Pattern not found: pat')
Bram Moolenaar36113e42020-11-02 21:08:47 +01001148enddef
1149
Bram Moolenaarece0b872021-01-08 20:40:45 +01001150def Test_silent_pattern()
1151 new
1152 silent! :/pat/put _
1153 bwipe!
1154enddef
1155
Bram Moolenaarfa984412021-03-25 22:15:28 +01001156def Test_useless_command_modifier()
1157 g:maybe = true
1158 var lines =<< trim END
1159 if g:maybe
1160 silent endif
1161 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001162 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001163
1164 lines =<< trim END
1165 for i in [0]
1166 silent endfor
1167 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001168 v9.CheckDefFailure(lines, 'E1176:', 2)
1169 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001170
1171 lines =<< trim END
1172 while g:maybe
1173 silent endwhile
1174 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001175 v9.CheckDefFailure(lines, 'E1176:', 2)
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001176 g:maybe = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001177 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001178
1179 lines =<< trim END
1180 silent try
1181 finally
1182 endtry
1183 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001184 v9.CheckDefAndScriptFailure(lines, 'E1176:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001185
1186 lines =<< trim END
1187 try
1188 silent catch
1189 endtry
1190 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001191 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001192
1193 lines =<< trim END
1194 try
1195 silent finally
1196 endtry
1197 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001198 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001199
1200 lines =<< trim END
1201 try
1202 finally
1203 silent endtry
1204 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001205 v9.CheckDefAndScriptFailure(lines, 'E1176:', 3)
Bram Moolenaarbc510062022-02-14 21:19:04 +00001206
1207 lines =<< trim END
1208 leftabove
1209 END
1210 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
1211
1212 lines =<< trim END
1213 leftabove # comment
1214 END
1215 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001216enddef
1217
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001218def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001219 var from = 3
1220 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001221 g:val = 111
1222 def Increment(nrs: list<number>)
1223 for nr in nrs
1224 g:val += nr
1225 endfor
1226 enddef
1227 eval range(from, to)
1228 ->Increment()
1229 assert_equal(111 + 3 + 4 + 5, g:val)
1230 unlet g:val
Bram Moolenaard0fe6202020-12-05 17:11:12 +01001231
1232 var lines =<< trim END
1233 vim9script
1234 g:caught = 'no'
1235 try
1236 eval 123 || 0
1237 catch
1238 g:caught = 'yes'
1239 endtry
1240 assert_equal('yes', g:caught)
1241 unlet g:caught
1242 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001243 v9.CheckScriptSuccess(lines)
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001244enddef
1245
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001246def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001247 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001248 nnoremap <F3> :echo 'hit F3 #'<CR>
1249 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
1250 END
Bram Moolenaarac485062022-03-23 19:45:01 +00001251 v9.CheckDefAndScriptSuccess(lines)
1252
1253 # backslash before bar is not removed
1254 lines =<< trim END
1255 vim9script
1256
1257 def Init()
1258 noremap <buffer> <F5> <ScriptCmd>MyFunc('a') \| MyFunc('b')<CR>
1259 enddef
1260 Init()
1261 unmap <buffer> <F5>
1262 END
1263 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001264enddef
1265
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001266def Test_normal_command()
1267 new
1268 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +02001269 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001270 try
1271 exe "norm! \<C-]>"
1272 catch /E433/
1273 caught = 2
1274 endtry
1275 assert_equal(2, caught)
1276
1277 try
1278 exe "norm! 3\<C-]>"
1279 catch /E433/
1280 caught = 3
1281 endtry
1282 assert_equal(3, caught)
1283 bwipe!
1284enddef
1285
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001286def Test_put_command()
1287 new
1288 @p = 'ppp'
1289 put p
1290 assert_equal('ppp', getline(2))
1291
1292 put ='below'
1293 assert_equal('below', getline(3))
1294 put! ='above'
1295 assert_equal('above', getline(3))
1296 assert_equal('below', getline(4))
1297
Bram Moolenaar883cf972021-01-15 18:04:43 +01001298 :2put =['a', 'b', 'c']
1299 assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
1300
Bram Moolenaard0b7bfa2022-03-12 14:51:16 +00001301 :0put = 'first'
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001302 assert_equal('first', getline(1))
1303 :1put! ='first again'
1304 assert_equal('first again', getline(1))
1305
Bram Moolenaar08597872020-12-10 19:43:40 +01001306 # compute range at runtime
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001307 :%del
Bram Moolenaar08597872020-12-10 19:43:40 +01001308 setline(1, range(1, 8))
1309 @a = 'aaa'
1310 :$-2put a
1311 assert_equal('aaa', getline(7))
1312
1313 setline(1, range(1, 8))
1314 :2
1315 :+2put! a
1316 assert_equal('aaa', getline(4))
1317
Bram Moolenaara28639e2021-01-19 22:48:09 +01001318 []->mapnew(() => 0)
1319 :$put ='end'
1320 assert_equal('end', getline('$'))
1321
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001322 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001323
Bram Moolenaar62aec932022-01-29 21:45:34 +00001324 v9.CheckDefFailure(['put =xxx'], 'E1001:')
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001325enddef
1326
1327def Test_put_with_linebreak()
1328 new
1329 var lines =<< trim END
1330 vim9script
1331 pu =split('abc', '\zs')
1332 ->join()
1333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001334 v9.CheckScriptSuccess(lines)
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001335 getline(2)->assert_equal('a b c')
1336 bwipe!
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001337enddef
1338
Bram Moolenaar3bd8de42020-09-14 16:37:34 +02001339def Test_command_star_range()
1340 new
1341 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
1342 setpos("'<", [0, 1, 0, 0])
1343 setpos("'>", [0, 3, 0, 0])
1344 :*s/\(foo\|bar\)/baz/g
1345 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
1346
1347 bwipe!
1348enddef
1349
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001350def Test_f_args()
1351 var lines =<< trim END
1352 vim9script
1353
1354 func SaveCmdArgs(...)
1355 let g:args = a:000
1356 endfunc
1357
1358 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
1359
1360 TestFArgs
1361 assert_equal([], g:args)
1362
1363 TestFArgs one two three
1364 assert_equal(['one', 'two', 'three'], g:args)
1365 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001366 v9.CheckScriptSuccess(lines)
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001367enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001368
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001369def Test_user_command_comment()
1370 command -nargs=1 Comd echom <q-args>
1371
1372 var lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001373 vim9script
1374 Comd # comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001375 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001376 v9.CheckScriptSuccess(lines)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001377
1378 lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001379 vim9script
1380 Comd# comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001381 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001382 v9.CheckScriptFailure(lines, 'E1144:')
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001383 delcommand Comd
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001384
1385 lines =<< trim END
1386 vim9script
1387 command Foo echo 'Foo'
1388 Foo3Bar
1389 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001390 v9.CheckScriptFailure(lines, 'E1144: Command "Foo" is not followed by white space: Foo3Bar')
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001391
1392 delcommand Foo
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001393enddef
1394
Bram Moolenaar95388e32020-11-20 21:07:00 +01001395def Test_star_command()
1396 var lines =<< trim END
1397 vim9script
1398 @s = 'g:success = 8'
1399 set cpo+=*
1400 exe '*s'
1401 assert_equal(8, g:success)
1402 unlet g:success
1403 set cpo-=*
1404 assert_fails("exe '*s'", 'E1050:')
1405 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001406 v9.CheckScriptSuccess(lines)
Bram Moolenaar95388e32020-11-20 21:07:00 +01001407enddef
1408
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001409def Test_cmd_argument_without_colon()
1410 new Xfile
1411 setline(1, ['a', 'b', 'c', 'd'])
1412 write
1413 edit +3 %
1414 assert_equal(3, getcurpos()[1])
1415 edit +/a %
1416 assert_equal(1, getcurpos()[1])
1417 bwipe
1418 delete('Xfile')
1419enddef
1420
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001421def Test_ambiguous_user_cmd()
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001422 command Cmd1 eval 0
1423 command Cmd2 eval 0
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001424 var lines =<< trim END
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001425 Cmd
1426 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001427 v9.CheckDefAndScriptFailure(lines, 'E464:', 1)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001428 delcommand Cmd1
1429 delcommand Cmd2
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001430enddef
1431
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001432def Test_command_not_recognized()
1433 var lines =<< trim END
1434 d.key = 'asdf'
1435 END
Bram Moolenaar97f8c102022-04-02 19:43:57 +01001436 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
1437
1438 lines =<< trim END
1439 d['key'] = 'asdf'
1440 END
1441 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001442
1443 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001444 if 0
1445 d.key = 'asdf'
1446 endif
1447 END
1448 v9.CheckDefSuccess(lines)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001449enddef
Bram Moolenaarb7a78f72020-06-28 18:43:40 +02001450
Bram Moolenaarf4e20992020-12-21 19:59:08 +01001451def Test_magic_not_used()
1452 new
1453 for cmd in ['set magic', 'set nomagic']
1454 exe cmd
1455 setline(1, 'aaa')
1456 s/.../bbb/
1457 assert_equal('bbb', getline(1))
1458 endfor
1459
1460 set magic
1461 setline(1, 'aaa')
1462 assert_fails('s/.\M../bbb/', 'E486:')
1463 assert_fails('snomagic/.../bbb/', 'E486:')
1464 assert_equal('aaa', getline(1))
1465
1466 bwipe!
1467enddef
1468
Bram Moolenaar60f63102020-12-21 20:32:43 +01001469def Test_gdefault_not_used()
1470 new
1471 for cmd in ['set gdefault', 'set nogdefault']
1472 exe cmd
1473 setline(1, 'aaa')
1474 s/./b/
1475 assert_equal('baa', getline(1))
1476 endfor
1477
1478 set nogdefault
1479 bwipe!
1480enddef
1481
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001482def s:SomeComplFunc(findstart: number, base: string): any
Bram Moolenaar179eb562020-12-27 18:03:22 +01001483 if findstart
1484 return 0
1485 else
1486 return ['aaa', 'bbb']
1487 endif
1488enddef
1489
1490def Test_insert_complete()
1491 # this was running into an error with the matchparen hack
1492 new
1493 set completefunc=SomeComplFunc
1494 feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx')
1495 assert_equal('aaa', getline(1))
1496
1497 set completefunc=
1498 bwipe!
1499enddef
1500
Bram Moolenaara11919f2021-01-02 19:44:56 +01001501def Test_wincmd()
1502 split
1503 var id1 = win_getid()
1504 if true
1505 try | wincmd w | catch | endtry
1506 endif
1507 assert_notequal(id1, win_getid())
1508 close
Bram Moolenaar1ff89de2021-03-24 20:08:12 +01001509
1510 split
1511 var id = win_getid()
1512 split
1513 :2wincmd o
1514 assert_equal(id, win_getid())
1515 only
1516
1517 split
1518 split
1519 assert_equal(3, winnr('$'))
1520 :2wincmd c
1521 assert_equal(2, winnr('$'))
1522 only
1523
1524 split
1525 split
1526 assert_equal(3, winnr('$'))
1527 :2wincmd q
1528 assert_equal(2, winnr('$'))
1529 only
Bram Moolenaara11919f2021-01-02 19:44:56 +01001530enddef
1531
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001532def Test_windo_missing_endif()
1533 var lines =<< trim END
1534 windo if 1
1535 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001536 v9.CheckDefExecFailure(lines, 'E171:', 1)
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001537enddef
1538
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001539let s:theList = [1, 2, 3]
1540
1541def Test_lockvar()
1542 s:theList[1] = 22
1543 assert_equal([1, 22, 3], s:theList)
1544 lockvar s:theList
1545 assert_fails('theList[1] = 77', 'E741:')
1546 unlockvar s:theList
1547 s:theList[1] = 44
1548 assert_equal([1, 44, 3], s:theList)
1549
Bram Moolenaara99fb232021-12-20 12:25:03 +00001550 if 0
1551 lockvar whatever
1552 endif
1553
Bram Moolenaar70c43d82022-01-26 21:01:15 +00001554 g:lockme = [1, 2, 3]
1555 lockvar 1 g:lockme
1556 g:lockme[1] = 77
1557 assert_equal([1, 77, 3], g:lockme)
1558
1559 lockvar 2 g:lockme
1560 var caught = false
1561 try
1562 g:lockme[1] = 99
1563 catch /E1119:/
1564 caught = true
1565 endtry
1566 assert_true(caught)
1567 assert_equal([1, 77, 3], g:lockme)
1568 unlet g:lockme
1569
1570 # also for non-materialized list
1571 g:therange = range(3)
1572 lockvar 2 g:therange
1573 caught = false
1574 try
1575 g:therange[1] = 99
1576 catch /E1119:/
1577 caught = true
1578 endtry
1579 assert_true(caught)
1580 assert_equal([0, 1, 2], g:therange)
1581 unlet g:therange
1582
Bram Moolenaare939f5e2022-01-26 21:32:59 +00001583 # use exclamation mark for locking deeper
1584 g:nestedlist = [1, [2, 3], 4]
1585 lockvar! g:nestedlist
1586 try
1587 g:nestedlist[1][0] = 9
1588 catch /E1119:/
1589 caught = true
1590 endtry
1591 assert_true(caught)
1592 unlet g:nestedlist
1593
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001594 var d = {a: 1, b: 2}
1595 d.a = 3
1596 d.b = 4
1597 assert_equal({a: 3, b: 4}, d)
1598 lockvar d.a
1599 d.b = 5
1600 var ex = ''
1601 try
1602 d.a = 6
1603 catch
1604 ex = v:exception
1605 endtry
1606 assert_match('E1121:', ex)
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00001607 unlockvar d['a']
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001608 d.a = 7
1609 assert_equal({a: 7, b: 5}, d)
1610
Bram Moolenaar10611952022-04-03 21:11:34 +01001611 caught = false
1612 try
1613 lockvar d.c
1614 catch /E716/
1615 caught = true
1616 endtry
1617 assert_true(caught)
1618
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001619 var lines =<< trim END
1620 vim9script
Bram Moolenaare08be092022-02-17 13:08:26 +00001621 g:bl = 0z1122
1622 lockvar g:bl
1623 def Tryit()
1624 g:bl[1] = 99
1625 enddef
1626 Tryit()
1627 END
1628 v9.CheckScriptFailure(lines, 'E741:', 1)
1629
1630 lines =<< trim END
1631 vim9script
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001632 var theList = [1, 2, 3]
1633 def SetList()
1634 theList[1] = 22
1635 assert_equal([1, 22, 3], theList)
1636 lockvar theList
1637 theList[1] = 77
1638 enddef
1639 SetList()
1640 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001641 v9.CheckScriptFailure(lines, 'E1119', 4)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001642
1643 lines =<< trim END
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001644 vim9script
1645 var theList = [1, 2, 3]
1646 def AddToList()
1647 lockvar theList
1648 theList += [4]
1649 enddef
1650 AddToList()
1651 END
1652 v9.CheckScriptFailure(lines, 'E741', 2)
1653
1654 lines =<< trim END
1655 vim9script
1656 var theList = [1, 2, 3]
1657 def AddToList()
1658 lockvar theList
1659 add(theList, 4)
1660 enddef
1661 AddToList()
1662 END
1663 v9.CheckScriptFailure(lines, 'E741', 2)
1664
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00001665 # can unlet a locked list item but not change it
1666 lines =<< trim END
1667 var ll = [1, 2, 3]
1668 lockvar ll[1]
1669 unlet ll[1]
1670 assert_equal([1, 3], ll)
1671 END
1672 v9.CheckDefAndScriptSuccess(lines)
1673 lines =<< trim END
1674 var ll = [1, 2, 3]
1675 lockvar ll[1]
1676 ll[1] = 9
1677 END
1678 v9.CheckDefExecAndScriptFailure(lines, ['E1119:', 'E741'], 3)
1679
1680 # can unlet a locked dict item but not change it
1681 lines =<< trim END
1682 var dd = {a: 1, b: 2}
1683 lockvar dd.a
1684 unlet dd.a
1685 assert_equal({b: 2}, dd)
1686 END
1687 v9.CheckDefAndScriptSuccess(lines)
1688 lines =<< trim END
1689 var dd = {a: 1, b: 2}
1690 lockvar dd.a
1691 dd.a = 3
1692 END
1693 v9.CheckDefExecAndScriptFailure(lines, ['E1121:', 'E741'], 3)
1694
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001695 lines =<< trim END
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001696 var theList = [1, 2, 3]
1697 lockvar theList
1698 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001699 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001700
1701 lines =<< trim END
1702 var theList = [1, 2, 3]
1703 unlockvar theList
1704 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001705 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001706
1707 lines =<< trim END
1708 vim9script
1709 var name = 'john'
1710 lockvar nameX
1711 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001712 v9.CheckScriptFailure(lines, 'E1246', 3)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001713
1714 lines =<< trim END
1715 vim9script
1716 var name = 'john'
1717 def LockIt()
1718 lockvar nameX
1719 enddef
1720 LockIt()
1721 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001722 v9.CheckScriptFailure(lines, 'E1246', 1)
Bram Moolenaar7a411a32022-04-04 14:58:06 +01001723
1724 lines =<< trim END
1725 vim9script
1726 const name = 'john'
1727 unlockvar name
1728 END
1729 v9.CheckScriptFailure(lines, 'E46', 3)
1730
1731 lines =<< trim END
1732 vim9script
1733 const name = 'john'
1734 def UnLockIt()
1735 unlockvar name
1736 enddef
1737 UnLockIt()
1738 END
1739 v9.CheckScriptFailure(lines, 'E46', 1)
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001740
1741 lines =<< trim END
1742 def _()
1743 s:0([], s:0)
1744 lockv
1745 enddef
1746 defcomp
1747 END
1748 v9.CheckScriptFailure(lines, 'E179', 2)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001749enddef
1750
Bram Moolenaar4c137212021-04-19 16:48:48 +02001751def Test_substitute_expr()
1752 var to = 'repl'
1753 new
1754 setline(1, 'one from two')
1755 s/from/\=to
1756 assert_equal('one repl two', getline(1))
1757
1758 setline(1, 'one from two')
1759 s/from/\=to .. '_x'
1760 assert_equal('one repl_x two', getline(1))
1761
1762 setline(1, 'one from two from three')
1763 var also = 'also'
1764 s/from/\=to .. '_' .. also/g#e
1765 assert_equal('one repl_also two repl_also three', getline(1))
1766
Bram Moolenaar8238f082021-04-20 21:10:48 +02001767 setline(1, 'abc abc abc')
1768 for choice in [true, false]
1769 :1s/abc/\=choice ? 'yes' : 'no'/
1770 endfor
1771 assert_equal('yes no abc', getline(1))
1772
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01001773 setline(1, 'from')
1774 v9.CheckDefExecFailure(['s/from/\=g:notexist/'], 'E121: Undefined variable: g:notexist')
1775
Bram Moolenaard386e922021-04-25 14:48:49 +02001776 bwipe!
1777
Bram Moolenaar62aec932022-01-29 21:45:34 +00001778 v9.CheckDefFailure(['s/from/\="x")/'], 'E488:')
1779 v9.CheckDefFailure(['s/from/\="x"/9'], 'E488:')
Bram Moolenaar4c137212021-04-19 16:48:48 +02001780
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00001781 v9.CheckDefExecFailure(['s/this/\="that"/'], 'E486:')
1782
Bram Moolenaard386e922021-04-25 14:48:49 +02001783 # When calling a function the right instruction list needs to be restored.
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001784 g:cond = true
Bram Moolenaard386e922021-04-25 14:48:49 +02001785 var lines =<< trim END
1786 vim9script
1787 def Foo()
1788 Bar([])
1789 enddef
1790 def Bar(l: list<number>)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001791 if g:cond
Bram Moolenaard386e922021-04-25 14:48:49 +02001792 s/^/\=Rep()/
1793 for n in l[:]
1794 endfor
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001795 endif
Bram Moolenaard386e922021-04-25 14:48:49 +02001796 enddef
1797 def Rep(): string
1798 return 'rep'
1799 enddef
1800 new
1801 Foo()
1802 assert_equal('rep', getline(1))
1803 bwipe!
1804 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001805 v9.CheckScriptSuccess(lines)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001806 unlet g:cond
Bram Moolenaar27523602021-06-05 21:36:19 +02001807
1808 # List results in multiple lines
1809 new
1810 setline(1, 'some text here')
Bram Moolenaar2c707112021-08-02 22:26:56 +02001811 s/text/\=['aaa', 'bbb', 'ccc']/
Bram Moolenaar27523602021-06-05 21:36:19 +02001812 assert_equal(['some aaa', 'bbb', 'ccc', ' here'], getline(1, '$'))
1813 bwipe!
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001814
1815 # inside "if 0" substitute is ignored
1816 if 0
1817 s/a/\=nothing/ and | some more
1818 endif
Bram Moolenaar4c137212021-04-19 16:48:48 +02001819enddef
1820
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001821def Test_redir_to_var()
1822 var result: string
1823 redir => result
1824 echo 'something'
1825 redir END
1826 assert_equal("\nsomething", result)
1827
1828 redir =>> result
1829 echo 'more'
1830 redir END
1831 assert_equal("\nsomething\nmore", result)
1832
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001833 var d: dict<string>
1834 redir => d.redir
1835 echo 'dict'
1836 redir END
1837 assert_equal({redir: "\ndict"}, d)
1838
1839 var l = ['a', 'b', 'c']
1840 redir => l[1]
1841 echo 'list'
1842 redir END
1843 assert_equal(['a', "\nlist", 'c'], l)
1844
1845 var dl = {l: ['x']}
1846 redir => dl.l[0]
1847 echo 'dict-list'
1848 redir END
1849 assert_equal({l: ["\ndict-list"]}, dl)
1850
Bram Moolenaara369c3d2021-04-21 16:00:10 +02001851 redir =>> d.redir
1852 echo 'more'
1853 redir END
1854 assert_equal({redir: "\ndict\nmore"}, d)
1855
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001856 var lines =<< trim END
1857 redir => notexist
1858 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001859 v9.CheckDefFailure(lines, 'E1089:')
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001860
1861 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001862 var text: string
1863 redir => text
1864 END
1865 v9.CheckDefFailure(lines, 'E1185:')
1866
1867 lines =<< trim END
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001868 var ls = 'asdf'
1869 redir => ls[1]
1870 redir END
1871 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001872 v9.CheckDefFailure(lines, 'E1141:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001873
1874 lines =<< trim END
1875 var text: string
1876 redir => text
1877 echo 'hello'
1878 redir > Xfile
1879 redir END
1880 END
Bram Moolenaar02a977e2022-02-03 21:29:39 +00001881 v9.CheckDefFailure(lines, 'E1092:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001882
1883 lines =<< trim END
1884 var text: number
1885 redir => text
1886 echo 'hello'
1887 redir END
1888 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001889 v9.CheckDefFailure(lines, 'E1012:')
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001890enddef
1891
Bram Moolenaar68db9962021-05-09 23:19:22 +02001892def Test_echo_void()
1893 var lines =<< trim END
1894 vim9script
1895 def NoReturn()
1896 echo 'nothing'
1897 enddef
1898 echo NoReturn()
1899 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001900 v9.CheckScriptFailure(lines, 'E1186:', 5)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001901
1902 lines =<< trim END
1903 vim9script
1904 def NoReturn()
1905 echo 'nothing'
1906 enddef
1907 def Try()
1908 echo NoReturn()
1909 enddef
1910 defcompile
1911 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001912 v9.CheckScriptFailure(lines, 'E1186:', 1)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001913enddef
1914
Bram Moolenaar2c707112021-08-02 22:26:56 +02001915def Test_cmdwin_block()
1916 augroup justTesting
1917 autocmd BufEnter * {
1918 echomsg 'in block'
1919 }
1920 augroup END
1921 feedkeys('q:', 'xt')
1922 redraw
1923 feedkeys("aclose\<CR>", 'xt')
1924
1925 au! justTesting
1926enddef
1927
Bram Moolenaar7b829262021-10-13 15:04:34 +01001928def Test_var_not_cmd()
1929 var lines =<< trim END
1930 g:notexist:cmd
1931 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001932 v9.CheckDefAndScriptFailure(lines, ['E488: Trailing characters: :cmd', 'E121: Undefined variable: g:notexist'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001933
1934 lines =<< trim END
1935 g-pat-cmd
1936 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001937 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001938 lines =<< trim END
1939 g.pat.cmd
1940 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001941 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: g', 'E121: Undefined variable: g'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001942
1943 lines =<< trim END
1944 s:notexist:repl
1945 END
Bram Moolenaara749a422022-02-12 19:52:25 +00001946 v9.CheckDefAndScriptFailure(lines, ['E488: Trailing characters: :repl', 'E1268:'], 1)
1947
1948 lines =<< trim END
1949 notexist:repl
1950 END
1951 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001952
1953 lines =<< trim END
1954 s-pat-repl
1955 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001956 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001957 lines =<< trim END
1958 s.pat.repl
1959 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001960 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: s', 'E121: Undefined variable: s'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001961
1962 lines =<< trim END
1963 w:notexist->len()
1964 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001965 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: w:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001966
1967 lines =<< trim END
1968 b:notexist->len()
1969 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001970 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: b:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001971
1972 lines =<< trim END
1973 t:notexist->len()
1974 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001975 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: t:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001976enddef
1977
1978def Test_no_space_after_command()
1979 var lines =<< trim END
1980 g /pat/cmd
1981 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001982 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001983 lines =<< trim END
1984 g #pat#cmd
1985 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001986 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001987
1988 new
1989 setline(1, 'some pat')
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001990 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001991 g#pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001992 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001993 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001994 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001995 g# pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001996 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001997 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001998 bwipe!
Bram Moolenaar7b829262021-10-13 15:04:34 +01001999
2000 lines =<< trim END
2001 s /pat/repl
2002 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002003 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002004 lines =<< trim END
2005 s #pat#repl
2006 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002007 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002008 lines =<< trim END
2009 s#pat#repl
2010 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002011 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002012 lines =<< trim END
2013 s# pat#repl
2014 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002015 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002016enddef
2017
Yegappan Lakshmanan2a16dc62021-11-16 17:19:30 +00002018" Test for the 'previewpopup' option
2019def Test_previewpopup()
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002020 set previewpopup=height:10,width:60
2021 pedit Xfile
2022 var id = popup_findpreview()
2023 assert_notequal(id, 0)
2024 assert_match('Xfile', popup_getoptions(id).title)
2025 popup_clear()
2026 set previewpopup&
2027enddef
2028
Bram Moolenaarc8a9fe52021-11-20 19:50:59 +00002029def Test_syntax_enable_clear()
2030 syntax clear
2031 syntax enable
2032 highlight clear String
2033 assert_equal(true, hlget('String')->get(0, {})->get('default', false))
2034 syntax clear
2035enddef
2036
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02002037
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02002038" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker