blob: d76e3bd5709d2f096facae6a225e75c5da06ad7e [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
Bram Moolenaar747f1102022-09-18 13:06:41 +010055 lines =<< trim END
56 vim9script
57 echo .10
58 END
59 v9.CheckScriptSuccess(lines)
60 lines =<< trim END
61 vim9cmd echo .10
62 END
63 v9.CheckScriptSuccess(lines)
64 lines =<< trim END
65 vim9script
66 legacy echo .10
67 END
68 v9.CheckScriptFailure(lines, 'E15:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020069
70 echo v:version
71 assert_fails('vim9cmd echo version', 'E121:')
72 lines =<< trim END
73 vim9script
74 echo version
75 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000076 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaardd9de502021-08-15 13:49:42 +020077 lines =<< trim END
78 vim9script
79 legacy echo version
80 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000081 v9.CheckScriptSuccess(lines)
Christian Brabandt504543f2023-09-11 20:08:50 +020082
83 lines =<< trim END
84 vim9script
85 def Func()
86 var d: dict<string>
87 d.k .= ''
88 enddef
89 defcompile
90 END
91 v9.CheckScriptFailure(lines, 'E985:')
92 lines =<< trim END
93 vim9script
94 def Func()
95 var d: dict<string>
96 d.k ,= ''
97 enddef
98 defcompile
99 END
100 v9.CheckScriptFailure(lines, 'E1017:')
Bram Moolenaar39f3b142021-02-14 12:57:36 +0100101enddef
102
Bram Moolenaarf79d9dd2022-05-21 15:39:02 +0100103def Test_defcompile_fails()
104 assert_fails('defcompile NotExists', 'E1061:')
105 assert_fails('defcompile debug debug Test_defcompile_fails', 'E488:')
106 assert_fails('defcompile profile profile Test_defcompile_fails', 'E488:')
107enddef
108
109defcompile Test_defcompile_fails
110defcompile debug Test_defcompile_fails
111defcompile profile Test_defcompile_fails
112
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +0000113def Test_cmdmod_execute()
114 # "legacy" applies not only to the "exe" argument but also to the commands
115 var lines =<< trim END
116 vim9script
117
118 b:undo = 'let g:undone = 1 | let g:undtwo = 2'
119 legacy exe b:undo
120 assert_equal(1, g:undone)
121 assert_equal(2, g:undtwo)
122 END
123 v9.CheckScriptSuccess(lines)
124
125 # same for "vim9cmd" modifier
126 lines =<< trim END
127 let b:undo = 'g:undone = 11 | g:undtwo = 22'
128 vim9cmd exe b:undo
129 call assert_equal(11, g:undone)
130 call assert_equal(22, g:undtwo)
131 END
132 v9.CheckScriptSuccess(lines)
133 unlet b:undo
134 unlet g:undone
135 unlet g:undtwo
Bram Moolenaar2a9b62d2022-02-12 13:30:17 +0000136
137 # "legacy" does not apply to a loaded script
138 lines =<< trim END
139 vim9script
140 export var exported = 'x'
141 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100142 writefile(lines, 'Xvim9import.vim', 'D')
Bram Moolenaar2a9b62d2022-02-12 13:30:17 +0000143 lines =<< trim END
144 legacy exe "import './Xvim9import.vim'"
145 END
146 v9.CheckScriptSuccess(lines)
Bram Moolenaarcdf04852022-02-12 22:13:06 +0000147
dundargocc57b5bc2022-11-02 13:30:51 +0000148 # "legacy" does not apply to a called function
Bram Moolenaarcdf04852022-02-12 22:13:06 +0000149 lines =<< trim END
150 vim9script
151
152 def g:TheFunc()
153 if exists('something')
154 echo 'yes'
155 endif
156 enddef
157 legacy exe 'call g:TheFunc()'
158 END
159 v9.CheckScriptSuccess(lines)
160 delfunc g:TheFunc
Kota Kato3d3f6ac2022-08-04 18:50:14 +0100161
162 # vim9cmd execute(cmd) executes code in vim9 script context
163 lines =<< trim END
164 vim9cmd execute("g:vim9executetest = 'bar'")
165 call assert_equal('bar', g:vim9executetest)
166 END
167 v9.CheckScriptSuccess(lines)
168 unlet g:vim9executetest
169
170 lines =<< trim END
171 vim9cmd execute(["g:vim9executetest1 = 'baz'", "g:vim9executetest2 = 'foo'"])
172 call assert_equal('baz', g:vim9executetest1)
173 call assert_equal('foo', g:vim9executetest2)
174 END
175 v9.CheckScriptSuccess(lines)
176 unlet g:vim9executetest1
177 unlet g:vim9executetest2
178
179 # legacy call execute(cmd) executes code in vim script context
180 lines =<< trim END
181 vim9script
182 legacy call execute("let g:vim9executetest = 'bar'")
183 assert_equal('bar', g:vim9executetest)
184 END
185 v9.CheckScriptSuccess(lines)
186 unlet g:vim9executetest
187
188 lines =<< trim END
189 vim9script
190 legacy call execute(["let g:vim9executetest1 = 'baz'", "let g:vim9executetest2 = 'foo'"])
191 assert_equal('baz', g:vim9executetest1)
192 assert_equal('foo', g:vim9executetest2)
193 END
194 v9.CheckScriptSuccess(lines)
195 unlet g:vim9executetest1
196 unlet g:vim9executetest2
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +0000197enddef
198
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200199def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +0200200 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200201 edit `=filename`
202 assert_equal('Xtest', bufname())
203
Bram Moolenaarac564082020-09-27 19:05:33 +0200204 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200205 edit Xtest`=filenr`
206 assert_equal('Xtest123', bufname())
207
208 filenr = 77
209 edit `=filename``=filenr`
210 assert_equal('Xtest77', bufname())
211
212 edit X`=filename`xx`=filenr`yy
213 assert_equal('XXtestxx77yy', bufname())
Bram Moolenaar025cb1c2020-12-14 18:31:27 +0100214
Bram Moolenaar62aec932022-01-29 21:45:34 +0000215 v9.CheckDefFailure(['edit `=xxx`'], 'E1001:')
216 v9.CheckDefFailure(['edit `="foo"'], 'E1083:')
Bram Moolenaarb288ba92021-06-05 17:10:55 +0200217
218 var files = ['file 1', 'file%2', 'file# 3']
219 args `=files`
220 assert_equal(files, argv())
Bram Moolenaar279d7332021-11-27 11:42:50 +0000221
222 filename = 'Xwindo'
223 windo edit `=filename`
224 assert_equal('Xwindo', bufname())
225
226 filename = 'Xtabdo'
227 tabdo edit `=filename`
228 assert_equal('Xtabdo', bufname())
229
230 filename = 'Xargdo'
231 argdo edit `=filename`
232 assert_equal('Xargdo', bufname())
233
234 :%bwipe!
235 filename = 'Xbufdo'
236 bufdo file `=filename`
237 assert_equal('Xbufdo', bufname())
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200238enddef
239
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100240def Test_expand_alternate_file()
241 var lines =<< trim END
242 edit Xfileone
243 var bone = bufnr()
244 edit Xfiletwo
245 var btwo = bufnr()
246 edit Xfilethree
247 var bthree = bufnr()
248
249 edit #
250 assert_equal(bthree, bufnr())
251 edit %%
252 assert_equal(btwo, bufnr())
253 edit %% # comment
254 assert_equal(bthree, bufnr())
255 edit %%yy
256 assert_equal('Xfiletwoyy', bufname())
257
258 exe "edit %%" .. bone
259 assert_equal(bone, bufnr())
260 exe "edit %%" .. btwo .. "xx"
261 assert_equal('Xfiletwoxx', bufname())
262
263 next Xfileone Xfiletwo Xfilethree
264 assert_equal('Xfileone', argv(0))
265 assert_equal('Xfiletwo', argv(1))
266 assert_equal('Xfilethree', argv(2))
267 next %%%zz
268 assert_equal('Xfileone', argv(0))
269 assert_equal('Xfiletwo', argv(1))
270 assert_equal('Xfilethreezz', argv(2))
271
272 v:oldfiles = ['Xonefile', 'Xtwofile']
273 edit %%<1
274 assert_equal('Xonefile', bufname())
275 edit %%<2
276 assert_equal('Xtwofile', bufname())
277 assert_fails('edit %%<3', 'E684:')
278
279 edit Xfileone.vim
280 edit Xfiletwo
281 edit %%:r
282 assert_equal('Xfileone', bufname())
Bram Moolenaardfbc5fd2021-01-23 15:15:01 +0100283
284 assert_false(bufexists('altfoo'))
285 edit altfoo
286 edit bar
287 assert_true(bufexists('altfoo'))
288 assert_true(buflisted('altfoo'))
289 bdel %%
290 assert_true(bufexists('altfoo'))
291 assert_false(buflisted('altfoo'))
292 bwipe! altfoo
293 bwipe! bar
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100294 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000295 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100296enddef
297
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100298def Test_global_backtick_expansion()
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000299 var name = 'xxx'
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100300 new
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000301 setline(1, ['one', 'two', 'three'])
302 set nomod
303 g/two/edit `=name`
304 assert_equal('xxx', bufname())
305 bwipe!
306
307 new
308 setline(1, ['one', 'two', 'three'])
309 g/two/s/^/`=name`/
310 assert_equal('`=name`two', getline(2))
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100311 bwipe!
312enddef
313
Bram Moolenaarecac5912021-01-05 19:23:28 +0100314def Test_folddo_backtick_expansion()
315 new
316 var name = 'xxx'
317 folddoopen edit `=name`
318 assert_equal('xxx', bufname())
319 bwipe!
320
321 new
322 setline(1, ['one', 'two'])
323 set nomodified
324 :1,2fold
325 foldclose
326 folddoclose edit `=name`
327 assert_equal('xxx', bufname())
328 bwipe!
Bram Moolenaarfad27422021-11-30 21:58:19 +0000329
330 var lines =<< trim END
331 g:val = 'value'
332 def Test()
333 folddoopen echo `=g:val`
334 enddef
335 call Test()
336 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000337 v9.CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
Bram Moolenaarecac5912021-01-05 19:23:28 +0100338enddef
339
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200340def Test_hardcopy_wildcards()
341 CheckUnix
342 CheckFeature postscript
343
Bram Moolenaarac564082020-09-27 19:05:33 +0200344 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200345 hardcopy > X`=outfile`.ps
346 assert_true(filereadable('Xprint.ps'))
347
348 delete('Xprint.ps')
349enddef
350
351def Test_syn_include_wildcards()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100352 writefile(['syn keyword Found found'], 'Xthemine.vim', 'D')
Bram Moolenaarac564082020-09-27 19:05:33 +0200353 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200354 &rtp = '.'
355
Bram Moolenaarac564082020-09-27 19:05:33 +0200356 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200357 syn include @Group Xthe`=fname`.vim
358 assert_match('Found.* contained found', execute('syn list Found'))
359
360 &rtp = save_rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200361enddef
362
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200363def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200364 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200365 vim9script
366 redir @a
367 echo 'one'
368 .. 'two'
369 redir END
370 assert_equal("\nonetwo", @a)
371 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000372 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200373
374 lines =<< trim END
375 vim9script
376 redir @a
377 echo 11 +
378 77
379 - 22
380 redir END
381 assert_equal("\n66", @a)
382 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000383 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200384enddef
385
Bram Moolenaar13106602020-10-04 16:06:05 +0200386def Test_condition_types()
387 var lines =<< trim END
388 if 'text'
389 endif
390 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000391 v9.CheckDefAndScriptFailure(lines, 'E1135:', 1)
Bram Moolenaar13106602020-10-04 16:06:05 +0200392
393 lines =<< trim END
394 if [1]
395 endif
396 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000397 v9.CheckDefFailure(lines, 'E1012:', 1)
398 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200399
400 lines =<< trim END
401 g:cond = 'text'
402 if g:cond
403 endif
404 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000405 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200406
407 lines =<< trim END
408 g:cond = 0
409 if g:cond
410 elseif 'text'
411 endif
412 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000413 v9.CheckDefAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200414
415 lines =<< trim END
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000416 g:cond = 0
417 if g:cond
418 elseif 'text' garbage
419 endif
420 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000421 v9.CheckDefAndScriptFailure(lines, 'E488:', 3)
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000422
423 lines =<< trim END
424 g:cond = 0
Bram Moolenaar13106602020-10-04 16:06:05 +0200425 if g:cond
426 elseif [1]
427 endif
428 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000429 v9.CheckDefFailure(lines, 'E1012:', 3)
430 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 4)
Bram Moolenaar13106602020-10-04 16:06:05 +0200431
432 lines =<< trim END
433 g:cond = 'text'
434 if 0
435 elseif g:cond
436 endif
437 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000438 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200439
440 lines =<< trim END
441 while 'text'
442 endwhile
443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000444 v9.CheckDefFailure(lines, 'E1012:', 1)
445 v9.CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200446
447 lines =<< trim END
448 while [1]
449 endwhile
450 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000451 v9.CheckDefFailure(lines, 'E1012:', 1)
452 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200453
454 lines =<< trim END
455 g:cond = 'text'
456 while g:cond
457 endwhile
458 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000459 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200460enddef
461
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200462def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200463 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200464 vim9script
465 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200466 true
467 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200468 g:res = 42
469 endif
470 assert_equal(42, 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
474
475 lines =<< trim END
476 vim9script
477 if 1 &&
478 0
479 g:res = 0
480 elseif 0 ||
481 0
482 || 1
483 g:res = 12
484 endif
485 assert_equal(12, g:res)
486 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000487 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200488 unlet g:res
489enddef
490
491def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200492 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200493 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200494 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200495 while nr <
496 10 + 3
497 nr = nr
498 + 4
499 endwhile
500 assert_equal(16, nr)
501 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000502 v9.CheckScriptSuccess(lines)
Bram Moolenaard5053d02020-06-28 15:51:16 +0200503
504 lines =<< trim END
505 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200506 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200507 while nr
508 <
509 10
510 +
511 3
512 nr = nr
513 +
514 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200515 endwhile
516 assert_equal(16, nr)
517 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000518 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200519enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200520
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200521def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200522 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200523 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200524 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200525 for x
526 in
527 [1, 2, 3, 4]
528 nr = nr + x
529 endfor
530 assert_equal(10, nr)
531 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000532 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200533
534 lines =<< trim END
535 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200536 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200537 for x
538 in
539 [1, 2,
540 3, 4
541 ]
542 nr = nr
543 +
544 x
545 endfor
546 assert_equal(10, nr)
547 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000548 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200549enddef
550
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551def s:MethodAfterLinebreak(arg: string)
Bram Moolenaare0890d62021-02-17 14:52:14 +0100552 arg
553 ->setline(1)
554enddef
555
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200556def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200557 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200558 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200559 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200560 func RetArg(
561 arg
562 )
563 let s:res = a:arg
564 endfunc
565 [1,
566 2,
567 3]->RetArg()
568 assert_equal([1, 2, 3], res)
569 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000570 v9.CheckScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100571
572 lines =<< trim END
573 new
574 var name = [1, 2]
575 name
576 ->copy()
577 ->setline(1)
578 assert_equal(['1', '2'], getline(1, 2))
579 bwipe!
580 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000581 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100582
583 lines =<< trim END
584 new
Bram Moolenaar6914e872021-03-06 21:01:09 +0100585 def Foo(): string
586 return 'the text'
587 enddef
588 def Bar(F: func): string
589 return F()
590 enddef
591 def Test()
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100592 Foo ->Bar()
593 ->setline(1)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100594 enddef
595 Test()
596 assert_equal('the text', getline(1))
597 bwipe!
598 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000599 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100600
601 lines =<< trim END
602 new
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100603 g:shortlist
604 ->copy()
605 ->setline(1)
606 assert_equal(['1', '2'], getline(1, 2))
607 bwipe!
608 END
609 g:shortlist = [1, 2]
Bram Moolenaar62aec932022-01-29 21:45:34 +0000610 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100611 unlet g:shortlist
Bram Moolenaare0890d62021-02-17 14:52:14 +0100612
613 new
614 MethodAfterLinebreak('foobar')
615 assert_equal('foobar', getline(1))
616 bwipe!
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100617
618 lines =<< trim END
619 vim9script
620 def Foo(): string
621 return '# some text'
622 enddef
623
624 def Bar(F: func): string
625 return F()
626 enddef
627
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100628 Foo->Bar()
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100629 ->setline(1)
630 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000631 v9.CheckScriptSuccess(lines)
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100632 assert_equal('# some text', getline(1))
633 bwipe!
Bram Moolenaar5f195932020-07-01 20:07:14 +0200634enddef
635
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100636def Test_method_call_whitespace()
637 var lines =<< trim END
638 new
639 var yank = 'text'
640 yank->setline(1)
641 yank ->setline(2)
642 yank-> setline(3)
643 yank -> setline(4)
644 assert_equal(['text', 'text', 'text', 'text'], getline(1, 4))
645 bwipe!
646 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000647 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100648enddef
649
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100650def Test_method_and_user_command()
651 var lines =<< trim END
652 vim9script
653 def Cmd()
654 g:didFunc = 1
655 enddef
656 command Cmd g:didCmd = 1
657 Cmd
658 assert_equal(1, g:didCmd)
659 Cmd()
660 assert_equal(1, g:didFunc)
661 unlet g:didFunc
662 unlet g:didCmd
663
664 def InDefFunc()
665 Cmd
666 assert_equal(1, g:didCmd)
667 Cmd()
668 assert_equal(1, g:didFunc)
669 unlet g:didFunc
670 unlet g:didCmd
671 enddef
672 InDefFunc()
673 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000674 v9.CheckScriptSuccess(lines)
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100675enddef
676
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200677def Test_option_use_linebreak()
678 var lines =<< trim END
679 new
680 &matchpairs = '(:)'
681 &matchpairs->setline(1)
682 &matchpairs = '[:]'
683 &matchpairs ->setline(2)
684 &matchpairs = '{:}'
685 &matchpairs
686 ->setline(3)
687 assert_equal(['(:)', '[:]', '{:}'], getline(1, '$'))
688 bwipe!
689 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000690 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200691enddef
692
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200693def Test_use_register()
Bram Moolenaar73170912021-08-22 22:44:11 +0200694 var lines =<< trim END
695 new
696 @a = 'one'
697 @a->setline(1)
698 @b = 'two'
699 @b ->setline(2)
700 @c = 'three'
701 @c
702 ->setline(3)
703 assert_equal(['one', 'two', 'three'], getline(1, '$'))
704 bwipe!
705 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000706 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200707
708 lines =<< trim END
709 @a = 'echo "text"'
710 @a
711 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000712 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000713
714 lines =<< trim END
Bram Moolenaarea720382022-05-05 16:08:55 +0100715 @a = 'echo "text"'
716 @a
717
718 END
719 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
720
721 lines =<< trim END
722 @a = 'echo "text"'
723 @a
724 # comment
725 END
726 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
727
728 lines =<< trim END
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000729 @/ = 'pattern'
730 @/
731 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000732 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000733
734 lines =<< trim END
735 &opfunc = 'nothing'
736 &opfunc
737 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000738 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000739 &opfunc = ''
740
741 lines =<< trim END
742 &l:showbreak = 'nothing'
743 &l:showbreak
744 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000745 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000746 &l:showbreak = ''
747
748 lines =<< trim END
749 &g:showbreak = 'nothing'
750 &g:showbreak
751 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000752 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000753 &g:showbreak = ''
Bram Moolenaar65259b52021-11-23 14:52:06 +0000754
755 lines =<< trim END
756 $SomeEnv = 'value'
757 $SomeEnv
758 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000759 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar65259b52021-11-23 14:52:06 +0000760 $SomeEnv = ''
Bram Moolenaar0d032632022-05-17 12:45:15 +0100761
762 lines =<< trim END
763 eval 'value'
764 END
765 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
766
767 lines =<< trim END
768 eval "value"
769 END
770 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
Bram Moolenaar73170912021-08-22 22:44:11 +0200771enddef
772
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200773def Test_environment_use_linebreak()
774 var lines =<< trim END
775 new
776 $TESTENV = 'one'
777 $TESTENV->setline(1)
778 $TESTENV = 'two'
779 $TESTENV ->setline(2)
780 $TESTENV = 'three'
781 $TESTENV
782 ->setline(3)
783 assert_equal(['one', 'two', 'three'], getline(1, '$'))
784 bwipe!
785 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000786 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200787enddef
788
Bram Moolenaar683581e2020-10-22 21:22:58 +0200789def Test_skipped_expr_linebreak()
790 if 0
791 var x = []
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100792 ->map(() => 0)
Bram Moolenaar683581e2020-10-22 21:22:58 +0200793 endif
794enddef
795
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200796def Test_dict_member()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100797 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200798 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100799 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200800 test.data
801 ->reverse()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100802 assert_equal({data: [3, 2, 1]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200803
Bram Moolenaarac564082020-09-27 19:05:33 +0200804 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200805 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100806 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200807 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100808 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200809 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000810 v9.CheckScriptSuccess(lines)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200811enddef
812
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200813def Test_bar_after_command()
814 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200815 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200816 redraw | echo x
817 enddef
818 RedrawAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000819 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200820
Bram Moolenaar788123c2020-07-05 15:32:17 +0200821 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200823 reg_executing() | echo x
824 enddef
825 CallAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000826 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaar788123c2020-07-05 15:32:17 +0200827
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200828 if has('unix')
829 # bar in filter write command does not start new command
830 def WriteToShell()
831 new
832 setline(1, 'some text')
833 w !cat | cat > Xoutfile
834 bwipe!
835 enddef
836 WriteToShell()
837 assert_equal(['some text'], readfile('Xoutfile'))
838 delete('Xoutfile')
839
840 # bar in filter read command does not start new command
841 def ReadFromShell()
842 new
843 r! echo hello there | cat > Xoutfile
844 r !echo again | cat >> Xoutfile
845 bwipe!
846 enddef
847 ReadFromShell()
848 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
849 delete('Xoutfile')
850 endif
851enddef
852
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200853def Test_filter_is_not_modifier()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100854 var tags = [{a: 1, b: 2}, {x: 3, y: 4}]
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100855 filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 )
Bram Moolenaare0de1712020-12-02 17:36:54 +0100856 assert_equal([{x: 3, y: 4}], tags)
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200857enddef
858
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100859def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100860 var lines =<< trim END
861 final expected = "\nType Name Content\n c \"c piyo"
862 @a = 'hoge'
863 @b = 'fuga'
864 @c = 'piyo'
865
866 assert_equal(execute('filter /piyo/ registers abc'), expected)
867 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000868 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare729ce22021-06-06 21:38:09 +0200869
870 # also do this compiled
871 lines =<< trim END
872 @a = 'very specific z3d37dh234 string'
873 filter z3d37dh234 registers
Bram Moolenaar62aec932022-01-29 21:45:34 +0000874 assert_match('very specific z3d37dh234 string', g:Screenline(&lines))
Bram Moolenaare729ce22021-06-06 21:38:09 +0200875 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000876 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar06bffe82021-11-28 20:24:17 +0000877
878 lines =<< trim END
879 edit foobar
880 redir => g:filter_out
881 filter #foobar# ls
882 redir END
883 assert_match('"foobar"', g:filter_out)
884 unlet g:filter_out
885 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000886 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100887enddef
888
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100889def Test_win_command_modifiers()
890 assert_equal(1, winnr('$'))
891
892 set splitright
893 vsplit
894 assert_equal(2, winnr())
895 close
896 aboveleft vsplit
897 assert_equal(1, winnr())
898 close
899 set splitright&
900
901 vsplit
902 assert_equal(1, winnr())
903 close
904 belowright vsplit
905 assert_equal(2, winnr())
906 close
907 rightbelow vsplit
908 assert_equal(2, winnr())
909 close
910
Bram Moolenaar97a19002020-11-01 22:15:44 +0100911 if has('browse')
912 browse set
913 assert_equal('option-window', expand('%'))
914 close
915 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100916
917 vsplit
918 botright split
919 assert_equal(3, winnr())
920 assert_equal(&columns, winwidth(0))
921 close
922 close
923
924 vsplit
925 topleft split
926 assert_equal(1, winnr())
927 assert_equal(&columns, winwidth(0))
928 close
929 close
930
931 gettabinfo()->len()->assert_equal(1)
932 tab split
933 gettabinfo()->len()->assert_equal(2)
934 tabclose
935
936 vertical new
937 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
938 close
939enddef
940
941func Test_command_modifier_confirm()
942 CheckNotGui
943 CheckRunVimInTerminal
944
945 " Test for saving all the modified buffers
946 let lines =<< trim END
947 call setline(1, 'changed')
948 def Getout()
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100949 confirm write Xcmodfile
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100950 enddef
951 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100952 call writefile(lines, 'Xconfirmscript', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100953 call writefile(['empty'], 'Xcmodfile')
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100954 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
955 call term_sendkeys(buf, ":call Getout()\n")
956 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
957 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100958 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
959 call term_sendkeys(buf, "\<CR>")
960 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100961 call StopVimInTerminal(buf)
962
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100963 call assert_equal(['changed'], readfile('Xcmodfile'))
964 call delete('Xcmodfile')
965 call delete('.Xcmodfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100966endfunc
967
968def Test_command_modifiers_keep()
969 if has('unix')
970 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
971 new
972 setline(1, ['one', 'two', 'three'])
973 normal 1Gma
974 normal 2Gmb
975 normal 3Gmc
976 if addRflag
977 set cpo+=R
978 else
979 set cpo-=R
980 endif
981 if keepMarks
982 keepmarks :%!cat
983 else
984 :%!cat
985 endif
986 if hasMarks
987 assert_equal(1, line("'a"))
988 assert_equal(2, line("'b"))
989 assert_equal(3, line("'c"))
990 else
991 assert_equal(0, line("'a"))
992 assert_equal(0, line("'b"))
993 assert_equal(0, line("'c"))
994 endif
995 quit!
996 enddef
997 DoTest(false, false, true)
998 DoTest(true, false, false)
999 DoTest(false, true, true)
1000 DoTest(true, true, true)
1001 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +01001002
1003 new
1004 setline(1, ['one', 'two', 'three', 'four'])
1005 assert_equal(4, line("$"))
1006 normal 1Gma
1007 normal 2Gmb
1008 normal 3Gmc
1009 lockmarks :1,2!wc
1010 # line is deleted, marks don't move
1011 assert_equal(3, line("$"))
1012 assert_equal('four', getline(3))
1013 assert_equal(1, line("'a"))
1014 assert_equal(2, line("'b"))
1015 assert_equal(3, line("'c"))
1016 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001017 endif
1018
Bram Moolenaarf65b35b2020-11-04 18:02:44 +01001019 edit Xone
1020 edit Xtwo
1021 assert_equal('Xone', expand('#'))
1022 keepalt edit Xthree
1023 assert_equal('Xone', expand('#'))
1024
1025 normal /a*b*
1026 assert_equal('a*b*', histget("search"))
1027 keeppatterns normal /c*d*
1028 assert_equal('a*b*', histget("search"))
1029
1030 new
1031 setline(1, range(10))
1032 :10
1033 normal gg
1034 assert_equal(10, getpos("''")[1])
1035 keepjumps normal 5G
1036 assert_equal(10, getpos("''")[1])
1037 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001038enddef
1039
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001040def Test_bar_line_continuation()
1041 var lines =<< trim END
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001042 au BufNewFile XveryNewFile g:readFile = 1
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001043 | g:readExtra = 2
1044 g:readFile = 0
1045 g:readExtra = 0
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001046 edit XveryNewFile
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001047 assert_equal(1, g:readFile)
1048 assert_equal(2, g:readExtra)
1049 bwipe!
1050 au! BufNewFile
1051
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001052 au BufNewFile XveryNewFile g:readFile = 1
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001053 | g:readExtra = 2
1054 | g:readMore = 3
1055 g:readFile = 0
1056 g:readExtra = 0
1057 g:readMore = 0
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001058 edit XveryNewFile
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001059 assert_equal(1, g:readFile)
1060 assert_equal(2, g:readExtra)
1061 assert_equal(3, g:readMore)
1062 bwipe!
1063 au! BufNewFile
1064 unlet g:readFile
1065 unlet g:readExtra
1066 unlet g:readMore
1067 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001068 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001069enddef
1070
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001071def Test_command_modifier_other()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001072 new Xsomefile
1073 setline(1, 'changed')
1074 var buf = bufnr()
1075 hide edit Xotherfile
1076 var info = getbufinfo(buf)
1077 assert_equal(1, info[0].hidden)
1078 assert_equal(1, info[0].changed)
1079 edit Xsomefile
1080 bwipe!
1081
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001082 au BufNewFile Xcmofile g:readFile = 1
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001083 g:readFile = 0
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001084 edit Xcmofile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001085 assert_equal(1, g:readFile)
1086 bwipe!
1087 g:readFile = 0
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001088 noautocmd edit Xcmofile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001089 assert_equal(0, g:readFile)
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001090 au! BufNewFile
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001091 unlet g:readFile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001092
1093 noswapfile edit XnoSwap
Bram Moolenaardd1f4262020-12-31 17:41:01 +01001094 assert_equal(false, &l:swapfile)
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001095 bwipe!
1096
1097 var caught = false
1098 try
1099 sandbox !ls
1100 catch /E48:/
1101 caught = true
1102 endtry
1103 assert_true(caught)
1104
1105 :8verbose g:verbose_now = &verbose
1106 assert_equal(8, g:verbose_now)
1107 unlet g:verbose_now
1108enddef
1109
Bram Moolenaar62aec932022-01-29 21:45:34 +00001110def s:EchoHere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001111 echomsg 'here'
1112enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001113def s:EchoThere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001114 unsilent echomsg 'there'
1115enddef
1116
1117def Test_modifier_silent_unsilent()
1118 echomsg 'last one'
1119 silent echomsg "text"
1120 assert_equal("\nlast one", execute(':1messages'))
1121
1122 silent! echoerr "error"
1123
1124 echomsg 'last one'
1125 silent EchoHere()
1126 assert_equal("\nlast one", execute(':1messages'))
1127
1128 silent EchoThere()
1129 assert_equal("\nthere", execute(':1messages'))
Bram Moolenaar20a76292020-12-25 19:47:24 +01001130
1131 try
1132 silent eval [][0]
1133 catch
1134 echomsg "caught"
1135 endtry
1136 assert_equal("\ncaught", execute(':1messages'))
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001137
1138 var lines =<< trim END
1139 vim9script
1140 set history=11
1141 silent! while 0
1142 set history=22
1143 silent! endwhile
1144 assert_equal(11, &history)
1145 set history&
1146 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001147 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001148enddef
1149
Bram Moolenaar36113e42020-11-02 21:08:47 +01001150def Test_range_after_command_modifier()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001151 v9.CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2)
Bram Moolenaar36113e42020-11-02 21:08:47 +01001152 new
1153 setline(1, 'xxx')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001154 v9.CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
Bram Moolenaar36113e42020-11-02 21:08:47 +01001155 assert_equal('', getline(1))
1156 bwipe!
Bram Moolenaarb579f6e2021-12-04 11:57:00 +00001157
1158 var lines =<< trim END
1159 legacy /pat/
1160 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001161 v9.CheckDefExecAndScriptFailure(lines, 'E486: Pattern not found: pat')
Bram Moolenaar36113e42020-11-02 21:08:47 +01001162enddef
1163
Bram Moolenaarece0b872021-01-08 20:40:45 +01001164def Test_silent_pattern()
1165 new
1166 silent! :/pat/put _
1167 bwipe!
1168enddef
1169
Bram Moolenaarfa984412021-03-25 22:15:28 +01001170def Test_useless_command_modifier()
1171 g:maybe = true
1172 var lines =<< trim END
1173 if g:maybe
1174 silent endif
1175 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001176 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001177
1178 lines =<< trim END
1179 for i in [0]
1180 silent endfor
1181 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001182 v9.CheckDefFailure(lines, 'E1176:', 2)
1183 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001184
1185 lines =<< trim END
1186 while g:maybe
1187 silent endwhile
1188 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001189 v9.CheckDefFailure(lines, 'E1176:', 2)
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001190 g:maybe = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001191 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001192
1193 lines =<< trim END
1194 silent try
1195 finally
1196 endtry
1197 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001198 v9.CheckDefAndScriptFailure(lines, 'E1176:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001199
1200 lines =<< trim END
1201 try
1202 silent catch
1203 endtry
1204 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001205 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001206
1207 lines =<< trim END
1208 try
1209 silent finally
1210 endtry
1211 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001212 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001213
1214 lines =<< trim END
1215 try
1216 finally
1217 silent endtry
1218 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001219 v9.CheckDefAndScriptFailure(lines, 'E1176:', 3)
Bram Moolenaarbc510062022-02-14 21:19:04 +00001220
1221 lines =<< trim END
1222 leftabove
1223 END
1224 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
1225
1226 lines =<< trim END
1227 leftabove # comment
1228 END
1229 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001230enddef
1231
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001232def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001233 var from = 3
1234 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001235 g:val = 111
1236 def Increment(nrs: list<number>)
1237 for nr in nrs
1238 g:val += nr
1239 endfor
1240 enddef
1241 eval range(from, to)
1242 ->Increment()
1243 assert_equal(111 + 3 + 4 + 5, g:val)
1244 unlet g:val
Bram Moolenaard0fe6202020-12-05 17:11:12 +01001245
1246 var lines =<< trim END
1247 vim9script
1248 g:caught = 'no'
1249 try
1250 eval 123 || 0
1251 catch
1252 g:caught = 'yes'
1253 endtry
1254 assert_equal('yes', g:caught)
1255 unlet g:caught
1256 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001257 v9.CheckScriptSuccess(lines)
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001258enddef
1259
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001260def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001261 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001262 nnoremap <F3> :echo 'hit F3 #'<CR>
1263 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
1264 END
Bram Moolenaarac485062022-03-23 19:45:01 +00001265 v9.CheckDefAndScriptSuccess(lines)
1266
1267 # backslash before bar is not removed
1268 lines =<< trim END
1269 vim9script
1270
1271 def Init()
1272 noremap <buffer> <F5> <ScriptCmd>MyFunc('a') \| MyFunc('b')<CR>
1273 enddef
1274 Init()
1275 unmap <buffer> <F5>
1276 END
1277 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001278enddef
1279
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001280def Test_normal_command()
1281 new
1282 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +02001283 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001284 try
1285 exe "norm! \<C-]>"
1286 catch /E433/
1287 caught = 2
1288 endtry
1289 assert_equal(2, caught)
1290
1291 try
1292 exe "norm! 3\<C-]>"
1293 catch /E433/
1294 caught = 3
1295 endtry
1296 assert_equal(3, caught)
1297 bwipe!
1298enddef
1299
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001300def Test_put_command()
1301 new
1302 @p = 'ppp'
1303 put p
1304 assert_equal('ppp', getline(2))
1305
1306 put ='below'
1307 assert_equal('below', getline(3))
1308 put! ='above'
1309 assert_equal('above', getline(3))
1310 assert_equal('below', getline(4))
1311
Bram Moolenaar883cf972021-01-15 18:04:43 +01001312 :2put =['a', 'b', 'c']
1313 assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
1314
Bram Moolenaard0b7bfa2022-03-12 14:51:16 +00001315 :0put = 'first'
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001316 assert_equal('first', getline(1))
1317 :1put! ='first again'
1318 assert_equal('first again', getline(1))
1319
Bram Moolenaar08597872020-12-10 19:43:40 +01001320 # compute range at runtime
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001321 :%del
Bram Moolenaar08597872020-12-10 19:43:40 +01001322 setline(1, range(1, 8))
1323 @a = 'aaa'
1324 :$-2put a
1325 assert_equal('aaa', getline(7))
1326
1327 setline(1, range(1, 8))
1328 :2
1329 :+2put! a
1330 assert_equal('aaa', getline(4))
1331
Bram Moolenaara28639e2021-01-19 22:48:09 +01001332 []->mapnew(() => 0)
1333 :$put ='end'
1334 assert_equal('end', getline('$'))
1335
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001336 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001337
Bram Moolenaar62aec932022-01-29 21:45:34 +00001338 v9.CheckDefFailure(['put =xxx'], 'E1001:')
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001339enddef
1340
1341def Test_put_with_linebreak()
1342 new
1343 var lines =<< trim END
1344 vim9script
1345 pu =split('abc', '\zs')
1346 ->join()
1347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001348 v9.CheckScriptSuccess(lines)
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001349 getline(2)->assert_equal('a b c')
1350 bwipe!
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001351enddef
1352
64-bitmane08f10a2025-03-18 22:14:34 +01001353def Test_iput()
1354 new
1355 set noexpandtab
1356
1357 call feedkeys("i\<Tab>foo", 'x')
1358
1359 @p = "ppp"
1360 iput p
1361 call assert_equal("\<Tab>ppp", getline(2))
1362
1363 iput ="below"
1364 assert_equal("\<Tab>below", getline(3))
1365 iput! ="above"
1366 assert_equal("\<Tab>above", getline(3))
1367 assert_equal("\<Tab>below", getline(4))
1368
1369 :2iput =['a', 'b', 'c']
1370 assert_equal(["\<Tab>ppp", "\<Tab>a", "\<Tab>b", "\<Tab>c", "\<Tab>above"], getline(2, 6))
1371
1372 :0iput = "\<Tab>\<Tab>first"
1373 assert_equal("\<Tab>first", getline(1))
1374 :1iput! ="first again"
1375 assert_equal("\<Tab>first again", getline(1))
1376
1377 bw!
1378 v9.CheckDefFailure(['iput =xxx'], 'E1001:')
1379enddef
1380
1381def Test_iput_with_linebreak()
1382 new
1383 var lines =<< trim END
1384 vim9script
1385 ip =split('abc', '\zs')
1386 ->join()
1387 END
1388 v9.CheckScriptSuccess(lines)
1389 getline(2)->assert_equal('a b c')
1390 bwipe!
1391enddef
1392
1393def Test_iput_not_put()
1394 new
1395 call feedkeys("ggS\<Tab>foo", 'x')
1396 @a = "putting"
1397 :0iput a
1398 assert_equal("\<Tab>putting", getline(1))
1399 put a
1400 assert_equal("putting", getline(2))
1401 iput a
1402 assert_equal("putting", getline(3))
1403 bwipe!
1404enddef
1405
Bram Moolenaar3bd8de42020-09-14 16:37:34 +02001406def Test_command_star_range()
1407 new
1408 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
1409 setpos("'<", [0, 1, 0, 0])
1410 setpos("'>", [0, 3, 0, 0])
1411 :*s/\(foo\|bar\)/baz/g
1412 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
1413
1414 bwipe!
1415enddef
1416
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001417def Test_f_args()
1418 var lines =<< trim END
1419 vim9script
1420
1421 func SaveCmdArgs(...)
1422 let g:args = a:000
1423 endfunc
1424
1425 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
1426
1427 TestFArgs
1428 assert_equal([], g:args)
1429
1430 TestFArgs one two three
1431 assert_equal(['one', 'two', 'three'], g:args)
1432 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001433 v9.CheckScriptSuccess(lines)
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001434enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001435
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001436def Test_user_command_comment()
1437 command -nargs=1 Comd echom <q-args>
1438
1439 var lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001440 vim9script
1441 Comd # comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001442 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001443 v9.CheckScriptSuccess(lines)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001444
1445 lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001446 vim9script
1447 Comd# comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001448 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001449 v9.CheckScriptFailure(lines, 'E1144:')
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001450 delcommand Comd
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001451
1452 lines =<< trim END
1453 vim9script
1454 command Foo echo 'Foo'
1455 Foo3Bar
1456 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001457 v9.CheckScriptFailure(lines, 'E1144: Command "Foo" is not followed by white space: Foo3Bar')
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001458
1459 delcommand Foo
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001460enddef
1461
Bram Moolenaar95388e32020-11-20 21:07:00 +01001462def Test_star_command()
1463 var lines =<< trim END
1464 vim9script
1465 @s = 'g:success = 8'
1466 set cpo+=*
1467 exe '*s'
1468 assert_equal(8, g:success)
1469 unlet g:success
1470 set cpo-=*
1471 assert_fails("exe '*s'", 'E1050:')
1472 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001473 v9.CheckScriptSuccess(lines)
Bram Moolenaar95388e32020-11-20 21:07:00 +01001474enddef
1475
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001476def Test_cmd_argument_without_colon()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001477 new Xawcfile
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001478 setline(1, ['a', 'b', 'c', 'd'])
1479 write
1480 edit +3 %
1481 assert_equal(3, getcurpos()[1])
1482 edit +/a %
1483 assert_equal(1, getcurpos()[1])
1484 bwipe
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001485 delete('Xawcfile')
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001486enddef
1487
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001488def Test_ambiguous_user_cmd()
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001489 command Cmd1 eval 0
1490 command Cmd2 eval 0
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001491 var lines =<< trim END
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001492 Cmd
1493 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001494 v9.CheckDefAndScriptFailure(lines, 'E464:', 1)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001495 delcommand Cmd1
1496 delcommand Cmd2
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001497enddef
1498
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001499def Test_command_not_recognized()
1500 var lines =<< trim END
1501 d.key = 'asdf'
1502 END
Bram Moolenaar97f8c102022-04-02 19:43:57 +01001503 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
1504
1505 lines =<< trim END
1506 d['key'] = 'asdf'
1507 END
1508 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001509
1510 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001511 if 0
1512 d.key = 'asdf'
1513 endif
1514 END
1515 v9.CheckDefSuccess(lines)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001516enddef
Bram Moolenaarb7a78f72020-06-28 18:43:40 +02001517
Bram Moolenaarf4e20992020-12-21 19:59:08 +01001518def Test_magic_not_used()
1519 new
1520 for cmd in ['set magic', 'set nomagic']
1521 exe cmd
1522 setline(1, 'aaa')
1523 s/.../bbb/
1524 assert_equal('bbb', getline(1))
1525 endfor
1526
1527 set magic
1528 setline(1, 'aaa')
1529 assert_fails('s/.\M../bbb/', 'E486:')
1530 assert_fails('snomagic/.../bbb/', 'E486:')
1531 assert_equal('aaa', getline(1))
1532
1533 bwipe!
1534enddef
1535
Bram Moolenaar60f63102020-12-21 20:32:43 +01001536def Test_gdefault_not_used()
1537 new
1538 for cmd in ['set gdefault', 'set nogdefault']
1539 exe cmd
1540 setline(1, 'aaa')
1541 s/./b/
1542 assert_equal('baa', getline(1))
1543 endfor
1544
1545 set nogdefault
1546 bwipe!
1547enddef
1548
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001549def s:SomeComplFunc(findstart: number, base: string): any
Bram Moolenaar179eb562020-12-27 18:03:22 +01001550 if findstart
1551 return 0
1552 else
1553 return ['aaa', 'bbb']
1554 endif
1555enddef
1556
1557def Test_insert_complete()
1558 # this was running into an error with the matchparen hack
1559 new
1560 set completefunc=SomeComplFunc
1561 feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx')
1562 assert_equal('aaa', getline(1))
1563
1564 set completefunc=
1565 bwipe!
1566enddef
1567
Bram Moolenaara11919f2021-01-02 19:44:56 +01001568def Test_wincmd()
1569 split
1570 var id1 = win_getid()
1571 if true
1572 try | wincmd w | catch | endtry
1573 endif
1574 assert_notequal(id1, win_getid())
1575 close
Bram Moolenaar1ff89de2021-03-24 20:08:12 +01001576
1577 split
1578 var id = win_getid()
1579 split
1580 :2wincmd o
1581 assert_equal(id, win_getid())
1582 only
1583
1584 split
1585 split
1586 assert_equal(3, winnr('$'))
1587 :2wincmd c
1588 assert_equal(2, winnr('$'))
1589 only
1590
1591 split
1592 split
1593 assert_equal(3, winnr('$'))
1594 :2wincmd q
1595 assert_equal(2, winnr('$'))
1596 only
Bram Moolenaara11919f2021-01-02 19:44:56 +01001597enddef
1598
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001599def Test_windo_missing_endif()
1600 var lines =<< trim END
1601 windo if 1
1602 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001603 v9.CheckDefExecFailure(lines, 'E171:', 1)
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001604enddef
1605
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001606let s:theList = [1, 2, 3]
1607
1608def Test_lockvar()
1609 s:theList[1] = 22
1610 assert_equal([1, 22, 3], s:theList)
1611 lockvar s:theList
1612 assert_fails('theList[1] = 77', 'E741:')
1613 unlockvar s:theList
1614 s:theList[1] = 44
1615 assert_equal([1, 44, 3], s:theList)
1616
Bram Moolenaara99fb232021-12-20 12:25:03 +00001617 if 0
1618 lockvar whatever
1619 endif
1620
Bram Moolenaar70c43d82022-01-26 21:01:15 +00001621 g:lockme = [1, 2, 3]
1622 lockvar 1 g:lockme
1623 g:lockme[1] = 77
1624 assert_equal([1, 77, 3], g:lockme)
1625
1626 lockvar 2 g:lockme
1627 var caught = false
1628 try
1629 g:lockme[1] = 99
1630 catch /E1119:/
1631 caught = true
1632 endtry
1633 assert_true(caught)
1634 assert_equal([1, 77, 3], g:lockme)
1635 unlet g:lockme
1636
1637 # also for non-materialized list
1638 g:therange = range(3)
1639 lockvar 2 g:therange
1640 caught = false
1641 try
1642 g:therange[1] = 99
1643 catch /E1119:/
1644 caught = true
1645 endtry
1646 assert_true(caught)
1647 assert_equal([0, 1, 2], g:therange)
1648 unlet g:therange
1649
Bram Moolenaare939f5e2022-01-26 21:32:59 +00001650 # use exclamation mark for locking deeper
1651 g:nestedlist = [1, [2, 3], 4]
1652 lockvar! g:nestedlist
1653 try
1654 g:nestedlist[1][0] = 9
1655 catch /E1119:/
1656 caught = true
1657 endtry
1658 assert_true(caught)
1659 unlet g:nestedlist
1660
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001661 var d = {a: 1, b: 2}
1662 d.a = 3
1663 d.b = 4
1664 assert_equal({a: 3, b: 4}, d)
1665 lockvar d.a
1666 d.b = 5
1667 var ex = ''
1668 try
1669 d.a = 6
1670 catch
1671 ex = v:exception
1672 endtry
1673 assert_match('E1121:', ex)
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00001674 unlockvar d['a']
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001675 d.a = 7
1676 assert_equal({a: 7, b: 5}, d)
1677
Bram Moolenaar10611952022-04-03 21:11:34 +01001678 caught = false
1679 try
1680 lockvar d.c
1681 catch /E716/
1682 caught = true
1683 endtry
1684 assert_true(caught)
1685
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001686 var lines =<< trim END
1687 vim9script
Bram Moolenaare08be092022-02-17 13:08:26 +00001688 g:bl = 0z1122
1689 lockvar g:bl
1690 def Tryit()
1691 g:bl[1] = 99
1692 enddef
1693 Tryit()
1694 END
1695 v9.CheckScriptFailure(lines, 'E741:', 1)
1696
1697 lines =<< trim END
1698 vim9script
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001699 var theList = [1, 2, 3]
1700 def SetList()
1701 theList[1] = 22
1702 assert_equal([1, 22, 3], theList)
1703 lockvar theList
1704 theList[1] = 77
1705 enddef
1706 SetList()
1707 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001708 v9.CheckScriptFailure(lines, 'E1119', 4)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001709
1710 lines =<< trim END
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001711 vim9script
1712 var theList = [1, 2, 3]
1713 def AddToList()
1714 lockvar theList
1715 theList += [4]
1716 enddef
1717 AddToList()
1718 END
1719 v9.CheckScriptFailure(lines, 'E741', 2)
1720
1721 lines =<< trim END
1722 vim9script
1723 var theList = [1, 2, 3]
1724 def AddToList()
1725 lockvar theList
1726 add(theList, 4)
1727 enddef
1728 AddToList()
1729 END
1730 v9.CheckScriptFailure(lines, 'E741', 2)
1731
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00001732 # can unlet a locked list item but not change it
1733 lines =<< trim END
1734 var ll = [1, 2, 3]
1735 lockvar ll[1]
1736 unlet ll[1]
1737 assert_equal([1, 3], ll)
1738 END
1739 v9.CheckDefAndScriptSuccess(lines)
1740 lines =<< trim END
1741 var ll = [1, 2, 3]
1742 lockvar ll[1]
1743 ll[1] = 9
1744 END
1745 v9.CheckDefExecAndScriptFailure(lines, ['E1119:', 'E741'], 3)
1746
1747 # can unlet a locked dict item but not change it
1748 lines =<< trim END
1749 var dd = {a: 1, b: 2}
1750 lockvar dd.a
1751 unlet dd.a
1752 assert_equal({b: 2}, dd)
1753 END
1754 v9.CheckDefAndScriptSuccess(lines)
1755 lines =<< trim END
1756 var dd = {a: 1, b: 2}
1757 lockvar dd.a
1758 dd.a = 3
1759 END
1760 v9.CheckDefExecAndScriptFailure(lines, ['E1121:', 'E741'], 3)
1761
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001762 lines =<< trim END
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001763 var theList = [1, 2, 3]
1764 lockvar theList
1765 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001766 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001767
1768 lines =<< trim END
1769 var theList = [1, 2, 3]
1770 unlockvar theList
1771 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001772 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001773
1774 lines =<< trim END
1775 vim9script
1776 var name = 'john'
1777 lockvar nameX
1778 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001779 v9.CheckScriptFailure(lines, 'E1246', 3)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001780
1781 lines =<< trim END
1782 vim9script
1783 var name = 'john'
1784 def LockIt()
1785 lockvar nameX
1786 enddef
1787 LockIt()
1788 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001789 v9.CheckScriptFailure(lines, 'E1246', 1)
Bram Moolenaar7a411a32022-04-04 14:58:06 +01001790
1791 lines =<< trim END
1792 vim9script
1793 const name = 'john'
1794 unlockvar name
1795 END
1796 v9.CheckScriptFailure(lines, 'E46', 3)
1797
1798 lines =<< trim END
1799 vim9script
1800 const name = 'john'
1801 def UnLockIt()
1802 unlockvar name
1803 enddef
1804 UnLockIt()
1805 END
1806 v9.CheckScriptFailure(lines, 'E46', 1)
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001807
1808 lines =<< trim END
1809 def _()
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001810 lockv
1811 enddef
1812 defcomp
1813 END
Bram Moolenaardbdd16b2022-08-14 21:46:07 +01001814 v9.CheckScriptFailure(lines, 'E179', 1)
1815
1816 lines =<< trim END
1817 def T()
1818 unlet
1819 enddef
1820 defcomp
1821 END
1822 v9.CheckScriptFailure(lines, 'E179', 1)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001823enddef
1824
Bram Moolenaar4c137212021-04-19 16:48:48 +02001825def Test_substitute_expr()
1826 var to = 'repl'
1827 new
1828 setline(1, 'one from two')
1829 s/from/\=to
1830 assert_equal('one repl two', getline(1))
1831
1832 setline(1, 'one from two')
1833 s/from/\=to .. '_x'
1834 assert_equal('one repl_x two', getline(1))
1835
1836 setline(1, 'one from two from three')
1837 var also = 'also'
1838 s/from/\=to .. '_' .. also/g#e
1839 assert_equal('one repl_also two repl_also three', getline(1))
1840
Bram Moolenaar8238f082021-04-20 21:10:48 +02001841 setline(1, 'abc abc abc')
1842 for choice in [true, false]
1843 :1s/abc/\=choice ? 'yes' : 'no'/
1844 endfor
1845 assert_equal('yes no abc', getline(1))
1846
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01001847 setline(1, 'from')
1848 v9.CheckDefExecFailure(['s/from/\=g:notexist/'], 'E121: Undefined variable: g:notexist')
1849
Bram Moolenaard386e922021-04-25 14:48:49 +02001850 bwipe!
1851
Bram Moolenaar62aec932022-01-29 21:45:34 +00001852 v9.CheckDefFailure(['s/from/\="x")/'], 'E488:')
1853 v9.CheckDefFailure(['s/from/\="x"/9'], 'E488:')
Bram Moolenaar4c137212021-04-19 16:48:48 +02001854
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00001855 v9.CheckDefExecFailure(['s/this/\="that"/'], 'E486:')
1856
Bram Moolenaard386e922021-04-25 14:48:49 +02001857 # When calling a function the right instruction list needs to be restored.
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001858 g:cond = true
Bram Moolenaard386e922021-04-25 14:48:49 +02001859 var lines =<< trim END
1860 vim9script
1861 def Foo()
1862 Bar([])
1863 enddef
1864 def Bar(l: list<number>)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001865 if g:cond
Bram Moolenaard386e922021-04-25 14:48:49 +02001866 s/^/\=Rep()/
1867 for n in l[:]
1868 endfor
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001869 endif
Bram Moolenaard386e922021-04-25 14:48:49 +02001870 enddef
1871 def Rep(): string
1872 return 'rep'
1873 enddef
1874 new
1875 Foo()
1876 assert_equal('rep', getline(1))
1877 bwipe!
1878 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001879 v9.CheckScriptSuccess(lines)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001880 unlet g:cond
Bram Moolenaar27523602021-06-05 21:36:19 +02001881
1882 # List results in multiple lines
1883 new
1884 setline(1, 'some text here')
Bram Moolenaar2c707112021-08-02 22:26:56 +02001885 s/text/\=['aaa', 'bbb', 'ccc']/
Bram Moolenaar27523602021-06-05 21:36:19 +02001886 assert_equal(['some aaa', 'bbb', 'ccc', ' here'], getline(1, '$'))
1887 bwipe!
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001888
1889 # inside "if 0" substitute is ignored
1890 if 0
1891 s/a/\=nothing/ and | some more
1892 endif
Bram Moolenaar4c137212021-04-19 16:48:48 +02001893enddef
1894
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001895def Test_redir_to_var()
1896 var result: string
1897 redir => result
1898 echo 'something'
1899 redir END
1900 assert_equal("\nsomething", result)
1901
1902 redir =>> result
1903 echo 'more'
1904 redir END
1905 assert_equal("\nsomething\nmore", result)
1906
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001907 var d: dict<string>
1908 redir => d.redir
1909 echo 'dict'
1910 redir END
1911 assert_equal({redir: "\ndict"}, d)
1912
1913 var l = ['a', 'b', 'c']
1914 redir => l[1]
1915 echo 'list'
1916 redir END
1917 assert_equal(['a', "\nlist", 'c'], l)
1918
1919 var dl = {l: ['x']}
1920 redir => dl.l[0]
1921 echo 'dict-list'
1922 redir END
1923 assert_equal({l: ["\ndict-list"]}, dl)
1924
Bram Moolenaara369c3d2021-04-21 16:00:10 +02001925 redir =>> d.redir
1926 echo 'more'
1927 redir END
1928 assert_equal({redir: "\ndict\nmore"}, d)
1929
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001930 var lines =<< trim END
1931 redir => notexist
1932 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001933 v9.CheckDefFailure(lines, 'E1089:')
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001934
1935 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001936 var text: string
1937 redir => text
1938 END
1939 v9.CheckDefFailure(lines, 'E1185:')
1940
1941 lines =<< trim END
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001942 var ls = 'asdf'
1943 redir => ls[1]
1944 redir END
1945 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001946 v9.CheckDefFailure(lines, 'E1141:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001947
1948 lines =<< trim END
1949 var text: string
1950 redir => text
1951 echo 'hello'
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001952 redir > Xnopfile
Bram Moolenaar003312b2021-12-20 10:55:35 +00001953 redir END
1954 END
Bram Moolenaar02a977e2022-02-03 21:29:39 +00001955 v9.CheckDefFailure(lines, 'E1092:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001956
1957 lines =<< trim END
1958 var text: number
1959 redir => text
1960 echo 'hello'
1961 redir END
1962 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001963 v9.CheckDefFailure(lines, 'E1012:')
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001964enddef
1965
Bram Moolenaar68db9962021-05-09 23:19:22 +02001966def Test_echo_void()
1967 var lines =<< trim END
1968 vim9script
1969 def NoReturn()
1970 echo 'nothing'
1971 enddef
1972 echo NoReturn()
1973 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001974 v9.CheckScriptFailure(lines, 'E1186:', 5)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001975
1976 lines =<< trim END
1977 vim9script
1978 def NoReturn()
1979 echo 'nothing'
1980 enddef
1981 def Try()
1982 echo NoReturn()
1983 enddef
1984 defcompile
1985 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001986 v9.CheckScriptFailure(lines, 'E1186:', 1)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001987enddef
1988
Bram Moolenaar2c707112021-08-02 22:26:56 +02001989def Test_cmdwin_block()
1990 augroup justTesting
1991 autocmd BufEnter * {
1992 echomsg 'in block'
1993 }
1994 augroup END
1995 feedkeys('q:', 'xt')
1996 redraw
1997 feedkeys("aclose\<CR>", 'xt')
1998
1999 au! justTesting
2000enddef
2001
Bram Moolenaar7b829262021-10-13 15:04:34 +01002002def Test_var_not_cmd()
2003 var lines =<< trim END
2004 g:notexist:cmd
2005 END
Bram Moolenaar9510d222022-09-11 15:14:05 +01002006 v9.CheckDefAndScriptFailure(lines, ['E1016: Cannot declare a global variable: g:notexist', "E1069: White space required after ':'"], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002007
2008 lines =<< trim END
2009 g-pat-cmd
2010 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002011 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01002012 lines =<< trim END
2013 g.pat.cmd
2014 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002015 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: g', 'E121: Undefined variable: g'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002016
2017 lines =<< trim END
2018 s:notexist:repl
2019 END
Bram Moolenaar9510d222022-09-11 15:14:05 +01002020 v9.CheckDefAndScriptFailure(lines, ['E1101: Cannot declare a script variable in a function: s:notexist', "E1069: White space required after ':'"], 1)
Bram Moolenaara749a422022-02-12 19:52:25 +00002021
2022 lines =<< trim END
2023 notexist:repl
2024 END
2025 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002026
2027 lines =<< trim END
2028 s-pat-repl
2029 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002030 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01002031 lines =<< trim END
2032 s.pat.repl
2033 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002034 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: s', 'E121: Undefined variable: s'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002035
2036 lines =<< trim END
2037 w:notexist->len()
2038 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002039 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: w:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002040
2041 lines =<< trim END
2042 b:notexist->len()
2043 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002044 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: b:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002045
2046 lines =<< trim END
2047 t:notexist->len()
2048 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002049 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: t:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002050enddef
2051
2052def Test_no_space_after_command()
2053 var lines =<< trim END
2054 g /pat/cmd
2055 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002056 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002057 lines =<< trim END
2058 g #pat#cmd
2059 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002060 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002061
2062 new
2063 setline(1, 'some pat')
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002064 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002065 g#pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002066 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002067 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002068 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002069 g# pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002070 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002071 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002072 bwipe!
Bram Moolenaar7b829262021-10-13 15:04:34 +01002073
2074 lines =<< trim END
2075 s /pat/repl
2076 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002077 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002078 lines =<< trim END
2079 s #pat#repl
2080 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002081 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002082 lines =<< trim END
2083 s#pat#repl
2084 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002085 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002086 lines =<< trim END
2087 s# pat#repl
2088 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002089 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002090enddef
2091
Christian Brabandt25618fc2024-08-22 21:25:18 +02002092def Test_lambda_crash()
2093 # This used to crash Vim
2094 var lines =<< trim END
2095 vim9 () => super => {
2096 END
2097 v9.CheckScriptFailureList(lines, ["E1356:", "E1405:"])
2098enddef
2099
Yinzuo Jianga2a2fe82024-12-16 21:22:09 +01002100def s:check_previewpopup(expected_title: string)
2101 var id = popup_findpreview()
2102 assert_notequal(id, 0)
2103 assert_match(expected_title, popup_getoptions(id).title)
2104 popup_clear()
2105 bw Xppfile
2106 set previewpopup&
2107enddef
2108
Yegappan Lakshmanan2a16dc62021-11-16 17:19:30 +00002109" Test for the 'previewpopup' option
2110def Test_previewpopup()
John Marriott45377e22025-03-27 18:12:32 +01002111 CheckFeature quickfix
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002112 set previewpopup=height:10,width:60
Bram Moolenaarb18b4962022-09-02 21:55:50 +01002113 pedit Xppfile
Yinzuo Jianga2a2fe82024-12-16 21:22:09 +01002114 s:check_previewpopup('Xppfile')
2115enddef
2116
2117def Test_previewpopup_pbuffer()
John Marriott45377e22025-03-27 18:12:32 +01002118 CheckFeature quickfix
Yinzuo Jianga2a2fe82024-12-16 21:22:09 +01002119 set previewpopup=height:10,width:60
2120 edit Xppfile
2121 pbuffer
2122 s:check_previewpopup('')
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002123enddef
2124
Bram Moolenaarc8a9fe52021-11-20 19:50:59 +00002125def Test_syntax_enable_clear()
2126 syntax clear
2127 syntax enable
2128 highlight clear String
2129 assert_equal(true, hlget('String')->get(0, {})->get('default', false))
2130 syntax clear
2131enddef
2132
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02002133
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02002134" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker