blob: 77e1d8a0696483f691bf18d769626da88497b82f [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 Moolenaar5b1d6e92022-02-11 20:33:48 +000086def Test_cmdmod_execute()
87 # "legacy" applies not only to the "exe" argument but also to the commands
88 var lines =<< trim END
89 vim9script
90
91 b:undo = 'let g:undone = 1 | let g:undtwo = 2'
92 legacy exe b:undo
93 assert_equal(1, g:undone)
94 assert_equal(2, g:undtwo)
95 END
96 v9.CheckScriptSuccess(lines)
97
98 # same for "vim9cmd" modifier
99 lines =<< trim END
100 let b:undo = 'g:undone = 11 | g:undtwo = 22'
101 vim9cmd exe b:undo
102 call assert_equal(11, g:undone)
103 call assert_equal(22, g:undtwo)
104 END
105 v9.CheckScriptSuccess(lines)
106 unlet b:undo
107 unlet g:undone
108 unlet g:undtwo
Bram Moolenaar2a9b62d2022-02-12 13:30:17 +0000109
110 # "legacy" does not apply to a loaded script
111 lines =<< trim END
112 vim9script
113 export var exported = 'x'
114 END
115 writefile(lines, 'Xvim9import.vim')
116 lines =<< trim END
117 legacy exe "import './Xvim9import.vim'"
118 END
119 v9.CheckScriptSuccess(lines)
120 delete('Xvim9import.vim')
Bram Moolenaarcdf04852022-02-12 22:13:06 +0000121
122 # "legacy" does not aply to a called function
123 lines =<< trim END
124 vim9script
125
126 def g:TheFunc()
127 if exists('something')
128 echo 'yes'
129 endif
130 enddef
131 legacy exe 'call g:TheFunc()'
132 END
133 v9.CheckScriptSuccess(lines)
134 delfunc g:TheFunc
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +0000135enddef
136
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200137def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +0200138 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200139 edit `=filename`
140 assert_equal('Xtest', bufname())
141
Bram Moolenaarac564082020-09-27 19:05:33 +0200142 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200143 edit Xtest`=filenr`
144 assert_equal('Xtest123', bufname())
145
146 filenr = 77
147 edit `=filename``=filenr`
148 assert_equal('Xtest77', bufname())
149
150 edit X`=filename`xx`=filenr`yy
151 assert_equal('XXtestxx77yy', bufname())
Bram Moolenaar025cb1c2020-12-14 18:31:27 +0100152
Bram Moolenaar62aec932022-01-29 21:45:34 +0000153 v9.CheckDefFailure(['edit `=xxx`'], 'E1001:')
154 v9.CheckDefFailure(['edit `="foo"'], 'E1083:')
Bram Moolenaarb288ba92021-06-05 17:10:55 +0200155
156 var files = ['file 1', 'file%2', 'file# 3']
157 args `=files`
158 assert_equal(files, argv())
Bram Moolenaar279d7332021-11-27 11:42:50 +0000159
160 filename = 'Xwindo'
161 windo edit `=filename`
162 assert_equal('Xwindo', bufname())
163
164 filename = 'Xtabdo'
165 tabdo edit `=filename`
166 assert_equal('Xtabdo', bufname())
167
168 filename = 'Xargdo'
169 argdo edit `=filename`
170 assert_equal('Xargdo', bufname())
171
172 :%bwipe!
173 filename = 'Xbufdo'
174 bufdo file `=filename`
175 assert_equal('Xbufdo', bufname())
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200176enddef
177
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100178def Test_expand_alternate_file()
179 var lines =<< trim END
180 edit Xfileone
181 var bone = bufnr()
182 edit Xfiletwo
183 var btwo = bufnr()
184 edit Xfilethree
185 var bthree = bufnr()
186
187 edit #
188 assert_equal(bthree, bufnr())
189 edit %%
190 assert_equal(btwo, bufnr())
191 edit %% # comment
192 assert_equal(bthree, bufnr())
193 edit %%yy
194 assert_equal('Xfiletwoyy', bufname())
195
196 exe "edit %%" .. bone
197 assert_equal(bone, bufnr())
198 exe "edit %%" .. btwo .. "xx"
199 assert_equal('Xfiletwoxx', bufname())
200
201 next Xfileone Xfiletwo Xfilethree
202 assert_equal('Xfileone', argv(0))
203 assert_equal('Xfiletwo', argv(1))
204 assert_equal('Xfilethree', argv(2))
205 next %%%zz
206 assert_equal('Xfileone', argv(0))
207 assert_equal('Xfiletwo', argv(1))
208 assert_equal('Xfilethreezz', argv(2))
209
210 v:oldfiles = ['Xonefile', 'Xtwofile']
211 edit %%<1
212 assert_equal('Xonefile', bufname())
213 edit %%<2
214 assert_equal('Xtwofile', bufname())
215 assert_fails('edit %%<3', 'E684:')
216
217 edit Xfileone.vim
218 edit Xfiletwo
219 edit %%:r
220 assert_equal('Xfileone', bufname())
Bram Moolenaardfbc5fd2021-01-23 15:15:01 +0100221
222 assert_false(bufexists('altfoo'))
223 edit altfoo
224 edit bar
225 assert_true(bufexists('altfoo'))
226 assert_true(buflisted('altfoo'))
227 bdel %%
228 assert_true(bufexists('altfoo'))
229 assert_false(buflisted('altfoo'))
230 bwipe! altfoo
231 bwipe! bar
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100232 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000233 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100234enddef
235
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100236def Test_global_backtick_expansion()
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000237 var name = 'xxx'
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100238 new
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000239 setline(1, ['one', 'two', 'three'])
240 set nomod
241 g/two/edit `=name`
242 assert_equal('xxx', bufname())
243 bwipe!
244
245 new
246 setline(1, ['one', 'two', 'three'])
247 g/two/s/^/`=name`/
248 assert_equal('`=name`two', getline(2))
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100249 bwipe!
250enddef
251
Bram Moolenaarecac5912021-01-05 19:23:28 +0100252def Test_folddo_backtick_expansion()
253 new
254 var name = 'xxx'
255 folddoopen edit `=name`
256 assert_equal('xxx', bufname())
257 bwipe!
258
259 new
260 setline(1, ['one', 'two'])
261 set nomodified
262 :1,2fold
263 foldclose
264 folddoclose edit `=name`
265 assert_equal('xxx', bufname())
266 bwipe!
Bram Moolenaarfad27422021-11-30 21:58:19 +0000267
268 var lines =<< trim END
269 g:val = 'value'
270 def Test()
271 folddoopen echo `=g:val`
272 enddef
273 call Test()
274 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000275 v9.CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
Bram Moolenaarecac5912021-01-05 19:23:28 +0100276enddef
277
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200278def Test_hardcopy_wildcards()
279 CheckUnix
280 CheckFeature postscript
281
Bram Moolenaarac564082020-09-27 19:05:33 +0200282 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200283 hardcopy > X`=outfile`.ps
284 assert_true(filereadable('Xprint.ps'))
285
286 delete('Xprint.ps')
287enddef
288
289def Test_syn_include_wildcards()
290 writefile(['syn keyword Found found'], 'Xthemine.vim')
Bram Moolenaarac564082020-09-27 19:05:33 +0200291 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200292 &rtp = '.'
293
Bram Moolenaarac564082020-09-27 19:05:33 +0200294 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200295 syn include @Group Xthe`=fname`.vim
296 assert_match('Found.* contained found', execute('syn list Found'))
297
298 &rtp = save_rtp
299 delete('Xthemine.vim')
300enddef
301
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200302def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200303 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200304 vim9script
305 redir @a
306 echo 'one'
307 .. 'two'
308 redir END
309 assert_equal("\nonetwo", @a)
310 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000311 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200312
313 lines =<< trim END
314 vim9script
315 redir @a
316 echo 11 +
317 77
318 - 22
319 redir END
320 assert_equal("\n66", @a)
321 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000322 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200323enddef
324
Bram Moolenaar13106602020-10-04 16:06:05 +0200325def Test_condition_types()
326 var lines =<< trim END
327 if 'text'
328 endif
329 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000330 v9.CheckDefAndScriptFailure(lines, 'E1135:', 1)
Bram Moolenaar13106602020-10-04 16:06:05 +0200331
332 lines =<< trim END
333 if [1]
334 endif
335 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000336 v9.CheckDefFailure(lines, 'E1012:', 1)
337 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200338
339 lines =<< trim END
340 g:cond = 'text'
341 if g:cond
342 endif
343 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000344 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200345
346 lines =<< trim END
347 g:cond = 0
348 if g:cond
349 elseif 'text'
350 endif
351 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000352 v9.CheckDefAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200353
354 lines =<< trim END
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000355 g:cond = 0
356 if g:cond
357 elseif 'text' garbage
358 endif
359 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000360 v9.CheckDefAndScriptFailure(lines, 'E488:', 3)
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000361
362 lines =<< trim END
363 g:cond = 0
Bram Moolenaar13106602020-10-04 16:06:05 +0200364 if g:cond
365 elseif [1]
366 endif
367 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000368 v9.CheckDefFailure(lines, 'E1012:', 3)
369 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 4)
Bram Moolenaar13106602020-10-04 16:06:05 +0200370
371 lines =<< trim END
372 g:cond = 'text'
373 if 0
374 elseif g:cond
375 endif
376 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000377 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200378
379 lines =<< trim END
380 while 'text'
381 endwhile
382 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000383 v9.CheckDefFailure(lines, 'E1012:', 1)
384 v9.CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200385
386 lines =<< trim END
387 while [1]
388 endwhile
389 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000390 v9.CheckDefFailure(lines, 'E1012:', 1)
391 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200392
393 lines =<< trim END
394 g:cond = 'text'
395 while g:cond
396 endwhile
397 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000398 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200399enddef
400
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200401def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200402 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200403 vim9script
404 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200405 true
406 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200407 g:res = 42
408 endif
409 assert_equal(42, g:res)
410 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000411 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200412 unlet g:res
413
414 lines =<< trim END
415 vim9script
416 if 1 &&
417 0
418 g:res = 0
419 elseif 0 ||
420 0
421 || 1
422 g:res = 12
423 endif
424 assert_equal(12, g:res)
425 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000426 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200427 unlet g:res
428enddef
429
430def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200432 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200433 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200434 while nr <
435 10 + 3
436 nr = nr
437 + 4
438 endwhile
439 assert_equal(16, nr)
440 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000441 v9.CheckScriptSuccess(lines)
Bram Moolenaard5053d02020-06-28 15:51:16 +0200442
443 lines =<< trim END
444 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200445 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200446 while nr
447 <
448 10
449 +
450 3
451 nr = nr
452 +
453 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200454 endwhile
455 assert_equal(16, nr)
456 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200458enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200459
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200460def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200461 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200462 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200463 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200464 for x
465 in
466 [1, 2, 3, 4]
467 nr = nr + x
468 endfor
469 assert_equal(10, nr)
470 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000471 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200472
473 lines =<< trim END
474 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200475 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200476 for x
477 in
478 [1, 2,
479 3, 4
480 ]
481 nr = nr
482 +
483 x
484 endfor
485 assert_equal(10, nr)
486 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000487 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200488enddef
489
Bram Moolenaar62aec932022-01-29 21:45:34 +0000490def s:MethodAfterLinebreak(arg: string)
Bram Moolenaare0890d62021-02-17 14:52:14 +0100491 arg
492 ->setline(1)
493enddef
494
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200495def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200496 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200497 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200498 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200499 func RetArg(
500 arg
501 )
502 let s:res = a:arg
503 endfunc
504 [1,
505 2,
506 3]->RetArg()
507 assert_equal([1, 2, 3], res)
508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000509 v9.CheckScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100510
511 lines =<< trim END
512 new
513 var name = [1, 2]
514 name
515 ->copy()
516 ->setline(1)
517 assert_equal(['1', '2'], getline(1, 2))
518 bwipe!
519 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000520 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100521
522 lines =<< trim END
523 new
Bram Moolenaar6914e872021-03-06 21:01:09 +0100524 def Foo(): string
525 return 'the text'
526 enddef
527 def Bar(F: func): string
528 return F()
529 enddef
530 def Test()
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100531 Foo ->Bar()
532 ->setline(1)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100533 enddef
534 Test()
535 assert_equal('the text', getline(1))
536 bwipe!
537 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000538 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100539
540 lines =<< trim END
541 new
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100542 g:shortlist
543 ->copy()
544 ->setline(1)
545 assert_equal(['1', '2'], getline(1, 2))
546 bwipe!
547 END
548 g:shortlist = [1, 2]
Bram Moolenaar62aec932022-01-29 21:45:34 +0000549 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100550 unlet g:shortlist
Bram Moolenaare0890d62021-02-17 14:52:14 +0100551
552 new
553 MethodAfterLinebreak('foobar')
554 assert_equal('foobar', getline(1))
555 bwipe!
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100556
557 lines =<< trim END
558 vim9script
559 def Foo(): string
560 return '# some text'
561 enddef
562
563 def Bar(F: func): string
564 return F()
565 enddef
566
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100567 Foo->Bar()
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100568 ->setline(1)
569 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000570 v9.CheckScriptSuccess(lines)
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100571 assert_equal('# some text', getline(1))
572 bwipe!
Bram Moolenaar5f195932020-07-01 20:07:14 +0200573enddef
574
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100575def Test_method_call_whitespace()
576 var lines =<< trim END
577 new
578 var yank = 'text'
579 yank->setline(1)
580 yank ->setline(2)
581 yank-> setline(3)
582 yank -> setline(4)
583 assert_equal(['text', 'text', 'text', 'text'], getline(1, 4))
584 bwipe!
585 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000586 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100587enddef
588
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100589def Test_method_and_user_command()
590 var lines =<< trim END
591 vim9script
592 def Cmd()
593 g:didFunc = 1
594 enddef
595 command Cmd g:didCmd = 1
596 Cmd
597 assert_equal(1, g:didCmd)
598 Cmd()
599 assert_equal(1, g:didFunc)
600 unlet g:didFunc
601 unlet g:didCmd
602
603 def InDefFunc()
604 Cmd
605 assert_equal(1, g:didCmd)
606 Cmd()
607 assert_equal(1, g:didFunc)
608 unlet g:didFunc
609 unlet g:didCmd
610 enddef
611 InDefFunc()
612 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000613 v9.CheckScriptSuccess(lines)
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100614enddef
615
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200616def Test_option_use_linebreak()
617 var lines =<< trim END
618 new
619 &matchpairs = '(:)'
620 &matchpairs->setline(1)
621 &matchpairs = '[:]'
622 &matchpairs ->setline(2)
623 &matchpairs = '{:}'
624 &matchpairs
625 ->setline(3)
626 assert_equal(['(:)', '[:]', '{:}'], getline(1, '$'))
627 bwipe!
628 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000629 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200630enddef
631
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200632def Test_use_register()
Bram Moolenaar73170912021-08-22 22:44:11 +0200633 var lines =<< trim END
634 new
635 @a = 'one'
636 @a->setline(1)
637 @b = 'two'
638 @b ->setline(2)
639 @c = 'three'
640 @c
641 ->setline(3)
642 assert_equal(['one', 'two', 'three'], getline(1, '$'))
643 bwipe!
644 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000645 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200646
647 lines =<< trim END
648 @a = 'echo "text"'
649 @a
650 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000651 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000652
653 lines =<< trim END
Bram Moolenaarea720382022-05-05 16:08:55 +0100654 @a = 'echo "text"'
655 @a
656
657 END
658 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
659
660 lines =<< trim END
661 @a = 'echo "text"'
662 @a
663 # comment
664 END
665 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
666
667 lines =<< trim END
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000668 @/ = 'pattern'
669 @/
670 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000671 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000672
673 lines =<< trim END
674 &opfunc = 'nothing'
675 &opfunc
676 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000677 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000678 &opfunc = ''
679
680 lines =<< trim END
681 &l:showbreak = 'nothing'
682 &l:showbreak
683 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000684 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000685 &l:showbreak = ''
686
687 lines =<< trim END
688 &g:showbreak = 'nothing'
689 &g:showbreak
690 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000691 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000692 &g:showbreak = ''
Bram Moolenaar65259b52021-11-23 14:52:06 +0000693
694 lines =<< trim END
695 $SomeEnv = 'value'
696 $SomeEnv
697 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000698 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar65259b52021-11-23 14:52:06 +0000699 $SomeEnv = ''
Bram Moolenaar0d032632022-05-17 12:45:15 +0100700
701 lines =<< trim END
702 eval 'value'
703 END
704 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
705
706 lines =<< trim END
707 eval "value"
708 END
709 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
Bram Moolenaar73170912021-08-22 22:44:11 +0200710enddef
711
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200712def Test_environment_use_linebreak()
713 var lines =<< trim END
714 new
715 $TESTENV = 'one'
716 $TESTENV->setline(1)
717 $TESTENV = 'two'
718 $TESTENV ->setline(2)
719 $TESTENV = 'three'
720 $TESTENV
721 ->setline(3)
722 assert_equal(['one', 'two', 'three'], getline(1, '$'))
723 bwipe!
724 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000725 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200726enddef
727
Bram Moolenaar683581e2020-10-22 21:22:58 +0200728def Test_skipped_expr_linebreak()
729 if 0
730 var x = []
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100731 ->map(() => 0)
Bram Moolenaar683581e2020-10-22 21:22:58 +0200732 endif
733enddef
734
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200735def Test_dict_member()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100736 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200737 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100738 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200739 test.data
740 ->reverse()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100741 assert_equal({data: [3, 2, 1]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200742
Bram Moolenaarac564082020-09-27 19:05:33 +0200743 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200744 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100745 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200746 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100747 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200748 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000749 v9.CheckScriptSuccess(lines)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200750enddef
751
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200752def Test_bar_after_command()
753 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200754 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200755 redraw | echo x
756 enddef
757 RedrawAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000758 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200759
Bram Moolenaar788123c2020-07-05 15:32:17 +0200760 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200761 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200762 reg_executing() | echo x
763 enddef
764 CallAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000765 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaar788123c2020-07-05 15:32:17 +0200766
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200767 if has('unix')
768 # bar in filter write command does not start new command
769 def WriteToShell()
770 new
771 setline(1, 'some text')
772 w !cat | cat > Xoutfile
773 bwipe!
774 enddef
775 WriteToShell()
776 assert_equal(['some text'], readfile('Xoutfile'))
777 delete('Xoutfile')
778
779 # bar in filter read command does not start new command
780 def ReadFromShell()
781 new
782 r! echo hello there | cat > Xoutfile
783 r !echo again | cat >> Xoutfile
784 bwipe!
785 enddef
786 ReadFromShell()
787 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
788 delete('Xoutfile')
789 endif
790enddef
791
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200792def Test_filter_is_not_modifier()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100793 var tags = [{a: 1, b: 2}, {x: 3, y: 4}]
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100794 filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 )
Bram Moolenaare0de1712020-12-02 17:36:54 +0100795 assert_equal([{x: 3, y: 4}], tags)
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200796enddef
797
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100798def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100799 var lines =<< trim END
800 final expected = "\nType Name Content\n c \"c piyo"
801 @a = 'hoge'
802 @b = 'fuga'
803 @c = 'piyo'
804
805 assert_equal(execute('filter /piyo/ registers abc'), expected)
806 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000807 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare729ce22021-06-06 21:38:09 +0200808
809 # also do this compiled
810 lines =<< trim END
811 @a = 'very specific z3d37dh234 string'
812 filter z3d37dh234 registers
Bram Moolenaar62aec932022-01-29 21:45:34 +0000813 assert_match('very specific z3d37dh234 string', g:Screenline(&lines))
Bram Moolenaare729ce22021-06-06 21:38:09 +0200814 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000815 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar06bffe82021-11-28 20:24:17 +0000816
817 lines =<< trim END
818 edit foobar
819 redir => g:filter_out
820 filter #foobar# ls
821 redir END
822 assert_match('"foobar"', g:filter_out)
823 unlet g:filter_out
824 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000825 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100826enddef
827
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100828def Test_win_command_modifiers()
829 assert_equal(1, winnr('$'))
830
831 set splitright
832 vsplit
833 assert_equal(2, winnr())
834 close
835 aboveleft vsplit
836 assert_equal(1, winnr())
837 close
838 set splitright&
839
840 vsplit
841 assert_equal(1, winnr())
842 close
843 belowright vsplit
844 assert_equal(2, winnr())
845 close
846 rightbelow vsplit
847 assert_equal(2, winnr())
848 close
849
Bram Moolenaar97a19002020-11-01 22:15:44 +0100850 if has('browse')
851 browse set
852 assert_equal('option-window', expand('%'))
853 close
854 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100855
856 vsplit
857 botright split
858 assert_equal(3, winnr())
859 assert_equal(&columns, winwidth(0))
860 close
861 close
862
863 vsplit
864 topleft split
865 assert_equal(1, winnr())
866 assert_equal(&columns, winwidth(0))
867 close
868 close
869
870 gettabinfo()->len()->assert_equal(1)
871 tab split
872 gettabinfo()->len()->assert_equal(2)
873 tabclose
874
875 vertical new
876 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
877 close
878enddef
879
880func Test_command_modifier_confirm()
881 CheckNotGui
882 CheckRunVimInTerminal
883
884 " Test for saving all the modified buffers
885 let lines =<< trim END
886 call setline(1, 'changed')
887 def Getout()
888 confirm write Xfile
889 enddef
890 END
891 call writefile(lines, 'Xconfirmscript')
892 call writefile(['empty'], 'Xfile')
893 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
894 call term_sendkeys(buf, ":call Getout()\n")
895 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
896 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100897 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
898 call term_sendkeys(buf, "\<CR>")
899 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100900 call StopVimInTerminal(buf)
901
902 call assert_equal(['changed'], readfile('Xfile'))
903 call delete('Xfile')
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100904 call delete('.Xfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100905 call delete('Xconfirmscript')
906endfunc
907
908def Test_command_modifiers_keep()
909 if has('unix')
910 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
911 new
912 setline(1, ['one', 'two', 'three'])
913 normal 1Gma
914 normal 2Gmb
915 normal 3Gmc
916 if addRflag
917 set cpo+=R
918 else
919 set cpo-=R
920 endif
921 if keepMarks
922 keepmarks :%!cat
923 else
924 :%!cat
925 endif
926 if hasMarks
927 assert_equal(1, line("'a"))
928 assert_equal(2, line("'b"))
929 assert_equal(3, line("'c"))
930 else
931 assert_equal(0, line("'a"))
932 assert_equal(0, line("'b"))
933 assert_equal(0, line("'c"))
934 endif
935 quit!
936 enddef
937 DoTest(false, false, true)
938 DoTest(true, false, false)
939 DoTest(false, true, true)
940 DoTest(true, true, true)
941 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100942
943 new
944 setline(1, ['one', 'two', 'three', 'four'])
945 assert_equal(4, line("$"))
946 normal 1Gma
947 normal 2Gmb
948 normal 3Gmc
949 lockmarks :1,2!wc
950 # line is deleted, marks don't move
951 assert_equal(3, line("$"))
952 assert_equal('four', getline(3))
953 assert_equal(1, line("'a"))
954 assert_equal(2, line("'b"))
955 assert_equal(3, line("'c"))
956 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100957 endif
958
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100959 edit Xone
960 edit Xtwo
961 assert_equal('Xone', expand('#'))
962 keepalt edit Xthree
963 assert_equal('Xone', expand('#'))
964
965 normal /a*b*
966 assert_equal('a*b*', histget("search"))
967 keeppatterns normal /c*d*
968 assert_equal('a*b*', histget("search"))
969
970 new
971 setline(1, range(10))
972 :10
973 normal gg
974 assert_equal(10, getpos("''")[1])
975 keepjumps normal 5G
976 assert_equal(10, getpos("''")[1])
977 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100978enddef
979
Bram Moolenaar8242ebb2020-12-29 11:15:01 +0100980def Test_bar_line_continuation()
981 var lines =<< trim END
982 au BufNewFile Xfile g:readFile = 1
983 | g:readExtra = 2
984 g:readFile = 0
985 g:readExtra = 0
986 edit Xfile
987 assert_equal(1, g:readFile)
988 assert_equal(2, g:readExtra)
989 bwipe!
990 au! BufNewFile
991
992 au BufNewFile Xfile g:readFile = 1
993 | g:readExtra = 2
994 | g:readMore = 3
995 g:readFile = 0
996 g:readExtra = 0
997 g:readMore = 0
998 edit Xfile
999 assert_equal(1, g:readFile)
1000 assert_equal(2, g:readExtra)
1001 assert_equal(3, g:readMore)
1002 bwipe!
1003 au! BufNewFile
1004 unlet g:readFile
1005 unlet g:readExtra
1006 unlet g:readMore
1007 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001008 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001009enddef
1010
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001011def Test_command_modifier_other()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001012 new Xsomefile
1013 setline(1, 'changed')
1014 var buf = bufnr()
1015 hide edit Xotherfile
1016 var info = getbufinfo(buf)
1017 assert_equal(1, info[0].hidden)
1018 assert_equal(1, info[0].changed)
1019 edit Xsomefile
1020 bwipe!
1021
1022 au BufNewFile Xfile g:readFile = 1
1023 g:readFile = 0
1024 edit Xfile
1025 assert_equal(1, g:readFile)
1026 bwipe!
1027 g:readFile = 0
1028 noautocmd edit Xfile
1029 assert_equal(0, g:readFile)
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001030 au! BufNewFile
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001031 unlet g:readFile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001032
1033 noswapfile edit XnoSwap
Bram Moolenaardd1f4262020-12-31 17:41:01 +01001034 assert_equal(false, &l:swapfile)
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001035 bwipe!
1036
1037 var caught = false
1038 try
1039 sandbox !ls
1040 catch /E48:/
1041 caught = true
1042 endtry
1043 assert_true(caught)
1044
1045 :8verbose g:verbose_now = &verbose
1046 assert_equal(8, g:verbose_now)
1047 unlet g:verbose_now
1048enddef
1049
Bram Moolenaar62aec932022-01-29 21:45:34 +00001050def s:EchoHere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001051 echomsg 'here'
1052enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001053def s:EchoThere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001054 unsilent echomsg 'there'
1055enddef
1056
1057def Test_modifier_silent_unsilent()
1058 echomsg 'last one'
1059 silent echomsg "text"
1060 assert_equal("\nlast one", execute(':1messages'))
1061
1062 silent! echoerr "error"
1063
1064 echomsg 'last one'
1065 silent EchoHere()
1066 assert_equal("\nlast one", execute(':1messages'))
1067
1068 silent EchoThere()
1069 assert_equal("\nthere", execute(':1messages'))
Bram Moolenaar20a76292020-12-25 19:47:24 +01001070
1071 try
1072 silent eval [][0]
1073 catch
1074 echomsg "caught"
1075 endtry
1076 assert_equal("\ncaught", execute(':1messages'))
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001077
1078 var lines =<< trim END
1079 vim9script
1080 set history=11
1081 silent! while 0
1082 set history=22
1083 silent! endwhile
1084 assert_equal(11, &history)
1085 set history&
1086 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001087 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001088enddef
1089
Bram Moolenaar36113e42020-11-02 21:08:47 +01001090def Test_range_after_command_modifier()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001091 v9.CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2)
Bram Moolenaar36113e42020-11-02 21:08:47 +01001092 new
1093 setline(1, 'xxx')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001094 v9.CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
Bram Moolenaar36113e42020-11-02 21:08:47 +01001095 assert_equal('', getline(1))
1096 bwipe!
Bram Moolenaarb579f6e2021-12-04 11:57:00 +00001097
1098 var lines =<< trim END
1099 legacy /pat/
1100 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001101 v9.CheckDefExecAndScriptFailure(lines, 'E486: Pattern not found: pat')
Bram Moolenaar36113e42020-11-02 21:08:47 +01001102enddef
1103
Bram Moolenaarece0b872021-01-08 20:40:45 +01001104def Test_silent_pattern()
1105 new
1106 silent! :/pat/put _
1107 bwipe!
1108enddef
1109
Bram Moolenaarfa984412021-03-25 22:15:28 +01001110def Test_useless_command_modifier()
1111 g:maybe = true
1112 var lines =<< trim END
1113 if g:maybe
1114 silent endif
1115 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001116 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001117
1118 lines =<< trim END
1119 for i in [0]
1120 silent endfor
1121 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001122 v9.CheckDefFailure(lines, 'E1176:', 2)
1123 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001124
1125 lines =<< trim END
1126 while g:maybe
1127 silent endwhile
1128 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001129 v9.CheckDefFailure(lines, 'E1176:', 2)
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001130 g:maybe = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001131 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001132
1133 lines =<< trim END
1134 silent try
1135 finally
1136 endtry
1137 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001138 v9.CheckDefAndScriptFailure(lines, 'E1176:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001139
1140 lines =<< trim END
1141 try
1142 silent catch
1143 endtry
1144 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001145 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001146
1147 lines =<< trim END
1148 try
1149 silent finally
1150 endtry
1151 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001152 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001153
1154 lines =<< trim END
1155 try
1156 finally
1157 silent endtry
1158 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001159 v9.CheckDefAndScriptFailure(lines, 'E1176:', 3)
Bram Moolenaarbc510062022-02-14 21:19:04 +00001160
1161 lines =<< trim END
1162 leftabove
1163 END
1164 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
1165
1166 lines =<< trim END
1167 leftabove # comment
1168 END
1169 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001170enddef
1171
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001172def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001173 var from = 3
1174 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001175 g:val = 111
1176 def Increment(nrs: list<number>)
1177 for nr in nrs
1178 g:val += nr
1179 endfor
1180 enddef
1181 eval range(from, to)
1182 ->Increment()
1183 assert_equal(111 + 3 + 4 + 5, g:val)
1184 unlet g:val
Bram Moolenaard0fe6202020-12-05 17:11:12 +01001185
1186 var lines =<< trim END
1187 vim9script
1188 g:caught = 'no'
1189 try
1190 eval 123 || 0
1191 catch
1192 g:caught = 'yes'
1193 endtry
1194 assert_equal('yes', g:caught)
1195 unlet g:caught
1196 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001197 v9.CheckScriptSuccess(lines)
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001198enddef
1199
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001200def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001201 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001202 nnoremap <F3> :echo 'hit F3 #'<CR>
1203 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
1204 END
Bram Moolenaarac485062022-03-23 19:45:01 +00001205 v9.CheckDefAndScriptSuccess(lines)
1206
1207 # backslash before bar is not removed
1208 lines =<< trim END
1209 vim9script
1210
1211 def Init()
1212 noremap <buffer> <F5> <ScriptCmd>MyFunc('a') \| MyFunc('b')<CR>
1213 enddef
1214 Init()
1215 unmap <buffer> <F5>
1216 END
1217 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001218enddef
1219
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001220def Test_normal_command()
1221 new
1222 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +02001223 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001224 try
1225 exe "norm! \<C-]>"
1226 catch /E433/
1227 caught = 2
1228 endtry
1229 assert_equal(2, caught)
1230
1231 try
1232 exe "norm! 3\<C-]>"
1233 catch /E433/
1234 caught = 3
1235 endtry
1236 assert_equal(3, caught)
1237 bwipe!
1238enddef
1239
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001240def Test_put_command()
1241 new
1242 @p = 'ppp'
1243 put p
1244 assert_equal('ppp', getline(2))
1245
1246 put ='below'
1247 assert_equal('below', getline(3))
1248 put! ='above'
1249 assert_equal('above', getline(3))
1250 assert_equal('below', getline(4))
1251
Bram Moolenaar883cf972021-01-15 18:04:43 +01001252 :2put =['a', 'b', 'c']
1253 assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
1254
Bram Moolenaard0b7bfa2022-03-12 14:51:16 +00001255 :0put = 'first'
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001256 assert_equal('first', getline(1))
1257 :1put! ='first again'
1258 assert_equal('first again', getline(1))
1259
Bram Moolenaar08597872020-12-10 19:43:40 +01001260 # compute range at runtime
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001261 :%del
Bram Moolenaar08597872020-12-10 19:43:40 +01001262 setline(1, range(1, 8))
1263 @a = 'aaa'
1264 :$-2put a
1265 assert_equal('aaa', getline(7))
1266
1267 setline(1, range(1, 8))
1268 :2
1269 :+2put! a
1270 assert_equal('aaa', getline(4))
1271
Bram Moolenaara28639e2021-01-19 22:48:09 +01001272 []->mapnew(() => 0)
1273 :$put ='end'
1274 assert_equal('end', getline('$'))
1275
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001276 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001277
Bram Moolenaar62aec932022-01-29 21:45:34 +00001278 v9.CheckDefFailure(['put =xxx'], 'E1001:')
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001279enddef
1280
1281def Test_put_with_linebreak()
1282 new
1283 var lines =<< trim END
1284 vim9script
1285 pu =split('abc', '\zs')
1286 ->join()
1287 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001288 v9.CheckScriptSuccess(lines)
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001289 getline(2)->assert_equal('a b c')
1290 bwipe!
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001291enddef
1292
Bram Moolenaar3bd8de42020-09-14 16:37:34 +02001293def Test_command_star_range()
1294 new
1295 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
1296 setpos("'<", [0, 1, 0, 0])
1297 setpos("'>", [0, 3, 0, 0])
1298 :*s/\(foo\|bar\)/baz/g
1299 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
1300
1301 bwipe!
1302enddef
1303
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001304def Test_f_args()
1305 var lines =<< trim END
1306 vim9script
1307
1308 func SaveCmdArgs(...)
1309 let g:args = a:000
1310 endfunc
1311
1312 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
1313
1314 TestFArgs
1315 assert_equal([], g:args)
1316
1317 TestFArgs one two three
1318 assert_equal(['one', 'two', 'three'], g:args)
1319 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001320 v9.CheckScriptSuccess(lines)
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001321enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001322
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001323def Test_user_command_comment()
1324 command -nargs=1 Comd echom <q-args>
1325
1326 var lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001327 vim9script
1328 Comd # comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001329 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001330 v9.CheckScriptSuccess(lines)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001331
1332 lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001333 vim9script
1334 Comd# comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001335 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001336 v9.CheckScriptFailure(lines, 'E1144:')
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001337 delcommand Comd
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001338
1339 lines =<< trim END
1340 vim9script
1341 command Foo echo 'Foo'
1342 Foo3Bar
1343 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001344 v9.CheckScriptFailure(lines, 'E1144: Command "Foo" is not followed by white space: Foo3Bar')
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001345
1346 delcommand Foo
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001347enddef
1348
Bram Moolenaar95388e32020-11-20 21:07:00 +01001349def Test_star_command()
1350 var lines =<< trim END
1351 vim9script
1352 @s = 'g:success = 8'
1353 set cpo+=*
1354 exe '*s'
1355 assert_equal(8, g:success)
1356 unlet g:success
1357 set cpo-=*
1358 assert_fails("exe '*s'", 'E1050:')
1359 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001360 v9.CheckScriptSuccess(lines)
Bram Moolenaar95388e32020-11-20 21:07:00 +01001361enddef
1362
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001363def Test_cmd_argument_without_colon()
1364 new Xfile
1365 setline(1, ['a', 'b', 'c', 'd'])
1366 write
1367 edit +3 %
1368 assert_equal(3, getcurpos()[1])
1369 edit +/a %
1370 assert_equal(1, getcurpos()[1])
1371 bwipe
1372 delete('Xfile')
1373enddef
1374
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001375def Test_ambiguous_user_cmd()
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001376 command Cmd1 eval 0
1377 command Cmd2 eval 0
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001378 var lines =<< trim END
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001379 Cmd
1380 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001381 v9.CheckDefAndScriptFailure(lines, 'E464:', 1)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001382 delcommand Cmd1
1383 delcommand Cmd2
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001384enddef
1385
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001386def Test_command_not_recognized()
1387 var lines =<< trim END
1388 d.key = 'asdf'
1389 END
Bram Moolenaar97f8c102022-04-02 19:43:57 +01001390 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
1391
1392 lines =<< trim END
1393 d['key'] = 'asdf'
1394 END
1395 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001396
1397 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001398 if 0
1399 d.key = 'asdf'
1400 endif
1401 END
1402 v9.CheckDefSuccess(lines)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001403enddef
Bram Moolenaarb7a78f72020-06-28 18:43:40 +02001404
Bram Moolenaarf4e20992020-12-21 19:59:08 +01001405def Test_magic_not_used()
1406 new
1407 for cmd in ['set magic', 'set nomagic']
1408 exe cmd
1409 setline(1, 'aaa')
1410 s/.../bbb/
1411 assert_equal('bbb', getline(1))
1412 endfor
1413
1414 set magic
1415 setline(1, 'aaa')
1416 assert_fails('s/.\M../bbb/', 'E486:')
1417 assert_fails('snomagic/.../bbb/', 'E486:')
1418 assert_equal('aaa', getline(1))
1419
1420 bwipe!
1421enddef
1422
Bram Moolenaar60f63102020-12-21 20:32:43 +01001423def Test_gdefault_not_used()
1424 new
1425 for cmd in ['set gdefault', 'set nogdefault']
1426 exe cmd
1427 setline(1, 'aaa')
1428 s/./b/
1429 assert_equal('baa', getline(1))
1430 endfor
1431
1432 set nogdefault
1433 bwipe!
1434enddef
1435
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001436def s:SomeComplFunc(findstart: number, base: string): any
Bram Moolenaar179eb562020-12-27 18:03:22 +01001437 if findstart
1438 return 0
1439 else
1440 return ['aaa', 'bbb']
1441 endif
1442enddef
1443
1444def Test_insert_complete()
1445 # this was running into an error with the matchparen hack
1446 new
1447 set completefunc=SomeComplFunc
1448 feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx')
1449 assert_equal('aaa', getline(1))
1450
1451 set completefunc=
1452 bwipe!
1453enddef
1454
Bram Moolenaara11919f2021-01-02 19:44:56 +01001455def Test_wincmd()
1456 split
1457 var id1 = win_getid()
1458 if true
1459 try | wincmd w | catch | endtry
1460 endif
1461 assert_notequal(id1, win_getid())
1462 close
Bram Moolenaar1ff89de2021-03-24 20:08:12 +01001463
1464 split
1465 var id = win_getid()
1466 split
1467 :2wincmd o
1468 assert_equal(id, win_getid())
1469 only
1470
1471 split
1472 split
1473 assert_equal(3, winnr('$'))
1474 :2wincmd c
1475 assert_equal(2, winnr('$'))
1476 only
1477
1478 split
1479 split
1480 assert_equal(3, winnr('$'))
1481 :2wincmd q
1482 assert_equal(2, winnr('$'))
1483 only
Bram Moolenaara11919f2021-01-02 19:44:56 +01001484enddef
1485
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001486def Test_windo_missing_endif()
1487 var lines =<< trim END
1488 windo if 1
1489 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001490 v9.CheckDefExecFailure(lines, 'E171:', 1)
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001491enddef
1492
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001493let s:theList = [1, 2, 3]
1494
1495def Test_lockvar()
1496 s:theList[1] = 22
1497 assert_equal([1, 22, 3], s:theList)
1498 lockvar s:theList
1499 assert_fails('theList[1] = 77', 'E741:')
1500 unlockvar s:theList
1501 s:theList[1] = 44
1502 assert_equal([1, 44, 3], s:theList)
1503
Bram Moolenaara99fb232021-12-20 12:25:03 +00001504 if 0
1505 lockvar whatever
1506 endif
1507
Bram Moolenaar70c43d82022-01-26 21:01:15 +00001508 g:lockme = [1, 2, 3]
1509 lockvar 1 g:lockme
1510 g:lockme[1] = 77
1511 assert_equal([1, 77, 3], g:lockme)
1512
1513 lockvar 2 g:lockme
1514 var caught = false
1515 try
1516 g:lockme[1] = 99
1517 catch /E1119:/
1518 caught = true
1519 endtry
1520 assert_true(caught)
1521 assert_equal([1, 77, 3], g:lockme)
1522 unlet g:lockme
1523
1524 # also for non-materialized list
1525 g:therange = range(3)
1526 lockvar 2 g:therange
1527 caught = false
1528 try
1529 g:therange[1] = 99
1530 catch /E1119:/
1531 caught = true
1532 endtry
1533 assert_true(caught)
1534 assert_equal([0, 1, 2], g:therange)
1535 unlet g:therange
1536
Bram Moolenaare939f5e2022-01-26 21:32:59 +00001537 # use exclamation mark for locking deeper
1538 g:nestedlist = [1, [2, 3], 4]
1539 lockvar! g:nestedlist
1540 try
1541 g:nestedlist[1][0] = 9
1542 catch /E1119:/
1543 caught = true
1544 endtry
1545 assert_true(caught)
1546 unlet g:nestedlist
1547
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001548 var d = {a: 1, b: 2}
1549 d.a = 3
1550 d.b = 4
1551 assert_equal({a: 3, b: 4}, d)
1552 lockvar d.a
1553 d.b = 5
1554 var ex = ''
1555 try
1556 d.a = 6
1557 catch
1558 ex = v:exception
1559 endtry
1560 assert_match('E1121:', ex)
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00001561 unlockvar d['a']
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001562 d.a = 7
1563 assert_equal({a: 7, b: 5}, d)
1564
Bram Moolenaar10611952022-04-03 21:11:34 +01001565 caught = false
1566 try
1567 lockvar d.c
1568 catch /E716/
1569 caught = true
1570 endtry
1571 assert_true(caught)
1572
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001573 var lines =<< trim END
1574 vim9script
Bram Moolenaare08be092022-02-17 13:08:26 +00001575 g:bl = 0z1122
1576 lockvar g:bl
1577 def Tryit()
1578 g:bl[1] = 99
1579 enddef
1580 Tryit()
1581 END
1582 v9.CheckScriptFailure(lines, 'E741:', 1)
1583
1584 lines =<< trim END
1585 vim9script
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001586 var theList = [1, 2, 3]
1587 def SetList()
1588 theList[1] = 22
1589 assert_equal([1, 22, 3], theList)
1590 lockvar theList
1591 theList[1] = 77
1592 enddef
1593 SetList()
1594 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001595 v9.CheckScriptFailure(lines, 'E1119', 4)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001596
1597 lines =<< trim END
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001598 vim9script
1599 var theList = [1, 2, 3]
1600 def AddToList()
1601 lockvar theList
1602 theList += [4]
1603 enddef
1604 AddToList()
1605 END
1606 v9.CheckScriptFailure(lines, 'E741', 2)
1607
1608 lines =<< trim END
1609 vim9script
1610 var theList = [1, 2, 3]
1611 def AddToList()
1612 lockvar theList
1613 add(theList, 4)
1614 enddef
1615 AddToList()
1616 END
1617 v9.CheckScriptFailure(lines, 'E741', 2)
1618
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00001619 # can unlet a locked list item but not change it
1620 lines =<< trim END
1621 var ll = [1, 2, 3]
1622 lockvar ll[1]
1623 unlet ll[1]
1624 assert_equal([1, 3], ll)
1625 END
1626 v9.CheckDefAndScriptSuccess(lines)
1627 lines =<< trim END
1628 var ll = [1, 2, 3]
1629 lockvar ll[1]
1630 ll[1] = 9
1631 END
1632 v9.CheckDefExecAndScriptFailure(lines, ['E1119:', 'E741'], 3)
1633
1634 # can unlet a locked dict item but not change it
1635 lines =<< trim END
1636 var dd = {a: 1, b: 2}
1637 lockvar dd.a
1638 unlet dd.a
1639 assert_equal({b: 2}, dd)
1640 END
1641 v9.CheckDefAndScriptSuccess(lines)
1642 lines =<< trim END
1643 var dd = {a: 1, b: 2}
1644 lockvar dd.a
1645 dd.a = 3
1646 END
1647 v9.CheckDefExecAndScriptFailure(lines, ['E1121:', 'E741'], 3)
1648
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001649 lines =<< trim END
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001650 var theList = [1, 2, 3]
1651 lockvar theList
1652 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001653 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001654
1655 lines =<< trim END
1656 var theList = [1, 2, 3]
1657 unlockvar theList
1658 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001659 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001660
1661 lines =<< trim END
1662 vim9script
1663 var name = 'john'
1664 lockvar nameX
1665 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001666 v9.CheckScriptFailure(lines, 'E1246', 3)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001667
1668 lines =<< trim END
1669 vim9script
1670 var name = 'john'
1671 def LockIt()
1672 lockvar nameX
1673 enddef
1674 LockIt()
1675 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001676 v9.CheckScriptFailure(lines, 'E1246', 1)
Bram Moolenaar7a411a32022-04-04 14:58:06 +01001677
1678 lines =<< trim END
1679 vim9script
1680 const name = 'john'
1681 unlockvar name
1682 END
1683 v9.CheckScriptFailure(lines, 'E46', 3)
1684
1685 lines =<< trim END
1686 vim9script
1687 const name = 'john'
1688 def UnLockIt()
1689 unlockvar name
1690 enddef
1691 UnLockIt()
1692 END
1693 v9.CheckScriptFailure(lines, 'E46', 1)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001694enddef
1695
Bram Moolenaar4c137212021-04-19 16:48:48 +02001696def Test_substitute_expr()
1697 var to = 'repl'
1698 new
1699 setline(1, 'one from two')
1700 s/from/\=to
1701 assert_equal('one repl two', getline(1))
1702
1703 setline(1, 'one from two')
1704 s/from/\=to .. '_x'
1705 assert_equal('one repl_x two', getline(1))
1706
1707 setline(1, 'one from two from three')
1708 var also = 'also'
1709 s/from/\=to .. '_' .. also/g#e
1710 assert_equal('one repl_also two repl_also three', getline(1))
1711
Bram Moolenaar8238f082021-04-20 21:10:48 +02001712 setline(1, 'abc abc abc')
1713 for choice in [true, false]
1714 :1s/abc/\=choice ? 'yes' : 'no'/
1715 endfor
1716 assert_equal('yes no abc', getline(1))
1717
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01001718 setline(1, 'from')
1719 v9.CheckDefExecFailure(['s/from/\=g:notexist/'], 'E121: Undefined variable: g:notexist')
1720
Bram Moolenaard386e922021-04-25 14:48:49 +02001721 bwipe!
1722
Bram Moolenaar62aec932022-01-29 21:45:34 +00001723 v9.CheckDefFailure(['s/from/\="x")/'], 'E488:')
1724 v9.CheckDefFailure(['s/from/\="x"/9'], 'E488:')
Bram Moolenaar4c137212021-04-19 16:48:48 +02001725
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00001726 v9.CheckDefExecFailure(['s/this/\="that"/'], 'E486:')
1727
Bram Moolenaard386e922021-04-25 14:48:49 +02001728 # When calling a function the right instruction list needs to be restored.
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001729 g:cond = true
Bram Moolenaard386e922021-04-25 14:48:49 +02001730 var lines =<< trim END
1731 vim9script
1732 def Foo()
1733 Bar([])
1734 enddef
1735 def Bar(l: list<number>)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001736 if g:cond
Bram Moolenaard386e922021-04-25 14:48:49 +02001737 s/^/\=Rep()/
1738 for n in l[:]
1739 endfor
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001740 endif
Bram Moolenaard386e922021-04-25 14:48:49 +02001741 enddef
1742 def Rep(): string
1743 return 'rep'
1744 enddef
1745 new
1746 Foo()
1747 assert_equal('rep', getline(1))
1748 bwipe!
1749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001750 v9.CheckScriptSuccess(lines)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001751 unlet g:cond
Bram Moolenaar27523602021-06-05 21:36:19 +02001752
1753 # List results in multiple lines
1754 new
1755 setline(1, 'some text here')
Bram Moolenaar2c707112021-08-02 22:26:56 +02001756 s/text/\=['aaa', 'bbb', 'ccc']/
Bram Moolenaar27523602021-06-05 21:36:19 +02001757 assert_equal(['some aaa', 'bbb', 'ccc', ' here'], getline(1, '$'))
1758 bwipe!
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001759
1760 # inside "if 0" substitute is ignored
1761 if 0
1762 s/a/\=nothing/ and | some more
1763 endif
Bram Moolenaar4c137212021-04-19 16:48:48 +02001764enddef
1765
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001766def Test_redir_to_var()
1767 var result: string
1768 redir => result
1769 echo 'something'
1770 redir END
1771 assert_equal("\nsomething", result)
1772
1773 redir =>> result
1774 echo 'more'
1775 redir END
1776 assert_equal("\nsomething\nmore", result)
1777
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001778 var d: dict<string>
1779 redir => d.redir
1780 echo 'dict'
1781 redir END
1782 assert_equal({redir: "\ndict"}, d)
1783
1784 var l = ['a', 'b', 'c']
1785 redir => l[1]
1786 echo 'list'
1787 redir END
1788 assert_equal(['a', "\nlist", 'c'], l)
1789
1790 var dl = {l: ['x']}
1791 redir => dl.l[0]
1792 echo 'dict-list'
1793 redir END
1794 assert_equal({l: ["\ndict-list"]}, dl)
1795
Bram Moolenaara369c3d2021-04-21 16:00:10 +02001796 redir =>> d.redir
1797 echo 'more'
1798 redir END
1799 assert_equal({redir: "\ndict\nmore"}, d)
1800
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001801 var lines =<< trim END
1802 redir => notexist
1803 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001804 v9.CheckDefFailure(lines, 'E1089:')
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001805
1806 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001807 var text: string
1808 redir => text
1809 END
1810 v9.CheckDefFailure(lines, 'E1185:')
1811
1812 lines =<< trim END
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001813 var ls = 'asdf'
1814 redir => ls[1]
1815 redir END
1816 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001817 v9.CheckDefFailure(lines, 'E1141:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001818
1819 lines =<< trim END
1820 var text: string
1821 redir => text
1822 echo 'hello'
1823 redir > Xfile
1824 redir END
1825 END
Bram Moolenaar02a977e2022-02-03 21:29:39 +00001826 v9.CheckDefFailure(lines, 'E1092:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001827
1828 lines =<< trim END
1829 var text: number
1830 redir => text
1831 echo 'hello'
1832 redir END
1833 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001834 v9.CheckDefFailure(lines, 'E1012:')
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001835enddef
1836
Bram Moolenaar68db9962021-05-09 23:19:22 +02001837def Test_echo_void()
1838 var lines =<< trim END
1839 vim9script
1840 def NoReturn()
1841 echo 'nothing'
1842 enddef
1843 echo NoReturn()
1844 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001845 v9.CheckScriptFailure(lines, 'E1186:', 5)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001846
1847 lines =<< trim END
1848 vim9script
1849 def NoReturn()
1850 echo 'nothing'
1851 enddef
1852 def Try()
1853 echo NoReturn()
1854 enddef
1855 defcompile
1856 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001857 v9.CheckScriptFailure(lines, 'E1186:', 1)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001858enddef
1859
Bram Moolenaar2c707112021-08-02 22:26:56 +02001860def Test_cmdwin_block()
1861 augroup justTesting
1862 autocmd BufEnter * {
1863 echomsg 'in block'
1864 }
1865 augroup END
1866 feedkeys('q:', 'xt')
1867 redraw
1868 feedkeys("aclose\<CR>", 'xt')
1869
1870 au! justTesting
1871enddef
1872
Bram Moolenaar7b829262021-10-13 15:04:34 +01001873def Test_var_not_cmd()
1874 var lines =<< trim END
1875 g:notexist:cmd
1876 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001877 v9.CheckDefAndScriptFailure(lines, ['E488: Trailing characters: :cmd', 'E121: Undefined variable: g:notexist'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001878
1879 lines =<< trim END
1880 g-pat-cmd
1881 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001882 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001883 lines =<< trim END
1884 g.pat.cmd
1885 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001886 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: g', 'E121: Undefined variable: g'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001887
1888 lines =<< trim END
1889 s:notexist:repl
1890 END
Bram Moolenaara749a422022-02-12 19:52:25 +00001891 v9.CheckDefAndScriptFailure(lines, ['E488: Trailing characters: :repl', 'E1268:'], 1)
1892
1893 lines =<< trim END
1894 notexist:repl
1895 END
1896 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001897
1898 lines =<< trim END
1899 s-pat-repl
1900 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001901 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001902 lines =<< trim END
1903 s.pat.repl
1904 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001905 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: s', 'E121: Undefined variable: s'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001906
1907 lines =<< trim END
1908 w:notexist->len()
1909 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001910 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: w:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001911
1912 lines =<< trim END
1913 b:notexist->len()
1914 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001915 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: b:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001916
1917 lines =<< trim END
1918 t:notexist->len()
1919 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001920 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: t:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001921enddef
1922
1923def Test_no_space_after_command()
1924 var lines =<< trim END
1925 g /pat/cmd
1926 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001927 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001928 lines =<< trim END
1929 g #pat#cmd
1930 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001931 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001932
1933 new
1934 setline(1, 'some pat')
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001935 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001936 g#pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001937 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001938 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001939 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001940 g# pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001941 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001942 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001943 bwipe!
Bram Moolenaar7b829262021-10-13 15:04:34 +01001944
1945 lines =<< trim END
1946 s /pat/repl
1947 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001948 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001949 lines =<< trim END
1950 s #pat#repl
1951 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001952 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001953 lines =<< trim END
1954 s#pat#repl
1955 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001956 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001957 lines =<< trim END
1958 s# pat#repl
1959 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001960 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001961enddef
1962
Yegappan Lakshmanan2a16dc62021-11-16 17:19:30 +00001963" Test for the 'previewpopup' option
1964def Test_previewpopup()
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00001965 set previewpopup=height:10,width:60
1966 pedit Xfile
1967 var id = popup_findpreview()
1968 assert_notequal(id, 0)
1969 assert_match('Xfile', popup_getoptions(id).title)
1970 popup_clear()
1971 set previewpopup&
1972enddef
1973
Bram Moolenaarc8a9fe52021-11-20 19:50:59 +00001974def Test_syntax_enable_clear()
1975 syntax clear
1976 syntax enable
1977 highlight clear String
1978 assert_equal(true, hlget('String')->get(0, {})->get('default', false))
1979 syntax clear
1980enddef
1981
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001982
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02001983" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker