blob: ece3f734f067e18170d0a814e412dd7281dc3f50 [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 Moolenaarcfe435d2020-04-25 20:02:55 +02004source vim9.vim
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
15 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
25 CheckScriptFailure(lines, 'E492:')
26
27 lines =<< trim END
28 vim9script
29 legacy echo "con" . "cat"
30 legacy let str = 'con'
31 legacy let str .= 'cat'
32 END
33 CheckScriptSuccess(lines)
34
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
42 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
53 CheckScriptFailure(lines, 'E115:')
54
55 if has('float')
56 lines =<< trim END
57 vim9script
58 echo .10
59 END
60 CheckScriptSuccess(lines)
61 lines =<< trim END
62 vim9cmd echo .10
63 END
64 CheckScriptSuccess(lines)
65 lines =<< trim END
66 vim9script
67 legacy echo .10
68 END
69 CheckScriptFailure(lines, 'E15:')
70 endif
71
72 echo v:version
73 assert_fails('vim9cmd echo version', 'E121:')
74 lines =<< trim END
75 vim9script
76 echo version
77 END
78 CheckScriptFailure(lines, 'E121:')
79 lines =<< trim END
80 vim9script
81 legacy echo version
82 END
83 CheckScriptSuccess(lines)
Bram Moolenaar39f3b142021-02-14 12:57:36 +010084enddef
85
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020086def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +020087 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020088 edit `=filename`
89 assert_equal('Xtest', bufname())
90
Bram Moolenaarac564082020-09-27 19:05:33 +020091 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020092 edit Xtest`=filenr`
93 assert_equal('Xtest123', bufname())
94
95 filenr = 77
96 edit `=filename``=filenr`
97 assert_equal('Xtest77', bufname())
98
99 edit X`=filename`xx`=filenr`yy
100 assert_equal('XXtestxx77yy', bufname())
Bram Moolenaar025cb1c2020-12-14 18:31:27 +0100101
102 CheckDefFailure(['edit `=xxx`'], 'E1001:')
103 CheckDefFailure(['edit `="foo"'], 'E1083:')
Bram Moolenaarb288ba92021-06-05 17:10:55 +0200104
105 var files = ['file 1', 'file%2', 'file# 3']
106 args `=files`
107 assert_equal(files, argv())
Bram Moolenaar279d7332021-11-27 11:42:50 +0000108
109 filename = 'Xwindo'
110 windo edit `=filename`
111 assert_equal('Xwindo', bufname())
112
113 filename = 'Xtabdo'
114 tabdo edit `=filename`
115 assert_equal('Xtabdo', bufname())
116
117 filename = 'Xargdo'
118 argdo edit `=filename`
119 assert_equal('Xargdo', bufname())
120
121 :%bwipe!
122 filename = 'Xbufdo'
123 bufdo file `=filename`
124 assert_equal('Xbufdo', bufname())
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200125enddef
126
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100127def Test_expand_alternate_file()
128 var lines =<< trim END
129 edit Xfileone
130 var bone = bufnr()
131 edit Xfiletwo
132 var btwo = bufnr()
133 edit Xfilethree
134 var bthree = bufnr()
135
136 edit #
137 assert_equal(bthree, bufnr())
138 edit %%
139 assert_equal(btwo, bufnr())
140 edit %% # comment
141 assert_equal(bthree, bufnr())
142 edit %%yy
143 assert_equal('Xfiletwoyy', bufname())
144
145 exe "edit %%" .. bone
146 assert_equal(bone, bufnr())
147 exe "edit %%" .. btwo .. "xx"
148 assert_equal('Xfiletwoxx', bufname())
149
150 next Xfileone Xfiletwo Xfilethree
151 assert_equal('Xfileone', argv(0))
152 assert_equal('Xfiletwo', argv(1))
153 assert_equal('Xfilethree', argv(2))
154 next %%%zz
155 assert_equal('Xfileone', argv(0))
156 assert_equal('Xfiletwo', argv(1))
157 assert_equal('Xfilethreezz', argv(2))
158
159 v:oldfiles = ['Xonefile', 'Xtwofile']
160 edit %%<1
161 assert_equal('Xonefile', bufname())
162 edit %%<2
163 assert_equal('Xtwofile', bufname())
164 assert_fails('edit %%<3', 'E684:')
165
166 edit Xfileone.vim
167 edit Xfiletwo
168 edit %%:r
169 assert_equal('Xfileone', bufname())
Bram Moolenaardfbc5fd2021-01-23 15:15:01 +0100170
171 assert_false(bufexists('altfoo'))
172 edit altfoo
173 edit bar
174 assert_true(bufexists('altfoo'))
175 assert_true(buflisted('altfoo'))
176 bdel %%
177 assert_true(bufexists('altfoo'))
178 assert_false(buflisted('altfoo'))
179 bwipe! altfoo
180 bwipe! bar
Bram Moolenaar4389f9c2020-12-27 16:55:11 +0100181 END
182 CheckDefAndScriptSuccess(lines)
183enddef
184
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100185def Test_global_backtick_expansion()
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000186 var name = 'xxx'
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100187 new
Bram Moolenaar3d2e0312021-12-01 09:27:20 +0000188 setline(1, ['one', 'two', 'three'])
189 set nomod
190 g/two/edit `=name`
191 assert_equal('xxx', bufname())
192 bwipe!
193
194 new
195 setline(1, ['one', 'two', 'three'])
196 g/two/s/^/`=name`/
197 assert_equal('`=name`two', getline(2))
Bram Moolenaar56ce9ea2020-12-25 18:35:29 +0100198 bwipe!
199enddef
200
Bram Moolenaarecac5912021-01-05 19:23:28 +0100201def Test_folddo_backtick_expansion()
202 new
203 var name = 'xxx'
204 folddoopen edit `=name`
205 assert_equal('xxx', bufname())
206 bwipe!
207
208 new
209 setline(1, ['one', 'two'])
210 set nomodified
211 :1,2fold
212 foldclose
213 folddoclose edit `=name`
214 assert_equal('xxx', bufname())
215 bwipe!
Bram Moolenaarfad27422021-11-30 21:58:19 +0000216
217 var lines =<< trim END
218 g:val = 'value'
219 def Test()
220 folddoopen echo `=g:val`
221 enddef
222 call Test()
223 END
224 CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
Bram Moolenaarecac5912021-01-05 19:23:28 +0100225enddef
226
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200227def Test_hardcopy_wildcards()
228 CheckUnix
229 CheckFeature postscript
230
Bram Moolenaarac564082020-09-27 19:05:33 +0200231 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200232 hardcopy > X`=outfile`.ps
233 assert_true(filereadable('Xprint.ps'))
234
235 delete('Xprint.ps')
236enddef
237
238def Test_syn_include_wildcards()
239 writefile(['syn keyword Found found'], 'Xthemine.vim')
Bram Moolenaarac564082020-09-27 19:05:33 +0200240 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200241 &rtp = '.'
242
Bram Moolenaarac564082020-09-27 19:05:33 +0200243 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +0200244 syn include @Group Xthe`=fname`.vim
245 assert_match('Found.* contained found', execute('syn list Found'))
246
247 &rtp = save_rtp
248 delete('Xthemine.vim')
249enddef
250
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200251def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200252 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +0200253 vim9script
254 redir @a
255 echo 'one'
256 .. 'two'
257 redir END
258 assert_equal("\nonetwo", @a)
259 END
260 CheckScriptSuccess(lines)
261
262 lines =<< trim END
263 vim9script
264 redir @a
265 echo 11 +
266 77
267 - 22
268 redir END
269 assert_equal("\n66", @a)
270 END
271 CheckScriptSuccess(lines)
272enddef
273
Bram Moolenaar13106602020-10-04 16:06:05 +0200274def Test_condition_types()
275 var lines =<< trim END
276 if 'text'
277 endif
278 END
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100279 CheckDefAndScriptFailure(lines, 'E1135:', 1)
Bram Moolenaar13106602020-10-04 16:06:05 +0200280
281 lines =<< trim END
282 if [1]
283 endif
284 END
285 CheckDefFailure(lines, 'E1012:', 1)
286 CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
287
288 lines =<< trim END
289 g:cond = 'text'
290 if g:cond
291 endif
292 END
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100293 CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200294
295 lines =<< trim END
296 g:cond = 0
297 if g:cond
298 elseif 'text'
299 endif
300 END
Bram Moolenaar69535d82021-11-30 21:39:39 +0000301 CheckDefAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200302
303 lines =<< trim END
304 if g:cond
305 elseif [1]
306 endif
307 END
308 CheckDefFailure(lines, 'E1012:', 2)
309 CheckScriptFailure(['vim9script'] + lines, 'E745:', 3)
310
311 lines =<< trim END
312 g:cond = 'text'
313 if 0
314 elseif g:cond
315 endif
316 END
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100317 CheckDefExecAndScriptFailure(lines, 'E1135:', 3)
Bram Moolenaar13106602020-10-04 16:06:05 +0200318
319 lines =<< trim END
320 while 'text'
321 endwhile
322 END
323 CheckDefFailure(lines, 'E1012:', 1)
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100324 CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200325
326 lines =<< trim END
327 while [1]
328 endwhile
329 END
330 CheckDefFailure(lines, 'E1012:', 1)
331 CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
332
333 lines =<< trim END
334 g:cond = 'text'
335 while g:cond
336 endwhile
337 END
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100338 CheckDefExecAndScriptFailure(lines, 'E1135:', 2)
Bram Moolenaar13106602020-10-04 16:06:05 +0200339enddef
340
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200341def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200342 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200343 vim9script
344 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200345 true
346 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200347 g:res = 42
348 endif
349 assert_equal(42, g:res)
350 END
351 CheckScriptSuccess(lines)
352 unlet g:res
353
354 lines =<< trim END
355 vim9script
356 if 1 &&
357 0
358 g:res = 0
359 elseif 0 ||
360 0
361 || 1
362 g:res = 12
363 endif
364 assert_equal(12, g:res)
365 END
366 CheckScriptSuccess(lines)
367 unlet g:res
368enddef
369
370def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200371 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200372 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200373 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200374 while nr <
375 10 + 3
376 nr = nr
377 + 4
378 endwhile
379 assert_equal(16, nr)
380 END
381 CheckScriptSuccess(lines)
382
383 lines =<< trim END
384 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200385 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200386 while nr
387 <
388 10
389 +
390 3
391 nr = nr
392 +
393 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200394 endwhile
395 assert_equal(16, nr)
396 END
397 CheckScriptSuccess(lines)
398enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200399
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200400def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200401 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200402 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200403 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200404 for x
405 in
406 [1, 2, 3, 4]
407 nr = nr + x
408 endfor
409 assert_equal(10, nr)
410 END
411 CheckScriptSuccess(lines)
412
413 lines =<< trim END
414 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200415 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200416 for x
417 in
418 [1, 2,
419 3, 4
420 ]
421 nr = nr
422 +
423 x
424 endfor
425 assert_equal(10, nr)
426 END
427 CheckScriptSuccess(lines)
428enddef
429
Bram Moolenaare0890d62021-02-17 14:52:14 +0100430def MethodAfterLinebreak(arg: string)
431 arg
432 ->setline(1)
433enddef
434
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200435def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200436 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200437 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200438 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200439 func RetArg(
440 arg
441 )
442 let s:res = a:arg
443 endfunc
444 [1,
445 2,
446 3]->RetArg()
447 assert_equal([1, 2, 3], res)
448 END
449 CheckScriptSuccess(lines)
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100450
451 lines =<< trim END
452 new
453 var name = [1, 2]
454 name
455 ->copy()
456 ->setline(1)
457 assert_equal(['1', '2'], getline(1, 2))
458 bwipe!
459 END
460 CheckDefAndScriptSuccess(lines)
461
462 lines =<< trim END
463 new
Bram Moolenaar6914e872021-03-06 21:01:09 +0100464 def Foo(): string
465 return 'the text'
466 enddef
467 def Bar(F: func): string
468 return F()
469 enddef
470 def Test()
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100471 Foo ->Bar()
472 ->setline(1)
Bram Moolenaar6914e872021-03-06 21:01:09 +0100473 enddef
474 Test()
475 assert_equal('the text', getline(1))
476 bwipe!
477 END
478 CheckDefAndScriptSuccess(lines)
479
480 lines =<< trim END
481 new
Bram Moolenaar148be9b2021-02-02 21:33:52 +0100482 g:shortlist
483 ->copy()
484 ->setline(1)
485 assert_equal(['1', '2'], getline(1, 2))
486 bwipe!
487 END
488 g:shortlist = [1, 2]
489 CheckDefAndScriptSuccess(lines)
490 unlet g:shortlist
Bram Moolenaare0890d62021-02-17 14:52:14 +0100491
492 new
493 MethodAfterLinebreak('foobar')
494 assert_equal('foobar', getline(1))
495 bwipe!
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100496
497 lines =<< trim END
498 vim9script
499 def Foo(): string
500 return '# some text'
501 enddef
502
503 def Bar(F: func): string
504 return F()
505 enddef
506
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100507 Foo->Bar()
Bram Moolenaar2e2d7582021-03-03 21:22:41 +0100508 ->setline(1)
509 END
510 CheckScriptSuccess(lines)
511 assert_equal('# some text', getline(1))
512 bwipe!
Bram Moolenaar5f195932020-07-01 20:07:14 +0200513enddef
514
Bram Moolenaar7cebe8b2021-01-23 14:22:16 +0100515def Test_method_call_whitespace()
516 var lines =<< trim END
517 new
518 var yank = 'text'
519 yank->setline(1)
520 yank ->setline(2)
521 yank-> setline(3)
522 yank -> setline(4)
523 assert_equal(['text', 'text', 'text', 'text'], getline(1, 4))
524 bwipe!
525 END
526 CheckDefAndScriptSuccess(lines)
527enddef
528
Bram Moolenaar77b10ff2021-03-14 13:21:35 +0100529def Test_method_and_user_command()
530 var lines =<< trim END
531 vim9script
532 def Cmd()
533 g:didFunc = 1
534 enddef
535 command Cmd g:didCmd = 1
536 Cmd
537 assert_equal(1, g:didCmd)
538 Cmd()
539 assert_equal(1, g:didFunc)
540 unlet g:didFunc
541 unlet g:didCmd
542
543 def InDefFunc()
544 Cmd
545 assert_equal(1, g:didCmd)
546 Cmd()
547 assert_equal(1, g:didFunc)
548 unlet g:didFunc
549 unlet g:didCmd
550 enddef
551 InDefFunc()
552 END
553 CheckScriptSuccess(lines)
554enddef
555
Bram Moolenaarbf5f2872021-08-21 20:50:35 +0200556def Test_option_use_linebreak()
557 var lines =<< trim END
558 new
559 &matchpairs = '(:)'
560 &matchpairs->setline(1)
561 &matchpairs = '[:]'
562 &matchpairs ->setline(2)
563 &matchpairs = '{:}'
564 &matchpairs
565 ->setline(3)
566 assert_equal(['(:)', '[:]', '{:}'], getline(1, '$'))
567 bwipe!
568 END
569 CheckDefAndScriptSuccess(lines)
570enddef
571
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200572def Test_use_register()
Bram Moolenaar73170912021-08-22 22:44:11 +0200573 var lines =<< trim END
574 new
575 @a = 'one'
576 @a->setline(1)
577 @b = 'two'
578 @b ->setline(2)
579 @c = 'three'
580 @c
581 ->setline(3)
582 assert_equal(['one', 'two', 'three'], getline(1, '$'))
583 bwipe!
584 END
585 CheckDefAndScriptSuccess(lines)
Bram Moolenaar4799cef2021-08-25 22:37:36 +0200586
587 lines =<< trim END
588 @a = 'echo "text"'
589 @a
590 END
Bram Moolenaar7d5b8be2021-11-22 15:05:46 +0000591 CheckDefAndScriptFailure(lines, 'E1207:', 2)
592
593 lines =<< trim END
594 @/ = 'pattern'
595 @/
596 END
597 CheckDefAndScriptFailure(lines, 'E1207:', 2)
598
599 lines =<< trim END
600 &opfunc = 'nothing'
601 &opfunc
602 END
603 CheckDefAndScriptFailure(lines, 'E1207:', 2)
604 &opfunc = ''
605
606 lines =<< trim END
607 &l:showbreak = 'nothing'
608 &l:showbreak
609 END
610 CheckDefAndScriptFailure(lines, 'E1207:', 2)
611 &l:showbreak = ''
612
613 lines =<< trim END
614 &g:showbreak = 'nothing'
615 &g:showbreak
616 END
617 CheckDefAndScriptFailure(lines, 'E1207:', 2)
618 &g:showbreak = ''
Bram Moolenaar65259b52021-11-23 14:52:06 +0000619
620 lines =<< trim END
621 $SomeEnv = 'value'
622 $SomeEnv
623 END
624 CheckDefAndScriptFailure(lines, 'E1207:', 2)
625 $SomeEnv = ''
Bram Moolenaar73170912021-08-22 22:44:11 +0200626enddef
627
Bram Moolenaar5ca5cc62021-08-24 21:56:03 +0200628def Test_environment_use_linebreak()
629 var lines =<< trim END
630 new
631 $TESTENV = 'one'
632 $TESTENV->setline(1)
633 $TESTENV = 'two'
634 $TESTENV ->setline(2)
635 $TESTENV = 'three'
636 $TESTENV
637 ->setline(3)
638 assert_equal(['one', 'two', 'three'], getline(1, '$'))
639 bwipe!
640 END
641 CheckDefAndScriptSuccess(lines)
642enddef
643
Bram Moolenaar683581e2020-10-22 21:22:58 +0200644def Test_skipped_expr_linebreak()
645 if 0
646 var x = []
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100647 ->map(() => 0)
Bram Moolenaar683581e2020-10-22 21:22:58 +0200648 endif
649enddef
650
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200651def Test_dict_member()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100652 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200653 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100654 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200655 test.data
656 ->reverse()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100657 assert_equal({data: [3, 2, 1]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200658
Bram Moolenaarac564082020-09-27 19:05:33 +0200659 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200660 vim9script
Bram Moolenaare0de1712020-12-02 17:36:54 +0100661 var test: dict<list<number>> = {data: [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200662 test.data->sort()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100663 assert_equal({data: [1, 2, 3]}, test)
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200664 END
665 CheckScriptSuccess(lines)
666enddef
667
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200668def Test_bar_after_command()
669 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200670 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200671 redraw | echo x
672 enddef
673 RedrawAndEcho()
674 assert_match('did redraw', Screenline(&lines))
675
Bram Moolenaar788123c2020-07-05 15:32:17 +0200676 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200677 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200678 reg_executing() | echo x
679 enddef
680 CallAndEcho()
681 assert_match('did redraw', Screenline(&lines))
682
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200683 if has('unix')
684 # bar in filter write command does not start new command
685 def WriteToShell()
686 new
687 setline(1, 'some text')
688 w !cat | cat > Xoutfile
689 bwipe!
690 enddef
691 WriteToShell()
692 assert_equal(['some text'], readfile('Xoutfile'))
693 delete('Xoutfile')
694
695 # bar in filter read command does not start new command
696 def ReadFromShell()
697 new
698 r! echo hello there | cat > Xoutfile
699 r !echo again | cat >> Xoutfile
700 bwipe!
701 enddef
702 ReadFromShell()
703 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
704 delete('Xoutfile')
705 endif
706enddef
707
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200708def Test_filter_is_not_modifier()
Bram Moolenaare0de1712020-12-02 17:36:54 +0100709 var tags = [{a: 1, b: 2}, {x: 3, y: 4}]
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100710 filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 )
Bram Moolenaare0de1712020-12-02 17:36:54 +0100711 assert_equal([{x: 3, y: 4}], tags)
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200712enddef
713
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100714def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100715 var lines =<< trim END
716 final expected = "\nType Name Content\n c \"c piyo"
717 @a = 'hoge'
718 @b = 'fuga'
719 @c = 'piyo'
720
721 assert_equal(execute('filter /piyo/ registers abc'), expected)
722 END
723 CheckDefAndScriptSuccess(lines)
Bram Moolenaare729ce22021-06-06 21:38:09 +0200724
725 # also do this compiled
726 lines =<< trim END
727 @a = 'very specific z3d37dh234 string'
728 filter z3d37dh234 registers
729 assert_match('very specific z3d37dh234 string', Screenline(&lines))
730 END
731 CheckDefAndScriptSuccess(lines)
Bram Moolenaar06bffe82021-11-28 20:24:17 +0000732
733 lines =<< trim END
734 edit foobar
735 redir => g:filter_out
736 filter #foobar# ls
737 redir END
738 assert_match('"foobar"', g:filter_out)
739 unlet g:filter_out
740 END
741 CheckDefAndScriptSuccess(lines)
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100742enddef
743
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100744def Test_win_command_modifiers()
745 assert_equal(1, winnr('$'))
746
747 set splitright
748 vsplit
749 assert_equal(2, winnr())
750 close
751 aboveleft vsplit
752 assert_equal(1, winnr())
753 close
754 set splitright&
755
756 vsplit
757 assert_equal(1, winnr())
758 close
759 belowright vsplit
760 assert_equal(2, winnr())
761 close
762 rightbelow vsplit
763 assert_equal(2, winnr())
764 close
765
Bram Moolenaar97a19002020-11-01 22:15:44 +0100766 if has('browse')
767 browse set
768 assert_equal('option-window', expand('%'))
769 close
770 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100771
772 vsplit
773 botright split
774 assert_equal(3, winnr())
775 assert_equal(&columns, winwidth(0))
776 close
777 close
778
779 vsplit
780 topleft split
781 assert_equal(1, winnr())
782 assert_equal(&columns, winwidth(0))
783 close
784 close
785
786 gettabinfo()->len()->assert_equal(1)
787 tab split
788 gettabinfo()->len()->assert_equal(2)
789 tabclose
790
791 vertical new
792 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
793 close
794enddef
795
796func Test_command_modifier_confirm()
797 CheckNotGui
798 CheckRunVimInTerminal
799
800 " Test for saving all the modified buffers
801 let lines =<< trim END
802 call setline(1, 'changed')
803 def Getout()
804 confirm write Xfile
805 enddef
806 END
807 call writefile(lines, 'Xconfirmscript')
808 call writefile(['empty'], 'Xfile')
809 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
810 call term_sendkeys(buf, ":call Getout()\n")
811 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
812 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100813 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
814 call term_sendkeys(buf, "\<CR>")
815 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100816 call StopVimInTerminal(buf)
817
818 call assert_equal(['changed'], readfile('Xfile'))
819 call delete('Xfile')
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100820 call delete('.Xfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100821 call delete('Xconfirmscript')
822endfunc
823
824def Test_command_modifiers_keep()
825 if has('unix')
826 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
827 new
828 setline(1, ['one', 'two', 'three'])
829 normal 1Gma
830 normal 2Gmb
831 normal 3Gmc
832 if addRflag
833 set cpo+=R
834 else
835 set cpo-=R
836 endif
837 if keepMarks
838 keepmarks :%!cat
839 else
840 :%!cat
841 endif
842 if hasMarks
843 assert_equal(1, line("'a"))
844 assert_equal(2, line("'b"))
845 assert_equal(3, line("'c"))
846 else
847 assert_equal(0, line("'a"))
848 assert_equal(0, line("'b"))
849 assert_equal(0, line("'c"))
850 endif
851 quit!
852 enddef
853 DoTest(false, false, true)
854 DoTest(true, false, false)
855 DoTest(false, true, true)
856 DoTest(true, true, true)
857 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100858
859 new
860 setline(1, ['one', 'two', 'three', 'four'])
861 assert_equal(4, line("$"))
862 normal 1Gma
863 normal 2Gmb
864 normal 3Gmc
865 lockmarks :1,2!wc
866 # line is deleted, marks don't move
867 assert_equal(3, line("$"))
868 assert_equal('four', getline(3))
869 assert_equal(1, line("'a"))
870 assert_equal(2, line("'b"))
871 assert_equal(3, line("'c"))
872 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100873 endif
874
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100875 edit Xone
876 edit Xtwo
877 assert_equal('Xone', expand('#'))
878 keepalt edit Xthree
879 assert_equal('Xone', expand('#'))
880
881 normal /a*b*
882 assert_equal('a*b*', histget("search"))
883 keeppatterns normal /c*d*
884 assert_equal('a*b*', histget("search"))
885
886 new
887 setline(1, range(10))
888 :10
889 normal gg
890 assert_equal(10, getpos("''")[1])
891 keepjumps normal 5G
892 assert_equal(10, getpos("''")[1])
893 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100894enddef
895
Bram Moolenaar8242ebb2020-12-29 11:15:01 +0100896def Test_bar_line_continuation()
897 var lines =<< trim END
898 au BufNewFile Xfile g:readFile = 1
899 | g:readExtra = 2
900 g:readFile = 0
901 g:readExtra = 0
902 edit Xfile
903 assert_equal(1, g:readFile)
904 assert_equal(2, g:readExtra)
905 bwipe!
906 au! BufNewFile
907
908 au BufNewFile Xfile g:readFile = 1
909 | g:readExtra = 2
910 | g:readMore = 3
911 g:readFile = 0
912 g:readExtra = 0
913 g:readMore = 0
914 edit Xfile
915 assert_equal(1, g:readFile)
916 assert_equal(2, g:readExtra)
917 assert_equal(3, g:readMore)
918 bwipe!
919 au! BufNewFile
920 unlet g:readFile
921 unlet g:readExtra
922 unlet g:readMore
923 END
924 CheckDefAndScriptSuccess(lines)
925enddef
926
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100927def Test_command_modifier_other()
Bram Moolenaar66669fc2020-11-04 18:53:35 +0100928 new Xsomefile
929 setline(1, 'changed')
930 var buf = bufnr()
931 hide edit Xotherfile
932 var info = getbufinfo(buf)
933 assert_equal(1, info[0].hidden)
934 assert_equal(1, info[0].changed)
935 edit Xsomefile
936 bwipe!
937
938 au BufNewFile Xfile g:readFile = 1
939 g:readFile = 0
940 edit Xfile
941 assert_equal(1, g:readFile)
942 bwipe!
943 g:readFile = 0
944 noautocmd edit Xfile
945 assert_equal(0, g:readFile)
Bram Moolenaardcc58e02020-12-28 20:53:21 +0100946 au! BufNewFile
Bram Moolenaardcc58e02020-12-28 20:53:21 +0100947 unlet g:readFile
Bram Moolenaar66669fc2020-11-04 18:53:35 +0100948
949 noswapfile edit XnoSwap
Bram Moolenaardd1f4262020-12-31 17:41:01 +0100950 assert_equal(false, &l:swapfile)
Bram Moolenaar66669fc2020-11-04 18:53:35 +0100951 bwipe!
952
953 var caught = false
954 try
955 sandbox !ls
956 catch /E48:/
957 caught = true
958 endtry
959 assert_true(caught)
960
961 :8verbose g:verbose_now = &verbose
962 assert_equal(8, g:verbose_now)
963 unlet g:verbose_now
964enddef
965
966def EchoHere()
967 echomsg 'here'
968enddef
969def EchoThere()
970 unsilent echomsg 'there'
971enddef
972
973def Test_modifier_silent_unsilent()
974 echomsg 'last one'
975 silent echomsg "text"
976 assert_equal("\nlast one", execute(':1messages'))
977
978 silent! echoerr "error"
979
980 echomsg 'last one'
981 silent EchoHere()
982 assert_equal("\nlast one", execute(':1messages'))
983
984 silent EchoThere()
985 assert_equal("\nthere", execute(':1messages'))
Bram Moolenaar20a76292020-12-25 19:47:24 +0100986
987 try
988 silent eval [][0]
989 catch
990 echomsg "caught"
991 endtry
992 assert_equal("\ncaught", execute(':1messages'))
Bram Moolenaar917c46a2021-08-10 19:53:01 +0200993
994 var lines =<< trim END
995 vim9script
996 set history=11
997 silent! while 0
998 set history=22
999 silent! endwhile
1000 assert_equal(11, &history)
1001 set history&
1002 END
1003 CheckScriptSuccess(lines)
Bram Moolenaare88c8e82020-11-01 17:03:37 +01001004enddef
1005
Bram Moolenaar36113e42020-11-02 21:08:47 +01001006def Test_range_after_command_modifier()
Bram Moolenaar6e2c2c52020-12-25 19:25:45 +01001007 CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2)
Bram Moolenaar36113e42020-11-02 21:08:47 +01001008 new
1009 setline(1, 'xxx')
1010 CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
1011 assert_equal('', getline(1))
1012 bwipe!
1013enddef
1014
Bram Moolenaarece0b872021-01-08 20:40:45 +01001015def Test_silent_pattern()
1016 new
1017 silent! :/pat/put _
1018 bwipe!
1019enddef
1020
Bram Moolenaarfa984412021-03-25 22:15:28 +01001021def Test_useless_command_modifier()
1022 g:maybe = true
1023 var lines =<< trim END
1024 if g:maybe
1025 silent endif
1026 END
1027 CheckDefAndScriptFailure(lines, 'E1176:', 2)
1028
1029 lines =<< trim END
1030 for i in [0]
1031 silent endfor
1032 END
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001033 CheckDefFailure(lines, 'E1176:', 2)
1034 CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001035
1036 lines =<< trim END
1037 while g:maybe
1038 silent endwhile
1039 END
Bram Moolenaar917c46a2021-08-10 19:53:01 +02001040 CheckDefFailure(lines, 'E1176:', 2)
1041 g:maybe = false
1042 CheckScriptSuccess(['vim9script'] + lines)
Bram Moolenaarfa984412021-03-25 22:15:28 +01001043
1044 lines =<< trim END
1045 silent try
1046 finally
1047 endtry
1048 END
1049 CheckDefAndScriptFailure(lines, 'E1176:', 1)
1050
1051 lines =<< trim END
1052 try
1053 silent catch
1054 endtry
1055 END
1056 CheckDefAndScriptFailure(lines, 'E1176:', 2)
1057
1058 lines =<< trim END
1059 try
1060 silent finally
1061 endtry
1062 END
1063 CheckDefAndScriptFailure(lines, 'E1176:', 2)
1064
1065 lines =<< trim END
1066 try
1067 finally
1068 silent endtry
1069 END
1070 CheckDefAndScriptFailure(lines, 'E1176:', 3)
1071enddef
1072
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001073def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001074 var from = 3
1075 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001076 g:val = 111
1077 def Increment(nrs: list<number>)
1078 for nr in nrs
1079 g:val += nr
1080 endfor
1081 enddef
1082 eval range(from, to)
1083 ->Increment()
1084 assert_equal(111 + 3 + 4 + 5, g:val)
1085 unlet g:val
Bram Moolenaard0fe6202020-12-05 17:11:12 +01001086
1087 var lines =<< trim END
1088 vim9script
1089 g:caught = 'no'
1090 try
1091 eval 123 || 0
1092 catch
1093 g:caught = 'yes'
1094 endtry
1095 assert_equal('yes', g:caught)
1096 unlet g:caught
1097 END
1098 CheckScriptSuccess(lines)
Bram Moolenaar007f9d62020-07-06 23:04:49 +02001099enddef
1100
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001101def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +02001102 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +02001103 nnoremap <F3> :echo 'hit F3 #'<CR>
1104 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
1105 END
1106 CheckDefSuccess(lines)
1107 CheckScriptSuccess(['vim9script'] + lines)
1108enddef
1109
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001110def Test_normal_command()
1111 new
1112 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +02001113 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +02001114 try
1115 exe "norm! \<C-]>"
1116 catch /E433/
1117 caught = 2
1118 endtry
1119 assert_equal(2, caught)
1120
1121 try
1122 exe "norm! 3\<C-]>"
1123 catch /E433/
1124 caught = 3
1125 endtry
1126 assert_equal(3, caught)
1127 bwipe!
1128enddef
1129
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001130def Test_put_command()
1131 new
1132 @p = 'ppp'
1133 put p
1134 assert_equal('ppp', getline(2))
1135
1136 put ='below'
1137 assert_equal('below', getline(3))
1138 put! ='above'
1139 assert_equal('above', getline(3))
1140 assert_equal('below', getline(4))
1141
Bram Moolenaar883cf972021-01-15 18:04:43 +01001142 :2put =['a', 'b', 'c']
1143 assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6))
1144
Bram Moolenaar08597872020-12-10 19:43:40 +01001145 # compute range at runtime
1146 setline(1, range(1, 8))
1147 @a = 'aaa'
1148 :$-2put a
1149 assert_equal('aaa', getline(7))
1150
1151 setline(1, range(1, 8))
1152 :2
1153 :+2put! a
1154 assert_equal('aaa', getline(4))
1155
Bram Moolenaara28639e2021-01-19 22:48:09 +01001156 []->mapnew(() => 0)
1157 :$put ='end'
1158 assert_equal('end', getline('$'))
1159
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001160 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01001161
1162 CheckDefFailure(['put =xxx'], 'E1001:')
1163enddef
1164
1165def Test_put_with_linebreak()
1166 new
1167 var lines =<< trim END
1168 vim9script
1169 pu =split('abc', '\zs')
1170 ->join()
1171 END
1172 CheckScriptSuccess(lines)
1173 getline(2)->assert_equal('a b c')
1174 bwipe!
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001175enddef
1176
Bram Moolenaar3bd8de42020-09-14 16:37:34 +02001177def Test_command_star_range()
1178 new
1179 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
1180 setpos("'<", [0, 1, 0, 0])
1181 setpos("'>", [0, 3, 0, 0])
1182 :*s/\(foo\|bar\)/baz/g
1183 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
1184
1185 bwipe!
1186enddef
1187
Bram Moolenaar20d89e02020-10-20 23:11:33 +02001188def Test_f_args()
1189 var lines =<< trim END
1190 vim9script
1191
1192 func SaveCmdArgs(...)
1193 let g:args = a:000
1194 endfunc
1195
1196 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
1197
1198 TestFArgs
1199 assert_equal([], g:args)
1200
1201 TestFArgs one two three
1202 assert_equal(['one', 'two', 'three'], g:args)
1203 END
1204 CheckScriptSuccess(lines)
1205enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +02001206
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001207def Test_user_command_comment()
1208 command -nargs=1 Comd echom <q-args>
1209
1210 var lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001211 vim9script
1212 Comd # comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001213 END
1214 CheckScriptSuccess(lines)
1215
1216 lines =<< trim END
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001217 vim9script
1218 Comd# comment
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001219 END
1220 CheckScriptFailure(lines, 'E1144:')
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001221 delcommand Comd
Bram Moolenaarb98cec22021-04-25 16:35:55 +02001222
1223 lines =<< trim END
1224 vim9script
1225 command Foo echo 'Foo'
1226 Foo3Bar
1227 END
1228 CheckScriptFailure(lines, 'E1144: Command "Foo" is not followed by white space: Foo3Bar')
1229
1230 delcommand Foo
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001231enddef
1232
Bram Moolenaar95388e32020-11-20 21:07:00 +01001233def Test_star_command()
1234 var lines =<< trim END
1235 vim9script
1236 @s = 'g:success = 8'
1237 set cpo+=*
1238 exe '*s'
1239 assert_equal(8, g:success)
1240 unlet g:success
1241 set cpo-=*
1242 assert_fails("exe '*s'", 'E1050:')
1243 END
1244 CheckScriptSuccess(lines)
1245enddef
1246
Bram Moolenaar47a2abf2020-11-25 20:12:11 +01001247def Test_cmd_argument_without_colon()
1248 new Xfile
1249 setline(1, ['a', 'b', 'c', 'd'])
1250 write
1251 edit +3 %
1252 assert_equal(3, getcurpos()[1])
1253 edit +/a %
1254 assert_equal(1, getcurpos()[1])
1255 bwipe
1256 delete('Xfile')
1257enddef
1258
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001259def Test_ambiguous_user_cmd()
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001260 command Cmd1 eval 0
1261 command Cmd2 eval 0
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001262 var lines =<< trim END
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001263 Cmd
1264 END
Bram Moolenaard1510ee2021-01-04 16:15:58 +01001265 CheckDefAndScriptFailure(lines, 'E464:', 1)
1266 delcommand Cmd1
1267 delcommand Cmd2
Bram Moolenaar1c0aa972020-12-16 21:43:54 +01001268enddef
1269
Bram Moolenaar52c124d2020-12-20 21:43:35 +01001270def Test_command_not_recognized()
1271 var lines =<< trim END
1272 d.key = 'asdf'
1273 END
1274 CheckDefFailure(lines, 'E1146:', 1)
1275
1276 lines =<< trim END
1277 d['key'] = 'asdf'
1278 END
1279 CheckDefFailure(lines, 'E1146:', 1)
1280enddef
Bram Moolenaarb7a78f72020-06-28 18:43:40 +02001281
Bram Moolenaarf4e20992020-12-21 19:59:08 +01001282def Test_magic_not_used()
1283 new
1284 for cmd in ['set magic', 'set nomagic']
1285 exe cmd
1286 setline(1, 'aaa')
1287 s/.../bbb/
1288 assert_equal('bbb', getline(1))
1289 endfor
1290
1291 set magic
1292 setline(1, 'aaa')
1293 assert_fails('s/.\M../bbb/', 'E486:')
1294 assert_fails('snomagic/.../bbb/', 'E486:')
1295 assert_equal('aaa', getline(1))
1296
1297 bwipe!
1298enddef
1299
Bram Moolenaar60f63102020-12-21 20:32:43 +01001300def Test_gdefault_not_used()
1301 new
1302 for cmd in ['set gdefault', 'set nogdefault']
1303 exe cmd
1304 setline(1, 'aaa')
1305 s/./b/
1306 assert_equal('baa', getline(1))
1307 endfor
1308
1309 set nogdefault
1310 bwipe!
1311enddef
1312
Bram Moolenaar179eb562020-12-27 18:03:22 +01001313def g:SomeComplFunc(findstart: number, base: string): any
1314 if findstart
1315 return 0
1316 else
1317 return ['aaa', 'bbb']
1318 endif
1319enddef
1320
1321def Test_insert_complete()
1322 # this was running into an error with the matchparen hack
1323 new
1324 set completefunc=SomeComplFunc
1325 feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx')
1326 assert_equal('aaa', getline(1))
1327
1328 set completefunc=
1329 bwipe!
1330enddef
1331
Bram Moolenaara11919f2021-01-02 19:44:56 +01001332def Test_wincmd()
1333 split
1334 var id1 = win_getid()
1335 if true
1336 try | wincmd w | catch | endtry
1337 endif
1338 assert_notequal(id1, win_getid())
1339 close
Bram Moolenaar1ff89de2021-03-24 20:08:12 +01001340
1341 split
1342 var id = win_getid()
1343 split
1344 :2wincmd o
1345 assert_equal(id, win_getid())
1346 only
1347
1348 split
1349 split
1350 assert_equal(3, winnr('$'))
1351 :2wincmd c
1352 assert_equal(2, winnr('$'))
1353 only
1354
1355 split
1356 split
1357 assert_equal(3, winnr('$'))
1358 :2wincmd q
1359 assert_equal(2, winnr('$'))
1360 only
Bram Moolenaara11919f2021-01-02 19:44:56 +01001361enddef
1362
Bram Moolenaar9567efa2021-01-11 22:16:30 +01001363def Test_windo_missing_endif()
1364 var lines =<< trim END
1365 windo if 1
1366 END
1367 CheckDefExecFailure(lines, 'E171:', 1)
1368enddef
1369
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001370let s:theList = [1, 2, 3]
1371
1372def Test_lockvar()
1373 s:theList[1] = 22
1374 assert_equal([1, 22, 3], s:theList)
1375 lockvar s:theList
1376 assert_fails('theList[1] = 77', 'E741:')
1377 unlockvar s:theList
1378 s:theList[1] = 44
1379 assert_equal([1, 44, 3], s:theList)
1380
Bram Moolenaaraacc9662021-08-13 19:40:51 +02001381 var d = {a: 1, b: 2}
1382 d.a = 3
1383 d.b = 4
1384 assert_equal({a: 3, b: 4}, d)
1385 lockvar d.a
1386 d.b = 5
1387 var ex = ''
1388 try
1389 d.a = 6
1390 catch
1391 ex = v:exception
1392 endtry
1393 assert_match('E1121:', ex)
1394 unlockvar d.a
1395 d.a = 7
1396 assert_equal({a: 7, b: 5}, d)
1397
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001398 var lines =<< trim END
1399 vim9script
1400 var theList = [1, 2, 3]
1401 def SetList()
1402 theList[1] = 22
1403 assert_equal([1, 22, 3], theList)
1404 lockvar theList
1405 theList[1] = 77
1406 enddef
1407 SetList()
1408 END
1409 CheckScriptFailure(lines, 'E1119', 4)
1410
1411 lines =<< trim END
1412 var theList = [1, 2, 3]
1413 lockvar theList
1414 END
1415 CheckDefFailure(lines, 'E1178', 2)
1416
1417 lines =<< trim END
1418 var theList = [1, 2, 3]
1419 unlockvar theList
1420 END
1421 CheckDefFailure(lines, 'E1178', 2)
Bram Moolenaar04b568b2021-11-22 21:58:41 +00001422
1423 lines =<< trim END
1424 vim9script
1425 var name = 'john'
1426 lockvar nameX
1427 END
1428 CheckScriptFailure(lines, 'E1246', 3)
1429
1430 lines =<< trim END
1431 vim9script
1432 var name = 'john'
1433 def LockIt()
1434 lockvar nameX
1435 enddef
1436 LockIt()
1437 END
1438 CheckScriptFailure(lines, 'E1246', 1)
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001439enddef
1440
Bram Moolenaar4c137212021-04-19 16:48:48 +02001441def Test_substitute_expr()
1442 var to = 'repl'
1443 new
1444 setline(1, 'one from two')
1445 s/from/\=to
1446 assert_equal('one repl two', getline(1))
1447
1448 setline(1, 'one from two')
1449 s/from/\=to .. '_x'
1450 assert_equal('one repl_x two', getline(1))
1451
1452 setline(1, 'one from two from three')
1453 var also = 'also'
1454 s/from/\=to .. '_' .. also/g#e
1455 assert_equal('one repl_also two repl_also three', getline(1))
1456
Bram Moolenaar8238f082021-04-20 21:10:48 +02001457 setline(1, 'abc abc abc')
1458 for choice in [true, false]
1459 :1s/abc/\=choice ? 'yes' : 'no'/
1460 endfor
1461 assert_equal('yes no abc', getline(1))
1462
Bram Moolenaard386e922021-04-25 14:48:49 +02001463 bwipe!
1464
Bram Moolenaar4c137212021-04-19 16:48:48 +02001465 CheckDefFailure(['s/from/\="x")/'], 'E488:')
1466 CheckDefFailure(['s/from/\="x"/9'], 'E488:')
1467
Bram Moolenaard386e922021-04-25 14:48:49 +02001468 # When calling a function the right instruction list needs to be restored.
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001469 g:cond = true
Bram Moolenaard386e922021-04-25 14:48:49 +02001470 var lines =<< trim END
1471 vim9script
1472 def Foo()
1473 Bar([])
1474 enddef
1475 def Bar(l: list<number>)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001476 if g:cond
Bram Moolenaard386e922021-04-25 14:48:49 +02001477 s/^/\=Rep()/
1478 for n in l[:]
1479 endfor
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001480 endif
Bram Moolenaard386e922021-04-25 14:48:49 +02001481 enddef
1482 def Rep(): string
1483 return 'rep'
1484 enddef
1485 new
1486 Foo()
1487 assert_equal('rep', getline(1))
1488 bwipe!
1489 END
1490 CheckScriptSuccess(lines)
Bram Moolenaar5930ddc2021-04-26 20:32:59 +02001491 unlet g:cond
Bram Moolenaar27523602021-06-05 21:36:19 +02001492
1493 # List results in multiple lines
1494 new
1495 setline(1, 'some text here')
Bram Moolenaar2c707112021-08-02 22:26:56 +02001496 s/text/\=['aaa', 'bbb', 'ccc']/
Bram Moolenaar27523602021-06-05 21:36:19 +02001497 assert_equal(['some aaa', 'bbb', 'ccc', ' here'], getline(1, '$'))
1498 bwipe!
Bram Moolenaar4c137212021-04-19 16:48:48 +02001499enddef
1500
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001501def Test_redir_to_var()
1502 var result: string
1503 redir => result
1504 echo 'something'
1505 redir END
1506 assert_equal("\nsomething", result)
1507
1508 redir =>> result
1509 echo 'more'
1510 redir END
1511 assert_equal("\nsomething\nmore", result)
1512
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001513 var d: dict<string>
1514 redir => d.redir
1515 echo 'dict'
1516 redir END
1517 assert_equal({redir: "\ndict"}, d)
1518
1519 var l = ['a', 'b', 'c']
1520 redir => l[1]
1521 echo 'list'
1522 redir END
1523 assert_equal(['a', "\nlist", 'c'], l)
1524
1525 var dl = {l: ['x']}
1526 redir => dl.l[0]
1527 echo 'dict-list'
1528 redir END
1529 assert_equal({l: ["\ndict-list"]}, dl)
1530
Bram Moolenaara369c3d2021-04-21 16:00:10 +02001531 redir =>> d.redir
1532 echo 'more'
1533 redir END
1534 assert_equal({redir: "\ndict\nmore"}, d)
1535
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001536 var lines =<< trim END
1537 redir => notexist
1538 END
1539 CheckDefFailure(lines, 'E1089:')
Bram Moolenaar753bcf82021-04-21 14:24:24 +02001540
1541 lines =<< trim END
1542 var ls = 'asdf'
1543 redir => ls[1]
1544 redir END
1545 END
1546 CheckDefFailure(lines, 'E1141:')
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +02001547enddef
1548
Bram Moolenaar68db9962021-05-09 23:19:22 +02001549def Test_echo_void()
1550 var lines =<< trim END
1551 vim9script
1552 def NoReturn()
1553 echo 'nothing'
1554 enddef
1555 echo NoReturn()
1556 END
1557 CheckScriptFailure(lines, 'E1186:', 5)
1558
1559 lines =<< trim END
1560 vim9script
1561 def NoReturn()
1562 echo 'nothing'
1563 enddef
1564 def Try()
1565 echo NoReturn()
1566 enddef
1567 defcompile
1568 END
1569 CheckScriptFailure(lines, 'E1186:', 1)
1570enddef
1571
Bram Moolenaar2c707112021-08-02 22:26:56 +02001572def Test_cmdwin_block()
1573 augroup justTesting
1574 autocmd BufEnter * {
1575 echomsg 'in block'
1576 }
1577 augroup END
1578 feedkeys('q:', 'xt')
1579 redraw
1580 feedkeys("aclose\<CR>", 'xt')
1581
1582 au! justTesting
1583enddef
1584
Bram Moolenaar7b829262021-10-13 15:04:34 +01001585def Test_var_not_cmd()
1586 var lines =<< trim END
1587 g:notexist:cmd
1588 END
1589 CheckDefAndScriptFailure2(lines, 'E488: Trailing characters: :cmd', 'E121: Undefined variable: g:notexist', 1)
1590
1591 lines =<< trim END
1592 g-pat-cmd
1593 END
1594 CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001595 lines =<< trim END
1596 g.pat.cmd
1597 END
1598 CheckDefAndScriptFailure2(lines, 'E1001: Variable not found: g', 'E121: Undefined variable: g', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001599
1600 lines =<< trim END
1601 s:notexist:repl
1602 END
1603 CheckDefAndScriptFailure2(lines, 'E488: Trailing characters: :repl', 'E121: Undefined variable: s:notexist', 1)
1604
1605 lines =<< trim END
1606 s-pat-repl
1607 END
1608 CheckDefAndScriptFailure(lines, 'E1241:', 1)
Bram Moolenaar051a8a32021-10-14 16:53:42 +01001609 lines =<< trim END
1610 s.pat.repl
1611 END
1612 CheckDefAndScriptFailure2(lines, 'E1001: Variable not found: s', 'E121: Undefined variable: s', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001613
1614 lines =<< trim END
1615 w:notexist->len()
1616 END
1617 CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: w:notexist', 1)
1618
1619 lines =<< trim END
1620 b:notexist->len()
1621 END
1622 CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: b:notexist', 1)
1623
1624 lines =<< trim END
1625 t:notexist->len()
1626 END
1627 CheckDefExecAndScriptFailure(lines, 'E121: Undefined variable: t:notexist', 1)
1628enddef
1629
1630def Test_no_space_after_command()
1631 var lines =<< trim END
1632 g /pat/cmd
1633 END
1634 CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001635 lines =<< trim END
1636 g #pat#cmd
1637 END
1638 CheckDefAndScriptFailure(lines, 'E1242:', 1)
1639 lines =<< trim END
1640 g#pat#cmd
1641 END
1642 CheckDefAndScriptSuccess(lines)
1643 lines =<< trim END
1644 g# pat#cmd
1645 END
1646 CheckDefAndScriptSuccess(lines)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001647
1648 lines =<< trim END
1649 s /pat/repl
1650 END
1651 CheckDefAndScriptFailure(lines, 'E1242:', 1)
Bram Moolenaarc0abac62021-10-13 21:17:05 +01001652 lines =<< trim END
1653 s #pat#repl
1654 END
1655 CheckDefAndScriptFailure(lines, 'E1242:', 1)
1656 lines =<< trim END
1657 s#pat#repl
1658 END
1659 CheckDefExecAndScriptFailure(lines, 'E486:', 1)
1660 lines =<< trim END
1661 s# pat#repl
1662 END
1663 CheckDefExecAndScriptFailure(lines, 'E486:', 1)
Bram Moolenaar7b829262021-10-13 15:04:34 +01001664enddef
1665
Yegappan Lakshmanan2a16dc62021-11-16 17:19:30 +00001666" Test for the 'previewpopup' option
1667def Test_previewpopup()
Yegappan Lakshmanan733b1242021-11-15 11:22:09 +00001668 set previewpopup=height:10,width:60
1669 pedit Xfile
1670 var id = popup_findpreview()
1671 assert_notequal(id, 0)
1672 assert_match('Xfile', popup_getoptions(id).title)
1673 popup_clear()
1674 set previewpopup&
1675enddef
1676
Bram Moolenaarc8a9fe52021-11-20 19:50:59 +00001677def Test_syntax_enable_clear()
1678 syntax clear
1679 syntax enable
1680 highlight clear String
1681 assert_equal(true, hlget('String')->get(0, {})->get('default', false))
1682 syntax clear
1683enddef
1684
Bram Moolenaarb2cb6c82021-03-28 20:38:34 +02001685
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02001686" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker