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