xref: /vim-8.2.3635/src/testdir/test_normal.vim (revision ca68ae13)
1" Test for various Normal mode commands
2
3source shared.vim
4source check.vim
5source view_util.vim
6
7func Setup_NewWindow()
8  10new
9  call setline(1, range(1,100))
10endfunc
11
12func MyFormatExpr()
13  " Adds '->$' at lines having numbers followed by trailing whitespace
14  for ln in range(v:lnum, v:lnum+v:count-1)
15    let line = getline(ln)
16    if getline(ln) =~# '\d\s\+$'
17      call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
18    endif
19  endfor
20endfunc
21
22func CountSpaces(type, ...)
23  " for testing operatorfunc
24  " will count the number of spaces
25  " and return the result in g:a
26  let sel_save = &selection
27  let &selection = "inclusive"
28  let reg_save = @@
29
30  if a:0  " Invoked from Visual mode, use gv command.
31    silent exe "normal! gvy"
32  elseif a:type == 'line'
33    silent exe "normal! '[V']y"
34  else
35    silent exe "normal! `[v`]y"
36  endif
37  let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
38  let &selection = sel_save
39  let @@ = reg_save
40endfunc
41
42func OpfuncDummy(type, ...)
43  " for testing operatorfunc
44  let g:opt=&linebreak
45
46  if a:0  " Invoked from Visual mode, use gv command.
47    silent exe "normal! gvy"
48  elseif a:type == 'line'
49    silent exe "normal! '[V']y"
50  else
51    silent exe "normal! `[v`]y"
52  endif
53  " Create a new dummy window
54  new
55  let g:bufnr=bufnr('%')
56endfunc
57
58func Test_normal00_optrans()
59  new
60  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
61  1
62  exe "norm! Sfoobar\<esc>"
63  call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
64  2
65  exe "norm! $vbsone"
66  call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
67  norm! VS Second line here
68  call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
69  %d
70  call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
71  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
72
73  1
74  norm! 2D
75  call assert_equal(['3 this is the third line', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
76  set cpo+=#
77  norm! 4D
78  call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
79
80  " clean up
81  set cpo-=#
82  bw!
83endfunc
84
85func Test_normal01_keymodel()
86  call Setup_NewWindow()
87  " Test 1: depending on 'keymodel' <s-down> does something different
88  50
89  call feedkeys("V\<S-Up>y", 'tx')
90  call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
91  set keymodel=startsel
92  50
93  call feedkeys("V\<S-Up>y", 'tx')
94  call assert_equal(['49', '50'], getline("'<", "'>"))
95  " Start visual mode when keymodel = startsel
96  50
97  call feedkeys("\<S-Up>y", 'tx')
98  call assert_equal(['49', '5'], getreg(0, 0, 1))
99  " Use the different Shift special keys
100  50
101  call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx')
102  call assert_equal(['50'], getline("'<", "'>"))
103  call assert_equal(['50', ''], getreg(0, 0, 1))
104
105  " Do not start visual mode when keymodel=
106  set keymodel=
107  50
108  call feedkeys("\<S-Up>y$", 'tx')
109  call assert_equal(['42'], getreg(0, 0, 1))
110  " Stop visual mode when keymodel=stopsel
111  set keymodel=stopsel
112  50
113  call feedkeys("Vkk\<Up>yy", 'tx')
114  call assert_equal(['47'], getreg(0, 0, 1))
115
116  set keymodel=
117  50
118  call feedkeys("Vkk\<Up>yy", 'tx')
119  call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
120
121  " clean up
122  bw!
123endfunc
124
125func Test_normal03_join()
126  " basic join test
127  call Setup_NewWindow()
128  50
129  norm! VJ
130  call assert_equal('50 51', getline('.'))
131  $
132  norm! J
133  call assert_equal('100', getline('.'))
134  $
135  norm! V9-gJ
136  call assert_equal('919293949596979899100', getline('.'))
137  call setline(1, range(1,100))
138  $
139  :j 10
140  call assert_equal('100', getline('.'))
141  " clean up
142  bw!
143endfunc
144
145func Test_normal04_filter()
146  " basic filter test
147  " only test on non windows platform
148  if has('win32')
149    return
150  endif
151  call Setup_NewWindow()
152  1
153  call feedkeys("!!sed -e 's/^/|    /'\n", 'tx')
154  call assert_equal('|    1', getline('.'))
155  90
156  :sil :!echo one
157  call feedkeys('.', 'tx')
158  call assert_equal('|    90', getline('.'))
159  95
160  set cpo+=!
161  " 2 <CR>, 1: for executing the command,
162  "         2: clear hit-enter-prompt
163  call feedkeys("!!\n", 'tx')
164  call feedkeys(":!echo one\n\n", 'tx')
165  call feedkeys(".", 'tx')
166  call assert_equal('one', getline('.'))
167  set cpo-=!
168  bw!
169endfunc
170
171func Test_normal05_formatexpr()
172  " basic formatexpr test
173  call Setup_NewWindow()
174  %d_
175  call setline(1, ['here: 1   ', '2', 'here: 3   ', '4', 'not here:   '])
176  1
177  set formatexpr=MyFormatExpr()
178  norm! gqG
179  call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here:   '], getline(1,'$'))
180  set formatexpr=
181  bw!
182endfunc
183
184func Test_normal05_formatexpr_newbuf()
185  " Edit another buffer in the 'formatexpr' function
186  new
187  func! Format()
188    edit another
189  endfunc
190  set formatexpr=Format()
191  norm gqG
192  bw!
193  set formatexpr=
194endfunc
195
196func Test_normal05_formatexpr_setopt()
197  " Change the 'formatexpr' value in the function
198  new
199  func! Format()
200    set formatexpr=
201  endfunc
202  set formatexpr=Format()
203  norm gqG
204  bw!
205  set formatexpr=
206endfunc
207
208func Test_normal06_formatprg()
209  " basic test for formatprg
210  " only test on non windows platform
211  if has('win32')
212    return
213  endif
214
215  " uses sed to number non-empty lines
216  call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/    /', '}'''], 'Xsed_format.sh')
217  call system('chmod +x ./Xsed_format.sh')
218  let text = ['a', '', 'c', '', ' ', 'd', 'e']
219  let expected = ['1    a', '', '3    c', '', '5     ', '6    d', '7    e']
220
221  10new
222  call setline(1, text)
223  set formatprg=./Xsed_format.sh
224  norm! gggqG
225  call assert_equal(expected, getline(1, '$'))
226  bw!
227
228  10new
229  call setline(1, text)
230  set formatprg=donothing
231  setlocal formatprg=./Xsed_format.sh
232  norm! gggqG
233  call assert_equal(expected, getline(1, '$'))
234  bw!
235
236  " clean up
237  set formatprg=
238  setlocal formatprg=
239  call delete('Xsed_format.sh')
240endfunc
241
242func Test_normal07_internalfmt()
243  " basic test for internal formmatter to textwidth of 12
244  let list=range(1,11)
245  call map(list, 'v:val."    "')
246  10new
247  call setline(1, list)
248  set tw=12
249  norm! gggqG
250  call assert_equal(['1    2    3', '4    5    6', '7    8    9', '10    11    '], getline(1, '$'))
251  " clean up
252  set tw=0
253  bw!
254endfunc
255
256func Test_normal08_fold()
257  " basic tests for foldopen/folddelete
258  if !has("folding")
259    return
260  endif
261  call Setup_NewWindow()
262  50
263  setl foldenable fdm=marker
264  " First fold
265  norm! V4jzf
266  " check that folds have been created
267  call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
268  " Second fold
269  46
270  norm! V10jzf
271  " check that folds have been created
272  call assert_equal('46/*{{{*/', getline(46))
273  call assert_equal('60/*}}}*/', getline(60))
274  norm! k
275  call assert_equal('45', getline('.'))
276  norm! j
277  call assert_equal('46/*{{{*/', getline('.'))
278  norm! j
279  call assert_equal('61', getline('.'))
280  norm! k
281  " open a fold
282  norm! Vzo
283  norm! k
284  call assert_equal('45', getline('.'))
285  norm! j
286  call assert_equal('46/*{{{*/', getline('.'))
287  norm! j
288  call assert_equal('47', getline('.'))
289  norm! k
290  norm! zcVzO
291  call assert_equal('46/*{{{*/', getline('.'))
292  norm! j
293  call assert_equal('47', getline('.'))
294  norm! j
295  call assert_equal('48', getline('.'))
296  norm! j
297  call assert_equal('49', getline('.'))
298  norm! j
299  call assert_equal('50/*{{{*/', getline('.'))
300  norm! j
301  call assert_equal('51', getline('.'))
302  " delete folds
303  :46
304  " collapse fold
305  norm! V14jzC
306  " delete all folds recursively
307  norm! VzD
308  call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
309
310  " clean up
311  setl nofoldenable fdm=marker
312  bw!
313endfunc
314
315func Test_normal09_operatorfunc()
316  " Test operatorfunc
317  call Setup_NewWindow()
318  " Add some spaces for counting
319  50,60s/$/  /
320  unlet! g:a
321  let g:a=0
322  nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
323  vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
324  50
325  norm V2j,,
326  call assert_equal(6, g:a)
327  norm V,,
328  call assert_equal(2, g:a)
329  norm ,,l
330  call assert_equal(0, g:a)
331  50
332  exe "norm 0\<c-v>10j2l,,"
333  call assert_equal(11, g:a)
334  50
335  norm V10j,,
336  call assert_equal(22, g:a)
337
338  " clean up
339  unmap <buffer> ,,
340  set opfunc=
341  unlet! g:a
342  bw!
343endfunc
344
345func Test_normal09a_operatorfunc()
346  " Test operatorfunc
347  call Setup_NewWindow()
348  " Add some spaces for counting
349  50,60s/$/  /
350  unlet! g:opt
351  set linebreak
352  nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
353  50
354  norm ,,j
355  exe "bd!" g:bufnr
356  call assert_true(&linebreak)
357  call assert_equal(g:opt, &linebreak)
358  set nolinebreak
359  norm ,,j
360  exe "bd!" g:bufnr
361  call assert_false(&linebreak)
362  call assert_equal(g:opt, &linebreak)
363
364  " clean up
365  unmap <buffer> ,,
366  set opfunc=
367  bw!
368  unlet! g:opt
369endfunc
370
371func Test_normal10_expand()
372  " Test for expand()
373  10new
374  call setline(1, ['1', 'ifooar,,cbar'])
375  2
376  norm! $
377  call assert_equal('cbar', expand('<cword>'))
378  call assert_equal('ifooar,,cbar', expand('<cWORD>'))
379
380  call setline(1, ['prx = list[idx];'])
381  1
382  let expected = ['', 'prx', 'prx', 'prx',
383	\ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
384	\ 'idx', 'idx', 'idx', 'idx',
385	\ 'list[idx]',
386	\ '];',
387	\ ]
388  for i in range(1, 16)
389    exe 'norm ' . i . '|'
390    call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
391  endfor
392
393  if executable('echo')
394    " Test expand(`...`) i.e. backticks command expansion.
395    call assert_equal('abcde', expand('`echo abcde`'))
396  endif
397
398  " Test expand(`=...`) i.e. backticks expression expansion
399  call assert_equal('5', expand('`=2+3`'))
400  call assert_equal('3.14', expand('`=3.14`'))
401
402  " clean up
403  bw!
404endfunc
405
406func Test_normal11_showcmd()
407  " test for 'showcmd'
408  10new
409  exe "norm! ofoobar\<esc>"
410  call assert_equal(2, line('$'))
411  set showcmd
412  exe "norm! ofoobar2\<esc>"
413  call assert_equal(3, line('$'))
414  exe "norm! VAfoobar3\<esc>"
415  call assert_equal(3, line('$'))
416  exe "norm! 0d3\<del>2l"
417  call assert_equal('obar2foobar3', getline('.'))
418  bw!
419endfunc
420
421" Test for nv_error and normal command errors
422func Test_normal12_nv_error()
423  10new
424  call setline(1, range(1,5))
425  " should not do anything, just beep
426  call assert_beeps('exe "norm! <c-k>"')
427  call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
428  call assert_beeps('normal! G2dd')
429  call assert_beeps("normal! g\<C-A>")
430  call assert_beeps("normal! g\<C-X>")
431  call assert_beeps("normal! g\<C-B>")
432  call assert_beeps("normal! vQ\<Esc>")
433  call assert_beeps("normal! 2[[")
434  call assert_beeps("normal! 2]]")
435  call assert_beeps("normal! 2[]")
436  call assert_beeps("normal! 2][")
437  call assert_beeps("normal! 4[z")
438  call assert_beeps("normal! 4]z")
439  call assert_beeps("normal! 4[c")
440  call assert_beeps("normal! 4]c")
441  call assert_beeps("normal! 200%")
442  call assert_beeps("normal! %")
443  call assert_beeps("normal! 2{")
444  call assert_beeps("normal! 2}")
445  call assert_beeps("normal! r\<Right>")
446  call assert_beeps("normal! 8ry")
447  call assert_beeps('normal! "@')
448  bw!
449endfunc
450
451func Test_normal13_help()
452  " Test for F1
453  call assert_equal(1, winnr())
454  call feedkeys("\<f1>", 'txi')
455  call assert_match('help\.txt', bufname('%'))
456  call assert_equal(2, winnr('$'))
457  bw!
458endfunc
459
460func Test_normal14_page()
461  " basic test for Ctrl-F and Ctrl-B
462  call Setup_NewWindow()
463  exe "norm! \<c-f>"
464  call assert_equal('9', getline('.'))
465  exe "norm! 2\<c-f>"
466  call assert_equal('25', getline('.'))
467  exe "norm! 2\<c-b>"
468  call assert_equal('18', getline('.'))
469  1
470  set scrolloff=5
471  exe "norm! 2\<c-f>"
472  call assert_equal('21', getline('.'))
473  exe "norm! \<c-b>"
474  call assert_equal('13', getline('.'))
475  1
476  set scrolloff=99
477  exe "norm! \<c-f>"
478  call assert_equal('13', getline('.'))
479  set scrolloff=0
480  100
481  exe "norm! $\<c-b>"
482  call assert_equal('92', getline('.'))
483  call assert_equal([0, 92, 1, 0, 1], getcurpos())
484  100
485  set nostartofline
486  exe "norm! $\<c-b>"
487  call assert_equal('92', getline('.'))
488  call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
489  " cleanup
490  set startofline
491  bw!
492endfunc
493
494func Test_normal14_page_eol()
495  10new
496  norm oxxxxxxx
497  exe "norm 2\<c-f>"
498  " check with valgrind that cursor is put back in column 1
499  exe "norm 2\<c-b>"
500  bw!
501endfunc
502
503" Test for errors with z command
504func Test_normal_z_error()
505  call assert_beeps('normal! z2p')
506  call assert_beeps('normal! zp')
507endfunc
508
509func Test_normal15_z_scroll_vert()
510  " basic test for z commands that scroll the window
511  call Setup_NewWindow()
512  100
513  norm! >>
514  " Test for z<cr>
515  exe "norm! z\<cr>"
516  call assert_equal('	100', getline('.'))
517  call assert_equal(100, winsaveview()['topline'])
518  call assert_equal([0, 100, 2, 0, 9], getcurpos())
519
520  " Test for zt
521  21
522  norm! >>0zt
523  call assert_equal('	21', getline('.'))
524  call assert_equal(21, winsaveview()['topline'])
525  call assert_equal([0, 21, 1, 0, 8], getcurpos())
526
527  " Test for zb
528  30
529  norm! >>$ztzb
530  call assert_equal('	30', getline('.'))
531  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
532  call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
533
534  " Test for z-
535  1
536  30
537  norm! 0z-
538  call assert_equal('	30', getline('.'))
539  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
540  call assert_equal([0, 30, 2, 0, 9], getcurpos())
541
542  " Test for z{height}<cr>
543  call assert_equal(10, winheight(0))
544  exe "norm! z12\<cr>"
545  call assert_equal(12, winheight(0))
546  exe "norm! z10\<cr>"
547  call assert_equal(10, winheight(0))
548
549  " Test for z.
550  1
551  21
552  norm! 0z.
553  call assert_equal('	21', getline('.'))
554  call assert_equal(17, winsaveview()['topline'])
555  call assert_equal([0, 21, 2, 0, 9], getcurpos())
556
557  " Test for zz
558  1
559  21
560  norm! 0zz
561  call assert_equal('	21', getline('.'))
562  call assert_equal(17, winsaveview()['topline'])
563  call assert_equal([0, 21, 1, 0, 8], getcurpos())
564
565  " Test for z+
566  11
567  norm! zt
568  norm! z+
569  call assert_equal('	21', getline('.'))
570  call assert_equal(21, winsaveview()['topline'])
571  call assert_equal([0, 21, 2, 0, 9], getcurpos())
572
573  " Test for [count]z+
574  1
575  norm! 21z+
576  call assert_equal('	21', getline('.'))
577  call assert_equal(21, winsaveview()['topline'])
578  call assert_equal([0, 21, 2, 0, 9], getcurpos())
579
580  " Test for z^
581  norm! 22z+0
582  norm! z^
583  call assert_equal('	21', getline('.'))
584  call assert_equal(12, winsaveview()['topline'])
585  call assert_equal([0, 21, 2, 0, 9], getcurpos())
586
587  " Test for [count]z^
588  1
589  norm! 30z^
590  call assert_equal('	21', getline('.'))
591  call assert_equal(12, winsaveview()['topline'])
592  call assert_equal([0, 21, 2, 0, 9], getcurpos())
593
594  " cleanup
595  bw!
596endfunc
597
598func Test_normal16_z_scroll_hor()
599  " basic test for z commands that scroll the window
600  10new
601  15vsp
602  set nowrap listchars=
603  let lineA='abcdefghijklmnopqrstuvwxyz'
604  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
605  $put =lineA
606  $put =lineB
607  1d
608
609  " Test for zl and zh with a count
610  norm! 0z10l
611  call assert_equal([11, 1], [col('.'), wincol()])
612  norm! z4h
613  call assert_equal([11, 5], [col('.'), wincol()])
614  normal! 2gg
615
616  " Test for zl
617  1
618  norm! 5zl
619  call assert_equal(lineA, getline('.'))
620  call assert_equal(6, col('.'))
621  call assert_equal(5, winsaveview()['leftcol'])
622  norm! yl
623  call assert_equal('f', @0)
624
625  " Test for zh
626  norm! 2zh
627  call assert_equal(lineA, getline('.'))
628  call assert_equal(6, col('.'))
629  norm! yl
630  call assert_equal('f', @0)
631  call assert_equal(3, winsaveview()['leftcol'])
632
633  " Test for zL
634  norm! zL
635  call assert_equal(11, col('.'))
636  norm! yl
637  call assert_equal('k', @0)
638  call assert_equal(10, winsaveview()['leftcol'])
639  norm! 2zL
640  call assert_equal(25, col('.'))
641  norm! yl
642  call assert_equal('y', @0)
643  call assert_equal(24, winsaveview()['leftcol'])
644
645  " Test for zH
646  norm! 2zH
647  call assert_equal(25, col('.'))
648  call assert_equal(10, winsaveview()['leftcol'])
649  norm! yl
650  call assert_equal('y', @0)
651
652  " Test for zs
653  norm! $zs
654  call assert_equal(26, col('.'))
655  call assert_equal(25, winsaveview()['leftcol'])
656  norm! yl
657  call assert_equal('z', @0)
658
659  " Test for ze
660  norm! ze
661  call assert_equal(26, col('.'))
662  call assert_equal(11, winsaveview()['leftcol'])
663  norm! yl
664  call assert_equal('z', @0)
665
666  " cleanup
667  set wrap listchars=eol:$
668  bw!
669endfunc
670
671func Test_normal17_z_scroll_hor2()
672  " basic test for z commands that scroll the window
673  " using 'sidescrolloff' setting
674  10new
675  20vsp
676  set nowrap listchars= sidescrolloff=5
677  let lineA='abcdefghijklmnopqrstuvwxyz'
678  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
679  $put =lineA
680  $put =lineB
681  1d
682
683  " Test for zl
684  1
685  norm! 5zl
686  call assert_equal(lineA, getline('.'))
687  call assert_equal(11, col('.'))
688  call assert_equal(5, winsaveview()['leftcol'])
689  norm! yl
690  call assert_equal('k', @0)
691
692  " Test for zh
693  norm! 2zh
694  call assert_equal(lineA, getline('.'))
695  call assert_equal(11, col('.'))
696  norm! yl
697  call assert_equal('k', @0)
698  call assert_equal(3, winsaveview()['leftcol'])
699
700  " Test for zL
701  norm! 0zL
702  call assert_equal(16, col('.'))
703  norm! yl
704  call assert_equal('p', @0)
705  call assert_equal(10, winsaveview()['leftcol'])
706  norm! 2zL
707  call assert_equal(26, col('.'))
708  norm! yl
709  call assert_equal('z', @0)
710  call assert_equal(15, winsaveview()['leftcol'])
711
712  " Test for zH
713  norm! 2zH
714  call assert_equal(15, col('.'))
715  call assert_equal(0, winsaveview()['leftcol'])
716  norm! yl
717  call assert_equal('o', @0)
718
719  " Test for zs
720  norm! $zs
721  call assert_equal(26, col('.'))
722  call assert_equal(20, winsaveview()['leftcol'])
723  norm! yl
724  call assert_equal('z', @0)
725
726  " Test for ze
727  norm! ze
728  call assert_equal(26, col('.'))
729  call assert_equal(11, winsaveview()['leftcol'])
730  norm! yl
731  call assert_equal('z', @0)
732
733  " cleanup
734  set wrap listchars=eol:$ sidescrolloff=0
735  bw!
736endfunc
737
738" Test for H, M and L commands with folds
739func Test_scroll_cmds()
740  15new
741  call setline(1, range(1, 100))
742  exe "normal! 30ggz\<CR>"
743  set foldenable
744  33,36fold
745  40,43fold
746  46,49fold
747  let h = winheight(0)
748  " Top of the screen = 30
749  " Folded lines = 9
750  " Bottom of the screen = 30 + h + 9 - 1
751  normal! 4L
752  call assert_equal(35 + h, line('.'))
753  normal! 4H
754  call assert_equal(33, line('.'))
755  set foldenable&
756  close!
757endfunc
758
759func Test_normal18_z_fold()
760  " basic tests for foldopen/folddelete
761  if !has("folding")
762    return
763  endif
764  call Setup_NewWindow()
765  50
766  setl foldenable fdm=marker foldlevel=5
767
768  call assert_beeps('normal! zj')
769  call assert_beeps('normal! zk')
770
771  " Test for zF
772  " First fold
773  norm! 4zF
774  " check that folds have been created
775  call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
776
777  " Test for zd
778  51
779  norm! 2zF
780  call assert_equal(2, foldlevel('.'))
781  norm! kzd
782  call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
783  norm! j
784  call assert_equal(1, foldlevel('.'))
785
786  " Test for zD
787  " also deletes partially selected folds recursively
788  51
789  norm! zF
790  call assert_equal(2, foldlevel('.'))
791  norm! kV2jzD
792  call assert_equal(['50', '51', '52', '53'], getline(50,53))
793
794  " Test for zE
795  85
796  norm! 4zF
797  86
798  norm! 2zF
799  90
800  norm! 4zF
801  call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
802  norm! zE
803  call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
804
805  " Test for zn
806  50
807  set foldlevel=0
808  norm! 2zF
809  norm! zn
810  norm! k
811  call assert_equal('49', getline('.'))
812  norm! j
813  call assert_equal('50/*{{{*/', getline('.'))
814  norm! j
815  call assert_equal('51/*}}}*/', getline('.'))
816  norm! j
817  call assert_equal('52', getline('.'))
818  call assert_equal(0, &foldenable)
819
820  " Test for zN
821  49
822  norm! zN
823  call assert_equal('49', getline('.'))
824  norm! j
825  call assert_equal('50/*{{{*/', getline('.'))
826  norm! j
827  call assert_equal('52', getline('.'))
828  call assert_equal(1, &foldenable)
829
830  " Test for zi
831  norm! zi
832  call assert_equal(0, &foldenable)
833  norm! zi
834  call assert_equal(1, &foldenable)
835  norm! zi
836  call assert_equal(0, &foldenable)
837  norm! zi
838  call assert_equal(1, &foldenable)
839
840  " Test for za
841  50
842  norm! za
843  norm! k
844  call assert_equal('49', getline('.'))
845  norm! j
846  call assert_equal('50/*{{{*/', getline('.'))
847  norm! j
848  call assert_equal('51/*}}}*/', getline('.'))
849  norm! j
850  call assert_equal('52', getline('.'))
851  50
852  norm! za
853  norm! k
854  call assert_equal('49', getline('.'))
855  norm! j
856  call assert_equal('50/*{{{*/', getline('.'))
857  norm! j
858  call assert_equal('52', getline('.'))
859
860  49
861  norm! 5zF
862  norm! k
863  call assert_equal('48', getline('.'))
864  norm! j
865  call assert_equal('49/*{{{*/', getline('.'))
866  norm! j
867  call assert_equal('55', getline('.'))
868  49
869  norm! za
870  call assert_equal('49/*{{{*/', getline('.'))
871  norm! j
872  call assert_equal('50/*{{{*/', getline('.'))
873  norm! j
874  call assert_equal('52', getline('.'))
875  set nofoldenable
876  " close fold and set foldenable
877  norm! za
878  call assert_equal(1, &foldenable)
879
880  50
881  " have to use {count}za to open all folds and make the cursor visible
882  norm! 2za
883  norm! 2k
884  call assert_equal('48', getline('.'))
885  norm! j
886  call assert_equal('49/*{{{*/', getline('.'))
887  norm! j
888  call assert_equal('50/*{{{*/', getline('.'))
889  norm! j
890  call assert_equal('51/*}}}*/', getline('.'))
891  norm! j
892  call assert_equal('52', getline('.'))
893
894  " Test for zA
895  49
896  set foldlevel=0
897  50
898  norm! zA
899  norm! 2k
900  call assert_equal('48', getline('.'))
901  norm! j
902  call assert_equal('49/*{{{*/', getline('.'))
903  norm! j
904  call assert_equal('50/*{{{*/', getline('.'))
905  norm! j
906  call assert_equal('51/*}}}*/', getline('.'))
907  norm! j
908  call assert_equal('52', getline('.'))
909
910  " zA on a opened fold when foldenable is not set
911  50
912  set nofoldenable
913  norm! zA
914  call assert_equal(1, &foldenable)
915  norm! k
916  call assert_equal('48', getline('.'))
917  norm! j
918  call assert_equal('49/*{{{*/', getline('.'))
919  norm! j
920  call assert_equal('55', getline('.'))
921
922  " Test for zc
923  norm! zE
924  50
925  norm! 2zF
926  49
927  norm! 5zF
928  set nofoldenable
929  50
930  " There most likely is a bug somewhere:
931  " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
932  " TODO: Should this only close the inner most fold or both folds?
933  norm! zc
934  call assert_equal(1, &foldenable)
935  norm! k
936  call assert_equal('48', getline('.'))
937  norm! j
938  call assert_equal('49/*{{{*/', getline('.'))
939  norm! j
940  call assert_equal('55', getline('.'))
941  set nofoldenable
942  50
943  norm! Vjzc
944  norm! k
945  call assert_equal('48', getline('.'))
946  norm! j
947  call assert_equal('49/*{{{*/', getline('.'))
948  norm! j
949  call assert_equal('55', getline('.'))
950
951  " Test for zC
952  set nofoldenable
953  50
954  norm! zCk
955  call assert_equal('48', getline('.'))
956  norm! j
957  call assert_equal('49/*{{{*/', getline('.'))
958  norm! j
959  call assert_equal('55', getline('.'))
960
961  " Test for zx
962  " 1) close folds at line 49-54
963  set nofoldenable
964  48
965  norm! zx
966  call assert_equal(1, &foldenable)
967  norm! j
968  call assert_equal('49/*{{{*/', getline('.'))
969  norm! j
970  call assert_equal('55', getline('.'))
971
972  " 2) do not close fold under cursor
973  51
974  set nofoldenable
975  norm! zx
976  call assert_equal(1, &foldenable)
977  norm! 3k
978  call assert_equal('48', getline('.'))
979  norm! j
980  call assert_equal('49/*{{{*/', getline('.'))
981  norm! j
982  call assert_equal('50/*{{{*/', getline('.'))
983  norm! j
984  call assert_equal('51/*}}}*/', getline('.'))
985  norm! j
986  call assert_equal('52', getline('.'))
987  norm! j
988  call assert_equal('53', getline('.'))
989  norm! j
990  call assert_equal('54/*}}}*/', getline('.'))
991  norm! j
992  call assert_equal('55', getline('.'))
993
994  " 3) close one level of folds
995  48
996  set nofoldenable
997  set foldlevel=1
998  norm! zx
999  call assert_equal(1, &foldenable)
1000  call assert_equal('48', getline('.'))
1001  norm! j
1002  call assert_equal('49/*{{{*/', getline('.'))
1003  norm! j
1004  call assert_equal('50/*{{{*/', getline('.'))
1005  norm! j
1006  call assert_equal('52', getline('.'))
1007  norm! j
1008  call assert_equal('53', getline('.'))
1009  norm! j
1010  call assert_equal('54/*}}}*/', getline('.'))
1011  norm! j
1012  call assert_equal('55', getline('.'))
1013
1014  " Test for zX
1015  " Close all folds
1016  set foldlevel=0 nofoldenable
1017  50
1018  norm! zX
1019  call assert_equal(1, &foldenable)
1020  norm! k
1021  call assert_equal('48', getline('.'))
1022  norm! j
1023  call assert_equal('49/*{{{*/', getline('.'))
1024  norm! j
1025  call assert_equal('55', getline('.'))
1026
1027  " Test for zm
1028  50
1029  set nofoldenable foldlevel=2
1030  norm! zm
1031  call assert_equal(1, &foldenable)
1032  call assert_equal(1, &foldlevel)
1033  norm! zm
1034  call assert_equal(0, &foldlevel)
1035  norm! zm
1036  call assert_equal(0, &foldlevel)
1037  norm! k
1038  call assert_equal('48', getline('.'))
1039  norm! j
1040  call assert_equal('49/*{{{*/', getline('.'))
1041  norm! j
1042  call assert_equal('55', getline('.'))
1043
1044  " Test for zM
1045  48
1046  set nofoldenable foldlevel=99
1047  norm! zM
1048  call assert_equal(1, &foldenable)
1049  call assert_equal(0, &foldlevel)
1050  call assert_equal('48', getline('.'))
1051  norm! j
1052  call assert_equal('49/*{{{*/', getline('.'))
1053  norm! j
1054  call assert_equal('55', getline('.'))
1055
1056  " Test for zr
1057  48
1058  set nofoldenable foldlevel=0
1059  norm! zr
1060  call assert_equal(0, &foldenable)
1061  call assert_equal(1, &foldlevel)
1062  set foldlevel=0 foldenable
1063  norm! zr
1064  call assert_equal(1, &foldenable)
1065  call assert_equal(1, &foldlevel)
1066  norm! zr
1067  call assert_equal(2, &foldlevel)
1068  call assert_equal('48', getline('.'))
1069  norm! j
1070  call assert_equal('49/*{{{*/', getline('.'))
1071  norm! j
1072  call assert_equal('50/*{{{*/', getline('.'))
1073  norm! j
1074  call assert_equal('51/*}}}*/', getline('.'))
1075  norm! j
1076  call assert_equal('52', getline('.'))
1077
1078  " Test for zR
1079  48
1080  set nofoldenable foldlevel=0
1081  norm! zR
1082  call assert_equal(0, &foldenable)
1083  call assert_equal(2, &foldlevel)
1084  set foldenable foldlevel=0
1085  norm! zR
1086  call assert_equal(1, &foldenable)
1087  call assert_equal(2, &foldlevel)
1088  call assert_equal('48', getline('.'))
1089  norm! j
1090  call assert_equal('49/*{{{*/', getline('.'))
1091  norm! j
1092  call assert_equal('50/*{{{*/', getline('.'))
1093  norm! j
1094  call assert_equal('51/*}}}*/', getline('.'))
1095  norm! j
1096  call assert_equal('52', getline('.'))
1097  call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1098  48
1099  call assert_equal('48', getline('.'))
1100  norm! j
1101  call assert_equal('49/*{{{*/', getline('.'))
1102  norm! j
1103  call assert_equal('50/*{{{*/', getline('.'))
1104  norm! j
1105  call assert_equal('a /*{{{*/', getline('.'))
1106  norm! j
1107  call assert_equal('51/*}}}*/', getline('.'))
1108  norm! j
1109  call assert_equal('52', getline('.'))
1110  48
1111  norm! zR
1112  call assert_equal(1, &foldenable)
1113  call assert_equal(3, &foldlevel)
1114  call assert_equal('48', getline('.'))
1115  norm! j
1116  call assert_equal('49/*{{{*/', getline('.'))
1117  norm! j
1118  call assert_equal('50/*{{{*/', getline('.'))
1119  norm! j
1120  call assert_equal('a /*{{{*/', getline('.'))
1121  norm! j
1122  call assert_equal('b /*}}}*/', getline('.'))
1123  norm! j
1124  call assert_equal('51/*}}}*/', getline('.'))
1125  norm! j
1126  call assert_equal('52', getline('.'))
1127
1128  " clean up
1129  setl nofoldenable fdm=marker foldlevel=0
1130  bw!
1131endfunc
1132
1133func Test_normal20_exmode()
1134  if !has("unix")
1135    " Reading from redirected file doesn't work on MS-Windows
1136    return
1137  endif
1138  call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1139  call writefile(['1', '2'], 'Xfile')
1140  call system(GetVimCommand() .. ' -e -s < Xscript Xfile')
1141  let a=readfile('Xfile2')
1142  call assert_equal(['1', 'foo', 'bar', '2'], a)
1143
1144  " clean up
1145  for file in ['Xfile', 'Xfile2', 'Xscript']
1146    call delete(file)
1147  endfor
1148  bw!
1149endfunc
1150
1151func Test_normal21_nv_hat()
1152
1153  " Edit a fresh file and wipe the buffer list so that there is no alternate
1154  " file present.  Next, check for the expected command failures.
1155  edit Xfoo | %bw
1156  call assert_fails(':buffer #', 'E86')
1157  call assert_fails(':execute "normal! \<C-^>"', 'E23')
1158
1159  " Test for the expected behavior when switching between two named buffers.
1160  edit Xfoo | edit Xbar
1161  call feedkeys("\<C-^>", 'tx')
1162  call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1163  call feedkeys("\<C-^>", 'tx')
1164  call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1165
1166  " Test for the expected behavior when only one buffer is named.
1167  enew | let l:nr = bufnr('%')
1168  call feedkeys("\<C-^>", 'tx')
1169  call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1170  call feedkeys("\<C-^>", 'tx')
1171  call assert_equal('', bufname('%'))
1172  call assert_equal(l:nr, bufnr('%'))
1173
1174  " Test that no action is taken by "<C-^>" when an operator is pending.
1175  edit Xfoo
1176  call feedkeys("ci\<C-^>", 'tx')
1177  call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1178
1179  %bw!
1180endfunc
1181
1182func Test_normal22_zet()
1183  " Test for ZZ
1184  " let shell = &shell
1185  " let &shell = 'sh'
1186  call writefile(['1', '2'], 'Xfile')
1187  let args = ' -N -i NONE --noplugins -X --not-a-term'
1188  call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile')
1189  let a = readfile('Xfile')
1190  call assert_equal([], a)
1191  " Test for ZQ
1192  call writefile(['1', '2'], 'Xfile')
1193  call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile')
1194  let a = readfile('Xfile')
1195  call assert_equal(['1', '2'], a)
1196
1197  " Unsupported Z command
1198  call assert_beeps('normal! ZW')
1199
1200  " clean up
1201  for file in ['Xfile']
1202    call delete(file)
1203  endfor
1204  " let &shell = shell
1205endfunc
1206
1207func Test_normal23_K()
1208  " Test for K command
1209  new
1210  call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
1211  let k = &keywordprg
1212  set keywordprg=:help
1213  1
1214  norm! VK
1215  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1216  call assert_equal('help', &ft)
1217  call assert_match('\*version8.txt\*', getline('.'))
1218  helpclose
1219  norm! 0K
1220  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1221  call assert_equal('help', &ft)
1222  call assert_match('\*version8\.\d\*', getline('.'))
1223  helpclose
1224
1225  set keywordprg=:new
1226  set iskeyword+=%
1227  set iskeyword+=\|
1228  2
1229  norm! K
1230  call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1231  bwipe!
1232  3
1233  norm! K
1234  call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1235  bwipe!
1236  if !has('win32')
1237    4
1238    norm! K
1239    call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1240    bwipe!
1241  endif
1242  set iskeyword-=%
1243  set iskeyword-=\|
1244
1245  " Only expect "man" to work on Unix
1246  if !has("unix")
1247    let &keywordprg = k
1248    bw!
1249    return
1250  endif
1251
1252  let not_gnu_man = has('mac') || has('bsd')
1253  if not_gnu_man
1254    " In MacOS and BSD, the option for specifying a pager is different
1255    set keywordprg=man\ -P\ cat
1256  else
1257    set keywordprg=man\ --pager=cat
1258  endif
1259  " Test for using man
1260  2
1261  let a = execute('unsilent norm! K')
1262  if not_gnu_man
1263    call assert_match("man -P cat 'man'", a)
1264  else
1265    call assert_match("man --pager=cat 'man'", a)
1266  endif
1267
1268  " Error cases
1269  call setline(1, '#$#')
1270  call assert_fails('normal! ggK', 'E349:')
1271  call setline(1, '---')
1272  call assert_fails('normal! ggv2lK', 'E349:')
1273  call setline(1, ['abc', 'xyz'])
1274  call assert_fails("normal! gg2lv2h\<C-]>", 'E426:')
1275  call assert_beeps("normal! ggVjK")
1276
1277  " clean up
1278  let &keywordprg = k
1279  bw!
1280endfunc
1281
1282func Test_normal24_rot13()
1283  " Testing for g?? g?g?
1284  new
1285  call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1286  1
1287  norm! g??
1288  call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1289  norm! g?g?
1290  call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1291
1292  " clean up
1293  bw!
1294endfunc
1295
1296func Test_normal25_tag()
1297  CheckFeature quickfix
1298
1299  " Testing for CTRL-] g CTRL-] g]
1300  " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1301  h
1302  " Test for CTRL-]
1303  call search('\<x\>$')
1304  exe "norm! \<c-]>"
1305  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1306  norm! yiW
1307  call assert_equal("*x*", @0)
1308  exe ":norm \<c-o>"
1309
1310  " Test for g_CTRL-]
1311  call search('\<v_u\>$')
1312  exe "norm! g\<c-]>"
1313  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1314  norm! yiW
1315  call assert_equal("*v_u*", @0)
1316  exe ":norm \<c-o>"
1317
1318  " Test for g]
1319  call search('\<i_<Esc>$')
1320  let a = execute(":norm! g]")
1321  call assert_match('i_<Esc>.*insert.txt', a)
1322
1323  if !empty(exepath('cscope')) && has('cscope')
1324    " setting cscopetag changes how g] works
1325    set cst
1326    exe "norm! g]"
1327    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1328    norm! yiW
1329    call assert_equal("*i_<Esc>*", @0)
1330    exe ":norm \<c-o>"
1331    " Test for CTRL-W g]
1332    exe "norm! \<C-W>g]"
1333    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1334    norm! yiW
1335    call assert_equal("*i_<Esc>*", @0)
1336    call assert_equal(3, winnr('$'))
1337    helpclose
1338    set nocst
1339  endif
1340
1341  " Test for CTRL-W g]
1342  let a = execute("norm! \<C-W>g]")
1343  call assert_match('i_<Esc>.*insert.txt', a)
1344
1345  " Test for CTRL-W CTRL-]
1346  exe "norm! \<C-W>\<C-]>"
1347  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1348  norm! yiW
1349  call assert_equal("*i_<Esc>*", @0)
1350  call assert_equal(3, winnr('$'))
1351  helpclose
1352
1353  " Test for CTRL-W g CTRL-]
1354  exe "norm! \<C-W>g\<C-]>"
1355  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1356  norm! yiW
1357  call assert_equal("*i_<Esc>*", @0)
1358  call assert_equal(3, winnr('$'))
1359  helpclose
1360
1361  " clean up
1362  helpclose
1363endfunc
1364
1365func Test_normal26_put()
1366  " Test for ]p ]P [p and [P
1367  new
1368  call append(0, ['while read LINE', 'do', '  ((count++))', '  if [ $? -ne 0 ]; then', "    echo 'Error writing file'", '  fi', 'done'])
1369  1
1370  /Error/y a
1371  2
1372  norm! "a]pj"a[p
1373  call assert_equal(['do', "echo 'Error writing file'", "  echo 'Error writing file'", '  ((count++))'], getline(2,5))
1374  1
1375  /^\s\{4}/
1376  exe "norm!  \"a]P3Eldt'"
1377  exe "norm! j\"a[P2Eldt'"
1378  call assert_equal(['  if [ $? -ne 0 ]; then', "    echo 'Error writing'", "    echo 'Error'", "    echo 'Error writing file'", '  fi'], getline(6,10))
1379
1380  " clean up
1381  bw!
1382endfunc
1383
1384func Test_normal27_bracket()
1385  " Test for [' [` ]' ]`
1386  call Setup_NewWindow()
1387  1,21s/.\+/  &   b/
1388  1
1389  norm! $ma
1390  5
1391  norm! $mb
1392  10
1393  norm! $mc
1394  15
1395  norm! $md
1396  20
1397  norm! $me
1398
1399  " Test for ['
1400  9
1401  norm! 2['
1402  call assert_equal('  1   b', getline('.'))
1403  call assert_equal(1, line('.'))
1404  call assert_equal(3, col('.'))
1405
1406  " Test for ]'
1407  norm! ]'
1408  call assert_equal('  5   b', getline('.'))
1409  call assert_equal(5, line('.'))
1410  call assert_equal(3, col('.'))
1411
1412  " No mark after line 21, cursor moves to first non blank on current line
1413  21
1414  norm! $]'
1415  call assert_equal('  21   b', getline('.'))
1416  call assert_equal(21, line('.'))
1417  call assert_equal(3, col('.'))
1418
1419  " Test for [`
1420  norm! 2[`
1421  call assert_equal('  15   b', getline('.'))
1422  call assert_equal(15, line('.'))
1423  call assert_equal(8, col('.'))
1424
1425  " Test for ]`
1426  norm! ]`
1427  call assert_equal('  20   b', getline('.'))
1428  call assert_equal(20, line('.'))
1429  call assert_equal(8, col('.'))
1430
1431  " clean up
1432  bw!
1433endfunc
1434
1435" Test for ( and ) sentence movements
1436func Test_normal28_parenthesis()
1437  new
1438  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1439
1440  $
1441  norm! d(
1442  call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1443  norm! 2d(
1444  call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1445  1
1446  norm! 0d)
1447  call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1448
1449  call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1450  $
1451  norm! $d(
1452  call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1453
1454  " It is an error if a next sentence is not found
1455  %d
1456  call setline(1, '.SH')
1457  call assert_beeps('normal )')
1458
1459  " Jumping to a fold should open the fold
1460  call setline(1, ['', '', 'one', 'two', 'three'])
1461  set foldenable
1462  2,$fold
1463  call feedkeys(')', 'xt')
1464  call assert_equal(3, line('.'))
1465  call assert_equal(1, foldlevel('.'))
1466  call assert_equal(-1, foldclosed('.'))
1467  set foldenable&
1468
1469  " clean up
1470  bw!
1471endfunc
1472
1473" Test for { and } paragraph movements
1474func Test_normal29_brace()
1475  let text =<< trim [DATA]
1476    A paragraph begins after each empty line, and also at each of a set of
1477    paragraph macros, specified by the pairs of characters in the 'paragraphs'
1478    option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
1479    the macros ".IP", ".LP", etc.  (These are nroff macros, so the dot must be in
1480    the first column).  A section boundary is also a paragraph boundary.
1481    Note that a blank line (only containing white space) is NOT a paragraph
1482    boundary.
1483
1484
1485    Also note that this does not include a '{' or '}' in the first column.  When
1486    the '{' flag is in 'cpoptions' then '{' in the first column is used as a
1487    paragraph boundary |posix|.
1488    {
1489    This is no paragraph
1490    unless the '{' is set
1491    in 'cpoptions'
1492    }
1493    .IP
1494    The nroff macros IP separates a paragraph
1495    That means, it must be a '.'
1496    followed by IP
1497    .LPIt does not matter, if afterwards some
1498    more characters follow.
1499    .SHAlso section boundaries from the nroff
1500    macros terminate a paragraph. That means
1501    a character like this:
1502    .NH
1503    End of text here
1504  [DATA]
1505
1506  new
1507  call append(0, text)
1508  1
1509  norm! 0d2}
1510
1511  let expected =<< trim [DATA]
1512    .IP
1513    The nroff macros IP separates a paragraph
1514    That means, it must be a '.'
1515    followed by IP
1516    .LPIt does not matter, if afterwards some
1517    more characters follow.
1518    .SHAlso section boundaries from the nroff
1519    macros terminate a paragraph. That means
1520    a character like this:
1521    .NH
1522    End of text here
1523
1524  [DATA]
1525  call assert_equal(expected, getline(1, '$'))
1526
1527  norm! 0d}
1528
1529  let expected =<< trim [DATA]
1530    .LPIt does not matter, if afterwards some
1531    more characters follow.
1532    .SHAlso section boundaries from the nroff
1533    macros terminate a paragraph. That means
1534    a character like this:
1535    .NH
1536    End of text here
1537
1538  [DATA]
1539  call assert_equal(expected, getline(1, '$'))
1540
1541  $
1542  norm! d{
1543
1544  let expected =<< trim [DATA]
1545    .LPIt does not matter, if afterwards some
1546    more characters follow.
1547    .SHAlso section boundaries from the nroff
1548    macros terminate a paragraph. That means
1549    a character like this:
1550
1551  [DATA]
1552  call assert_equal(expected, getline(1, '$'))
1553
1554  norm! d{
1555
1556  let expected =<< trim [DATA]
1557    .LPIt does not matter, if afterwards some
1558    more characters follow.
1559
1560  [DATA]
1561  call assert_equal(expected, getline(1, '$'))
1562
1563  " Test with { in cpooptions
1564  %d
1565  call append(0, text)
1566  set cpo+={
1567  1
1568  norm! 0d2}
1569
1570  let expected =<< trim [DATA]
1571    {
1572    This is no paragraph
1573    unless the '{' is set
1574    in 'cpoptions'
1575    }
1576    .IP
1577    The nroff macros IP separates a paragraph
1578    That means, it must be a '.'
1579    followed by IP
1580    .LPIt does not matter, if afterwards some
1581    more characters follow.
1582    .SHAlso section boundaries from the nroff
1583    macros terminate a paragraph. That means
1584    a character like this:
1585    .NH
1586    End of text here
1587
1588  [DATA]
1589  call assert_equal(expected, getline(1, '$'))
1590
1591  $
1592  norm! d}
1593
1594  let expected =<< trim [DATA]
1595    {
1596    This is no paragraph
1597    unless the '{' is set
1598    in 'cpoptions'
1599    }
1600    .IP
1601    The nroff macros IP separates a paragraph
1602    That means, it must be a '.'
1603    followed by IP
1604    .LPIt does not matter, if afterwards some
1605    more characters follow.
1606    .SHAlso section boundaries from the nroff
1607    macros terminate a paragraph. That means
1608    a character like this:
1609    .NH
1610    End of text here
1611
1612  [DATA]
1613  call assert_equal(expected, getline(1, '$'))
1614
1615  norm! gg}
1616  norm! d5}
1617
1618  let expected =<< trim [DATA]
1619    {
1620    This is no paragraph
1621    unless the '{' is set
1622    in 'cpoptions'
1623    }
1624
1625  [DATA]
1626  call assert_equal(expected, getline(1, '$'))
1627
1628  " Jumping to a fold should open the fold
1629  %d
1630  call setline(1, ['', 'one', 'two', ''])
1631  set foldenable
1632  2,$fold
1633  call feedkeys('}', 'xt')
1634  call assert_equal(4, line('.'))
1635  call assert_equal(1, foldlevel('.'))
1636  call assert_equal(-1, foldclosed('.'))
1637  set foldenable&
1638
1639  " clean up
1640  set cpo-={
1641  bw!
1642endfunc
1643
1644" Test for ~ command
1645func Test_normal30_changecase()
1646  new
1647  call append(0, 'This is a simple test: äüöß')
1648  norm! 1ggVu
1649  call assert_equal('this is a simple test: äüöß', getline('.'))
1650  norm! VU
1651  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1652  norm! guu
1653  call assert_equal('this is a simple test: äüöss', getline('.'))
1654  norm! gUgU
1655  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1656  norm! gugu
1657  call assert_equal('this is a simple test: äüöss', getline('.'))
1658  norm! gUU
1659  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1660  norm! 010~
1661  call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
1662  norm! V~
1663  call assert_equal('THIS IS A simple test: äüöss', getline('.'))
1664
1665  " Test for changing case across lines using 'whichwrap'
1666  call setline(1, ['aaaaaa', 'aaaaaa'])
1667  normal! gg10~
1668  call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2))
1669  set whichwrap+=~
1670  normal! gg10~
1671  call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2))
1672  set whichwrap&
1673
1674  " clean up
1675  bw!
1676endfunc
1677
1678" Turkish ASCII turns to multi-byte.  On some systems Turkish locale
1679" is available but toupper()/tolower() don't do the right thing.
1680func Test_normal_changecase_turkish()
1681  new
1682  try
1683    lang tr_TR.UTF-8
1684    set casemap=
1685    let iupper = toupper('i')
1686    if iupper == "\u0130"
1687      call setline(1, 'iI')
1688      1normal gUU
1689      call assert_equal("\u0130I", getline(1))
1690      call assert_equal("\u0130I", toupper("iI"))
1691
1692      call setline(1, 'iI')
1693      1normal guu
1694      call assert_equal("i\u0131", getline(1))
1695      call assert_equal("i\u0131", tolower("iI"))
1696    elseif iupper == "I"
1697      call setline(1, 'iI')
1698      1normal gUU
1699      call assert_equal("II", getline(1))
1700      call assert_equal("II", toupper("iI"))
1701
1702      call setline(1, 'iI')
1703      1normal guu
1704      call assert_equal("ii", getline(1))
1705      call assert_equal("ii", tolower("iI"))
1706    else
1707      call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'")
1708    endif
1709    set casemap&
1710    call setline(1, 'iI')
1711    1normal gUU
1712    call assert_equal("II", getline(1))
1713    call assert_equal("II", toupper("iI"))
1714
1715    call setline(1, 'iI')
1716    1normal guu
1717    call assert_equal("ii", getline(1))
1718    call assert_equal("ii", tolower("iI"))
1719
1720    lang en_US.UTF-8
1721  catch /E197:/
1722    " can't use Turkish locale
1723    throw 'Skipped: Turkish locale not available'
1724  endtry
1725  close!
1726endfunc
1727
1728" Test for r (replace) command
1729func Test_normal31_r_cmd()
1730  new
1731  call append(0, 'This is a simple test: abcd')
1732  exe "norm! 1gg$r\<cr>"
1733  call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
1734  exe "norm! 1gg2wlr\<cr>"
1735  call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
1736  exe "norm! 2gg0W5r\<cr>"
1737  call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
1738  set autoindent
1739  call setline(2, ['simple test: abc', ''])
1740  exe "norm! 2gg0W5r\<cr>"
1741  call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
1742  exe "norm! 1ggVr\<cr>"
1743  call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
1744  call setline(1, 'This is a')
1745  exe "norm! 1gg05rf"
1746  call assert_equal('fffffis a', getline(1))
1747
1748  " When replacing characters, copy characters from above and below lines
1749  " using CTRL-Y and CTRL-E.
1750  " Different code paths are used for utf-8 and latin1 encodings
1751  set showmatch
1752  for enc in ['latin1', 'utf-8']
1753    enew!
1754    let &encoding = enc
1755    call setline(1, [' {a}', 'xxxxxxxxxx', '      [b]'])
1756    exe "norm! 2gg5r\<C-Y>l5r\<C-E>"
1757    call assert_equal(' {a}x [b]x', getline(2))
1758  endfor
1759  set showmatch&
1760
1761  " r command should fail in operator pending mode
1762  call assert_beeps('normal! cr')
1763
1764  " clean up
1765  set noautoindent
1766  bw!
1767endfunc
1768
1769" Test for g*, g#
1770func Test_normal32_g_cmd1()
1771  new
1772  call append(0, ['abc.x_foo', 'x_foobar.abc'])
1773  1
1774  norm! $g*
1775  call assert_equal('x_foo', @/)
1776  call assert_equal('x_foobar.abc', getline('.'))
1777  norm! $g#
1778  call assert_equal('abc', @/)
1779  call assert_equal('abc.x_foo', getline('.'))
1780
1781  " clean up
1782  bw!
1783endfunc
1784
1785" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G,
1786" gi and gI commands
1787func Test_normal33_g_cmd2()
1788  if !has("jumplist")
1789    return
1790  endif
1791  call Setup_NewWindow()
1792  " Test for g`
1793  clearjumps
1794  norm! ma10j
1795  let a=execute(':jumps')
1796  " empty jumplist
1797  call assert_equal('>', a[-1:])
1798  norm! g`a
1799  call assert_equal('>', a[-1:])
1800  call assert_equal(1, line('.'))
1801  call assert_equal('1', getline('.'))
1802  call cursor(10, 1)
1803  norm! g'a
1804  call assert_equal('>', a[-1:])
1805  call assert_equal(1, line('.'))
1806
1807  " Test for g; and g,
1808  norm! g;
1809  " there is only one change in the changelist
1810  " currently, when we setup the window
1811  call assert_equal(2, line('.'))
1812  call assert_fails(':norm! g;', 'E662')
1813  call assert_fails(':norm! g,', 'E663')
1814  let &ul=&ul
1815  call append('$', ['a', 'b', 'c', 'd'])
1816  let &ul=&ul
1817  call append('$', ['Z', 'Y', 'X', 'W'])
1818  let a = execute(':changes')
1819  call assert_match('2\s\+0\s\+2', a)
1820  call assert_match('101\s\+0\s\+a', a)
1821  call assert_match('105\s\+0\s\+Z', a)
1822  norm! 3g;
1823  call assert_equal(2, line('.'))
1824  norm! 2g,
1825  call assert_equal(105, line('.'))
1826
1827  " Test for g& - global substitute
1828  %d
1829  call setline(1, range(1,10))
1830  call append('$', ['a', 'b', 'c', 'd'])
1831  $s/\w/&&/g
1832  exe "norm! /[1-8]\<cr>"
1833  norm! g&
1834  call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
1835
1836  " Jumping to a fold using gg should open the fold
1837  set foldenable
1838  set foldopen+=jump
1839  5,8fold
1840  call feedkeys('6gg', 'xt')
1841  call assert_equal(1, foldlevel('.'))
1842  call assert_equal(-1, foldclosed('.'))
1843  set foldopen-=jump
1844  set foldenable&
1845
1846  " Test for gv
1847  %d
1848  call append('$', repeat(['abcdefgh'], 8))
1849  exe "norm! 2gg02l\<c-v>2j2ly"
1850  call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
1851  " in visual mode, gv swaps current and last selected region
1852  exe "norm! G0\<c-v>4k4lgvd"
1853  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
1854  exe "norm! G0\<c-v>4k4ly"
1855  exe "norm! gvood"
1856  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
1857  " gv cannot be used  in operator pending mode
1858  call assert_beeps('normal! cgv')
1859  " gv should beep without a previously selected visual area
1860  new
1861  call assert_beeps('normal! gv')
1862  close
1863
1864  " Test for gk/gj
1865  %d
1866  15vsp
1867  set wrap listchars= sbr=
1868  let lineA='abcdefghijklmnopqrstuvwxyz'
1869  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1870  let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
1871  $put =lineA
1872  $put =lineB
1873
1874  norm! 3gg0dgk
1875  call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
1876  set nu
1877  norm! 3gg0gjdgj
1878  call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1879
1880  " Test for gJ
1881  norm! 2gggJ
1882  call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1883  call assert_equal(16, col('.'))
1884  " shouldn't do anything
1885  norm! 10gJ
1886  call assert_equal(1, col('.'))
1887
1888  " Test for g0 g^ gm g$
1889  exe "norm! 2gg0gji   "
1890  call assert_equal(['', 'abcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1891  norm! g0yl
1892  call assert_equal(12, col('.'))
1893  call assert_equal(' ', getreg(0))
1894  norm! g$yl
1895  call assert_equal(22, col('.'))
1896  call assert_equal('3', getreg(0))
1897  norm! gmyl
1898  call assert_equal(17, col('.'))
1899  call assert_equal('n', getreg(0))
1900  norm! g^yl
1901  call assert_equal(15, col('.'))
1902  call assert_equal('l', getreg(0))
1903  call assert_beeps('normal 5g$')
1904
1905  " Test for g_
1906  call assert_beeps('normal! 100g_')
1907  call setline(2, ['  foo  ', '  foobar  '])
1908  normal! 2ggg_
1909  call assert_equal(5, col('.'))
1910  normal! 2g_
1911  call assert_equal(8, col('.'))
1912
1913  norm! 2ggdG
1914  $put =lineC
1915
1916  " Test for gM
1917  norm! gMyl
1918  call assert_equal(73, col('.'))
1919  call assert_equal('0', getreg(0))
1920  " Test for 20gM
1921  norm! 20gMyl
1922  call assert_equal(29, col('.'))
1923  call assert_equal('S', getreg(0))
1924  " Test for 60gM
1925  norm! 60gMyl
1926  call assert_equal(87, col('.'))
1927  call assert_equal('E', getreg(0))
1928
1929  " Test for g Ctrl-G
1930  set ff=unix
1931  let a=execute(":norm! g\<c-g>")
1932  call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a)
1933
1934  " Test for gI
1935  norm! gIfoo
1936  call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
1937
1938  " Test for gi
1939  wincmd c
1940  %d
1941  set tw=0
1942  call setline(1, ['foobar', 'new line'])
1943  norm! A next word
1944  $put ='third line'
1945  norm! gi another word
1946  call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
1947  call setline(1, 'foobar')
1948  normal! Ggifirst line
1949  call assert_equal('foobarfirst line', getline(1))
1950  " Test gi in 'virtualedit' mode with cursor after the end of the line
1951  set virtualedit=all
1952  call setline(1, 'foo')
1953  exe "normal! Abar\<Right>\<Right>\<Right>\<Right>"
1954  call setline(1, 'foo')
1955  normal! Ggifirst line
1956  call assert_equal('foo       first line', getline(1))
1957  set virtualedit&
1958
1959  " Test for aboring a g command using CTRL-\ CTRL-G
1960  exe "normal! g\<C-\>\<C-G>"
1961  call assert_equal('foo       first line', getline('.'))
1962
1963  " clean up
1964  bw!
1965endfunc
1966
1967" Test for g CTRL-G
1968func Test_g_ctrl_g()
1969  new
1970
1971  let a = execute(":norm! g\<c-g>")
1972  call assert_equal("\n--No lines in buffer--", a)
1973
1974  " Test for CTRL-G (same as :file)
1975  let a = execute(":norm! \<c-g>")
1976  call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a)
1977
1978  call setline(1, ['first line', 'second line'])
1979
1980  " Test g CTRL-g with dos, mac and unix file type.
1981  norm! gojll
1982  set ff=dos
1983  let a = execute(":norm! g\<c-g>")
1984  call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
1985
1986  set ff=mac
1987  let a = execute(":norm! g\<c-g>")
1988  call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
1989
1990  set ff=unix
1991  let a = execute(":norm! g\<c-g>")
1992  call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
1993
1994  " Test g CTRL-g in visual mode (v)
1995  let a = execute(":norm! gojllvlg\<c-g>")
1996  call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
1997
1998  " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
1999  let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
2000  call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2001
2002  " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
2003  let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
2004  call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2005
2006  " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
2007  let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
2008  call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
2009
2010  " There should be one byte less with noeol
2011  set bin noeol
2012  let a = execute(":norm! \<Esc>gog\<c-g>")
2013  call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
2014  set bin & eol&
2015
2016  call setline(1, ['Français', '日本語'])
2017
2018  let a = execute(":norm! \<Esc>gojlg\<c-g>")
2019  call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20", a)
2020
2021  let a = execute(":norm! \<Esc>gojvlg\<c-g>")
2022  call assert_equal("\nSelected 1 of 2 Lines; 1 of 2 Words; 2 of 13 Chars; 6 of 20 Bytes", a)
2023
2024  let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
2025  call assert_equal("\nSelected 4 Cols; 2 of 2 Lines; 2 of 2 Words; 6 of 13 Chars; 11 of 20 Bytes", a)
2026
2027  set fenc=utf8 bomb
2028  let a = execute(":norm! \<Esc>gojlg\<c-g>")
2029  call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+3 for BOM)", a)
2030
2031  set fenc=utf16 bomb
2032  let a = execute(":norm! g\<c-g>")
2033  call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+2 for BOM)", a)
2034
2035  set fenc=utf32 bomb
2036  let a = execute(":norm! g\<c-g>")
2037  call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+4 for BOM)", a)
2038
2039  set fenc& bomb&
2040
2041  set ff&
2042  bwipe!
2043endfunc
2044
2045" Test for g8
2046func Test_normal34_g_cmd3()
2047  new
2048  let a=execute(':norm! 1G0g8')
2049  call assert_equal("\nNUL", a)
2050
2051  call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
2052  let a=execute(':norm! 1G$g8')
2053  call assert_equal("\nc3 b6 ", a)
2054
2055  call setline(1, "a\u0302")
2056  let a=execute(':norm! 1G0g8')
2057  call assert_equal("\n61 + cc 82 ", a)
2058
2059  " clean up
2060  bw!
2061endfunc
2062
2063" Test 8g8 which finds invalid utf8 at or after the cursor.
2064func Test_normal_8g8()
2065  new
2066
2067  " With invalid byte.
2068  call setline(1, "___\xff___")
2069  norm! 1G08g8g
2070  call assert_equal([0, 1, 4, 0, 1], getcurpos())
2071
2072  " With invalid byte before the cursor.
2073  call setline(1, "___\xff___")
2074  norm! 1G$h8g8g
2075  call assert_equal([0, 1, 6, 0, 9], getcurpos())
2076
2077  " With truncated sequence.
2078  call setline(1, "___\xE2\x82___")
2079  norm! 1G08g8g
2080  call assert_equal([0, 1, 4, 0, 1], getcurpos())
2081
2082  " With overlong sequence.
2083  call setline(1, "___\xF0\x82\x82\xAC___")
2084  norm! 1G08g8g
2085  call assert_equal([0, 1, 4, 0, 1], getcurpos())
2086
2087  " With valid utf8.
2088  call setline(1, "café")
2089  norm! 1G08g8
2090  call assert_equal([0, 1, 1, 0, 1], getcurpos())
2091
2092  bw!
2093endfunc
2094
2095" Test for g<
2096func Test_normal35_g_cmd4()
2097  " Cannot capture its output,
2098  " probably a bug, therefore, test disabled:
2099  throw "Skipped: output of g< can't be tested currently"
2100  echo "a\nb\nc\nd"
2101  let b=execute(':norm! g<')
2102  call assert_true(!empty(b), 'failed `execute(g<)`')
2103endfunc
2104
2105" Test for gp gP go
2106func Test_normal36_g_cmd5()
2107  new
2108  call append(0, 'abcdefghijklmnopqrstuvwxyz')
2109  set ff=unix
2110  " Test for gp gP
2111  call append(1, range(1,10))
2112  1
2113  norm! 1yy
2114  3
2115  norm! gp
2116  call assert_equal([0, 5, 1, 0, 1], getcurpos())
2117  $
2118  norm! gP
2119  call assert_equal([0, 14, 1, 0, 1], getcurpos())
2120
2121  " Test for go
2122  norm! 26go
2123  call assert_equal([0, 1, 26, 0, 26], getcurpos())
2124  norm! 27go
2125  call assert_equal([0, 1, 26, 0, 26], getcurpos())
2126  norm! 28go
2127  call assert_equal([0, 2, 1, 0, 1], getcurpos())
2128  set ff=dos
2129  norm! 29go
2130  call assert_equal([0, 2, 1, 0, 1], getcurpos())
2131  set ff=unix
2132  norm! gg0
2133  norm! 101go
2134  call assert_equal([0, 13, 26, 0, 26], getcurpos())
2135  norm! 103go
2136  call assert_equal([0, 14, 1, 0, 1], getcurpos())
2137  " count > buffer content
2138  norm! 120go
2139  call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
2140  " clean up
2141  bw!
2142endfunc
2143
2144" Test for gt and gT
2145func Test_normal37_g_cmd6()
2146  tabnew 1.txt
2147  tabnew 2.txt
2148  tabnew 3.txt
2149  norm! 1gt
2150  call assert_equal(1, tabpagenr())
2151  norm! 3gt
2152  call assert_equal(3, tabpagenr())
2153  norm! 1gT
2154  " count gT goes not to the absolute tabpagenumber
2155  " but, but goes to the count previous tabpagenumber
2156  call assert_equal(2, tabpagenr())
2157  " wrap around
2158  norm! 3gT
2159  call assert_equal(3, tabpagenr())
2160  " gt does not wrap around
2161  norm! 5gt
2162  call assert_equal(3, tabpagenr())
2163
2164  for i in range(3)
2165    tabclose
2166  endfor
2167  " clean up
2168  call assert_fails(':tabclose', 'E784:')
2169endfunc
2170
2171" Test for <Home> and <C-Home> key
2172func Test_normal38_nvhome()
2173  new
2174  call setline(1, range(10))
2175  $
2176  setl et sw=2
2177  norm! V10>$
2178  " count is ignored
2179  exe "norm! 10\<home>"
2180  call assert_equal(1, col('.'))
2181  exe "norm! \<home>"
2182  call assert_equal([0, 10, 1, 0, 1], getcurpos())
2183  exe "norm! 5\<c-home>"
2184  call assert_equal([0, 5, 1, 0, 1], getcurpos())
2185  exe "norm! \<c-home>"
2186  call assert_equal([0, 1, 1, 0, 1], getcurpos())
2187  exe "norm! G\<c-kHome>"
2188  call assert_equal([0, 1, 1, 0, 1], getcurpos())
2189
2190  " clean up
2191  bw!
2192endfunc
2193
2194" Test for <End> and <C-End> keys
2195func Test_normal_nvend()
2196  new
2197  call setline(1, map(range(1, 10), '"line" .. v:val'))
2198  exe "normal! \<End>"
2199  call assert_equal(5, col('.'))
2200  exe "normal! 4\<End>"
2201  call assert_equal([4, 5], [line('.'), col('.')])
2202  exe "normal! \<C-End>"
2203  call assert_equal([10, 6], [line('.'), col('.')])
2204  close!
2205endfunc
2206
2207" Test for cw cW ce
2208func Test_normal39_cw()
2209  " Test for cw and cW on whitespace
2210  " and cpo+=w setting
2211  new
2212  set tw=0
2213  call append(0, 'here      are   some words')
2214  norm! 1gg0elcwZZZ
2215  call assert_equal('hereZZZare   some words', getline('.'))
2216  norm! 1gg0elcWYYY
2217  call assert_equal('hereZZZareYYYsome words', getline('.'))
2218  set cpo+=w
2219  call setline(1, 'here      are   some words')
2220  norm! 1gg0elcwZZZ
2221  call assert_equal('hereZZZ     are   some words', getline('.'))
2222  norm! 1gg2elcWYYY
2223  call assert_equal('hereZZZ     areYYY  some words', getline('.'))
2224  set cpo-=w
2225  norm! 2gg0cwfoo
2226  call assert_equal('foo', getline('.'))
2227
2228  call setline(1, 'one; two')
2229  call cursor(1, 1)
2230  call feedkeys('cwvim', 'xt')
2231  call assert_equal('vim; two', getline(1))
2232  call feedkeys('0cWone', 'xt')
2233  call assert_equal('one two', getline(1))
2234  "When cursor is at the end of a word 'ce' will change until the end of the
2235  "next word, but 'cw' will change only one character
2236  call setline(1, 'one two')
2237  call feedkeys('0ecwce', 'xt')
2238  call assert_equal('once two', getline(1))
2239  call setline(1, 'one two')
2240  call feedkeys('0ecely', 'xt')
2241  call assert_equal('only', getline(1))
2242
2243  " clean up
2244  bw!
2245endfunc
2246
2247" Test for CTRL-\ commands
2248func Test_normal40_ctrl_bsl()
2249  new
2250  call append(0, 'here      are   some words')
2251  exe "norm! 1gg0a\<C-\>\<C-N>"
2252  call assert_equal('n', mode())
2253  call assert_equal(1, col('.'))
2254  call assert_equal('', visualmode())
2255  exe "norm! 1gg0viw\<C-\>\<C-N>"
2256  call assert_equal('n', mode())
2257  call assert_equal(4, col('.'))
2258  exe "norm! 1gg0a\<C-\>\<C-G>"
2259  call assert_equal('n', mode())
2260  call assert_equal(1, col('.'))
2261  "imap <buffer> , <c-\><c-n>
2262  set im
2263  exe ":norm! \<c-\>\<c-n>dw"
2264  set noim
2265  call assert_equal('are   some words', getline(1))
2266  call assert_false(&insertmode)
2267  call assert_beeps("normal! \<C-\>\<C-A>", 'xt')
2268
2269  " Using CTRL-\ CTRL-N in cmd window should close the window
2270  call feedkeys("q:\<C-\>\<C-N>", 'xt')
2271  call assert_equal('', getcmdwintype())
2272
2273  " clean up
2274  bw!
2275endfunc
2276
2277" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode
2278func Test_normal41_insert_reg()
2279  new
2280  set sts=2 sw=2 ts=8 tw=0
2281  call append(0, ["aaa\tbbb\tccc", '', '', ''])
2282  let a=getline(1)
2283  norm! 2gg0
2284  exe "norm! a\<c-r>=a\<cr>"
2285  norm! 3gg0
2286  exe "norm! a\<c-r>\<c-r>=a\<cr>"
2287  norm! 4gg0
2288  exe "norm! a\<c-r>\<c-o>=a\<cr>"
2289  call assert_equal(['aaa	bbb	ccc', 'aaa bbb	ccc', 'aaa bbb	ccc', 'aaa	bbb	ccc', ''], getline(1, '$'))
2290
2291  " clean up
2292  set sts=0 sw=8 ts=8
2293  bw!
2294endfunc
2295
2296" Test for Ctrl-D and Ctrl-U
2297func Test_normal42_halfpage()
2298  call Setup_NewWindow()
2299  call assert_equal(5, &scroll)
2300  exe "norm! \<c-d>"
2301  call assert_equal('6', getline('.'))
2302  exe "norm! 2\<c-d>"
2303  call assert_equal('8', getline('.'))
2304  call assert_equal(2, &scroll)
2305  set scroll=5
2306  exe "norm! \<c-u>"
2307  call assert_equal('3', getline('.'))
2308  1
2309  set scrolloff=5
2310  exe "norm! \<c-d>"
2311  call assert_equal('10', getline('.'))
2312  exe "norm! \<c-u>"
2313  call assert_equal('5', getline('.'))
2314  1
2315  set scrolloff=99
2316  exe "norm! \<c-d>"
2317  call assert_equal('10', getline('.'))
2318  set scrolloff=0
2319  100
2320  exe "norm! $\<c-u>"
2321  call assert_equal('95', getline('.'))
2322  call assert_equal([0, 95, 1, 0, 1], getcurpos())
2323  100
2324  set nostartofline
2325  exe "norm! $\<c-u>"
2326  call assert_equal('95', getline('.'))
2327  call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
2328  " cleanup
2329  set startofline
2330  bw!
2331endfunc
2332
2333" Tests for text object aw
2334func Test_normal43_textobject1()
2335  new
2336  call append(0, ['foobar,eins,foobar', 'foo,zwei,foo    '])
2337  " diw
2338  norm! 1gg0diw
2339  call assert_equal([',eins,foobar', 'foo,zwei,foo    ', ''], getline(1,'$'))
2340  " daw
2341  norm! 2ggEdaw
2342  call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
2343  %d
2344  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
2345  " diW
2346  norm! 2ggwd2iW
2347  call assert_equal(['foo	eins	foobar', 'foo	foo   ', ''], getline(1,'$'))
2348  " daW
2349  norm! 1ggd2aW
2350  call assert_equal(['foobar', 'foo	foo   ', ''], getline(1,'$'))
2351
2352  %d
2353  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
2354  " aw in visual line mode switches to characterwise mode
2355  norm! 2gg$Vawd
2356  call assert_equal(['foo	eins	foobar', 'foo	zwei	foo'], getline(1,'$'))
2357  norm! 1gg$Viwd
2358  call assert_equal(['foo	eins	', 'foo	zwei	foo'], getline(1,'$'))
2359
2360  " clean up
2361  bw!
2362endfunc
2363
2364" Test for is and as text objects
2365func Test_normal44_textobjects2()
2366  new
2367  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
2368  " Test for dis - does not remove trailing whitespace
2369  norm! 1gg0dis
2370  call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
2371  " Test for das - removes leading whitespace
2372  norm! 3ggf?ldas
2373  call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
2374  " when used in visual mode, is made characterwise
2375  norm! 3gg$Visy
2376  call assert_equal('v', visualmode())
2377  " reset visualmode()
2378  norm! 3ggVy
2379  norm! 3gg$Vasy
2380  call assert_equal('v', visualmode())
2381  " basic testing for textobjects a< and at
2382  %d
2383  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
2384  " a<
2385  norm! 1gg0da<
2386  call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2387  norm! 1pj
2388  call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2389  " at
2390  norm! d2at
2391  call assert_equal([' '], getline(1,'$'))
2392  %d
2393  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
2394  " i<
2395  norm! 1gg0di<
2396  call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2397  norm! 1Pj
2398  call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2399  norm! d2it
2400  call assert_equal(['<div></div>',' '], getline(1,'$'))
2401  " basic testing for a[ and i[ text object
2402  %d
2403  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2404  norm! 3gg0di[
2405  call assert_equal([' ', '[', ']'], getline(1,'$'))
2406  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2407  norm! 3gg0ftd2a[
2408  call assert_equal([' '], getline(1,'$'))
2409  %d
2410  " Test for i" when cursor is in front of a quoted object
2411  call append(0, 'foo "bar"')
2412  norm! 1gg0di"
2413  call assert_equal(['foo ""', ''], getline(1,'$'))
2414
2415  " clean up
2416  bw!
2417endfunc
2418
2419func Test_normal45_drop()
2420  if !has('dnd')
2421    " The ~ register does not exist
2422    call assert_beeps('norm! "~')
2423    return
2424  endif
2425
2426  " basic test for drag-n-drop
2427  " unfortunately, without a gui, we can't really test much here,
2428  " so simply test that ~p fails (which uses the drop register)
2429  new
2430  call assert_fails(':norm! "~p', 'E353')
2431  call assert_equal([],  getreg('~', 1, 1))
2432  " the ~ register is read only
2433  call assert_fails(':let @~="1"', 'E354')
2434  bw!
2435endfunc
2436
2437func Test_normal46_ignore()
2438  new
2439  " How to test this?
2440  " let's just for now test, that the buffer
2441  " does not change
2442  call feedkeys("\<c-s>", 't')
2443  call assert_equal([''], getline(1,'$'))
2444
2445  " no valid commands
2446  exe "norm! \<char-0x100>"
2447  call assert_equal([''], getline(1,'$'))
2448
2449  exe "norm! ä"
2450  call assert_equal([''], getline(1,'$'))
2451
2452  " clean up
2453  bw!
2454endfunc
2455
2456func Test_normal47_visual_buf_wipe()
2457  " This was causing a crash or ml_get error.
2458  enew!
2459  call setline(1,'xxx')
2460  normal $
2461  new
2462  call setline(1, range(1,2))
2463  2
2464  exe "norm \<C-V>$"
2465  bw!
2466  norm yp
2467  set nomodified
2468endfunc
2469
2470func Test_normal47_autocmd()
2471  " disabled, does not seem to be possible currently
2472  throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
2473  new
2474  call append(0, repeat('-',20))
2475  au CursorHold * call feedkeys('2l', '')
2476  1
2477  set updatetime=20
2478  " should delete 12 chars (d12l)
2479  call feedkeys('d1', '!')
2480  call assert_equal('--------', getline(1))
2481
2482  " clean up
2483  au! CursorHold
2484  set updatetime=4000
2485  bw!
2486endfunc
2487
2488func Test_normal48_wincmd()
2489  new
2490  exe "norm! \<c-w>c"
2491  call assert_equal(1, winnr('$'))
2492  call assert_fails(":norm! \<c-w>c", "E444")
2493endfunc
2494
2495func Test_normal49_counts()
2496  new
2497  call setline(1, 'one two three four five six seven eight nine ten')
2498  1
2499  norm! 3d2w
2500  call assert_equal('seven eight nine ten', getline(1))
2501  bw!
2502endfunc
2503
2504func Test_normal50_commandline()
2505  if !has("timers") || !has("cmdline_hist")
2506    return
2507  endif
2508  func! DoTimerWork(id)
2509    call assert_equal('[Command Line]', bufname(''))
2510    " should fail, with E11, but does fail with E23?
2511    "call feedkeys("\<c-^>", 'tm')
2512
2513    " should also fail with E11
2514    call assert_fails(":wincmd p", 'E11')
2515    " return from commandline window
2516    call feedkeys("\<cr>")
2517  endfunc
2518
2519  let oldlang=v:lang
2520  lang C
2521  set updatetime=20
2522  call timer_start(100, 'DoTimerWork')
2523  try
2524    " throws E23, for whatever reason...
2525    call feedkeys('q:', 'x!')
2526  catch /E23/
2527    " no-op
2528  endtry
2529  " clean up
2530  set updatetime=4000
2531  exe "lang" oldlang
2532  bw!
2533endfunc
2534
2535func Test_normal51_FileChangedRO()
2536  if !has("autocmd")
2537    return
2538  endif
2539  " Don't sleep after the warning message.
2540  call test_settime(1)
2541  call writefile(['foo'], 'Xreadonly.log')
2542  new Xreadonly.log
2543  setl ro
2544  au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
2545  call assert_fails(":norm! Af", 'E788')
2546  call assert_equal(['foo'], getline(1,'$'))
2547  call assert_equal('Xreadonly.log', bufname(''))
2548
2549  " cleanup
2550  call test_settime(0)
2551  bw!
2552  call delete("Xreadonly.log")
2553endfunc
2554
2555func Test_normal52_rl()
2556  if !has("rightleft")
2557    return
2558  endif
2559  new
2560  call setline(1, 'abcde fghij klmnopq')
2561  norm! 1gg$
2562  set rl
2563  call assert_equal(19, col('.'))
2564  call feedkeys('l', 'tx')
2565  call assert_equal(18, col('.'))
2566  call feedkeys('h', 'tx')
2567  call assert_equal(19, col('.'))
2568  call feedkeys("\<right>", 'tx')
2569  call assert_equal(18, col('.'))
2570  call feedkeys("\<left>", 'tx')
2571  call assert_equal(19, col('.'))
2572  call feedkeys("\<s-right>", 'tx')
2573  call assert_equal(13, col('.'))
2574  call feedkeys("\<c-right>", 'tx')
2575  call assert_equal(7, col('.'))
2576  call feedkeys("\<c-left>", 'tx')
2577  call assert_equal(13, col('.'))
2578  call feedkeys("\<s-left>", 'tx')
2579  call assert_equal(19, col('.'))
2580  call feedkeys("<<", 'tx')
2581  call assert_equal('	abcde fghij klmnopq',getline(1))
2582  call feedkeys(">>", 'tx')
2583  call assert_equal('abcde fghij klmnopq',getline(1))
2584
2585  " cleanup
2586  set norl
2587  bw!
2588endfunc
2589
2590func Test_normal53_digraph()
2591  if !has('digraphs')
2592    return
2593  endif
2594  new
2595  call setline(1, 'abcdefgh|')
2596  exe "norm! 1gg0f\<c-k>!!"
2597  call assert_equal(9, col('.'))
2598  set cpo+=D
2599  exe "norm! 1gg0f\<c-k>!!"
2600  call assert_equal(1, col('.'))
2601
2602  set cpo-=D
2603  bw!
2604endfunc
2605
2606func Test_normal54_Ctrl_bsl()
2607  new
2608  call setline(1, 'abcdefghijklmn')
2609  exe "norm! df\<c-\>\<c-n>"
2610  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2611  exe "norm! df\<c-\>\<c-g>"
2612  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2613  exe "norm! df\<c-\>m"
2614  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2615
2616  call setline(2, 'abcdefghijklmnāf')
2617  norm! 2gg0
2618  exe "norm! df\<Char-0x101>"
2619  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2620  norm! 1gg0
2621  exe "norm! df\<esc>"
2622  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2623
2624  " clean up
2625  bw!
2626endfunc
2627
2628func Test_normal_large_count()
2629  " This may fail with 32bit long, how do we detect that?
2630  new
2631  normal o
2632  normal 6666666666dL
2633  bwipe!
2634endfunc
2635
2636func Test_delete_until_paragraph()
2637  new
2638  normal grádv}
2639  call assert_equal('á', getline(1))
2640  normal grád}
2641  call assert_equal('', getline(1))
2642  bwipe!
2643endfunc
2644
2645" Test for the gr (virtual replace) command
2646" Test for the bug fixed by 7.4.387
2647func Test_gr_command()
2648  enew!
2649  let save_cpo = &cpo
2650  call append(0, ['First line', 'Second line', 'Third line'])
2651  exe "normal i\<C-G>u"
2652  call cursor(2, 1)
2653  set cpo-=X
2654  normal 4gro
2655  call assert_equal('oooond line', getline(2))
2656  undo
2657  set cpo+=X
2658  normal 4gro
2659  call assert_equal('ooooecond line', getline(2))
2660  let &cpo = save_cpo
2661  normal! ggvegrx
2662  call assert_equal('xxxxx line', getline(1))
2663  exe "normal! gggr\<C-V>122"
2664  call assert_equal('zxxxx line', getline(1))
2665  set virtualedit=all
2666  normal! 15|grl
2667  call assert_equal('zxxxx line    l', getline(1))
2668  set virtualedit&
2669  set nomodifiable
2670  call assert_fails('normal! grx', 'E21:')
2671  call assert_fails('normal! gRx', 'E21:')
2672  set modifiable&
2673  enew!
2674endfunc
2675
2676" When splitting a window the changelist position is wrong.
2677" Test the changelist position after splitting a window.
2678" Test for the bug fixed by 7.4.386
2679func Test_changelist()
2680  let save_ul = &ul
2681  enew!
2682  call append('$', ['1', '2'])
2683  exe "normal i\<C-G>u"
2684  exe "normal Gkylpa\<C-G>u"
2685  set ul=100
2686  exe "normal Gylpa\<C-G>u"
2687  set ul=100
2688  normal gg
2689  vsplit
2690  normal g;
2691  call assert_equal([3, 2], [line('.'), col('.')])
2692  normal g;
2693  call assert_equal([2, 2], [line('.'), col('.')])
2694  call assert_fails('normal g;', 'E662:')
2695  new
2696  call assert_fails('normal g;', 'E664:')
2697  %bwipe!
2698  let &ul = save_ul
2699endfunc
2700
2701func Test_nv_hat_count()
2702  %bwipeout!
2703  let l:nr = bufnr('%') + 1
2704  call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92')
2705
2706  edit Xfoo
2707  let l:foo_nr = bufnr('Xfoo')
2708
2709  edit Xbar
2710  let l:bar_nr = bufnr('Xbar')
2711
2712  " Make sure we are not just using the alternate file.
2713  edit Xbaz
2714
2715  call feedkeys(l:foo_nr . "\<C-^>", 'tx')
2716  call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
2717
2718  call feedkeys(l:bar_nr . "\<C-^>", 'tx')
2719  call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
2720
2721  %bwipeout!
2722endfunc
2723
2724func Test_message_when_using_ctrl_c()
2725  " Make sure no buffers are changed.
2726  %bwipe!
2727
2728  exe "normal \<C-C>"
2729  call assert_match("Type  :qa  and press <Enter> to exit Vim", Screenline(&lines))
2730
2731  new
2732  cal setline(1, 'hi!')
2733  exe "normal \<C-C>"
2734  call assert_match("Type  :qa!  and press <Enter> to abandon all changes and exit Vim", Screenline(&lines))
2735
2736  bwipe!
2737endfunc
2738
2739" Test for '[m', ']m', '[M' and ']M'
2740" Jumping to beginning and end of methods in Java-like languages
2741func Test_java_motion()
2742  new
2743  call assert_beeps('normal! [m')
2744  call assert_beeps('normal! ]m')
2745  call assert_beeps('normal! [M')
2746  call assert_beeps('normal! ]M')
2747  a
2748Piece of Java
2749{
2750	tt m1 {
2751		t1;
2752	} e1
2753
2754	tt m2 {
2755		t2;
2756	} e2
2757
2758	tt m3 {
2759		if (x)
2760		{
2761			t3;
2762		}
2763	} e3
2764}
2765.
2766
2767  normal gg
2768
2769  normal 2]maA
2770  call assert_equal("\ttt m1 {A", getline('.'))
2771  call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2772
2773  normal j]maB
2774  call assert_equal("\ttt m2 {B", getline('.'))
2775  call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')])
2776
2777  normal ]maC
2778  call assert_equal("\ttt m3 {C", getline('.'))
2779  call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2780
2781  normal [maD
2782  call assert_equal("\ttt m3 {DC", getline('.'))
2783  call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2784
2785  normal k2[maE
2786  call assert_equal("\ttt m1 {EA", getline('.'))
2787  call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2788
2789  normal 3[maF
2790  call assert_equal("{F", getline('.'))
2791  call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2792
2793  normal ]MaG
2794  call assert_equal("\t}G e1", getline('.'))
2795  call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')])
2796
2797  normal j2]MaH
2798  call assert_equal("\t}H e3", getline('.'))
2799  call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2800
2801  normal ]M]M
2802  normal aI
2803  call assert_equal("}I", getline('.'))
2804  call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')])
2805
2806  normal 2[MaJ
2807  call assert_equal("\t}JH e3", getline('.'))
2808  call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2809
2810  normal k[MaK
2811  call assert_equal("\t}K e2", getline('.'))
2812  call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')])
2813
2814  normal 3[MaL
2815  call assert_equal("{LF", getline('.'))
2816  call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2817
2818  close!
2819endfunc
2820
2821func Test_normal_gdollar_cmd()
2822  if !has("jumplist")
2823    return
2824  endif
2825  " Tests for g cmds
2826  call Setup_NewWindow()
2827  " Make long lines that will wrap
2828  %s/$/\=repeat(' foobar', 10)/
2829  20vsp
2830  set wrap
2831  " Test for g$ with count
2832  norm! gg
2833  norm! 0vg$y
2834  call assert_equal(20, col("'>"))
2835  call assert_equal('1 foobar foobar foob', getreg(0))
2836  norm! gg
2837  norm! 0v4g$y
2838  call assert_equal(72, col("'>"))
2839  call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0))
2840  norm! gg
2841  norm! 0v6g$y
2842  call assert_equal(40, col("'>"))
2843  call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2844		  \ '2 foobar foobar foobar foobar foobar foo', getreg(0))
2845  set nowrap
2846  " clean up
2847  norm! gg
2848  norm! 0vg$y
2849  call assert_equal(20, col("'>"))
2850  call assert_equal('1 foobar foobar foob', getreg(0))
2851  norm! gg
2852  norm! 0v4g$y
2853  call assert_equal(20, col("'>"))
2854  call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2855                 \  '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2856                 \  '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2857                 \  '4 foobar foobar foob', getreg(0))
2858  norm! gg
2859  norm! 0v6g$y
2860  call assert_equal(20, col("'>"))
2861  call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2862                 \  '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2863                 \  '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2864                 \  '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2865                 \  '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2866                 \  '6 foobar foobar foob', getreg(0))
2867  " Move to last line, also down movement is not possible, should still move
2868  " the cursor to the last visible char
2869  norm! G
2870  norm! 0v6g$y
2871  call assert_equal(20, col("'>"))
2872  call assert_equal('100 foobar foobar fo', getreg(0))
2873  bw!
2874endfunc
2875
2876func Test_normal_gk_gj()
2877  " needs 80 column new window
2878  new
2879  vert 80new
2880  call assert_beeps('normal gk')
2881  put =[repeat('x',90)..' {{{1', 'x {{{1']
2882  norm! gk
2883  " In a 80 column wide terminal the window will be only 78 char
2884  " (because Vim will leave space for the other window),
2885  " but if the terminal is larger, it will be 80 chars, so verify the
2886  " cursor column correctly.
2887  call assert_equal(winwidth(0)+1, col('.'))
2888  call assert_equal(winwidth(0)+1, virtcol('.'))
2889  norm! j
2890  call assert_equal(6, col('.'))
2891  call assert_equal(6, virtcol('.'))
2892  norm! gk
2893  call assert_equal(95, col('.'))
2894  call assert_equal(95, virtcol('.'))
2895  %bw!
2896
2897  " needs 80 column new window
2898  new
2899  vert 80new
2900  call assert_beeps('normal gj')
2901  set number
2902  set numberwidth=10
2903  set cpoptions+=n
2904  put =[repeat('0',90), repeat('1',90)]
2905  norm! 075l
2906  call assert_equal(76, col('.'))
2907  norm! gk
2908  call assert_equal(1, col('.'))
2909  norm! gk
2910  call assert_equal(76, col('.'))
2911  norm! gk
2912  call assert_equal(1, col('.'))
2913  norm! gj
2914  call assert_equal(76, col('.'))
2915  norm! gj
2916  call assert_equal(1, col('.'))
2917  norm! gj
2918  call assert_equal(76, col('.'))
2919  " When 'nowrap' is set, gk and gj behave like k and j
2920  set nowrap
2921  normal! gk
2922  call assert_equal([2, 76], [line('.'), col('.')])
2923  normal! gj
2924  call assert_equal([3, 76], [line('.'), col('.')])
2925  %bw!
2926  set cpoptions& number& numberwidth& wrap&
2927endfunc
2928
2929" Test for cursor movement with '-' in 'cpoptions'
2930func Test_normal_cpo_minus()
2931  new
2932  call setline(1, ['foo', 'bar', 'baz'])
2933  let save_cpo = &cpo
2934  set cpo+=-
2935  call assert_beeps('normal 10j')
2936  call assert_equal(1, line('.'))
2937  normal G
2938  call assert_beeps('normal 10k')
2939  call assert_equal(3, line('.'))
2940  call assert_fails(10, 'E16:')
2941  let &cpo = save_cpo
2942  close!
2943endfunc
2944
2945" Test for displaying dollar when changing text ('$' flag in 'cpoptions')
2946func Test_normal_cpo_dollar()
2947  new
2948  let g:Line = ''
2949  func SaveFirstLine()
2950    let g:Line = Screenline(1)
2951    return ''
2952  endfunc
2953  inoremap <expr> <buffer> <F2> SaveFirstLine()
2954  call test_override('redraw_flag', 1)
2955  set cpo+=$
2956  call setline(1, 'one two three')
2957  redraw!
2958  exe "normal c2w\<F2>vim"
2959  call assert_equal('one tw$ three', g:Line)
2960  call assert_equal('vim three', getline(1))
2961  set cpo-=$
2962  call test_override('ALL', 0)
2963  delfunc SaveFirstLine
2964  %bw!
2965endfunc
2966
2967" Test for using : to run a multi-line Ex command in operator pending mode
2968func Test_normal_yank_with_excmd()
2969  new
2970  call setline(1, ['foo', 'bar', 'baz'])
2971  let @a = ''
2972  call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt')
2973  call assert_equal('f', @a)
2974  close!
2975endfunc
2976
2977" Test for supplying a count to a normal-mode command across a cursorhold call
2978func Test_normal_cursorhold_with_count()
2979  func s:cHold()
2980    let g:cHold_Called += 1
2981  endfunc
2982  new
2983  augroup normalcHoldTest
2984    au!
2985    au CursorHold <buffer> call s:cHold()
2986  augroup END
2987  let g:cHold_Called = 0
2988  call feedkeys("3\<CursorHold>2ix", 'xt')
2989  call assert_equal(1, g:cHold_Called)
2990  call assert_equal(repeat('x', 32), getline(1))
2991  augroup normalcHoldTest
2992    au!
2993  augroup END
2994  au! normalcHoldTest
2995  close!
2996  delfunc s:cHold
2997endfunc
2998
2999" Test for using a count and a command with CTRL-W
3000func Test_wincmd_with_count()
3001  call feedkeys("\<C-W>12n", 'xt')
3002  call assert_equal(12, winheight(0))
3003endfunc
3004
3005" Test for 'b', 'B' 'ge' and 'gE' commands
3006func Test_horiz_motion()
3007  new
3008  normal! gg
3009  call assert_beeps('normal! b')
3010  call assert_beeps('normal! B')
3011  call assert_beeps('normal! gE')
3012  call assert_beeps('normal! ge')
3013  " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left
3014  call setline(1, 'one ,two ,three')
3015  exe "normal! $\<S-BS>"
3016  call assert_equal(11, col('.'))
3017  exe "normal! $\<C-BS>"
3018  call assert_equal(10, col('.'))
3019  close!
3020endfunc
3021
3022" Test for using a : command in operator pending mode
3023func Test_normal_colon_op()
3024  new
3025  call setline(1, ['one', 'two'])
3026  call assert_beeps("normal! Gc:d\<CR>")
3027  close!
3028endfunc
3029
3030" vim: shiftwidth=2 sts=2 expandtab
3031