blob: 71c47cdcefa8b815919fa5f2f5aa7e54607c3502 [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
8def Test_edit_wildcards()
Bram Moolenaarac564082020-09-27 19:05:33 +02009 var filename = 'Xtest'
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020010 edit `=filename`
11 assert_equal('Xtest', bufname())
12
Bram Moolenaarac564082020-09-27 19:05:33 +020013 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020014 edit Xtest`=filenr`
15 assert_equal('Xtest123', bufname())
16
17 filenr = 77
18 edit `=filename``=filenr`
19 assert_equal('Xtest77', bufname())
20
21 edit X`=filename`xx`=filenr`yy
22 assert_equal('XXtestxx77yy', bufname())
23enddef
24
Bram Moolenaar6378c4f2020-04-26 13:50:41 +020025def Test_hardcopy_wildcards()
26 CheckUnix
27 CheckFeature postscript
28
Bram Moolenaarac564082020-09-27 19:05:33 +020029 var outfile = 'print'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +020030 hardcopy > X`=outfile`.ps
31 assert_true(filereadable('Xprint.ps'))
32
33 delete('Xprint.ps')
34enddef
35
36def Test_syn_include_wildcards()
37 writefile(['syn keyword Found found'], 'Xthemine.vim')
Bram Moolenaarac564082020-09-27 19:05:33 +020038 var save_rtp = &rtp
Bram Moolenaar6378c4f2020-04-26 13:50:41 +020039 &rtp = '.'
40
Bram Moolenaarac564082020-09-27 19:05:33 +020041 var fname = 'mine'
Bram Moolenaar6378c4f2020-04-26 13:50:41 +020042 syn include @Group Xthe`=fname`.vim
43 assert_match('Found.* contained found', execute('syn list Found'))
44
45 &rtp = save_rtp
46 delete('Xthemine.vim')
47enddef
48
Bram Moolenaar7e8967f2020-06-27 21:56:17 +020049def Test_echo_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +020050 var lines =<< trim END
Bram Moolenaar7e8967f2020-06-27 21:56:17 +020051 vim9script
52 redir @a
53 echo 'one'
54 .. 'two'
55 redir END
56 assert_equal("\nonetwo", @a)
57 END
58 CheckScriptSuccess(lines)
59
60 lines =<< trim END
61 vim9script
62 redir @a
63 echo 11 +
64 77
65 - 22
66 redir END
67 assert_equal("\n66", @a)
68 END
69 CheckScriptSuccess(lines)
70enddef
71
Bram Moolenaar13106602020-10-04 16:06:05 +020072def Test_condition_types()
73 var lines =<< trim END
74 if 'text'
75 endif
76 END
77 CheckDefAndScriptFailure(lines, 'E1030:', 1)
78
79 lines =<< trim END
80 if [1]
81 endif
82 END
83 CheckDefFailure(lines, 'E1012:', 1)
84 CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
85
86 lines =<< trim END
87 g:cond = 'text'
88 if g:cond
89 endif
90 END
91 CheckDefExecAndScriptFailure(lines, 'E1030:', 2)
92
93 lines =<< trim END
94 g:cond = 0
95 if g:cond
96 elseif 'text'
97 endif
98 END
99 CheckDefFailure(lines, 'E1012:', 3)
100 CheckScriptFailure(['vim9script'] + lines, 'E1030:', 4)
101
102 lines =<< trim END
103 if g:cond
104 elseif [1]
105 endif
106 END
107 CheckDefFailure(lines, 'E1012:', 2)
108 CheckScriptFailure(['vim9script'] + lines, 'E745:', 3)
109
110 lines =<< trim END
111 g:cond = 'text'
112 if 0
113 elseif g:cond
114 endif
115 END
116 CheckDefExecAndScriptFailure(lines, 'E1030:', 3)
117
118 lines =<< trim END
119 while 'text'
120 endwhile
121 END
122 CheckDefFailure(lines, 'E1012:', 1)
123 CheckScriptFailure(['vim9script'] + lines, 'E1030:', 2)
124
125 lines =<< trim END
126 while [1]
127 endwhile
128 END
129 CheckDefFailure(lines, 'E1012:', 1)
130 CheckScriptFailure(['vim9script'] + lines, 'E745:', 2)
131
132 lines =<< trim END
133 g:cond = 'text'
134 while g:cond
135 endwhile
136 END
137 CheckDefExecAndScriptFailure(lines, 'E1030:', 2)
138enddef
139
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200140def Test_if_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200141 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200142 vim9script
143 if 1 &&
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200144 true
145 || 1
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200146 g:res = 42
147 endif
148 assert_equal(42, g:res)
149 END
150 CheckScriptSuccess(lines)
151 unlet g:res
152
153 lines =<< trim END
154 vim9script
155 if 1 &&
156 0
157 g:res = 0
158 elseif 0 ||
159 0
160 || 1
161 g:res = 12
162 endif
163 assert_equal(12, g:res)
164 END
165 CheckScriptSuccess(lines)
166 unlet g:res
167enddef
168
169def Test_while_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200170 var lines =<< trim END
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200171 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200172 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200173 while nr <
174 10 + 3
175 nr = nr
176 + 4
177 endwhile
178 assert_equal(16, nr)
179 END
180 CheckScriptSuccess(lines)
181
182 lines =<< trim END
183 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200184 var nr = 0
Bram Moolenaard5053d02020-06-28 15:51:16 +0200185 while nr
186 <
187 10
188 +
189 3
190 nr = nr
191 +
192 4
Bram Moolenaarfaf86262020-06-27 23:07:36 +0200193 endwhile
194 assert_equal(16, nr)
195 END
196 CheckScriptSuccess(lines)
197enddef
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200198
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200199def Test_for_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200200 var lines =<< trim END
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200201 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200202 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200203 for x
204 in
205 [1, 2, 3, 4]
206 nr = nr + x
207 endfor
208 assert_equal(10, nr)
209 END
210 CheckScriptSuccess(lines)
211
212 lines =<< trim END
213 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200214 var nr = 0
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200215 for x
216 in
217 [1, 2,
218 3, 4
219 ]
220 nr = nr
221 +
222 x
223 endfor
224 assert_equal(10, nr)
225 END
226 CheckScriptSuccess(lines)
227enddef
228
Bram Moolenaard2ef6b32020-07-02 21:11:34 +0200229def Test_method_call_linebreak()
Bram Moolenaarac564082020-09-27 19:05:33 +0200230 var lines =<< trim END
Bram Moolenaar5f195932020-07-01 20:07:14 +0200231 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200232 var res = []
Bram Moolenaar5f195932020-07-01 20:07:14 +0200233 func RetArg(
234 arg
235 )
236 let s:res = a:arg
237 endfunc
238 [1,
239 2,
240 3]->RetArg()
241 assert_equal([1, 2, 3], res)
242 END
243 CheckScriptSuccess(lines)
244enddef
245
Bram Moolenaar683581e2020-10-22 21:22:58 +0200246def Test_skipped_expr_linebreak()
247 if 0
248 var x = []
249 ->map({ -> 0})
250 endif
251enddef
252
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200253def Test_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200254 var test: dict<list<number>> = {'data': [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200255 test.data->sort()
256 assert_equal(#{data: [1, 2, 3]}, test)
257 test.data
258 ->reverse()
259 assert_equal(#{data: [3, 2, 1]}, test)
260
Bram Moolenaarac564082020-09-27 19:05:33 +0200261 var lines =<< trim END
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200262 vim9script
Bram Moolenaarac564082020-09-27 19:05:33 +0200263 var test: dict<list<number>> = {'data': [3, 1, 2]}
Bram Moolenaar0a47e092020-07-08 18:30:06 +0200264 test.data->sort()
265 assert_equal(#{data: [1, 2, 3]}, test)
266 END
267 CheckScriptSuccess(lines)
268enddef
269
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200270def Test_bar_after_command()
271 def RedrawAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200272 var x = 'did redraw'
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200273 redraw | echo x
274 enddef
275 RedrawAndEcho()
276 assert_match('did redraw', Screenline(&lines))
277
Bram Moolenaar788123c2020-07-05 15:32:17 +0200278 def CallAndEcho()
Bram Moolenaarac564082020-09-27 19:05:33 +0200279 var x = 'did redraw'
Bram Moolenaar788123c2020-07-05 15:32:17 +0200280 reg_executing() | echo x
281 enddef
282 CallAndEcho()
283 assert_match('did redraw', Screenline(&lines))
284
Bram Moolenaare9f262b2020-07-05 14:57:51 +0200285 if has('unix')
286 # bar in filter write command does not start new command
287 def WriteToShell()
288 new
289 setline(1, 'some text')
290 w !cat | cat > Xoutfile
291 bwipe!
292 enddef
293 WriteToShell()
294 assert_equal(['some text'], readfile('Xoutfile'))
295 delete('Xoutfile')
296
297 # bar in filter read command does not start new command
298 def ReadFromShell()
299 new
300 r! echo hello there | cat > Xoutfile
301 r !echo again | cat >> Xoutfile
302 bwipe!
303 enddef
304 ReadFromShell()
305 assert_equal(['hello there', 'again'], readfile('Xoutfile'))
306 delete('Xoutfile')
307 endif
308enddef
309
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200310def Test_filter_is_not_modifier()
Bram Moolenaarac564082020-09-27 19:05:33 +0200311 var tags = [{'a': 1, 'b': 2}, {'x': 3, 'y': 4}]
Bram Moolenaarb074e8b2020-07-11 13:40:45 +0200312 filter(tags, { _, v -> has_key(v, 'x') ? 1 : 0 })
313 assert_equal([#{x: 3, y: 4}], tags)
314enddef
315
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100316def Test_command_modifier_filter()
Bram Moolenaar4f6b6ed2020-10-29 20:24:34 +0100317 var lines =<< trim END
318 final expected = "\nType Name Content\n c \"c piyo"
319 @a = 'hoge'
320 @b = 'fuga'
321 @c = 'piyo'
322
323 assert_equal(execute('filter /piyo/ registers abc'), expected)
324 END
325 CheckDefAndScriptSuccess(lines)
326enddef
327
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100328def Test_win_command_modifiers()
329 assert_equal(1, winnr('$'))
330
331 set splitright
332 vsplit
333 assert_equal(2, winnr())
334 close
335 aboveleft vsplit
336 assert_equal(1, winnr())
337 close
338 set splitright&
339
340 vsplit
341 assert_equal(1, winnr())
342 close
343 belowright vsplit
344 assert_equal(2, winnr())
345 close
346 rightbelow vsplit
347 assert_equal(2, winnr())
348 close
349
Bram Moolenaar97a19002020-11-01 22:15:44 +0100350 if has('browse')
351 browse set
352 assert_equal('option-window', expand('%'))
353 close
354 endif
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100355
356 vsplit
357 botright split
358 assert_equal(3, winnr())
359 assert_equal(&columns, winwidth(0))
360 close
361 close
362
363 vsplit
364 topleft split
365 assert_equal(1, winnr())
366 assert_equal(&columns, winwidth(0))
367 close
368 close
369
370 gettabinfo()->len()->assert_equal(1)
371 tab split
372 gettabinfo()->len()->assert_equal(2)
373 tabclose
374
375 vertical new
376 assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0))
377 close
378enddef
379
380func Test_command_modifier_confirm()
381 CheckNotGui
382 CheckRunVimInTerminal
383
384 " Test for saving all the modified buffers
385 let lines =<< trim END
386 call setline(1, 'changed')
387 def Getout()
388 confirm write Xfile
389 enddef
390 END
391 call writefile(lines, 'Xconfirmscript')
392 call writefile(['empty'], 'Xfile')
393 let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8})
394 call term_sendkeys(buf, ":call Getout()\n")
395 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
396 call term_sendkeys(buf, "y")
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100397 call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000)
398 call term_sendkeys(buf, "\<CR>")
399 call TermWait(buf)
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100400 call StopVimInTerminal(buf)
401
402 call assert_equal(['changed'], readfile('Xfile'))
403 call delete('Xfile')
Bram Moolenaar645cd3e2020-11-01 20:04:57 +0100404 call delete('.Xfile.swp') " in case Vim was killed
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100405 call delete('Xconfirmscript')
406endfunc
407
408def Test_command_modifiers_keep()
409 if has('unix')
410 def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool)
411 new
412 setline(1, ['one', 'two', 'three'])
413 normal 1Gma
414 normal 2Gmb
415 normal 3Gmc
416 if addRflag
417 set cpo+=R
418 else
419 set cpo-=R
420 endif
421 if keepMarks
422 keepmarks :%!cat
423 else
424 :%!cat
425 endif
426 if hasMarks
427 assert_equal(1, line("'a"))
428 assert_equal(2, line("'b"))
429 assert_equal(3, line("'c"))
430 else
431 assert_equal(0, line("'a"))
432 assert_equal(0, line("'b"))
433 assert_equal(0, line("'c"))
434 endif
435 quit!
436 enddef
437 DoTest(false, false, true)
438 DoTest(true, false, false)
439 DoTest(false, true, true)
440 DoTest(true, true, true)
441 set cpo&vim
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100442
443 new
444 setline(1, ['one', 'two', 'three', 'four'])
445 assert_equal(4, line("$"))
446 normal 1Gma
447 normal 2Gmb
448 normal 3Gmc
449 lockmarks :1,2!wc
450 # line is deleted, marks don't move
451 assert_equal(3, line("$"))
452 assert_equal('four', getline(3))
453 assert_equal(1, line("'a"))
454 assert_equal(2, line("'b"))
455 assert_equal(3, line("'c"))
456 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100457 endif
458
Bram Moolenaarf65b35b2020-11-04 18:02:44 +0100459 edit Xone
460 edit Xtwo
461 assert_equal('Xone', expand('#'))
462 keepalt edit Xthree
463 assert_equal('Xone', expand('#'))
464
465 normal /a*b*
466 assert_equal('a*b*', histget("search"))
467 keeppatterns normal /c*d*
468 assert_equal('a*b*', histget("search"))
469
470 new
471 setline(1, range(10))
472 :10
473 normal gg
474 assert_equal(10, getpos("''")[1])
475 keepjumps normal 5G
476 assert_equal(10, getpos("''")[1])
477 quit!
Bram Moolenaare88c8e82020-11-01 17:03:37 +0100478enddef
479
480def Test_command_modifier_other()
481 # TODO
482 # hide
483 # noautocmd
484 # noswapfile
485 # sandbox
486 # silent
487 # silent!
488 # unsilent
489 # verbose
490enddef
491
Bram Moolenaar36113e42020-11-02 21:08:47 +0100492def Test_range_after_command_modifier()
493 CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050:', 2)
494 new
495 setline(1, 'xxx')
496 CheckScriptSuccess(['vim9script', 'silent keepjump :1d _'])
497 assert_equal('', getline(1))
498 bwipe!
499enddef
500
Bram Moolenaar007f9d62020-07-06 23:04:49 +0200501def Test_eval_command()
Bram Moolenaarac564082020-09-27 19:05:33 +0200502 var from = 3
503 var to = 5
Bram Moolenaar007f9d62020-07-06 23:04:49 +0200504 g:val = 111
505 def Increment(nrs: list<number>)
506 for nr in nrs
507 g:val += nr
508 endfor
509 enddef
510 eval range(from, to)
511 ->Increment()
512 assert_equal(111 + 3 + 4 + 5, g:val)
513 unlet g:val
514enddef
515
Bram Moolenaarb8a92962020-08-20 18:02:47 +0200516def Test_map_command()
Bram Moolenaarac564082020-09-27 19:05:33 +0200517 var lines =<< trim END
Bram Moolenaarb8a92962020-08-20 18:02:47 +0200518 nnoremap <F3> :echo 'hit F3 #'<CR>
519 assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n"))
520 END
521 CheckDefSuccess(lines)
522 CheckScriptSuccess(['vim9script'] + lines)
523enddef
524
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +0200525def Test_normal_command()
526 new
527 setline(1, 'doesnotexist')
Bram Moolenaarac564082020-09-27 19:05:33 +0200528 var caught = 0
Bram Moolenaarb3ea36c2020-08-23 21:46:32 +0200529 try
530 exe "norm! \<C-]>"
531 catch /E433/
532 caught = 2
533 endtry
534 assert_equal(2, caught)
535
536 try
537 exe "norm! 3\<C-]>"
538 catch /E433/
539 caught = 3
540 endtry
541 assert_equal(3, caught)
542 bwipe!
543enddef
544
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200545def Test_put_command()
546 new
547 @p = 'ppp'
548 put p
549 assert_equal('ppp', getline(2))
550
551 put ='below'
552 assert_equal('below', getline(3))
553 put! ='above'
554 assert_equal('above', getline(3))
555 assert_equal('below', getline(4))
556
557 bwipe!
558enddef
559
Bram Moolenaar3bd8de42020-09-14 16:37:34 +0200560def Test_command_star_range()
561 new
562 setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar'])
563 setpos("'<", [0, 1, 0, 0])
564 setpos("'>", [0, 3, 0, 0])
565 :*s/\(foo\|bar\)/baz/g
566 getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz'])
567
568 bwipe!
569enddef
570
Bram Moolenaar20d89e02020-10-20 23:11:33 +0200571def Test_f_args()
572 var lines =<< trim END
573 vim9script
574
575 func SaveCmdArgs(...)
576 let g:args = a:000
577 endfunc
578
579 command -nargs=* TestFArgs call SaveCmdArgs(<f-args>)
580
581 TestFArgs
582 assert_equal([], g:args)
583
584 TestFArgs one two three
585 assert_equal(['one', 'two', 'three'], g:args)
586 END
587 CheckScriptSuccess(lines)
588enddef
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200589
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +0200590def Test_modifier_silent()
591 echomsg 'last one'
592 silent echomsg "text"
593 redir => g:testmsg
594 :1messages
595 redir END
596 assert_equal("\nlast one", g:testmsg)
597 unlet g:testmsg
598
599 silent! echoerr "error"
600enddef
601
Bram Moolenaarb7a78f72020-06-28 18:43:40 +0200602
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200603" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker