blob: 4e89c7ffca622937168e167bbf8c28c2b7e16d7b [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
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100123 writefile(lines, 'Xvim9import.vim', 'D')
Bram Moolenaar2a9b62d2022-02-12 13:30:17 +0000124 lines =<< trim END
125 legacy exe "import './Xvim9import.vim'"
126 END
127 v9.CheckScriptSuccess(lines)
Bram Moolenaarcdf04852022-02-12 22:13:06 +0000128
129 # "legacy" does not aply to a called function
130 lines =<< trim END
131 vim9script
132
133 def g:TheFunc()
134 if exists('something')
135 echo 'yes'
136 endif
137 enddef
138 legacy exe 'call g:TheFunc()'
139 END
140 v9.CheckScriptSuccess(lines)
141 delfunc g:TheFunc
Kota Kato3d3f6ac2022-08-04 18:50:14 +0100142
143 # vim9cmd execute(cmd) executes code in vim9 script context
144 lines =<< trim END
145 vim9cmd execute("g:vim9executetest = 'bar'")
146 call assert_equal('bar', g:vim9executetest)
147 END
148 v9.CheckScriptSuccess(lines)
149 unlet g:vim9executetest
150
151 lines =<< trim END
152 vim9cmd execute(["g:vim9executetest1 = 'baz'", "g:vim9executetest2 = 'foo'"])
153 call assert_equal('baz', g:vim9executetest1)
154 call assert_equal('foo', g:vim9executetest2)
155 END
156 v9.CheckScriptSuccess(lines)
157 unlet g:vim9executetest1
158 unlet g:vim9executetest2
159
160 # legacy call execute(cmd) executes code in vim script context
161 lines =<< trim END
162 vim9script
163 legacy call execute("let g:vim9executetest = 'bar'")
164 assert_equal('bar', g:vim9executetest)
165 END
166 v9.CheckScriptSuccess(lines)
167 unlet g:vim9executetest
168
169 lines =<< trim END
170 vim9script
171 legacy call execute(["let g:vim9executetest1 = 'baz'", "let g:vim9executetest2 = 'foo'"])
172 assert_equal('baz', g:vim9executetest1)
173 assert_equal('foo', g:vim9executetest2)
174 END
175 v9.CheckScriptSuccess(lines)
176 unlet g:vim9executetest1
177 unlet g:vim9executetest2
Bram Moolenaar5b1d6e92022-02-11 20:33:48 +0000178enddef
179
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200180def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +0200181 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200182 edit `=filename`
183 assert_equal('Xtest', bufname())
184
Bram Moolenaarac564082020-09-27 19:05:33 +0200185 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200186 edit Xtest`=filenr`
187 assert_equal('Xtest123', bufname())
188
189 filenr = 77
190 edit `=filename``=filenr`
191 assert_equal('Xtest77', bufname())
192
193 edit X`=filename`xx`=filenr`yy
194 assert_equal('XXtestxx77yy', bufname())
Bram Moolenaar025cb1c2020-12-14 18:31:27 +0100195
Bram Moolenaar62aec932022-01-29 21:45:34 +0000196 v9.CheckDefFailure(['edit `=xxx`'], 'E1001:')
197 v9.CheckDefFailure(['edit `="foo"'], 'E1083:')
Bram Moolenaarb288ba92021-06-05 17:10:55 +0200198
199 var files = ['file 1', 'file%2', 'file# 3']
200 args `=files`
201 assert_equal(files, argv())
Bram Moolenaar279d7332021-11-27 11:42:50 +0000202
203 filename = 'Xwindo'
204 windo edit `=filename`
205 assert_equal('Xwindo', bufname())
206
207 filename = 'Xtabdo'
208 tabdo edit `=filename`
209 assert_equal('Xtabdo', bufname())
210
211 filename = 'Xargdo'
212 argdo edit `=filename`
213 assert_equal('Xargdo', bufname())
214
215 :%bwipe!
216 filename = 'Xbufdo'
217 bufdo file `=filename`
218 assert_equal('Xbufdo', bufname())
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200219enddef
220
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100221def Test_expand_alternate_file()
222 var lines =<< trim END
223 edit Xfileone
224 var bone = bufnr()
225 edit Xfiletwo
226 var btwo = bufnr()
227 edit Xfilethree
228 var bthree = bufnr()
229
230 edit #
231 assert_equal(bthree, bufnr())
232 edit %%
233 assert_equal(btwo, bufnr())
234 edit %% # comment
235 assert_equal(bthree, bufnr())
236 edit %%yy
237 assert_equal('Xfiletwoyy', bufname())
238
239 exe "edit %%" .. bone
240 assert_equal(bone, bufnr())
241 exe "edit %%" .. btwo .. "xx"
242 assert_equal('Xfiletwoxx', bufname())
243
244 next Xfileone Xfiletwo Xfilethree
245 assert_equal('Xfileone', argv(0))
246 assert_equal('Xfiletwo', argv(1))
247 assert_equal('Xfilethree', argv(2))
248 next %%%zz
249 assert_equal('Xfileone', argv(0))
250 assert_equal('Xfiletwo', argv(1))
251 assert_equal('Xfilethreezz', argv(2))
252
253 v:oldfiles = ['Xonefile', 'Xtwofile']
254 edit %%<1
255 assert_equal('Xonefile', bufname())
256 edit %%<2
257 assert_equal('Xtwofile', bufname())
258 assert_fails('edit %%<3', 'E684:')
259
260 edit Xfileone.vim
261 edit Xfiletwo
262 edit %%:r
263 assert_equal('Xfileone', bufname())
Bram Moolenaardfbc5fd2021-01-23 15:15:01 +0100264
265 assert_false(bufexists('altfoo'))
266 edit altfoo
267 edit bar
268 assert_true(bufexists('altfoo'))
269 assert_true(buflisted('altfoo'))
270 bdel %%
271 assert_true(bufexists('altfoo'))
272 assert_false(buflisted('altfoo'))
273 bwipe! altfoo
274 bwipe! bar
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100275 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000276 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100277enddef
278
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100279def Test_global_backtick_expansion()
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000280 var name = 'xxx'
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100281 new
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000282 setline(1, ['one', 'two', 'three'])
283 set nomod
284 g/two/edit `=name`
285 assert_equal('xxx', bufname())
286 bwipe!
287
288 new
289 setline(1, ['one', 'two', 'three'])
290 g/two/s/^/`=name`/
291 assert_equal('`=name`two', getline(2))
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100292 bwipe!
293enddef
294
Bram Moolenaarecac5912021-01-05 19:23:28 +0100295def Test_folddo_backtick_expansion()
296 new
297 var name = 'xxx'
298 folddoopen edit `=name`
299 assert_equal('xxx', bufname())
300 bwipe!
301
302 new
303 setline(1, ['one', 'two'])
304 set nomodified
305 :1,2fold
306 foldclose
307 folddoclose edit `=name`
308 assert_equal('xxx', bufname())
309 bwipe!
Bram Moolenaarfad27422021-11-30 21:58:19 +0000310
311 var lines =<< trim END
312 g:val = 'value'
313 def Test()
314 folddoopen echo `=g:val`
315 enddef
316 call Test()
317 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000318 v9.CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
Bram Moolenaarecac5912021-01-05 19:23:28 +0100319enddef
320
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200321def Test_hardcopy_wildcards()
322 CheckUnix
323 CheckFeature postscript
324
Bram Moolenaarac564082020-09-27 19:05:33 +0200325 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200326 hardcopy > X`=outfile`.ps
327 assert_true(filereadable('Xprint.ps'))
328
329 delete('Xprint.ps')
330enddef
331
332def Test_syn_include_wildcards()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100333 writefile(['syn keyword Found found'], 'Xthemine.vim', 'D')
Bram Moolenaarac564082020-09-27 19:05:33 +0200334 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200335 &rtp = '.'
336
Bram Moolenaarac564082020-09-27 19:05:33 +0200337 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200338 syn include @Group Xthe`=fname`.vim
339 assert_match('Found.* contained found', execute('syn list Found'))
340
341 &rtp = save_rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200342enddef
343
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200344def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200345 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200346 vim9script
347 redir @a
348 echo 'one'
349 .. 'two'
350 redir END
351 assert_equal("\nonetwo", @a)
352 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000353 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200354
355 lines =<< trim END
356 vim9script
357 redir @a
358 echo 11 +
359 77
360 - 22
361 redir END
362 assert_equal("\n66", @a)
363 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000364 v9.CheckScriptSuccess(lines)
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200365enddef
366
Bram Moolenaar13106602020-10-04 16:06:05 +0200367def Test_condition_types()
368 var lines =<< trim END
369 if 'text'
370 endif
371 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000372 v9.CheckDefAndScriptFailure(lines, 'E1135:', 1)
Bram Moolenaar13106602020-10-04 16:06:05 +0200373
374 lines =<< trim END
375 if [1]
376 endif
377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000378 v9.CheckDefFailure(lines, 'E1012:', 1)
379 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200380
381 lines =<< trim END
382 g:cond = 'text'
383 if g:cond
384 endif
385 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000386 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200387
388 lines =<< trim END
389 g:cond = 0
390 if g:cond
391 elseif 'text'
392 endif
393 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000394 v9.CheckDefAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200395
396 lines =<< trim END
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000397 g:cond = 0
398 if g:cond
399 elseif 'text' garbage
400 endif
401 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000402 v9.CheckDefAndScriptFailure(lines, 'E488:', 3)
Bram Moolenaar56a8ffd2021-12-01 10:10:22 +0000403
404 lines =<< trim END
405 g:cond = 0
Bram Moolenaar13106602020-10-04 16:06:05 +0200406 if g:cond
407 elseif [1]
408 endif
409 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000410 v9.CheckDefFailure(lines, 'E1012:', 3)
411 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 4)
Bram Moolenaar13106602020-10-04 16:06:05 +0200412
413 lines =<< trim END
414 g:cond = 'text'
415 if 0
416 elseif g:cond
417 endif
418 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000419 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200420
421 lines =<< trim END
422 while 'text'
423 endwhile
424 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000425 v9.CheckDefFailure(lines, 'E1012:', 1)
426 v9.CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200427
428 lines =<< trim END
429 while [1]
430 endwhile
431 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000432 v9.CheckDefFailure(lines, 'E1012:', 1)
433 v9.CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200434
435 lines =<< trim END
436 g:cond = 'text'
437 while g:cond
438 endwhile
439 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000440 v9.CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200441enddef
442
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200443def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200444 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200445 vim9script
446 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200447 true
448 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200449 g:res = 42
450 endif
451 assert_equal(42, g:res)
452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000453 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200454 unlet g:res
455
456 lines =<< trim END
457 vim9script
458 if 1 &&
459 0
460 g:res = 0
461 elseif 0 ||
462 0
463 || 1
464 g:res = 12
465 endif
466 assert_equal(12, g:res)
467 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000468 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200469 unlet g:res
470enddef
471
472def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200473 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200474 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200475 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200476 while nr <
477 10 + 3
478 nr = nr
479 + 4
480 endwhile
481 assert_equal(16, nr)
482 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000483 v9.CheckScriptSuccess(lines)
Bram Moolenaard5053d02020-06-28 15:51:16 +0200484
485 lines =<< trim END
486 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200487 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200488 while nr
489 <
490 10
491 +
492 3
493 nr = nr
494 +
495 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200496 endwhile
497 assert_equal(16, nr)
498 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000499 v9.CheckScriptSuccess(lines)
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200500enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200501
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200502def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200503 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200504 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200505 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200506 for x
507 in
508 [1, 2, 3, 4]
509 nr = nr + x
510 endfor
511 assert_equal(10, nr)
512 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000513 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200514
515 lines =<< trim END
516 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200517 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200518 for x
519 in
520 [1, 2,
521 3, 4
522 ]
523 nr = nr
524 +
525 x
526 endfor
527 assert_equal(10, nr)
528 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000529 v9.CheckScriptSuccess(lines)
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200530enddef
531
Bram Moolenaar62aec932022-01-29 21:45:34 +0000532def s:MethodAfterLinebreak(arg: string)
Bram Moolenaare0890d62021-02-17 14:52:14 +0100533 arg
534 ->setline(1)
535enddef
536
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200537def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200538 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200539 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200540 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200541 func RetArg(
542 arg
543 )
544 let s:res = a:arg
545 endfunc
546 [1,
547 2,
548 3]->RetArg()
549 assert_equal([1, 2, 3], res)
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 v9.CheckScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100552
553 lines =<< trim END
554 new
555 var name = [1, 2]
556 name
557 ->copy()
558 ->setline(1)
559 assert_equal(['1', '2'], getline(1, 2))
560 bwipe!
561 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000562 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100563
564 lines =<< trim END
565 new
Bram Moolenaar6914e872021-03-06 21:01:09 +0100566 def Foo(): string
567 return 'the text'
568 enddef
569 def Bar(F: func): string
570 return F()
571 enddef
572 def Test()
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100573 Foo ->Bar()
574 ->setline(1)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100575 enddef
576 Test()
577 assert_equal('the text', getline(1))
578 bwipe!
579 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000580 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100581
582 lines =<< trim END
583 new
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100584 g:shortlist
585 ->copy()
586 ->setline(1)
587 assert_equal(['1', '2'], getline(1, 2))
588 bwipe!
589 END
590 g:shortlist = [1, 2]
Bram Moolenaar62aec932022-01-29 21:45:34 +0000591 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100592 unlet g:shortlist
Bram Moolenaare0890d62021-02-17 14:52:14 +0100593
594 new
595 MethodAfterLinebreak('foobar')
596 assert_equal('foobar', getline(1))
597 bwipe!
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100598
599 lines =<< trim END
600 vim9script
601 def Foo(): string
602 return '# some text'
603 enddef
604
605 def Bar(F: func): string
606 return F()
607 enddef
608
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100609 Foo->Bar()
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100610 ->setline(1)
611 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000612 v9.CheckScriptSuccess(lines)
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100613 assert_equal('# some text', getline(1))
614 bwipe!
Bram Moolenaar5f195932020-07-01 20:07:14 +0200615enddef
616
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100617def Test_method_call_whitespace()
618 var lines =<< trim END
619 new
620 var yank = 'text'
621 yank->setline(1)
622 yank ->setline(2)
623 yank-> setline(3)
624 yank -> setline(4)
625 assert_equal(['text', 'text', 'text', 'text'], getline(1, 4))
626 bwipe!
627 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000628 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100629enddef
630
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100631def Test_method_and_user_command()
632 var lines =<< trim END
633 vim9script
634 def Cmd()
635 g:didFunc = 1
636 enddef
637 command Cmd g:didCmd = 1
638 Cmd
639 assert_equal(1, g:didCmd)
640 Cmd()
641 assert_equal(1, g:didFunc)
642 unlet g:didFunc
643 unlet g:didCmd
644
645 def InDefFunc()
646 Cmd
647 assert_equal(1, g:didCmd)
648 Cmd()
649 assert_equal(1, g:didFunc)
650 unlet g:didFunc
651 unlet g:didCmd
652 enddef
653 InDefFunc()
654 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000655 v9.CheckScriptSuccess(lines)
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100656enddef
657
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200658def Test_option_use_linebreak()
659 var lines =<< trim END
660 new
661 &matchpairs = '(:)'
662 &matchpairs->setline(1)
663 &matchpairs = '[:]'
664 &matchpairs ->setline(2)
665 &matchpairs = '{:}'
666 &matchpairs
667 ->setline(3)
668 assert_equal(['(:)', '[:]', '{:}'], getline(1, '$'))
669 bwipe!
670 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000671 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200672enddef
673
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200674def Test_use_register()
Bram Moolenaar73170912021-08-22 22:44:11 +0200675 var lines =<< trim END
676 new
677 @a = 'one'
678 @a->setline(1)
679 @b = 'two'
680 @b ->setline(2)
681 @c = 'three'
682 @c
683 ->setline(3)
684 assert_equal(['one', 'two', 'three'], getline(1, '$'))
685 bwipe!
686 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000687 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200688
689 lines =<< trim END
690 @a = 'echo "text"'
691 @a
692 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000693 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000694
695 lines =<< trim END
Bram Moolenaarea720382022-05-05 16:08:55 +0100696 @a = 'echo "text"'
697 @a
698
699 END
700 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
701
702 lines =<< trim END
703 @a = 'echo "text"'
704 @a
705 # comment
706 END
707 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
708
709 lines =<< trim END
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000710 @/ = 'pattern'
711 @/
712 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000713 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000714
715 lines =<< trim END
716 &opfunc = 'nothing'
717 &opfunc
718 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000719 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000720 &opfunc = ''
721
722 lines =<< trim END
723 &l:showbreak = 'nothing'
724 &l:showbreak
725 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000726 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000727 &l:showbreak = ''
728
729 lines =<< trim END
730 &g:showbreak = 'nothing'
731 &g:showbreak
732 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000733 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000734 &g:showbreak = ''
Bram Moolenaar65259b52021-11-23 14:52:06 +0000735
736 lines =<< trim END
737 $SomeEnv = 'value'
738 $SomeEnv
739 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000740 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaar65259b52021-11-23 14:52:06 +0000741 $SomeEnv = ''
Bram Moolenaar0d032632022-05-17 12:45:15 +0100742
743 lines =<< trim END
744 eval 'value'
745 END
746 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
747
748 lines =<< trim END
749 eval "value"
750 END
751 v9.CheckDefAndScriptFailure(lines, 'E1207:', 1)
Bram Moolenaar73170912021-08-22 22:44:11 +0200752enddef
753
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200754def Test_environment_use_linebreak()
755 var lines =<< trim END
756 new
757 $TESTENV = 'one'
758 $TESTENV->setline(1)
759 $TESTENV = 'two'
760 $TESTENV ->setline(2)
761 $TESTENV = 'three'
762 $TESTENV
763 ->setline(3)
764 assert_equal(['one', 'two', 'three'], getline(1, '$'))
765 bwipe!
766 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000767 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200768enddef
769
Bram Moolenaar683581e2020-10-22 21:22:58 +0200770def Test_skipped_expr_linebreak()
771 if 0
772 var x = []
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100773 ->map(() => 0)
Bram Moolenaar683581e2020-10-22 21:22:58 +0200774 endif
775enddef
776
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200777def Test_dict_member()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100778 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200779 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100780 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200781 test.data
782 ->reverse()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100783 assert_equal({data: [3, 2, 1]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200784
Bram Moolenaarac564082020-09-27 19:05:33 +0200785 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200786 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100787 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200788 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100789 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200790 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000791 v9.CheckScriptSuccess(lines)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200792enddef
793
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200794def Test_bar_after_command()
795 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200796 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200797 redraw | echo x
798 enddef
799 RedrawAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000800 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200801
Bram Moolenaar788123c2020-07-05 15:32:17 +0200802 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200803 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200804 reg_executing() | echo x
805 enddef
806 CallAndEcho()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000807 assert_match('did redraw', g:Screenline(&lines))
Bram Moolenaar788123c2020-07-05 15:32:17 +0200808
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200809 if has('unix')
810 # bar in filter write command does not start new command
811 def WriteToShell()
812 new
813 setline(1, 'some text')
814 w !cat | cat > Xoutfile
815 bwipe!
816 enddef
817 WriteToShell()
818 assert_equal(['some text'], readfile('Xoutfile'))
819 delete('Xoutfile')
820
821 # bar in filter read command does not start new command
822 def ReadFromShell()
823 new
824 r! echo hello there | cat > Xoutfile
825 r !echo again | cat >> Xoutfile
826 bwipe!
827 enddef
828 ReadFromShell()
829 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
830 delete('Xoutfile')
831 endif
832enddef
833
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200834def Test_filter_is_not_modifier()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100835 var tags = [{a: 1, b: 2}, {x: 3, y: 4}]
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100836 filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 )
Bram Moolenaare0de1712020-12-02 17:36:54 +0100837 assert_equal([{x: 3, y: 4}], tags)
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200838enddef
839
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100840def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100841 var lines =<< trim END
842 final expected = "\nType Name Content\n c \"c piyo"
843 @a = 'hoge'
844 @b = 'fuga'
845 @c = 'piyo'
846
847 assert_equal(execute('filter /piyo/ registers abc'), expected)
848 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000849 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare729ce22021-06-06 21:38:09 +0200850
851 # also do this compiled
852 lines =<< trim END
853 @a = 'very specific z3d37dh234 string'
854 filter z3d37dh234 registers
Bram Moolenaar62aec932022-01-29 21:45:34 +0000855 assert_match('very specific z3d37dh234 string', g:Screenline(&lines))
Bram Moolenaare729ce22021-06-06 21:38:09 +0200856 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000857 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar06bffe82021-11-28 20:24:17 +0000858
859 lines =<< trim END
860 edit foobar
861 redir => g:filter_out
862 filter #foobar# ls
863 redir END
864 assert_match('"foobar"', g:filter_out)
865 unlet g:filter_out
866 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000867 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100868enddef
869
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100870def Test_win_command_modifiers()
871 assert_equal(1, winnr('$'))
872
873 set splitright
874 vsplit
875 assert_equal(2, winnr())
876 close
877 aboveleft vsplit
878 assert_equal(1, winnr())
879 close
880 set splitright&
881
882 vsplit
883 assert_equal(1, winnr())
884 close
885 belowright vsplit
886 assert_equal(2, winnr())
887 close
888 rightbelow vsplit
889 assert_equal(2, winnr())
890 close
891
Bram Moolenaar97a19002020-11-01 22:15:44 +0100892 if has('browse')
893 browse set
894 assert_equal('option-window', expand('%'))
895 close
896 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100897
898 vsplit
899 botright split
900 assert_equal(3, winnr())
901 assert_equal(&columns, winwidth(0))
902 close
903 close
904
905 vsplit
906 topleft split
907 assert_equal(1, winnr())
908 assert_equal(&columns, winwidth(0))
909 close
910 close
911
912 gettabinfo()->len()->assert_equal(1)
913 tab split
914 gettabinfo()->len()->assert_equal(2)
915 tabclose
916
917 vertical new
918 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
919 close
920enddef
921
922func Test_command_modifier_confirm()
923 CheckNotGui
924 CheckRunVimInTerminal
925
926 " Test for saving all the modified buffers
927 let lines =<< trim END
928 call setline(1, 'changed')
929 def Getout()
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100930 confirm write Xcmodfile
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100931 enddef
932 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100933 call writefile(lines, 'Xconfirmscript', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100934 call writefile(['empty'], 'Xcmodfile')
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100935 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
936 call term_sendkeys(buf, ":call Getout()\n")
937 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
938 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100939 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
940 call term_sendkeys(buf, "\<CR>")
941 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100942 call StopVimInTerminal(buf)
943
Bram Moolenaarb18b4962022-09-02 21:55:50 +0100944 call assert_equal(['changed'], readfile('Xcmodfile'))
945 call delete('Xcmodfile')
946 call delete('.Xcmodfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100947endfunc
948
949def Test_command_modifiers_keep()
950 if has('unix')
951 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
952 new
953 setline(1, ['one', 'two', 'three'])
954 normal 1Gma
955 normal 2Gmb
956 normal 3Gmc
957 if addRflag
958 set cpo+=R
959 else
960 set cpo-=R
961 endif
962 if keepMarks
963 keepmarks :%!cat
964 else
965 :%!cat
966 endif
967 if hasMarks
968 assert_equal(1, line("'a"))
969 assert_equal(2, line("'b"))
970 assert_equal(3, line("'c"))
971 else
972 assert_equal(0, line("'a"))
973 assert_equal(0, line("'b"))
974 assert_equal(0, line("'c"))
975 endif
976 quit!
977 enddef
978 DoTest(false, false, true)
979 DoTest(true, false, false)
980 DoTest(false, true, true)
981 DoTest(true, true, true)
982 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100983
984 new
985 setline(1, ['one', 'two', 'three', 'four'])
986 assert_equal(4, line("$"))
987 normal 1Gma
988 normal 2Gmb
989 normal 3Gmc
990 lockmarks :1,2!wc
991 # line is deleted, marks don't move
992 assert_equal(3, line("$"))
993 assert_equal('four', getline(3))
994 assert_equal(1, line("'a"))
995 assert_equal(2, line("'b"))
996 assert_equal(3, line("'c"))
997 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100998 endif
999
Bram Moolenaarf65b35b2020-11-04 18:02:44 +01001000 edit Xone
1001 edit Xtwo
1002 assert_equal('Xone', expand('#'))
1003 keepalt edit Xthree
1004 assert_equal('Xone', expand('#'))
1005
1006 normal /a*b*
1007 assert_equal('a*b*', histget("search"))
1008 keeppatterns normal /c*d*
1009 assert_equal('a*b*', histget("search"))
1010
1011 new
1012 setline(1, range(10))
1013 :10
1014 normal gg
1015 assert_equal(10, getpos("''")[1])
1016 keepjumps normal 5G
1017 assert_equal(10, getpos("''")[1])
1018 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001019enddef
1020
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001021def Test_bar_line_continuation()
1022 var lines =<< trim END
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001023 au BufNewFile XveryNewFile g:readFile = 1
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001024 | g:readExtra = 2
1025 g:readFile = 0
1026 g:readExtra = 0
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001027 edit XveryNewFile
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001028 assert_equal(1, g:readFile)
1029 assert_equal(2, g:readExtra)
1030 bwipe!
1031 au! BufNewFile
1032
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001033 au BufNewFile XveryNewFile g:readFile = 1
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001034 | g:readExtra = 2
1035 | g:readMore = 3
1036 g:readFile = 0
1037 g:readExtra = 0
1038 g:readMore = 0
Bram Moolenaar38ea5bd2022-08-20 20:09:14 +01001039 edit XveryNewFile
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001040 assert_equal(1, g:readFile)
1041 assert_equal(2, g:readExtra)
1042 assert_equal(3, g:readMore)
1043 bwipe!
1044 au! BufNewFile
1045 unlet g:readFile
1046 unlet g:readExtra
1047 unlet g:readMore
1048 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001049 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8242ebb2020-12-29 11:15:01 +01001050enddef
1051
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001052def Test_command_modifier_other()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001053 new Xsomefile
1054 setline(1, 'changed')
1055 var buf = bufnr()
1056 hide edit Xotherfile
1057 var info = getbufinfo(buf)
1058 assert_equal(1, info[0].hidden)
1059 assert_equal(1, info[0].changed)
1060 edit Xsomefile
1061 bwipe!
1062
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001063 au BufNewFile Xcmofile g:readFile = 1
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001064 g:readFile = 0
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001065 edit Xcmofile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001066 assert_equal(1, g:readFile)
1067 bwipe!
1068 g:readFile = 0
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001069 noautocmd edit Xcmofile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001070 assert_equal(0, g:readFile)
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001071 au! BufNewFile
Bram Moolenaardcc58e02020-12-28 20:53:21 +01001072 unlet g:readFile
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001073
1074 noswapfile edit XnoSwap
Bram Moolenaardd1f4262020-12-31 17:41:01 +01001075 assert_equal(false, &l:swapfile)
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001076 bwipe!
1077
1078 var caught = false
1079 try
1080 sandbox !ls
1081 catch /E48:/
1082 caught = true
1083 endtry
1084 assert_true(caught)
1085
1086 :8verbose g:verbose_now = &verbose
1087 assert_equal(8, g:verbose_now)
1088 unlet g:verbose_now
1089enddef
1090
Bram Moolenaar62aec932022-01-29 21:45:34 +00001091def s:EchoHere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001092 echomsg 'here'
1093enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001094def s:EchoThere()
Bram Moolenaar66669fc2020-11-04 18:53:35 +01001095 unsilent echomsg 'there'
1096enddef
1097
1098def Test_modifier_silent_unsilent()
1099 echomsg 'last one'
1100 silent echomsg "text"
1101 assert_equal("\nlast one", execute(':1messages'))
1102
1103 silent! echoerr "error"
1104
1105 echomsg 'last one'
1106 silent EchoHere()
1107 assert_equal("\nlast one", execute(':1messages'))
1108
1109 silent EchoThere()
1110 assert_equal("\nthere", execute(':1messages'))
Bram Moolenaar20a76292020-12-25 19:47:24 +01001111
1112 try
1113 silent eval [][0]
1114 catch
1115 echomsg "caught"
1116 endtry
1117 assert_equal("\ncaught", execute(':1messages'))
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001118
1119 var lines =<< trim END
1120 vim9script
1121 set history=11
1122 silent! while 0
1123 set history=22
1124 silent! endwhile
1125 assert_equal(11, &history)
1126 set history&
1127 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001128 v9.CheckScriptSuccess(lines)
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001129enddef
1130
Bram Moolenaar36113e42020-11-02 21:08:47 +01001131def Test_range_after_command_modifier()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001132 v9.CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2)
Bram Moolenaar36113e42020-11-02 21:08:47 +01001133 new
1134 setline(1, 'xxx')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001135 v9.CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
Bram Moolenaar36113e42020-11-02 21:08:47 +01001136 assert_equal('', getline(1))
1137 bwipe!
Bram Moolenaarb579f6e2021-12-04 11:57:00 +00001138
1139 var lines =<< trim END
1140 legacy /pat/
1141 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001142 v9.CheckDefExecAndScriptFailure(lines, 'E486: Pattern not found: pat')
Bram Moolenaar36113e42020-11-02 21:08:47 +01001143enddef
1144
Bram Moolenaarece0b872021-01-08 20:40:45 +01001145def Test_silent_pattern()
1146 new
1147 silent! :/pat/put _
1148 bwipe!
1149enddef
1150
Bram Moolenaarfa984412021-03-25 22:15:28 +01001151def Test_useless_command_modifier()
1152 g:maybe = true
1153 var lines =<< trim END
1154 if g:maybe
1155 silent endif
1156 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001157 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001158
1159 lines =<< trim END
1160 for i in [0]
1161 silent endfor
1162 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001163 v9.CheckDefFailure(lines, 'E1176:', 2)
1164 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001165
1166 lines =<< trim END
1167 while g:maybe
1168 silent endwhile
1169 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001170 v9.CheckDefFailure(lines, 'E1176:', 2)
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001171 g:maybe = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001172 v9.CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001173
1174 lines =<< trim END
1175 silent try
1176 finally
1177 endtry
1178 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001179 v9.CheckDefAndScriptFailure(lines, 'E1176:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001180
1181 lines =<< trim END
1182 try
1183 silent catch
1184 endtry
1185 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001186 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001187
1188 lines =<< trim END
1189 try
1190 silent finally
1191 endtry
1192 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001193 v9.CheckDefAndScriptFailure(lines, 'E1176:', 2)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001194
1195 lines =<< trim END
1196 try
1197 finally
1198 silent endtry
1199 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001200 v9.CheckDefAndScriptFailure(lines, 'E1176:', 3)
Bram Moolenaarbc510062022-02-14 21:19:04 +00001201
1202 lines =<< trim END
1203 leftabove
1204 END
1205 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
1206
1207 lines =<< trim END
1208 leftabove # comment
1209 END
1210 v9.CheckDefAndScriptFailure(lines, 'E1082:', 1)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001211enddef
1212
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001213def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 var from = 3
1215 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001216 g:val = 111
1217 def Increment(nrs: list<number>)
1218 for nr in nrs
1219 g:val += nr
1220 endfor
1221 enddef
1222 eval range(from, to)
1223 ->Increment()
1224 assert_equal(111 + 3 + 4 + 5, g:val)
1225 unlet g:val
Bram Moolenaard0fe6202020-12-05 17:11:12 +01001226
1227 var lines =<< trim END
1228 vim9script
1229 g:caught = 'no'
1230 try
1231 eval 123 || 0
1232 catch
1233 g:caught = 'yes'
1234 endtry
1235 assert_equal('yes', g:caught)
1236 unlet g:caught
1237 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001238 v9.CheckScriptSuccess(lines)
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001239enddef
1240
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001241def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001242 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001243 nnoremap <F3> :echo 'hit F3 #'<CR>
1244 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
1245 END
Bram Moolenaarac485062022-03-23 19:45:01 +00001246 v9.CheckDefAndScriptSuccess(lines)
1247
1248 # backslash before bar is not removed
1249 lines =<< trim END
1250 vim9script
1251
1252 def Init()
1253 noremap <buffer> <F5> <ScriptCmd>MyFunc('a') \| MyFunc('b')<CR>
1254 enddef
1255 Init()
1256 unmap <buffer> <F5>
1257 END
1258 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001259enddef
1260
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001261def Test_normal_command()
1262 new
1263 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +02001264 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001265 try
1266 exe "norm! \<C-]>"
1267 catch /E433/
1268 caught = 2
1269 endtry
1270 assert_equal(2, caught)
1271
1272 try
1273 exe "norm! 3\<C-]>"
1274 catch /E433/
1275 caught = 3
1276 endtry
1277 assert_equal(3, caught)
1278 bwipe!
1279enddef
1280
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001281def Test_put_command()
1282 new
1283 @p = 'ppp'
1284 put p
1285 assert_equal('ppp', getline(2))
1286
1287 put ='below'
1288 assert_equal('below', getline(3))
1289 put! ='above'
1290 assert_equal('above', getline(3))
1291 assert_equal('below', getline(4))
1292
Bram Moolenaar883cf972021-01-15 18:04:43 +01001293 :2put =['a', 'b', 'c']
1294 assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
1295
Bram Moolenaard0b7bfa2022-03-12 14:51:16 +00001296 :0put = 'first'
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001297 assert_equal('first', getline(1))
1298 :1put! ='first again'
1299 assert_equal('first again', getline(1))
1300
Bram Moolenaar08597872020-12-10 19:43:40 +01001301 # compute range at runtime
Bram Moolenaar4e713ba2022-02-07 15:31:37 +00001302 :%del
Bram Moolenaar08597872020-12-10 19:43:40 +01001303 setline(1, range(1, 8))
1304 @a = 'aaa'
1305 :$-2put a
1306 assert_equal('aaa', getline(7))
1307
1308 setline(1, range(1, 8))
1309 :2
1310 :+2put! a
1311 assert_equal('aaa', getline(4))
1312
Bram Moolenaara28639e2021-01-19 22:48:09 +01001313 []->mapnew(() => 0)
1314 :$put ='end'
1315 assert_equal('end', getline('$'))
1316
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001317 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001318
Bram Moolenaar62aec932022-01-29 21:45:34 +00001319 v9.CheckDefFailure(['put =xxx'], 'E1001:')
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001320enddef
1321
1322def Test_put_with_linebreak()
1323 new
1324 var lines =<< trim END
1325 vim9script
1326 pu =split('abc', '\zs')
1327 ->join()
1328 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001329 v9.CheckScriptSuccess(lines)
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001330 getline(2)->assert_equal('a b c')
1331 bwipe!
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001332enddef
1333
Bram Moolenaar3bd8de42020-09-14 16:37:34 +02001334def Test_command_star_range()
1335 new
1336 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
1337 setpos("'<", [0, 1, 0, 0])
1338 setpos("'>", [0, 3, 0, 0])
1339 :*s/\(foo\|bar\)/baz/g
1340 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
1341
1342 bwipe!
1343enddef
1344
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001345def Test_f_args()
1346 var lines =<< trim END
1347 vim9script
1348
1349 func SaveCmdArgs(...)
1350 let g:args = a:000
1351 endfunc
1352
1353 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
1354
1355 TestFArgs
1356 assert_equal([], g:args)
1357
1358 TestFArgs one two three
1359 assert_equal(['one', 'two', 'three'], g:args)
1360 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001361 v9.CheckScriptSuccess(lines)
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001362enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001363
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001364def Test_user_command_comment()
1365 command -nargs=1 Comd echom <q-args>
1366
1367 var lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001368 vim9script
1369 Comd # comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001370 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001371 v9.CheckScriptSuccess(lines)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001372
1373 lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001374 vim9script
1375 Comd# comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001376 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001377 v9.CheckScriptFailure(lines, 'E1144:')
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001378 delcommand Comd
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001379
1380 lines =<< trim END
1381 vim9script
1382 command Foo echo 'Foo'
1383 Foo3Bar
1384 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001385 v9.CheckScriptFailure(lines, 'E1144: Command "Foo" is not followed by white space: Foo3Bar')
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001386
1387 delcommand Foo
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001388enddef
1389
Bram Moolenaar95388e32020-11-20 21:07:00 +01001390def Test_star_command()
1391 var lines =<< trim END
1392 vim9script
1393 @s = 'g:success = 8'
1394 set cpo+=*
1395 exe '*s'
1396 assert_equal(8, g:success)
1397 unlet g:success
1398 set cpo-=*
1399 assert_fails("exe '*s'", 'E1050:')
1400 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001401 v9.CheckScriptSuccess(lines)
Bram Moolenaar95388e32020-11-20 21:07:00 +01001402enddef
1403
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001404def Test_cmd_argument_without_colon()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001405 new Xawcfile
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001406 setline(1, ['a', 'b', 'c', 'd'])
1407 write
1408 edit +3 %
1409 assert_equal(3, getcurpos()[1])
1410 edit +/a %
1411 assert_equal(1, getcurpos()[1])
1412 bwipe
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001413 delete('Xawcfile')
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001414enddef
1415
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001416def Test_ambiguous_user_cmd()
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001417 command Cmd1 eval 0
1418 command Cmd2 eval 0
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001419 var lines =<< trim END
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001420 Cmd
1421 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001422 v9.CheckDefAndScriptFailure(lines, 'E464:', 1)
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001423 delcommand Cmd1
1424 delcommand Cmd2
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001425enddef
1426
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001427def Test_command_not_recognized()
1428 var lines =<< trim END
1429 d.key = 'asdf'
1430 END
Bram Moolenaar97f8c102022-04-02 19:43:57 +01001431 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
1432
1433 lines =<< trim END
1434 d['key'] = 'asdf'
1435 END
1436 v9.CheckDefFailure(lines, 'E1089: Unknown variable: d', 1)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001437
1438 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001439 if 0
1440 d.key = 'asdf'
1441 endif
1442 END
1443 v9.CheckDefSuccess(lines)
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001444enddef
Bram Moolenaarb7a78f72020-06-28 18:43:40 +02001445
Bram Moolenaarf4e20992020-12-21 19:59:08 +01001446def Test_magic_not_used()
1447 new
1448 for cmd in ['set magic', 'set nomagic']
1449 exe cmd
1450 setline(1, 'aaa')
1451 s/.../bbb/
1452 assert_equal('bbb', getline(1))
1453 endfor
1454
1455 set magic
1456 setline(1, 'aaa')
1457 assert_fails('s/.\M../bbb/', 'E486:')
1458 assert_fails('snomagic/.../bbb/', 'E486:')
1459 assert_equal('aaa', getline(1))
1460
1461 bwipe!
1462enddef
1463
Bram Moolenaar60f63102020-12-21 20:32:43 +01001464def Test_gdefault_not_used()
1465 new
1466 for cmd in ['set gdefault', 'set nogdefault']
1467 exe cmd
1468 setline(1, 'aaa')
1469 s/./b/
1470 assert_equal('baa', getline(1))
1471 endfor
1472
1473 set nogdefault
1474 bwipe!
1475enddef
1476
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001477def s:SomeComplFunc(findstart: number, base: string): any
Bram Moolenaar179eb562020-12-27 18:03:22 +01001478 if findstart
1479 return 0
1480 else
1481 return ['aaa', 'bbb']
1482 endif
1483enddef
1484
1485def Test_insert_complete()
1486 # this was running into an error with the matchparen hack
1487 new
1488 set completefunc=SomeComplFunc
1489 feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx')
1490 assert_equal('aaa', getline(1))
1491
1492 set completefunc=
1493 bwipe!
1494enddef
1495
Bram Moolenaara11919f2021-01-02 19:44:56 +01001496def Test_wincmd()
1497 split
1498 var id1 = win_getid()
1499 if true
1500 try | wincmd w | catch | endtry
1501 endif
1502 assert_notequal(id1, win_getid())
1503 close
Bram Moolenaar1ff89de2021-03-24 20:08:12 +01001504
1505 split
1506 var id = win_getid()
1507 split
1508 :2wincmd o
1509 assert_equal(id, win_getid())
1510 only
1511
1512 split
1513 split
1514 assert_equal(3, winnr('$'))
1515 :2wincmd c
1516 assert_equal(2, winnr('$'))
1517 only
1518
1519 split
1520 split
1521 assert_equal(3, winnr('$'))
1522 :2wincmd q
1523 assert_equal(2, winnr('$'))
1524 only
Bram Moolenaara11919f2021-01-02 19:44:56 +01001525enddef
1526
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001527def Test_windo_missing_endif()
1528 var lines =<< trim END
1529 windo if 1
1530 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001531 v9.CheckDefExecFailure(lines, 'E171:', 1)
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001532enddef
1533
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001534let s:theList = [1, 2, 3]
1535
1536def Test_lockvar()
1537 s:theList[1] = 22
1538 assert_equal([1, 22, 3], s:theList)
1539 lockvar s:theList
1540 assert_fails('theList[1] = 77', 'E741:')
1541 unlockvar s:theList
1542 s:theList[1] = 44
1543 assert_equal([1, 44, 3], s:theList)
1544
Bram Moolenaara99fb232021-12-20 12:25:03 +00001545 if 0
1546 lockvar whatever
1547 endif
1548
Bram Moolenaar70c43d82022-01-26 21:01:15 +00001549 g:lockme = [1, 2, 3]
1550 lockvar 1 g:lockme
1551 g:lockme[1] = 77
1552 assert_equal([1, 77, 3], g:lockme)
1553
1554 lockvar 2 g:lockme
1555 var caught = false
1556 try
1557 g:lockme[1] = 99
1558 catch /E1119:/
1559 caught = true
1560 endtry
1561 assert_true(caught)
1562 assert_equal([1, 77, 3], g:lockme)
1563 unlet g:lockme
1564
1565 # also for non-materialized list
1566 g:therange = range(3)
1567 lockvar 2 g:therange
1568 caught = false
1569 try
1570 g:therange[1] = 99
1571 catch /E1119:/
1572 caught = true
1573 endtry
1574 assert_true(caught)
1575 assert_equal([0, 1, 2], g:therange)
1576 unlet g:therange
1577
Bram Moolenaare939f5e2022-01-26 21:32:59 +00001578 # use exclamation mark for locking deeper
1579 g:nestedlist = [1, [2, 3], 4]
1580 lockvar! g:nestedlist
1581 try
1582 g:nestedlist[1][0] = 9
1583 catch /E1119:/
1584 caught = true
1585 endtry
1586 assert_true(caught)
1587 unlet g:nestedlist
1588
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001589 var d = {a: 1, b: 2}
1590 d.a = 3
1591 d.b = 4
1592 assert_equal({a: 3, b: 4}, d)
1593 lockvar d.a
1594 d.b = 5
1595 var ex = ''
1596 try
1597 d.a = 6
1598 catch
1599 ex = v:exception
1600 endtry
1601 assert_match('E1121:', ex)
Bram Moolenaar83d0cec2022-02-04 21:17:58 +00001602 unlockvar d['a']
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001603 d.a = 7
1604 assert_equal({a: 7, b: 5}, d)
1605
Bram Moolenaar10611952022-04-03 21:11:34 +01001606 caught = false
1607 try
1608 lockvar d.c
1609 catch /E716/
1610 caught = true
1611 endtry
1612 assert_true(caught)
1613
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001614 var lines =<< trim END
1615 vim9script
Bram Moolenaare08be092022-02-17 13:08:26 +00001616 g:bl = 0z1122
1617 lockvar g:bl
1618 def Tryit()
1619 g:bl[1] = 99
1620 enddef
1621 Tryit()
1622 END
1623 v9.CheckScriptFailure(lines, 'E741:', 1)
1624
1625 lines =<< trim END
1626 vim9script
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001627 var theList = [1, 2, 3]
1628 def SetList()
1629 theList[1] = 22
1630 assert_equal([1, 22, 3], theList)
1631 lockvar theList
1632 theList[1] = 77
1633 enddef
1634 SetList()
1635 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001636 v9.CheckScriptFailure(lines, 'E1119', 4)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001637
1638 lines =<< trim END
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001639 vim9script
1640 var theList = [1, 2, 3]
1641 def AddToList()
1642 lockvar theList
1643 theList += [4]
1644 enddef
1645 AddToList()
1646 END
1647 v9.CheckScriptFailure(lines, 'E741', 2)
1648
1649 lines =<< trim END
1650 vim9script
1651 var theList = [1, 2, 3]
1652 def AddToList()
1653 lockvar theList
1654 add(theList, 4)
1655 enddef
1656 AddToList()
1657 END
1658 v9.CheckScriptFailure(lines, 'E741', 2)
1659
Bram Moolenaar6b8c7ba2022-03-20 17:46:06 +00001660 # can unlet a locked list item but not change it
1661 lines =<< trim END
1662 var ll = [1, 2, 3]
1663 lockvar ll[1]
1664 unlet ll[1]
1665 assert_equal([1, 3], ll)
1666 END
1667 v9.CheckDefAndScriptSuccess(lines)
1668 lines =<< trim END
1669 var ll = [1, 2, 3]
1670 lockvar ll[1]
1671 ll[1] = 9
1672 END
1673 v9.CheckDefExecAndScriptFailure(lines, ['E1119:', 'E741'], 3)
1674
1675 # can unlet a locked dict item but not change it
1676 lines =<< trim END
1677 var dd = {a: 1, b: 2}
1678 lockvar dd.a
1679 unlet dd.a
1680 assert_equal({b: 2}, dd)
1681 END
1682 v9.CheckDefAndScriptSuccess(lines)
1683 lines =<< trim END
1684 var dd = {a: 1, b: 2}
1685 lockvar dd.a
1686 dd.a = 3
1687 END
1688 v9.CheckDefExecAndScriptFailure(lines, ['E1121:', 'E741'], 3)
1689
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001690 lines =<< trim END
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001691 var theList = [1, 2, 3]
1692 lockvar theList
1693 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001694 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001695
1696 lines =<< trim END
1697 var theList = [1, 2, 3]
1698 unlockvar theList
1699 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001700 v9.CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001701
1702 lines =<< trim END
1703 vim9script
1704 var name = 'john'
1705 lockvar nameX
1706 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001707 v9.CheckScriptFailure(lines, 'E1246', 3)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001708
1709 lines =<< trim END
1710 vim9script
1711 var name = 'john'
1712 def LockIt()
1713 lockvar nameX
1714 enddef
1715 LockIt()
1716 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001717 v9.CheckScriptFailure(lines, 'E1246', 1)
Bram Moolenaar7a411a32022-04-04 14:58:06 +01001718
1719 lines =<< trim END
1720 vim9script
1721 const name = 'john'
1722 unlockvar name
1723 END
1724 v9.CheckScriptFailure(lines, 'E46', 3)
1725
1726 lines =<< trim END
1727 vim9script
1728 const name = 'john'
1729 def UnLockIt()
1730 unlockvar name
1731 enddef
1732 UnLockIt()
1733 END
1734 v9.CheckScriptFailure(lines, 'E46', 1)
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001735
1736 lines =<< trim END
1737 def _()
Bram Moolenaard1d8f6b2022-08-14 21:28:32 +01001738 lockv
1739 enddef
1740 defcomp
1741 END
Bram Moolenaardbdd16b2022-08-14 21:46:07 +01001742 v9.CheckScriptFailure(lines, 'E179', 1)
1743
1744 lines =<< trim END
1745 def T()
1746 unlet
1747 enddef
1748 defcomp
1749 END
1750 v9.CheckScriptFailure(lines, 'E179', 1)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001751enddef
1752
Bram Moolenaar4c137212021-04-19 16:48:48 +02001753def Test_substitute_expr()
1754 var to = 'repl'
1755 new
1756 setline(1, 'one from two')
1757 s/from/\=to
1758 assert_equal('one repl two', getline(1))
1759
1760 setline(1, 'one from two')
1761 s/from/\=to .. '_x'
1762 assert_equal('one repl_x two', getline(1))
1763
1764 setline(1, 'one from two from three')
1765 var also = 'also'
1766 s/from/\=to .. '_' .. also/g#e
1767 assert_equal('one repl_also two repl_also three', getline(1))
1768
Bram Moolenaar8238f082021-04-20 21:10:48 +02001769 setline(1, 'abc abc abc')
1770 for choice in [true, false]
1771 :1s/abc/\=choice ? 'yes' : 'no'/
1772 endfor
1773 assert_equal('yes no abc', getline(1))
1774
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01001775 setline(1, 'from')
1776 v9.CheckDefExecFailure(['s/from/\=g:notexist/'], 'E121: Undefined variable: g:notexist')
1777
Bram Moolenaard386e922021-04-25 14:48:49 +02001778 bwipe!
1779
Bram Moolenaar62aec932022-01-29 21:45:34 +00001780 v9.CheckDefFailure(['s/from/\="x")/'], 'E488:')
1781 v9.CheckDefFailure(['s/from/\="x"/9'], 'E488:')
Bram Moolenaar4c137212021-04-19 16:48:48 +02001782
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00001783 v9.CheckDefExecFailure(['s/this/\="that"/'], 'E486:')
1784
Bram Moolenaard386e922021-04-25 14:48:49 +02001785 # When calling a function the right instruction list needs to be restored.
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001786 g:cond = true
Bram Moolenaard386e922021-04-25 14:48:49 +02001787 var lines =<< trim END
1788 vim9script
1789 def Foo()
1790 Bar([])
1791 enddef
1792 def Bar(l: list<number>)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001793 if g:cond
Bram Moolenaard386e922021-04-25 14:48:49 +02001794 s/^/\=Rep()/
1795 for n in l[:]
1796 endfor
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001797 endif
Bram Moolenaard386e922021-04-25 14:48:49 +02001798 enddef
1799 def Rep(): string
1800 return 'rep'
1801 enddef
1802 new
1803 Foo()
1804 assert_equal('rep', getline(1))
1805 bwipe!
1806 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001807 v9.CheckScriptSuccess(lines)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001808 unlet g:cond
Bram Moolenaar27523602021-06-05 21:36:19 +02001809
1810 # List results in multiple lines
1811 new
1812 setline(1, 'some text here')
Bram Moolenaar2c707112021-08-02 22:26:56 +02001813 s/text/\=['aaa', 'bbb', 'ccc']/
Bram Moolenaar27523602021-06-05 21:36:19 +02001814 assert_equal(['some aaa', 'bbb', 'ccc', ' here'], getline(1, '$'))
1815 bwipe!
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001816
1817 # inside "if 0" substitute is ignored
1818 if 0
1819 s/a/\=nothing/ and | some more
1820 endif
Bram Moolenaar4c137212021-04-19 16:48:48 +02001821enddef
1822
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001823def Test_redir_to_var()
1824 var result: string
1825 redir => result
1826 echo 'something'
1827 redir END
1828 assert_equal("\nsomething", result)
1829
1830 redir =>> result
1831 echo 'more'
1832 redir END
1833 assert_equal("\nsomething\nmore", result)
1834
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001835 var d: dict<string>
1836 redir => d.redir
1837 echo 'dict'
1838 redir END
1839 assert_equal({redir: "\ndict"}, d)
1840
1841 var l = ['a', 'b', 'c']
1842 redir => l[1]
1843 echo 'list'
1844 redir END
1845 assert_equal(['a', "\nlist", 'c'], l)
1846
1847 var dl = {l: ['x']}
1848 redir => dl.l[0]
1849 echo 'dict-list'
1850 redir END
1851 assert_equal({l: ["\ndict-list"]}, dl)
1852
Bram Moolenaara369c3d2021-04-21 16:00:10 +02001853 redir =>> d.redir
1854 echo 'more'
1855 redir END
1856 assert_equal({redir: "\ndict\nmore"}, d)
1857
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001858 var lines =<< trim END
1859 redir => notexist
1860 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001861 v9.CheckDefFailure(lines, 'E1089:')
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001862
1863 lines =<< trim END
Bram Moolenaar8b716f52022-02-15 21:17:56 +00001864 var text: string
1865 redir => text
1866 END
1867 v9.CheckDefFailure(lines, 'E1185:')
1868
1869 lines =<< trim END
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001870 var ls = 'asdf'
1871 redir => ls[1]
1872 redir END
1873 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001874 v9.CheckDefFailure(lines, 'E1141:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001875
1876 lines =<< trim END
1877 var text: string
1878 redir => text
1879 echo 'hello'
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001880 redir > Xnopfile
Bram Moolenaar003312b2021-12-20 10:55:35 +00001881 redir END
1882 END
Bram Moolenaar02a977e2022-02-03 21:29:39 +00001883 v9.CheckDefFailure(lines, 'E1092:')
Bram Moolenaar003312b2021-12-20 10:55:35 +00001884
1885 lines =<< trim END
1886 var text: number
1887 redir => text
1888 echo 'hello'
1889 redir END
1890 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001891 v9.CheckDefFailure(lines, 'E1012:')
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001892enddef
1893
Bram Moolenaar68db9962021-05-09 23:19:22 +02001894def Test_echo_void()
1895 var lines =<< trim END
1896 vim9script
1897 def NoReturn()
1898 echo 'nothing'
1899 enddef
1900 echo NoReturn()
1901 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001902 v9.CheckScriptFailure(lines, 'E1186:', 5)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001903
1904 lines =<< trim END
1905 vim9script
1906 def NoReturn()
1907 echo 'nothing'
1908 enddef
1909 def Try()
1910 echo NoReturn()
1911 enddef
1912 defcompile
1913 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001914 v9.CheckScriptFailure(lines, 'E1186:', 1)
Bram Moolenaar68db9962021-05-09 23:19:22 +02001915enddef
1916
Bram Moolenaar2c707112021-08-02 22:26:56 +02001917def Test_cmdwin_block()
1918 augroup justTesting
1919 autocmd BufEnter * {
1920 echomsg 'in block'
1921 }
1922 augroup END
1923 feedkeys('q:', 'xt')
1924 redraw
1925 feedkeys("aclose\<CR>", 'xt')
1926
1927 au! justTesting
1928enddef
1929
Bram Moolenaar7b829262021-10-13 15:04:34 +01001930def Test_var_not_cmd()
1931 var lines =<< trim END
1932 g:notexist:cmd
1933 END
Bram Moolenaar9510d222022-09-11 15:14:05 +01001934 v9.CheckDefAndScriptFailure(lines, ['E1016: Cannot declare a global variable: g:notexist', "E1069: White space required after ':'"], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001935
1936 lines =<< trim END
1937 g-pat-cmd
1938 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001939 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001940 lines =<< trim END
1941 g.pat.cmd
1942 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001943 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: g', 'E121: Undefined variable: g'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001944
1945 lines =<< trim END
1946 s:notexist:repl
1947 END
Bram Moolenaar9510d222022-09-11 15:14:05 +01001948 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 +00001949
1950 lines =<< trim END
1951 notexist:repl
1952 END
1953 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001954
1955 lines =<< trim END
1956 s-pat-repl
1957 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001958 v9.CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001959 lines =<< trim END
1960 s.pat.repl
1961 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001962 v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: s', 'E121: Undefined variable: s'], 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001963
1964 lines =<< trim END
1965 w:notexist->len()
1966 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001967 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: w:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001968
1969 lines =<< trim END
1970 b:notexist->len()
1971 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001972 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: b:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001973
1974 lines =<< trim END
1975 t:notexist->len()
1976 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001977 v9.CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: t:notexist', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001978enddef
1979
1980def Test_no_space_after_command()
1981 var lines =<< trim END
1982 g /pat/cmd
1983 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001984 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001985 lines =<< trim END
1986 g #pat#cmd
1987 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001988 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001989
1990 new
1991 setline(1, 'some pat')
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001992 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001993 g#pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001994 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001995 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001996 lines =<< trim END
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00001997 g# pat#print
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001998 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001999 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf78ee2b2022-03-04 23:22:27 +00002000 bwipe!
Bram Moolenaar7b829262021-10-13 15:04:34 +01002001
2002 lines =<< trim END
2003 s /pat/repl
2004 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002005 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002006 lines =<< trim END
2007 s #pat#repl
2008 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002009 v9.CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002010 lines =<< trim END
2011 s#pat#repl
2012 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002013 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01002014 lines =<< trim END
2015 s# pat#repl
2016 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002017 v9.CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01002018enddef
2019
Yegappan Lakshmanan2a16dc62021-11-16 17:19:30 +00002020" Test for the 'previewpopup' option
2021def Test_previewpopup()
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002022 set previewpopup=height:10,width:60
Bram Moolenaarb18b4962022-09-02 21:55:50 +01002023 pedit Xppfile
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002024 var id = popup_findpreview()
2025 assert_notequal(id, 0)
Bram Moolenaarb18b4962022-09-02 21:55:50 +01002026 assert_match('Xppfile', popup_getoptions(id).title)
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00002027 popup_clear()
2028 set previewpopup&
2029enddef
2030
Bram Moolenaarc8a9fe52021-11-20 19:50:59 +00002031def Test_syntax_enable_clear()
2032 syntax clear
2033 syntax enable
2034 highlight clear String
2035 assert_equal(true, hlget('String')->get(0, {})->get('default', false))
2036 syntax clear
2037enddef
2038
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02002039
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02002040" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker