blob: 1a3f5df82c056facf614b4bd59797c5f67f5d4b1 [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)
Bram Moolenaar39f3b142021-02-14 12:57:36 +010082enddef
83
Bram Moolenaarf79d9dd2022-05-21 15:39:02 +010084def Test_defcompile_fails()
85 assert_fails('defcompile NotExists', 'E1061:')
86 assert_fails('defcompile debug debug Test_defcompile_fails', 'E488:')
87 assert_fails('defcompile profile profile Test_defcompile_fails', 'E488:')
88enddef
89
90defcompile Test_defcompile_fails
91defcompile debug Test_defcompile_fails
92defcompile profile Test_defcompile_fails
93
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +000094def Test_cmdmod_execute()
95 # "legacy" applies not only to the "exe" argument but also to the commands
96 var lines =<< trim END
97 vim9script
98
99 b:undo = 'let g:undone = 1 | let g:undtwo = 2'
100 legacy exe b:undo
101 assert_equal(1, g:undone)
102 assert_equal(2, g:undtwo)
103 END
104 v9.CheckScriptSuccess(lines)
105
106 # same for "vim9cmd" modifier
107 lines =<< trim END
108 let b:undo = 'g:undone = 11 | g:undtwo = 22'
109 vim9cmd exe b:undo
110 call assert_equal(11, g:undone)
111 call assert_equal(22, g:undtwo)
112 END
113 v9.CheckScriptSuccess(lines)
114 unlet b:undo
115 unlet g:undone
116 unlet g:undtwo
Bram Moolenaar2a9b62d2022-02-12 13:30:17 +0000117
118 # "legacy" does not apply to a loaded script
119 lines =<< trim END
120 vim9script
121 export var exported = 'x'
122 END
123 writefile(lines, 'Xvim9import.vim')
124 lines =<< trim END
125 legacy exe "import './Xvim9import.vim'"
126 END
127 v9.CheckScriptSuccess(lines)
128 delete('Xvim9import.vim')
Bram Moolenaarcdf04852022-02-12 22:13:06 +0000129
130 # "legacy" does not aply to a called function
131 lines =<< trim END
132 vim9script
133
134 def g:TheFunc()
135 if exists('something')
136 echo 'yes'
137 endif
138 enddef
139 legacy exe 'call g:TheFunc()'
140 END
141 v9.CheckScriptSuccess(lines)
142 delfunc g:TheFunc
Kota Kato3d3f6ac2022-08-04 18:50:14 +0100143
144 # vim9cmd execute(cmd) executes code in vim9 script context
145 lines =<< trim END
146 vim9cmd execute("g:vim9executetest = 'bar'")
147 call assert_equal('bar', g:vim9executetest)
148 END
149 v9.CheckScriptSuccess(lines)
150 unlet g:vim9executetest
151
152 lines =<< trim END
153 vim9cmd execute(["g:vim9executetest1 = 'baz'", "g:vim9executetest2 = 'foo'"])
154 call assert_equal('baz', g:vim9executetest1)
155 call assert_equal('foo', g:vim9executetest2)
156 END
157 v9.CheckScriptSuccess(lines)
158 unlet g:vim9executetest1
159 unlet g:vim9executetest2
160
161 # legacy call execute(cmd) executes code in vim script context
162 lines =<< trim END
163 vim9script
164 legacy call execute("let g:vim9executetest = 'bar'")
165 assert_equal('bar', g:vim9executetest)
166 END
167 v9.CheckScriptSuccess(lines)
168 unlet g:vim9executetest
169
170 lines =<< trim END
171 vim9script
172 legacy call execute(["let g:vim9executetest1 = 'baz'", "let g:vim9executetest2 = 'foo'"])
173 assert_equal('baz', g:vim9executetest1)
174 assert_equal('foo', g:vim9executetest2)
175 END
176 v9.CheckScriptSuccess(lines)
177 unlet g:vim9executetest1
178 unlet g:vim9executetest2
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +0000179enddef
180
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200181def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +0200182 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200183 edit `=filename`
184 assert_equal('Xtest', bufname())
185
Bram Moolenaarac564082020-09-27 19:05:33 +0200186 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200187 edit Xtest`=filenr`
188 assert_equal('Xtest123', bufname())
189
190 filenr = 77
191 edit `=filename``=filenr`
192 assert_equal('Xtest77', bufname())
193
194 edit X`=filename`xx`=filenr`yy
195 assert_equal('XXtestxx77yy', bufname())
Bram Moolenaar025cb1c2020-12-14 18:31:27 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['edit `=xxx`'], 'E1001:')
198 v9.CheckDefFailure(['edit `="foo"'], 'E1083:')
Bram Moolenaarb288ba92021-06-05 17:10:55 +0200199
200 var files = ['file 1', 'file%2', 'file# 3']
201 args `=files`
202 assert_equal(files, argv())
Bram Moolenaar279d7332021-11-27 11:42:50 +0000203
204 filename = 'Xwindo'
205 windo edit `=filename`
206 assert_equal('Xwindo', bufname())
207
208 filename = 'Xtabdo'
209 tabdo edit `=filename`
210 assert_equal('Xtabdo', bufname())
211
212 filename = 'Xargdo'
213 argdo edit `=filename`
214 assert_equal('Xargdo', bufname())
215
216 :%bwipe!
217 filename = 'Xbufdo'
218 bufdo file `=filename`
219 assert_equal('Xbufdo', bufname())
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200220enddef
221
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100222def Test_expand_alternate_file()
223 var lines =<< trim END
224 edit Xfileone
225 var bone = bufnr()
226 edit Xfiletwo
227 var btwo = bufnr()
228 edit Xfilethree
229 var bthree = bufnr()
230
231 edit #
232 assert_equal(bthree, bufnr())
233 edit %%
234 assert_equal(btwo, bufnr())
235 edit %% # comment
236 assert_equal(bthree, bufnr())
237 edit %%yy
238 assert_equal('Xfiletwoyy', bufname())
239
240 exe "edit %%" .. bone
241 assert_equal(bone, bufnr())
242 exe "edit %%" .. btwo .. "xx"
243 assert_equal('Xfiletwoxx', bufname())
244
245 next Xfileone Xfiletwo Xfilethree
246 assert_equal('Xfileone', argv(0))
247 assert_equal('Xfiletwo', argv(1))
248 assert_equal('Xfilethree', argv(2))
249 next %%%zz
250 assert_equal('Xfileone', argv(0))
251 assert_equal('Xfiletwo', argv(1))
252 assert_equal('Xfilethreezz', argv(2))
253
254 v:oldfiles = ['Xonefile', 'Xtwofile']
255 edit %%<1
256 assert_equal('Xonefile', bufname())
257 edit %%<2
258 assert_equal('Xtwofile', bufname())
259 assert_fails('edit %%<3', 'E684:')
260
261 edit Xfileone.vim
262 edit Xfiletwo
263 edit %%:r
264 assert_equal('Xfileone', bufname())
Bram Moolenaardfbc5fd2021-01-23 15:15:01 +0100265
266 assert_false(bufexists('altfoo'))
267 edit altfoo
268 edit bar
269 assert_true(bufexists('altfoo'))
270 assert_true(buflisted('altfoo'))
271 bdel %%
272 assert_true(bufexists('altfoo'))
273 assert_false(buflisted('altfoo'))
274 bwipe! altfoo
275 bwipe! bar
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100276 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000277 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100278enddef
279
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100280def Test_global_backtick_expansion()
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000281 var name = 'xxx'
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100282 new
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000283 setline(1, ['one', 'two', 'three'])
284 set nomod
285 g/two/edit `=name`
286 assert_equal('xxx', bufname())
287 bwipe!
288
289 new
290 setline(1, ['one', 'two', 'three'])
291 g/two/s/^/`=name`/
292 assert_equal('`=name`two', getline(2))
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100293 bwipe!
294enddef
295
Bram Moolenaarecac5912021-01-05 19:23:28 +0100296def Test_folddo_backtick_expansion()
297 new
298 var name = 'xxx'
299 folddoopen edit `=name`
300 assert_equal('xxx', bufname())
301 bwipe!
302
303 new
304 setline(1, ['one', 'two'])
305 set nomodified
306 :1,2fold
307 foldclose
308 folddoclose edit `=name`
309 assert_equal('xxx', bufname())
310 bwipe!
Bram Moolenaarfad27422021-11-30 21:58:19 +0000311
312 var lines =<< trim END
313 g:val = 'value'
314 def Test()
315 folddoopen echo `=g:val`
316 enddef
317 call Test()
318 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000319 v9.CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
Bram Moolenaarecac5912021-01-05 19:23:28 +0100320enddef
321
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200322def Test_hardcopy_wildcards()
323 CheckUnix
324 CheckFeature postscript
325
Bram Moolenaarac564082020-09-27 19:05:33 +0200326 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200327 hardcopy > X`=outfile`.ps
328 assert_true(filereadable('Xprint.ps'))
329
330 delete('Xprint.ps')
331enddef
332
333def Test_syn_include_wildcards()
334 writefile(['syn keyword Found found'], 'Xthemine.vim')
Bram Moolenaarac564082020-09-27 19:05:33 +0200335 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200336 &rtp = '.'
337
Bram Moolenaarac564082020-09-27 19:05:33 +0200338 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200339 syn include @Group Xthe`=fname`.vim
340 assert_match('Found.* contained found', execute('syn list Found'))
341
342 &rtp = save_rtp
343 delete('Xthemine.vim')
344enddef
345
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200346def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200347 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200348 vim9script
349 redir @a
350 echo 'one'
351 .. 'two'
352 redir END
353 assert_equal("\nonetwo", @a)
354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000355 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200356
357 lines =<< trim END
358 vim9script
359 redir @a
360 echo 11 +
361 77
362 - 22
363 redir END
364 assert_equal("\n66", @a)
365 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000366 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200367enddef
368
Bram Moolenaar13106602020-10-04 16:06:05 +0200369def Test_condition_types()
370 var lines =<< trim END
371 if 'text'
372 endif
373 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000374 v9.CheckDefAndScriptFailure(lines, 'E1135:', 1)
Bram Moolenaar13106602020-10-04 16:06:05 +0200375
376 lines =<< trim END
377 if [1]
378 endif
379 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000380 v9.CheckDefFailure(lines, 'E1012:', 1)
381 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200382
383 lines =<< trim END
384 g:cond = 'text'
385 if g:cond
386 endif
387 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000388 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200389
390 lines =<< trim END
391 g:cond = 0
392 if g:cond
393 elseif 'text'
394 endif
395 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000396 v9.CheckDefAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200397
398 lines =<< trim END
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000399 g:cond = 0
400 if g:cond
401 elseif 'text' garbage
402 endif
403 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000404 v9.CheckDefAndScriptFailure(lines, 'E488:', 3)
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000405
406 lines =<< trim END
407 g:cond = 0
Bram Moolenaar13106602020-10-04 16:06:05 +0200408 if g:cond
409 elseif [1]
410 endif
411 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000412 v9.CheckDefFailure(lines, 'E1012:', 3)
413 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 4)
Bram Moolenaar13106602020-10-04 16:06:05 +0200414
415 lines =<< trim END
416 g:cond = 'text'
417 if 0
418 elseif g:cond
419 endif
420 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000421 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200422
423 lines =<< trim END
424 while 'text'
425 endwhile
426 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000427 v9.CheckDefFailure(lines, 'E1012:', 1)
428 v9.CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200429
430 lines =<< trim END
431 while [1]
432 endwhile
433 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000434 v9.CheckDefFailure(lines, 'E1012:', 1)
435 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200436
437 lines =<< trim END
438 g:cond = 'text'
439 while g:cond
440 endwhile
441 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000442 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200443enddef
444
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200445def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200446 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200447 vim9script
448 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200449 true
450 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200451 g:res = 42
452 endif
453 assert_equal(42, g:res)
454 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000455 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200456 unlet g:res
457
458 lines =<< trim END
459 vim9script
460 if 1 &&
461 0
462 g:res = 0
463 elseif 0 ||
464 0
465 || 1
466 g:res = 12
467 endif
468 assert_equal(12, g:res)
469 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000470 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200471 unlet g:res
472enddef
473
474def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200475 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200476 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200477 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200478 while nr <
479 10 + 3
480 nr = nr
481 + 4
482 endwhile
483 assert_equal(16, nr)
484 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000485 v9.CheckScriptSuccess(lines)
Bram Moolenaard5053d02020-06-28 15:51:16 +0200486
487 lines =<< trim END
488 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200489 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200490 while nr
491 <
492 10
493 +
494 3
495 nr = nr
496 +
497 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200498 endwhile
499 assert_equal(16, nr)
500 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000501 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200502enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200503
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200504def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200505 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200506 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200507 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200508 for x
509 in
510 [1, 2, 3, 4]
511 nr = nr + x
512 endfor
513 assert_equal(10, nr)
514 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000515 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200516
517 lines =<< trim END
518 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200519 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200520 for x
521 in
522 [1, 2,
523 3, 4
524 ]
525 nr = nr
526 +
527 x
528 endfor
529 assert_equal(10, nr)
530 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000531 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200532enddef
533
Bram Moolenaar62aec932022-01-29 21:45:34 +0000534def s:MethodAfterLinebreak(arg: string)
Bram Moolenaare0890d62021-02-17 14:52:14 +0100535 arg
536 ->setline(1)
537enddef
538
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200539def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200540 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200541 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200542 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200543 func RetArg(
544 arg
545 )
546 let s:res = a:arg
547 endfunc
548 [1,
549 2,
550 3]->RetArg()
551 assert_equal([1, 2, 3], res)
552 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000553 v9.CheckScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100554
555 lines =<< trim END
556 new
557 var name = [1, 2]
558 name
559 ->copy()
560 ->setline(1)
561 assert_equal(['1', '2'], getline(1, 2))
562 bwipe!
563 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000564 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100565
566 lines =<< trim END
567 new
Bram Moolenaar6914e872021-03-06 21:01:09 +0100568 def Foo(): string
569 return 'the text'
570 enddef
571 def Bar(F: func): string
572 return F()
573 enddef
574 def Test()
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100575 Foo ->Bar()
576 ->setline(1)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100577 enddef
578 Test()
579 assert_equal('the text', getline(1))
580 bwipe!
581 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000582 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100583
584 lines =<< trim END
585 new
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100586 g:shortlist
587 ->copy()
588 ->setline(1)
589 assert_equal(['1', '2'], getline(1, 2))
590 bwipe!
591 END
592 g:shortlist = [1, 2]
Bram Moolenaar62aec932022-01-29 21:45:34 +0000593 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100594 unlet g:shortlist
Bram Moolenaare0890d62021-02-17 14:52:14 +0100595
596 new
597 MethodAfterLinebreak('foobar')
598 assert_equal('foobar', getline(1))
599 bwipe!
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100600
601 lines =<< trim END
602 vim9script
603 def Foo(): string
604 return '# some text'
605 enddef
606
607 def Bar(F: func): string
608 return F()
609 enddef
610
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100611 Foo->Bar()
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100612 ->setline(1)
613 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000614 v9.CheckScriptSuccess(lines)
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100615 assert_equal('# some text', getline(1))
616 bwipe!
Bram Moolenaar5f195932020-07-01 20:07:14 +0200617enddef
618
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100619def Test_method_call_whitespace()
620 var lines =<< trim END
621 new
622 var yank = 'text'
623 yank->setline(1)
624 yank ->setline(2)
625 yank-> setline(3)
626 yank -> setline(4)
627 assert_equal(['text', 'text', 'text', 'text'], getline(1, 4))
628 bwipe!
629 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000630 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100631enddef
632
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100633def Test_method_and_user_command()
634 var lines =<< trim END
635 vim9script
636 def Cmd()
637 g:didFunc = 1
638 enddef
639 command Cmd g:didCmd = 1
640 Cmd
641 assert_equal(1, g:didCmd)
642 Cmd()
643 assert_equal(1, g:didFunc)
644 unlet g:didFunc
645 unlet g:didCmd
646
647 def InDefFunc()
648 Cmd
649 assert_equal(1, g:didCmd)
650 Cmd()
651 assert_equal(1, g:didFunc)
652 unlet g:didFunc
653 unlet g:didCmd
654 enddef
655 InDefFunc()
656 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000657 v9.CheckScriptSuccess(lines)
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100658enddef
659
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200660def Test_option_use_linebreak()
661 var lines =<< trim END
662 new
663 &matchpairs = '(:)'
664 &matchpairs->setline(1)
665 &matchpairs = '[:]'
666 &matchpairs ->setline(2)
667 &matchpairs = '{:}'
668 &matchpairs
669 ->setline(3)
670 assert_equal(['(:)', '[:]', '{:}'], getline(1, '$'))
671 bwipe!
672 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000673 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200674enddef
675
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200676def Test_use_register()
Bram Moolenaar73170912021-08-22 22:44:11 +0200677 var lines =<< trim END
678 new
679 @a = 'one'
680 @a->setline(1)
681 @b = 'two'
682 @b ->setline(2)
683 @c = 'three'
684 @c
685 ->setline(3)
686 assert_equal(['one', 'two', 'three'], getline(1, '$'))
687 bwipe!
688 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000689 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200690
691 lines =<< trim END
692 @a = 'echo "text"'
693 @a
694 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000695 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000696
697 lines =<< trim END
Bram Moolenaarea720382022-05-05 16:08:55 +0100698 @a = 'echo "text"'
699 @a
700
701 END
702 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
703
704 lines =<< trim END
705 @a = 'echo "text"'
706 @a
707 # comment
708 END
709 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
710
711 lines =<< trim END
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000712 @/ = 'pattern'
713 @/
714 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000715 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000716
717 lines =<< trim END
718 &opfunc = 'nothing'
719 &opfunc
720 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000721 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000722 &opfunc = ''
723
724 lines =<< trim END
725 &l:showbreak = 'nothing'
726 &l:showbreak
727 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000728 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000729 &l:showbreak = ''
730
731 lines =<< trim END
732 &g:showbreak = 'nothing'
733 &g:showbreak
734 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000735 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000736 &g:showbreak = ''
Bram Moolenaar65259b52021-11-23 14:52:06 +0000737
738 lines =<< trim END
739 $SomeEnv = 'value'
740 $SomeEnv
741 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000742 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar65259b52021-11-23 14:52:06 +0000743 $SomeEnv = ''
Bram Moolenaar0d032632022-05-17 12:45:15 +0100744
745 lines =<< trim END
746 eval 'value'
747 END
748 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
749
750 lines =<< trim END
751 eval "value"
752 END
753 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
Bram Moolenaar73170912021-08-22 22:44:11 +0200754enddef
755
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200756def Test_environment_use_linebreak()
757 var lines =<< trim END
758 new
759 $TESTENV = 'one'
760 $TESTENV->setline(1)
761 $TESTENV = 'two'
762 $TESTENV ->setline(2)
763 $TESTENV = 'three'
764 $TESTENV
765 ->setline(3)
766 assert_equal(['one', 'two', 'three'], getline(1, '$'))
767 bwipe!
768 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000769 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200770enddef
771
Bram Moolenaar683581e2020-10-22 21:22:58 +0200772def Test_skipped_expr_linebreak()
773 if 0
774 var x = []
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100775 ->map(() => 0)
Bram Moolenaar683581e2020-10-22 21:22:58 +0200776 endif
777enddef
778
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200779def Test_dict_member()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100780 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200781 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100782 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200783 test.data
784 ->reverse()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100785 assert_equal({data: [3, 2, 1]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200786
Bram Moolenaarac564082020-09-27 19:05:33 +0200787 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200788 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100789 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200790 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100791 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200792 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000793 v9.CheckScriptSuccess(lines)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200794enddef
795
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200796def Test_bar_after_command()
797 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200798 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200799 redraw | echo x
800 enddef
801 RedrawAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000802 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200803
Bram Moolenaar788123c2020-07-05 15:32:17 +0200804 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200805 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200806 reg_executing() | echo x
807 enddef
808 CallAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000809 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaar788123c2020-07-05 15:32:17 +0200810
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200811 if has('unix')
812 # bar in filter write command does not start new command
813 def WriteToShell()
814 new
815 setline(1, 'some text')
816 w !cat | cat > Xoutfile
817 bwipe!
818 enddef
819 WriteToShell()
820 assert_equal(['some text'], readfile('Xoutfile'))
821 delete('Xoutfile')
822
823 # bar in filter read command does not start new command
824 def ReadFromShell()
825 new
826 r! echo hello there | cat > Xoutfile
827 r !echo again | cat >> Xoutfile
828 bwipe!
829 enddef
830 ReadFromShell()
831 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
832 delete('Xoutfile')
833 endif
834enddef
835
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200836def Test_filter_is_not_modifier()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100837 var tags = [{a: 1, b: 2}, {x: 3, y: 4}]
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100838 filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 )
Bram Moolenaare0de1712020-12-02 17:36:54 +0100839 assert_equal([{x: 3, y: 4}], tags)
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200840enddef
841
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100842def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100843 var lines =<< trim END
844 final expected = "\nType Name Content\n c \"c piyo"
845 @a = 'hoge'
846 @b = 'fuga'
847 @c = 'piyo'
848
849 assert_equal(execute('filter /piyo/ registers abc'), expected)
850 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000851 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare729ce22021-06-06 21:38:09 +0200852
853 # also do this compiled
854 lines =<< trim END
855 @a = 'very specific z3d37dh234 string'
856 filter z3d37dh234 registers
Bram Moolenaar62aec932022-01-29 21:45:34 +0000857 assert_match('very specific z3d37dh234 string', g:Screenline(&lines))
Bram Moolenaare729ce22021-06-06 21:38:09 +0200858 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000859 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar06bffe82021-11-28 20:24:17 +0000860
861 lines =<< trim END
862 edit foobar
863 redir => g:filter_out
864 filter #foobar# ls
865 redir END
866 assert_match('"foobar"', g:filter_out)
867 unlet g:filter_out
868 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000869 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100870enddef
871
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100872def Test_win_command_modifiers()
873 assert_equal(1, winnr('$'))
874
875 set splitright
876 vsplit
877 assert_equal(2, winnr())
878 close
879 aboveleft vsplit
880 assert_equal(1, winnr())
881 close
882 set splitright&
883
884 vsplit
885 assert_equal(1, winnr())
886 close
887 belowright vsplit
888 assert_equal(2, winnr())
889 close
890 rightbelow vsplit
891 assert_equal(2, winnr())
892 close
893
Bram Moolenaar97a19002020-11-01 22:15:44 +0100894 if has('browse')
895 browse set
896 assert_equal('option-window', expand('%'))
897 close
898 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100899
900 vsplit
901 botright split
902 assert_equal(3, winnr())
903 assert_equal(&columns, winwidth(0))
904 close
905 close
906
907 vsplit
908 topleft split
909 assert_equal(1, winnr())
910 assert_equal(&columns, winwidth(0))
911 close
912 close
913
914 gettabinfo()->len()->assert_equal(1)
915 tab split
916 gettabinfo()->len()->assert_equal(2)
917 tabclose
918
919 vertical new
920 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
921 close
922enddef
923
924func Test_command_modifier_confirm()
925 CheckNotGui
926 CheckRunVimInTerminal
927
928 " Test for saving all the modified buffers
929 let lines =<< trim END
930 call setline(1, 'changed')
931 def Getout()
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100932 confirm write Xcmodfile
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100933 enddef
934 END
935 call writefile(lines, 'Xconfirmscript')
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100936 call writefile(['empty'], 'Xcmodfile')
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100937 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
938 call term_sendkeys(buf, ":call Getout()\n")
939 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
940 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100941 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
942 call term_sendkeys(buf, "\<CR>")
943 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100944 call StopVimInTerminal(buf)
945
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100946 call assert_equal(['changed'], readfile('Xcmodfile'))
947 call delete('Xcmodfile')
948 call delete('.Xcmodfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100949 call delete('Xconfirmscript')
950endfunc
951
952def Test_command_modifiers_keep()
953 if has('unix')
954 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
955 new
956 setline(1, ['one', 'two', 'three'])
957 normal 1Gma
958 normal 2Gmb
959 normal 3Gmc
960 if addRflag
961 set cpo+=R
962 else
963 set cpo-=R
964 endif
965 if keepMarks
966 keepmarks :%!cat
967 else
968 :%!cat
969 endif
970 if hasMarks
971 assert_equal(1, line("'a"))
972 assert_equal(2, line("'b"))
973 assert_equal(3, line("'c"))
974 else
975 assert_equal(0, line("'a"))
976 assert_equal(0, line("'b"))
977 assert_equal(0, line("'c"))
978 endif
979 quit!
980 enddef
981 DoTest(false, false, true)
982 DoTest(true, false, false)
983 DoTest(false, true, true)
984 DoTest(true, true, true)
985 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100986
987 new
988 setline(1, ['one', 'two', 'three', 'four'])
989 assert_equal(4, line("$"))
990 normal 1Gma
991 normal 2Gmb
992 normal 3Gmc
993 lockmarks :1,2!wc
994 # line is deleted, marks don't move
995 assert_equal(3, line("$"))
996 assert_equal('four', getline(3))
997 assert_equal(1, line("'a"))
998 assert_equal(2, line("'b"))
999 assert_equal(3, line("'c"))
1000 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001001 endif
1002
Bram Moolenaarf65b35b2020-11-04 18:02:44 +01001003 edit Xone
1004 edit Xtwo
1005 assert_equal('Xone', expand('#'))
1006 keepalt edit Xthree
1007 assert_equal('Xone', expand('#'))
1008
1009 normal /a*b*
1010 assert_equal('a*b*', histget("search"))
1011 keeppatterns normal /c*d*
1012 assert_equal('a*b*', histget("search"))
1013
1014 new
1015 setline(1, range(10))
1016 :10
1017 normal gg
1018 assert_equal(10, getpos("''")[1])
1019 keepjumps normal 5G
1020 assert_equal(10, getpos("''")[1])
1021 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001022enddef
1023
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001024def Test_bar_line_continuation()
1025 var lines =<< trim END
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001026 au BufNewFile XveryNewFile g:readFile = 1
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001027 | g:readExtra = 2
1028 g:readFile = 0
1029 g:readExtra = 0
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001030 edit XveryNewFile
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001031 assert_equal(1, g:readFile)
1032 assert_equal(2, g:readExtra)
1033 bwipe!
1034 au! BufNewFile
1035
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001036 au BufNewFile XveryNewFile g:readFile = 1
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001037 | g:readExtra = 2
1038 | g:readMore = 3
1039 g:readFile = 0
1040 g:readExtra = 0
1041 g:readMore = 0
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001042 edit XveryNewFile
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001043 assert_equal(1, g:readFile)
1044 assert_equal(2, g:readExtra)
1045 assert_equal(3, g:readMore)
1046 bwipe!
1047 au! BufNewFile
1048 unlet g:readFile
1049 unlet g:readExtra
1050 unlet g:readMore
1051 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001052 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001053enddef
1054
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001055def Test_command_modifier_other()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001056 new Xsomefile
1057 setline(1, 'changed')
1058 var buf = bufnr()
1059 hide edit Xotherfile
1060 var info = getbufinfo(buf)
1061 assert_equal(1, info[0].hidden)
1062 assert_equal(1, info[0].changed)
1063 edit Xsomefile
1064 bwipe!
1065
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001066 au BufNewFile Xcmofile g:readFile = 1
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001067 g:readFile = 0
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001068 edit Xcmofile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001069 assert_equal(1, g:readFile)
1070 bwipe!
1071 g:readFile = 0
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001072 noautocmd edit Xcmofile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001073 assert_equal(0, g:readFile)
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001074 au! BufNewFile
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001075 unlet g:readFile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001076
1077 noswapfile edit XnoSwap
Bram Moolenaardd1f4262020-12-31 17:41:01 +01001078 assert_equal(false, &l:swapfile)
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001079 bwipe!
1080
1081 var caught = false
1082 try
1083 sandbox !ls
1084 catch /E48:/
1085 caught = true
1086 endtry
1087 assert_true(caught)
1088
1089 :8verbose g:verbose_now = &verbose
1090 assert_equal(8, g:verbose_now)
1091 unlet g:verbose_now
1092enddef
1093
Bram Moolenaar62aec932022-01-29 21:45:34 +00001094def s:EchoHere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001095 echomsg 'here'
1096enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001097def s:EchoThere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001098 unsilent echomsg 'there'
1099enddef
1100
1101def Test_modifier_silent_unsilent()
1102 echomsg 'last one'
1103 silent echomsg "text"
1104 assert_equal("\nlast one", execute(':1messages'))
1105
1106 silent! echoerr "error"
1107
1108 echomsg 'last one'
1109 silent EchoHere()
1110 assert_equal("\nlast one", execute(':1messages'))
1111
1112 silent EchoThere()
1113 assert_equal("\nthere", execute(':1messages'))
Bram Moolenaar20a76292020-12-25 19:47:24 +01001114
1115 try
1116 silent eval [][0]
1117 catch
1118 echomsg "caught"
1119 endtry
1120 assert_equal("\ncaught", execute(':1messages'))
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001121
1122 var lines =<< trim END
1123 vim9script
1124 set history=11
1125 silent! while 0
1126 set history=22
1127 silent! endwhile
1128 assert_equal(11, &history)
1129 set history&
1130 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001131 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001132enddef
1133
Bram Moolenaar36113e42020-11-02 21:08:47 +01001134def Test_range_after_command_modifier()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001135 v9.CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2)
Bram Moolenaar36113e42020-11-02 21:08:47 +01001136 new
1137 setline(1, 'xxx')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001138 v9.CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
Bram Moolenaar36113e42020-11-02 21:08:47 +01001139 assert_equal('', getline(1))
1140 bwipe!
Bram Moolenaarb579f6e2021-12-04 11:57:00 +00001141
1142 var lines =<< trim END
1143 legacy /pat/
1144 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001145 v9.CheckDefExecAndScriptFailure(lines, 'E486: Pattern not found: pat')
Bram Moolenaar36113e42020-11-02 21:08:47 +01001146enddef
1147
Bram Moolenaarece0b872021-01-08 20:40:45 +01001148def Test_silent_pattern()
1149 new
1150 silent! :/pat/put _
1151 bwipe!
1152enddef
1153
Bram Moolenaarfa984412021-03-25 22:15:28 +01001154def Test_useless_command_modifier()
1155 g:maybe = true
1156 var lines =<< trim END
1157 if g:maybe
1158 silent endif
1159 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001160 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001161
1162 lines =<< trim END
1163 for i in [0]
1164 silent endfor
1165 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001166 v9.CheckDefFailure(lines, 'E1176:', 2)
1167 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001168
1169 lines =<< trim END
1170 while g:maybe
1171 silent endwhile
1172 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001173 v9.CheckDefFailure(lines, 'E1176:', 2)
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001174 g:maybe = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001175 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001176
1177 lines =<< trim END
1178 silent try
1179 finally
1180 endtry
1181 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001182 v9.CheckDefAndScriptFailure(lines, 'E1176:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001183
1184 lines =<< trim END
1185 try
1186 silent catch
1187 endtry
1188 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001189 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001190
1191 lines =<< trim END
1192 try
1193 silent finally
1194 endtry
1195 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001196 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001197
1198 lines =<< trim END
1199 try
1200 finally
1201 silent endtry
1202 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001203 v9.CheckDefAndScriptFailure(lines, 'E1176:', 3)
Bram Moolenaarbc510062022-02-14 21:19:04 +00001204
1205 lines =<< trim END
1206 leftabove
1207 END
1208 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
1209
1210 lines =<< trim END
1211 leftabove # comment
1212 END
1213 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001214enddef
1215
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001216def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001217 var from = 3
1218 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001219 g:val = 111
1220 def Increment(nrs: list<number>)
1221 for nr in nrs
1222 g:val += nr
1223 endfor
1224 enddef
1225 eval range(from, to)
1226 ->Increment()
1227 assert_equal(111 + 3 + 4 + 5, g:val)
1228 unlet g:val
Bram Moolenaard0fe6202020-12-05 17:11:12 +01001229
1230 var lines =<< trim END
1231 vim9script
1232 g:caught = 'no'
1233 try
1234 eval 123 || 0
1235 catch
1236 g:caught = 'yes'
1237 endtry
1238 assert_equal('yes', g:caught)
1239 unlet g:caught
1240 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001241 v9.CheckScriptSuccess(lines)
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001242enddef
1243
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001244def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001245 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001246 nnoremap <F3> :echo 'hit F3 #'<CR>
1247 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
1248 END
Bram Moolenaarac485062022-03-23 19:45:01 +00001249 v9.CheckDefAndScriptSuccess(lines)
1250
1251 # backslash before bar is not removed
1252 lines =<< trim END
1253 vim9script
1254
1255 def Init()
1256 noremap <buffer> <F5> <ScriptCmd>MyFunc('a') \| MyFunc('b')<CR>
1257 enddef
1258 Init()
1259 unmap <buffer> <F5>
1260 END
1261 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001262enddef
1263
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001264def Test_normal_command()
1265 new
1266 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +02001267 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001268 try
1269 exe "norm! \<C-]>"
1270 catch /E433/
1271 caught = 2
1272 endtry
1273 assert_equal(2, caught)
1274
1275 try
1276 exe "norm! 3\<C-]>"
1277 catch /E433/
1278 caught = 3
1279 endtry
1280 assert_equal(3, caught)
1281 bwipe!
1282enddef
1283
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001284def Test_put_command()
1285 new
1286 @p = 'ppp'
1287 put p
1288 assert_equal('ppp', getline(2))
1289
1290 put ='below'
1291 assert_equal('below', getline(3))
1292 put! ='above'
1293 assert_equal('above', getline(3))
1294 assert_equal('below', getline(4))
1295
Bram Moolenaar883cf972021-01-15 18:04:43 +01001296 :2put =['a', 'b', 'c']
1297 assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
1298
Bram Moolenaard0b7bfa2022-03-12 14:51:16 +00001299 :0put = 'first'
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001300 assert_equal('first', getline(1))
1301 :1put! ='first again'
1302 assert_equal('first again', getline(1))
1303
Bram Moolenaar08597872020-12-10 19:43:40 +01001304 # compute range at runtime
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001305 :%del
Bram Moolenaar08597872020-12-10 19:43:40 +01001306 setline(1, range(1, 8))
1307 @a = 'aaa'
1308 :$-2put a
1309 assert_equal('aaa', getline(7))
1310
1311 setline(1, range(1, 8))
1312 :2
1313 :+2put! a
1314 assert_equal('aaa', getline(4))
1315
Bram Moolenaara28639e2021-01-19 22:48:09 +01001316 []->mapnew(() => 0)
1317 :$put ='end'
1318 assert_equal('end', getline('$'))
1319
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001320 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001321
Bram Moolenaar62aec932022-01-29 21:45:34 +00001322 v9.CheckDefFailure(['put =xxx'], 'E1001:')
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001323enddef
1324
1325def Test_put_with_linebreak()
1326 new
1327 var lines =<< trim END
1328 vim9script
1329 pu =split('abc', '\zs')
1330 ->join()
1331 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001332 v9.CheckScriptSuccess(lines)
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001333 getline(2)->assert_equal('a b c')
1334 bwipe!
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001335enddef
1336
Bram Moolenaar3bd8de42020-09-14 16:37:34 +02001337def Test_command_star_range()
1338 new
1339 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
1340 setpos("'<", [0, 1, 0, 0])
1341 setpos("'>", [0, 3, 0, 0])
1342 :*s/\(foo\|bar\)/baz/g
1343 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
1344
1345 bwipe!
1346enddef
1347
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001348def Test_f_args()
1349 var lines =<< trim END
1350 vim9script
1351
1352 func SaveCmdArgs(...)
1353 let g:args = a:000
1354 endfunc
1355
1356 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
1357
1358 TestFArgs
1359 assert_equal([], g:args)
1360
1361 TestFArgs one two three
1362 assert_equal(['one', 'two', 'three'], g:args)
1363 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001364 v9.CheckScriptSuccess(lines)
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001365enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001366
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001367def Test_user_command_comment()
1368 command -nargs=1 Comd echom <q-args>
1369
1370 var lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001371 vim9script
1372 Comd # comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001373 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001374 v9.CheckScriptSuccess(lines)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001375
1376 lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001377 vim9script
1378 Comd# comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001379 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001380 v9.CheckScriptFailure(lines, 'E1144:')
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001381 delcommand Comd
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001382
1383 lines =<< trim END
1384 vim9script
1385 command Foo echo 'Foo'
1386 Foo3Bar
1387 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001388 v9.CheckScriptFailure(lines, 'E1144: Command "Foo" is not followed by white space: Foo3Bar')
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001389
1390 delcommand Foo
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001391enddef
1392
Bram Moolenaar95388e32020-11-20 21:07:00 +01001393def Test_star_command()
1394 var lines =<< trim END
1395 vim9script
1396 @s = 'g:success = 8'
1397 set cpo+=*
1398 exe '*s'
1399 assert_equal(8, g:success)
1400 unlet g:success
1401 set cpo-=*
1402 assert_fails("exe '*s'", 'E1050:')
1403 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001404 v9.CheckScriptSuccess(lines)
Bram Moolenaar95388e32020-11-20 21:07:00 +01001405enddef
1406
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001407def Test_cmd_argument_without_colon()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001408 new Xawcfile
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001409 setline(1, ['a', 'b', 'c', 'd'])
1410 write
1411 edit +3 %
1412 assert_equal(3, getcurpos()[1])
1413 edit +/a %
1414 assert_equal(1, getcurpos()[1])
1415 bwipe
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001416 delete('Xawcfile')
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001417enddef
1418
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001419def Test_ambiguous_user_cmd()
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001420 command Cmd1 eval 0
1421 command Cmd2 eval 0
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001422 var lines =<< trim END
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001423 Cmd
1424 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001425 v9.CheckDefAndScriptFailure(lines, 'E464:', 1)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001426 delcommand Cmd1
1427 delcommand Cmd2
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001428enddef
1429
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001430def Test_command_not_recognized()
1431 var lines =<< trim END
1432 d.key = 'asdf'
1433 END
Bram Moolenaar97f8c102022-04-02 19:43:57 +01001434 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
1435
1436 lines =<< trim END
1437 d['key'] = 'asdf'
1438 END
1439 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001440
1441 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001442 if 0
1443 d.key = 'asdf'
1444 endif
1445 END
1446 v9.CheckDefSuccess(lines)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001447enddef
Bram Moolenaarb7a78f72020-06-28 18:43:40 +02001448
Bram Moolenaarf4e20992020-12-21 19:59:08 +01001449def Test_magic_not_used()
1450 new
1451 for cmd in ['set magic', 'set nomagic']
1452 exe cmd
1453 setline(1, 'aaa')
1454 s/.../bbb/
1455 assert_equal('bbb', getline(1))
1456 endfor
1457
1458 set magic
1459 setline(1, 'aaa')
1460 assert_fails('s/.\M../bbb/', 'E486:')
1461 assert_fails('snomagic/.../bbb/', 'E486:')
1462 assert_equal('aaa', getline(1))
1463
1464 bwipe!
1465enddef
1466
Bram Moolenaar60f63102020-12-21 20:32:43 +01001467def Test_gdefault_not_used()
1468 new
1469 for cmd in ['set gdefault', 'set nogdefault']
1470 exe cmd
1471 setline(1, 'aaa')
1472 s/./b/
1473 assert_equal('baa', getline(1))
1474 endfor
1475
1476 set nogdefault
1477 bwipe!
1478enddef
1479
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001480def s:SomeComplFunc(findstart: number, base: string): any
Bram Moolenaar179eb562020-12-27 18:03:22 +01001481 if findstart
1482 return 0
1483 else
1484 return ['aaa', 'bbb']
1485 endif
1486enddef
1487
1488def Test_insert_complete()
1489 # this was running into an error with the matchparen hack
1490 new
1491 set completefunc=SomeComplFunc
1492 feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx')
1493 assert_equal('aaa', getline(1))
1494
1495 set completefunc=
1496 bwipe!
1497enddef
1498
Bram Moolenaara11919f2021-01-02 19:44:56 +01001499def Test_wincmd()
1500 split
1501 var id1 = win_getid()
1502 if true
1503 try | wincmd w | catch | endtry
1504 endif
1505 assert_notequal(id1, win_getid())
1506 close
Bram Moolenaar1ff89de2021-03-24 20:08:12 +01001507
1508 split
1509 var id = win_getid()
1510 split
1511 :2wincmd o
1512 assert_equal(id, win_getid())
1513 only
1514
1515 split
1516 split
1517 assert_equal(3, winnr('$'))
1518 :2wincmd c
1519 assert_equal(2, winnr('$'))
1520 only
1521
1522 split
1523 split
1524 assert_equal(3, winnr('$'))
1525 :2wincmd q
1526 assert_equal(2, winnr('$'))
1527 only
Bram Moolenaara11919f2021-01-02 19:44:56 +01001528enddef
1529
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001530def Test_windo_missing_endif()
1531 var lines =<< trim END
1532 windo if 1
1533 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001534 v9.CheckDefExecFailure(lines, 'E171:', 1)
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001535enddef
1536
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001537let s:theList = [1, 2, 3]
1538
1539def Test_lockvar()
1540 s:theList[1] = 22
1541 assert_equal([1, 22, 3], s:theList)
1542 lockvar s:theList
1543 assert_fails('theList[1] = 77', 'E741:')
1544 unlockvar s:theList
1545 s:theList[1] = 44
1546 assert_equal([1, 44, 3], s:theList)
1547
Bram Moolenaara99fb232021-12-20 12:25:03 +00001548 if 0
1549 lockvar whatever
1550 endif
1551
Bram Moolenaar70c43d82022-01-26 21:01:15 +00001552 g:lockme = [1, 2, 3]
1553 lockvar 1 g:lockme
1554 g:lockme[1] = 77
1555 assert_equal([1, 77, 3], g:lockme)
1556
1557 lockvar 2 g:lockme
1558 var caught = false
1559 try
1560 g:lockme[1] = 99
1561 catch /E1119:/
1562 caught = true
1563 endtry
1564 assert_true(caught)
1565 assert_equal([1, 77, 3], g:lockme)
1566 unlet g:lockme
1567
1568 # also for non-materialized list
1569 g:therange = range(3)
1570 lockvar 2 g:therange
1571 caught = false
1572 try
1573 g:therange[1] = 99
1574 catch /E1119:/
1575 caught = true
1576 endtry
1577 assert_true(caught)
1578 assert_equal([0, 1, 2], g:therange)
1579 unlet g:therange
1580
Bram Moolenaare939f5e2022-01-26 21:32:59 +00001581 # use exclamation mark for locking deeper
1582 g:nestedlist = [1, [2, 3], 4]
1583 lockvar! g:nestedlist
1584 try
1585 g:nestedlist[1][0] = 9
1586 catch /E1119:/
1587 caught = true
1588 endtry
1589 assert_true(caught)
1590 unlet g:nestedlist
1591
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001592 var d = {a: 1, b: 2}
1593 d.a = 3
1594 d.b = 4
1595 assert_equal({a: 3, b: 4}, d)
1596 lockvar d.a
1597 d.b = 5
1598 var ex = ''
1599 try
1600 d.a = 6
1601 catch
1602 ex = v:exception
1603 endtry
1604 assert_match('E1121:', ex)
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00001605 unlockvar d['a']
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001606 d.a = 7
1607 assert_equal({a: 7, b: 5}, d)
1608
Bram Moolenaar10611952022-04-03 21:11:34 +01001609 caught = false
1610 try
1611 lockvar d.c
1612 catch /E716/
1613 caught = true
1614 endtry
1615 assert_true(caught)
1616
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001617 var lines =<< trim END
1618 vim9script
Bram Moolenaare08be092022-02-17 13:08:26 +00001619 g:bl = 0z1122
1620 lockvar g:bl
1621 def Tryit()
1622 g:bl[1] = 99
1623 enddef
1624 Tryit()
1625 END
1626 v9.CheckScriptFailure(lines, 'E741:', 1)
1627
1628 lines =<< trim END
1629 vim9script
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001630 var theList = [1, 2, 3]
1631 def SetList()
1632 theList[1] = 22
1633 assert_equal([1, 22, 3], theList)
1634 lockvar theList
1635 theList[1] = 77
1636 enddef
1637 SetList()
1638 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001639 v9.CheckScriptFailure(lines, 'E1119', 4)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001640
1641 lines =<< trim END
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001642 vim9script
1643 var theList = [1, 2, 3]
1644 def AddToList()
1645 lockvar theList
1646 theList += [4]
1647 enddef
1648 AddToList()
1649 END
1650 v9.CheckScriptFailure(lines, 'E741', 2)
1651
1652 lines =<< trim END
1653 vim9script
1654 var theList = [1, 2, 3]
1655 def AddToList()
1656 lockvar theList
1657 add(theList, 4)
1658 enddef
1659 AddToList()
1660 END
1661 v9.CheckScriptFailure(lines, 'E741', 2)
1662
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00001663 # can unlet a locked list item but not change it
1664 lines =<< trim END
1665 var ll = [1, 2, 3]
1666 lockvar ll[1]
1667 unlet ll[1]
1668 assert_equal([1, 3], ll)
1669 END
1670 v9.CheckDefAndScriptSuccess(lines)
1671 lines =<< trim END
1672 var ll = [1, 2, 3]
1673 lockvar ll[1]
1674 ll[1] = 9
1675 END
1676 v9.CheckDefExecAndScriptFailure(lines, ['E1119:', 'E741'], 3)
1677
1678 # can unlet a locked dict item but not change it
1679 lines =<< trim END
1680 var dd = {a: 1, b: 2}
1681 lockvar dd.a
1682 unlet dd.a
1683 assert_equal({b: 2}, dd)
1684 END
1685 v9.CheckDefAndScriptSuccess(lines)
1686 lines =<< trim END
1687 var dd = {a: 1, b: 2}
1688 lockvar dd.a
1689 dd.a = 3
1690 END
1691 v9.CheckDefExecAndScriptFailure(lines, ['E1121:', 'E741'], 3)
1692
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001693 lines =<< trim END
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001694 var theList = [1, 2, 3]
1695 lockvar theList
1696 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001697 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001698
1699 lines =<< trim END
1700 var theList = [1, 2, 3]
1701 unlockvar theList
1702 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001703 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001704
1705 lines =<< trim END
1706 vim9script
1707 var name = 'john'
1708 lockvar nameX
1709 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001710 v9.CheckScriptFailure(lines, 'E1246', 3)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001711
1712 lines =<< trim END
1713 vim9script
1714 var name = 'john'
1715 def LockIt()
1716 lockvar nameX
1717 enddef
1718 LockIt()
1719 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001720 v9.CheckScriptFailure(lines, 'E1246', 1)
Bram Moolenaar7a411a32022-04-04 14:58:06 +01001721
1722 lines =<< trim END
1723 vim9script
1724 const name = 'john'
1725 unlockvar name
1726 END
1727 v9.CheckScriptFailure(lines, 'E46', 3)
1728
1729 lines =<< trim END
1730 vim9script
1731 const name = 'john'
1732 def UnLockIt()
1733 unlockvar name
1734 enddef
1735 UnLockIt()
1736 END
1737 v9.CheckScriptFailure(lines, 'E46', 1)
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001738
1739 lines =<< trim END
1740 def _()
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001741 lockv
1742 enddef
1743 defcomp
1744 END
Bram Moolenaardbdd16b2022-08-14 21:46:07 +01001745 v9.CheckScriptFailure(lines, 'E179', 1)
1746
1747 lines =<< trim END
1748 def T()
1749 unlet
1750 enddef
1751 defcomp
1752 END
1753 v9.CheckScriptFailure(lines, 'E179', 1)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001754enddef
1755
Bram Moolenaar4c137212021-04-19 16:48:48 +02001756def Test_substitute_expr()
1757 var to = 'repl'
1758 new
1759 setline(1, 'one from two')
1760 s/from/\=to
1761 assert_equal('one repl two', getline(1))
1762
1763 setline(1, 'one from two')
1764 s/from/\=to .. '_x'
1765 assert_equal('one repl_x two', getline(1))
1766
1767 setline(1, 'one from two from three')
1768 var also = 'also'
1769 s/from/\=to .. '_' .. also/g#e
1770 assert_equal('one repl_also two repl_also three', getline(1))
1771
Bram Moolenaar8238f082021-04-20 21:10:48 +02001772 setline(1, 'abc abc abc')
1773 for choice in [true, false]
1774 :1s/abc/\=choice ? 'yes' : 'no'/
1775 endfor
1776 assert_equal('yes no abc', getline(1))
1777
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01001778 setline(1, 'from')
1779 v9.CheckDefExecFailure(['s/from/\=g:notexist/'], 'E121: Undefined variable: g:notexist')
1780
Bram Moolenaard386e922021-04-25 14:48:49 +02001781 bwipe!
1782
Bram Moolenaar62aec932022-01-29 21:45:34 +00001783 v9.CheckDefFailure(['s/from/\="x")/'], 'E488:')
1784 v9.CheckDefFailure(['s/from/\="x"/9'], 'E488:')
Bram Moolenaar4c137212021-04-19 16:48:48 +02001785
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00001786 v9.CheckDefExecFailure(['s/this/\="that"/'], 'E486:')
1787
Bram Moolenaard386e922021-04-25 14:48:49 +02001788 # When calling a function the right instruction list needs to be restored.
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001789 g:cond = true
Bram Moolenaard386e922021-04-25 14:48:49 +02001790 var lines =<< trim END
1791 vim9script
1792 def Foo()
1793 Bar([])
1794 enddef
1795 def Bar(l: list<number>)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001796 if g:cond
Bram Moolenaard386e922021-04-25 14:48:49 +02001797 s/^/\=Rep()/
1798 for n in l[:]
1799 endfor
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001800 endif
Bram Moolenaard386e922021-04-25 14:48:49 +02001801 enddef
1802 def Rep(): string
1803 return 'rep'
1804 enddef
1805 new
1806 Foo()
1807 assert_equal('rep', getline(1))
1808 bwipe!
1809 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001810 v9.CheckScriptSuccess(lines)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001811 unlet g:cond
Bram Moolenaar27523602021-06-05 21:36:19 +02001812
1813 # List results in multiple lines
1814 new
1815 setline(1, 'some text here')
Bram Moolenaar2c707112021-08-02 22:26:56 +02001816 s/text/\=['aaa', 'bbb', 'ccc']/
Bram Moolenaar27523602021-06-05 21:36:19 +02001817 assert_equal(['some aaa', 'bbb', 'ccc', ' here'], getline(1, '$'))
1818 bwipe!
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001819
1820 # inside "if 0" substitute is ignored
1821 if 0
1822 s/a/\=nothing/ and | some more
1823 endif
Bram Moolenaar4c137212021-04-19 16:48:48 +02001824enddef
1825
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001826def Test_redir_to_var()
1827 var result: string
1828 redir => result
1829 echo 'something'
1830 redir END
1831 assert_equal("\nsomething", result)
1832
1833 redir =>> result
1834 echo 'more'
1835 redir END
1836 assert_equal("\nsomething\nmore", result)
1837
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001838 var d: dict<string>
1839 redir => d.redir
1840 echo 'dict'
1841 redir END
1842 assert_equal({redir: "\ndict"}, d)
1843
1844 var l = ['a', 'b', 'c']
1845 redir => l[1]
1846 echo 'list'
1847 redir END
1848 assert_equal(['a', "\nlist", 'c'], l)
1849
1850 var dl = {l: ['x']}
1851 redir => dl.l[0]
1852 echo 'dict-list'
1853 redir END
1854 assert_equal({l: ["\ndict-list"]}, dl)
1855
Bram Moolenaara369c3d2021-04-21 16:00:10 +02001856 redir =>> d.redir
1857 echo 'more'
1858 redir END
1859 assert_equal({redir: "\ndict\nmore"}, d)
1860
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001861 var lines =<< trim END
1862 redir => notexist
1863 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001864 v9.CheckDefFailure(lines, 'E1089:')
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001865
1866 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001867 var text: string
1868 redir => text
1869 END
1870 v9.CheckDefFailure(lines, 'E1185:')
1871
1872 lines =<< trim END
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001873 var ls = 'asdf'
1874 redir => ls[1]
1875 redir END
1876 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001877 v9.CheckDefFailure(lines, 'E1141:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001878
1879 lines =<< trim END
1880 var text: string
1881 redir => text
1882 echo 'hello'
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001883 redir > Xnopfile
Bram Moolenaar003312b2021-12-20 10:55:35 +00001884 redir END
1885 END
Bram Moolenaar02a977e2022-02-03 21:29:39 +00001886 v9.CheckDefFailure(lines, 'E1092:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001887
1888 lines =<< trim END
1889 var text: number
1890 redir => text
1891 echo 'hello'
1892 redir END
1893 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001894 v9.CheckDefFailure(lines, 'E1012:')
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001895enddef
1896
Bram Moolenaar68db9962021-05-09 23:19:22 +02001897def Test_echo_void()
1898 var lines =<< trim END
1899 vim9script
1900 def NoReturn()
1901 echo 'nothing'
1902 enddef
1903 echo NoReturn()
1904 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001905 v9.CheckScriptFailure(lines, 'E1186:', 5)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001906
1907 lines =<< trim END
1908 vim9script
1909 def NoReturn()
1910 echo 'nothing'
1911 enddef
1912 def Try()
1913 echo NoReturn()
1914 enddef
1915 defcompile
1916 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001917 v9.CheckScriptFailure(lines, 'E1186:', 1)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001918enddef
1919
Bram Moolenaar2c707112021-08-02 22:26:56 +02001920def Test_cmdwin_block()
1921 augroup justTesting
1922 autocmd BufEnter * {
1923 echomsg 'in block'
1924 }
1925 augroup END
1926 feedkeys('q:', 'xt')
1927 redraw
1928 feedkeys("aclose\<CR>", 'xt')
1929
1930 au! justTesting
1931enddef
1932
Bram Moolenaar7b829262021-10-13 15:04:34 +01001933def Test_var_not_cmd()
1934 var lines =<< trim END
1935 g:notexist:cmd
1936 END
Bram Moolenaar9510d222022-09-11 15:14:05 +01001937 v9.CheckDefAndScriptFailure(lines, ['E1016: Cannot declare a global variable: g:notexist', "E1069: White space required after ':'"], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001938
1939 lines =<< trim END
1940 g-pat-cmd
1941 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001942 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001943 lines =<< trim END
1944 g.pat.cmd
1945 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001946 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: g', 'E121: Undefined variable: g'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001947
1948 lines =<< trim END
1949 s:notexist:repl
1950 END
Bram Moolenaar9510d222022-09-11 15:14:05 +01001951 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 +00001952
1953 lines =<< trim END
1954 notexist:repl
1955 END
1956 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001957
1958 lines =<< trim END
1959 s-pat-repl
1960 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001961 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001962 lines =<< trim END
1963 s.pat.repl
1964 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001965 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: s', 'E121: Undefined variable: s'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001966
1967 lines =<< trim END
1968 w:notexist->len()
1969 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001970 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: w:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001971
1972 lines =<< trim END
1973 b:notexist->len()
1974 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001975 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: b:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001976
1977 lines =<< trim END
1978 t:notexist->len()
1979 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001980 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: t:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001981enddef
1982
1983def Test_no_space_after_command()
1984 var lines =<< trim END
1985 g /pat/cmd
1986 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001987 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001988 lines =<< trim END
1989 g #pat#cmd
1990 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001991 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001992
1993 new
1994 setline(1, 'some pat')
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001995 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001996 g#pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001997 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001998 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001999 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002000 g# pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002001 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002002 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002003 bwipe!
Bram Moolenaar7b829262021-10-13 15:04:34 +01002004
2005 lines =<< trim END
2006 s /pat/repl
2007 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002008 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002009 lines =<< trim END
2010 s #pat#repl
2011 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002012 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002013 lines =<< trim END
2014 s#pat#repl
2015 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002016 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002017 lines =<< trim END
2018 s# pat#repl
2019 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002020 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002021enddef
2022
Yegappan Lakshmanan2a16dc62021-11-16 17:19:30 +00002023" Test for the 'previewpopup' option
2024def Test_previewpopup()
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002025 set previewpopup=height:10,width:60
Bram Moolenaarb18b4962022-09-02 21:55:50 +01002026 pedit Xppfile
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002027 var id = popup_findpreview()
2028 assert_notequal(id, 0)
Bram Moolenaarb18b4962022-09-02 21:55:50 +01002029 assert_match('Xppfile', popup_getoptions(id).title)
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002030 popup_clear()
2031 set previewpopup&
2032enddef
2033
Bram Moolenaarc8a9fe52021-11-20 19:50:59 +00002034def Test_syntax_enable_clear()
2035 syntax clear
2036 syntax enable
2037 highlight clear String
2038 assert_equal(true, hlget('String')->get(0, {})->get('default', false))
2039 syntax clear
2040enddef
2041
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02002042
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02002043" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker