xref: /vim-8.2.3635/src/testdir/test_normal.vim (revision e0720cbf)
1" Test for various Normal mode commands
2
3set belloff=all
4func! Setup_NewWindow()
5  10new
6  call setline(1, range(1,100))
7endfunc
8
9func! MyFormatExpr()
10  " Adds '->$' at lines having numbers followed by trailing whitespace
11  for ln in range(v:lnum, v:lnum+v:count-1)
12    let line = getline(ln)
13    if getline(ln) =~# '\d\s\+$'
14      call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
15    endif
16  endfor
17endfunc
18
19func! CountSpaces(type, ...)
20  " for testing operatorfunc
21  " will count the number of spaces
22  " and return the result in g:a
23  let sel_save = &selection
24  let &selection = "inclusive"
25  let reg_save = @@
26
27  if a:0  " Invoked from Visual mode, use gv command.
28    silent exe "normal! gvy"
29  elseif a:type == 'line'
30    silent exe "normal! '[V']y"
31  else
32    silent exe "normal! `[v`]y"
33  endif
34  let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
35  let &selection = sel_save
36  let @@ = reg_save
37endfunc
38
39func! OpfuncDummy(type, ...)
40  " for testing operatorfunc
41  let g:opt=&linebreak
42
43  if a:0  " Invoked from Visual mode, use gv command.
44    silent exe "normal! gvy"
45  elseif a:type == 'line'
46    silent exe "normal! '[V']y"
47  else
48    silent exe "normal! `[v`]y"
49  endif
50  " Create a new dummy window
51  new
52  let g:bufnr=bufnr('%')
53endfunc
54
55fun! Test_normal00_optrans()
56  new
57  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
58  1
59  exe "norm! Sfoobar\<esc>"
60  call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
61  2
62  exe "norm! $vbsone"
63  call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
64  norm! VS Second line here
65  call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
66  %d
67  call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
68  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
69
70  1
71  norm! 2D
72  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,'$'))
73  set cpo+=#
74  norm! 4D
75  call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
76
77  " clean up
78  set cpo-=#
79  bw!
80endfunc
81
82func! Test_normal01_keymodel()
83  call Setup_NewWindow()
84  " Test 1: depending on 'keymodel' <s-down> does something different
85  50
86  call feedkeys("V\<S-Up>y", 'tx')
87  call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
88  set keymodel=startsel
89  50
90  call feedkeys("V\<S-Up>y", 'tx')
91  call assert_equal(['49', '50'], getline("'<", "'>"))
92  " Start visual mode when keymodel = startsel
93  50
94  call feedkeys("\<S-Up>y", 'tx')
95  call assert_equal(['49', '5'], getreg(0, 0, 1))
96  " Do not start visual mode when keymodel=
97  set keymodel=
98  50
99  call feedkeys("\<S-Up>y$", 'tx')
100  call assert_equal(['42'], getreg(0, 0, 1))
101  " Stop visual mode when keymodel=stopsel
102  set keymodel=stopsel
103  50
104  call feedkeys("Vkk\<Up>yy", 'tx')
105  call assert_equal(['47'], getreg(0, 0, 1))
106
107  set keymodel=
108  50
109  call feedkeys("Vkk\<Up>yy", 'tx')
110  call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
111
112  " clean up
113  bw!
114endfunc
115
116func! Test_normal02_selectmode()
117  " some basic select mode tests
118  call Setup_NewWindow()
119  50
120  norm! gHy
121  call assert_equal('y51', getline('.'))
122  call setline(1, range(1,100))
123  50
124  exe ":norm! V9jo\<c-g>y"
125  call assert_equal('y60', getline('.'))
126  " clean up
127  bw!
128endfunc
129
130func! Test_normal02_selectmode2()
131  " some basic select mode tests
132  call Setup_NewWindow()
133  50
134  call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
135  call assert_equal('c51', getline('.'))
136  " clean up
137  bw!
138endfunc
139
140func! Test_normal03_join()
141  " basic join test
142  call Setup_NewWindow()
143  50
144  norm! VJ
145  call assert_equal('50 51', getline('.'))
146  $
147  norm! J
148  call assert_equal('100', getline('.'))
149  $
150  norm! V9-gJ
151  call assert_equal('919293949596979899100', getline('.'))
152  call setline(1, range(1,100))
153  $
154  :j 10
155  call assert_equal('100', getline('.'))
156  " clean up
157  bw!
158endfunc
159
160func! Test_normal04_filter()
161  " basic filter test
162  " only test on non windows platform
163  if has('win32')
164    return
165  endif
166  call Setup_NewWindow()
167  1
168  call feedkeys("!!sed -e 's/^/|    /'\n", 'tx')
169  call assert_equal('|    1', getline('.'))
170  90
171  :sil :!echo one
172  call feedkeys('.', 'tx')
173  call assert_equal('|    90', getline('.'))
174  95
175  set cpo+=!
176  " 2 <CR>, 1: for executing the command,
177  "         2: clear hit-enter-prompt
178  call feedkeys("!!\n", 'tx')
179  call feedkeys(":!echo one\n\n", 'tx')
180  call feedkeys(".", 'tx')
181  call assert_equal('one', getline('.'))
182  set cpo-=!
183  bw!
184endfunc
185
186func! Test_normal05_formatexpr()
187  " basic formatexpr test
188  call Setup_NewWindow()
189  %d_
190  call setline(1, ['here: 1   ', '2', 'here: 3   ', '4', 'not here:   '])
191  1
192  set formatexpr=MyFormatExpr()
193  norm! gqG
194  call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here:   '], getline(1,'$'))
195  set formatexpr=
196  bw!
197endfunc
198
199func Test_normal05_formatexpr_newbuf()
200  " Edit another buffer in the 'formatexpr' function
201  new
202  func! Format()
203    edit another
204  endfunc
205  set formatexpr=Format()
206  norm gqG
207  bw!
208  set formatexpr=
209endfunc
210
211func Test_normal05_formatexpr_setopt()
212  " Change the 'formatexpr' value in the function
213  new
214  func! Format()
215    set formatexpr=
216  endfunc
217  set formatexpr=Format()
218  norm gqG
219  bw!
220  set formatexpr=
221endfunc
222
223func! Test_normal06_formatprg()
224  " basic test for formatprg
225  " only test on non windows platform
226  if has('win32')
227    return
228  endif
229
230  " uses sed to number non-empty lines
231  call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/    /', '}'''], 'Xsed_format.sh')
232  call system('chmod +x ./Xsed_format.sh')
233  let text = ['a', '', 'c', '', ' ', 'd', 'e']
234  let expected = ['1    a', '', '3    c', '', '5     ', '6    d', '7    e']
235
236  10new
237  call setline(1, text)
238  set formatprg=./Xsed_format.sh
239  norm! gggqG
240  call assert_equal(expected, getline(1, '$'))
241  bw!
242
243  10new
244  call setline(1, text)
245  set formatprg=donothing
246  setlocal formatprg=./Xsed_format.sh
247  norm! gggqG
248  call assert_equal(expected, getline(1, '$'))
249  bw!
250
251  " clean up
252  set formatprg=
253  setlocal formatprg=
254  call delete('Xsed_format.sh')
255endfunc
256
257func! Test_normal07_internalfmt()
258  " basic test for internal formmatter to textwidth of 12
259  let list=range(1,11)
260  call map(list, 'v:val."    "')
261  10new
262  call setline(1, list)
263  set tw=12
264  norm! gggqG
265  call assert_equal(['1    2    3', '4    5    6', '7    8    9', '10    11    '], getline(1, '$'))
266  " clean up
267  set tw=0
268  bw!
269endfunc
270
271func! Test_normal08_fold()
272  " basic tests for foldopen/folddelete
273  if !has("folding")
274    return
275  endif
276  call Setup_NewWindow()
277  50
278  setl foldenable fdm=marker
279  " First fold
280  norm! V4jzf
281  " check that folds have been created
282  call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
283  " Second fold
284  46
285  norm! V10jzf
286  " check that folds have been created
287  call assert_equal('46/*{{{*/', getline(46))
288  call assert_equal('60/*}}}*/', getline(60))
289  norm! k
290  call assert_equal('45', getline('.'))
291  norm! j
292  call assert_equal('46/*{{{*/', getline('.'))
293  norm! j
294  call assert_equal('61', getline('.'))
295  norm! k
296  " open a fold
297  norm! Vzo
298  norm! k
299  call assert_equal('45', getline('.'))
300  norm! j
301  call assert_equal('46/*{{{*/', getline('.'))
302  norm! j
303  call assert_equal('47', getline('.'))
304  norm! k
305  norm! zcVzO
306  call assert_equal('46/*{{{*/', getline('.'))
307  norm! j
308  call assert_equal('47', getline('.'))
309  norm! j
310  call assert_equal('48', getline('.'))
311  norm! j
312  call assert_equal('49', getline('.'))
313  norm! j
314  call assert_equal('50/*{{{*/', getline('.'))
315  norm! j
316  call assert_equal('51', getline('.'))
317  " delete folds
318  :46
319  " collapse fold
320  norm! V14jzC
321  " delete all folds recursively
322  norm! VzD
323  call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
324
325  " clean up
326  setl nofoldenable fdm=marker
327  bw!
328endfunc
329
330func! Test_normal09_operatorfunc()
331  " Test operatorfunc
332  call Setup_NewWindow()
333  " Add some spaces for counting
334  50,60s/$/  /
335  unlet! g:a
336  let g:a=0
337  nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
338  vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
339  50
340  norm V2j,,
341  call assert_equal(6, g:a)
342  norm V,,
343  call assert_equal(2, g:a)
344  norm ,,l
345  call assert_equal(0, g:a)
346  50
347  exe "norm 0\<c-v>10j2l,,"
348  call assert_equal(11, g:a)
349  50
350  norm V10j,,
351  call assert_equal(22, g:a)
352
353  " clean up
354  unmap <buffer> ,,
355  set opfunc=
356  unlet! g:a
357  bw!
358endfunc
359
360func! Test_normal09a_operatorfunc()
361  " Test operatorfunc
362  call Setup_NewWindow()
363  " Add some spaces for counting
364  50,60s/$/  /
365  unlet! g:opt
366  set linebreak
367  nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
368  50
369  norm ,,j
370  exe "bd!" g:bufnr
371  call assert_true(&linebreak)
372  call assert_equal(g:opt, &linebreak)
373  set nolinebreak
374  norm ,,j
375  exe "bd!" g:bufnr
376  call assert_false(&linebreak)
377  call assert_equal(g:opt, &linebreak)
378
379  " clean up
380  unmap <buffer> ,,
381  set opfunc=
382  bw!
383  unlet! g:opt
384endfunc
385
386func! Test_normal10_expand()
387  " Test for expand()
388  10new
389  call setline(1, ['1', 'ifooar,,cbar'])
390  2
391  norm! $
392  let a=expand('<cword>')
393  let b=expand('<cWORD>')
394  call assert_equal('cbar', a)
395  call assert_equal('ifooar,,cbar', b)
396  " clean up
397  bw!
398endfunc
399
400func! Test_normal11_showcmd()
401  " test for 'showcmd'
402  10new
403  exe "norm! ofoobar\<esc>"
404  call assert_equal(2, line('$'))
405  set showcmd
406  exe "norm! ofoobar2\<esc>"
407  call assert_equal(3, line('$'))
408  exe "norm! VAfoobar3\<esc>"
409  call assert_equal(3, line('$'))
410  exe "norm! 0d3\<del>2l"
411  call assert_equal('obar2foobar3', getline('.'))
412  bw!
413endfunc
414
415func! Test_normal12_nv_error()
416  " Test for nv_error
417  10new
418  call setline(1, range(1,5))
419  " should not do anything, just beep
420  exe "norm! <c-k>"
421  call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
422  bw!
423endfunc
424
425func! Test_normal13_help()
426  " Test for F1
427  call assert_equal(1, winnr())
428  call feedkeys("\<f1>", 'txi')
429  call assert_match('help\.txt', bufname('%'))
430  call assert_equal(2, winnr('$'))
431  bw!
432endfunc
433
434func! Test_normal14_page()
435  " basic test for Ctrl-F and Ctrl-B
436  call Setup_NewWindow()
437  exe "norm! \<c-f>"
438  call assert_equal('9', getline('.'))
439  exe "norm! 2\<c-f>"
440  call assert_equal('25', getline('.'))
441  exe "norm! 2\<c-b>"
442  call assert_equal('18', getline('.'))
443  1
444  set scrolloff=5
445  exe "norm! 2\<c-f>"
446  call assert_equal('21', getline('.'))
447  exe "norm! \<c-b>"
448  call assert_equal('13', getline('.'))
449  1
450  set scrolloff=99
451  exe "norm! \<c-f>"
452  call assert_equal('13', getline('.'))
453  set scrolloff=0
454  100
455  exe "norm! $\<c-b>"
456  call assert_equal('92', getline('.'))
457  call assert_equal([0, 92, 1, 0, 1], getcurpos())
458  100
459  set nostartofline
460  exe "norm! $\<c-b>"
461  call assert_equal('92', getline('.'))
462  call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
463  " cleanup
464  set startofline
465  bw!
466endfunc
467
468func! Test_normal14_page_eol()
469  10new
470  norm oxxxxxxx
471  exe "norm 2\<c-f>"
472  " check with valgrind that cursor is put back in column 1
473  exe "norm 2\<c-b>"
474  bw!
475endfunc
476
477func! Test_normal15_z_scroll_vert()
478  " basic test for z commands that scroll the window
479  call Setup_NewWindow()
480  100
481  norm! >>
482  " Test for z<cr>
483  exe "norm! z\<cr>"
484  call assert_equal('	100', getline('.'))
485  call assert_equal(100, winsaveview()['topline'])
486  call assert_equal([0, 100, 2, 0, 9], getcurpos())
487
488  " Test for zt
489  21
490  norm! >>0zt
491  call assert_equal('	21', getline('.'))
492  call assert_equal(21, winsaveview()['topline'])
493  call assert_equal([0, 21, 1, 0, 8], getcurpos())
494
495  " Test for zb
496  30
497  norm! >>$ztzb
498  call assert_equal('	30', getline('.'))
499  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
500  call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
501
502  " Test for z-
503  1
504  30
505  norm! 0z-
506  call assert_equal('	30', getline('.'))
507  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
508  call assert_equal([0, 30, 2, 0, 9], getcurpos())
509
510  " Test for z{height}<cr>
511  call assert_equal(10, winheight(0))
512  exe "norm! z12\<cr>"
513  call assert_equal(12, winheight(0))
514  exe "norm! z10\<cr>"
515  call assert_equal(10, winheight(0))
516
517  " Test for z.
518  1
519  21
520  norm! 0z.
521  call assert_equal('	21', getline('.'))
522  call assert_equal(17, winsaveview()['topline'])
523  call assert_equal([0, 21, 2, 0, 9], getcurpos())
524
525  " Test for zz
526  1
527  21
528  norm! 0zz
529  call assert_equal('	21', getline('.'))
530  call assert_equal(17, winsaveview()['topline'])
531  call assert_equal([0, 21, 1, 0, 8], getcurpos())
532
533  " Test for z+
534  11
535  norm! zt
536  norm! z+
537  call assert_equal('	21', getline('.'))
538  call assert_equal(21, winsaveview()['topline'])
539  call assert_equal([0, 21, 2, 0, 9], getcurpos())
540
541  " Test for [count]z+
542  1
543  norm! 21z+
544  call assert_equal('	21', getline('.'))
545  call assert_equal(21, winsaveview()['topline'])
546  call assert_equal([0, 21, 2, 0, 9], getcurpos())
547
548  " Test for z^
549  norm! 22z+0
550  norm! z^
551  call assert_equal('	21', getline('.'))
552  call assert_equal(12, winsaveview()['topline'])
553  call assert_equal([0, 21, 2, 0, 9], getcurpos())
554
555  " Test for [count]z^
556  1
557  norm! 30z^
558  call assert_equal('	21', getline('.'))
559  call assert_equal(12, winsaveview()['topline'])
560  call assert_equal([0, 21, 2, 0, 9], getcurpos())
561
562  " cleanup
563  bw!
564endfunc
565
566func! Test_normal16_z_scroll_hor()
567  " basic test for z commands that scroll the window
568  10new
569  15vsp
570  set nowrap listchars=
571  let lineA='abcdefghijklmnopqrstuvwxyz'
572  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
573  $put =lineA
574  $put =lineB
575  1d
576
577  " Test for zl
578  1
579  norm! 5zl
580  call assert_equal(lineA, getline('.'))
581  call assert_equal(6, col('.'))
582  call assert_equal(5, winsaveview()['leftcol'])
583  norm! yl
584  call assert_equal('f', @0)
585
586  " Test for zh
587  norm! 2zh
588  call assert_equal(lineA, getline('.'))
589  call assert_equal(6, col('.'))
590  norm! yl
591  call assert_equal('f', @0)
592  call assert_equal(3, winsaveview()['leftcol'])
593
594  " Test for zL
595  norm! zL
596  call assert_equal(11, col('.'))
597  norm! yl
598  call assert_equal('k', @0)
599  call assert_equal(10, winsaveview()['leftcol'])
600  norm! 2zL
601  call assert_equal(25, col('.'))
602  norm! yl
603  call assert_equal('y', @0)
604  call assert_equal(24, winsaveview()['leftcol'])
605
606  " Test for zH
607  norm! 2zH
608  call assert_equal(25, col('.'))
609  call assert_equal(10, winsaveview()['leftcol'])
610  norm! yl
611  call assert_equal('y', @0)
612
613  " Test for zs
614  norm! $zs
615  call assert_equal(26, col('.'))
616  call assert_equal(25, winsaveview()['leftcol'])
617  norm! yl
618  call assert_equal('z', @0)
619
620  " Test for ze
621  norm! ze
622  call assert_equal(26, col('.'))
623  call assert_equal(11, winsaveview()['leftcol'])
624  norm! yl
625  call assert_equal('z', @0)
626
627  " cleanup
628  set wrap listchars=eol:$
629  bw!
630endfunc
631
632func! Test_normal17_z_scroll_hor2()
633  " basic test for z commands that scroll the window
634  " using 'sidescrolloff' setting
635  10new
636  20vsp
637  set nowrap listchars= sidescrolloff=5
638  let lineA='abcdefghijklmnopqrstuvwxyz'
639  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
640  $put =lineA
641  $put =lineB
642  1d
643
644  " Test for zl
645  1
646  norm! 5zl
647  call assert_equal(lineA, getline('.'))
648  call assert_equal(11, col('.'))
649  call assert_equal(5, winsaveview()['leftcol'])
650  norm! yl
651  call assert_equal('k', @0)
652
653  " Test for zh
654  norm! 2zh
655  call assert_equal(lineA, getline('.'))
656  call assert_equal(11, col('.'))
657  norm! yl
658  call assert_equal('k', @0)
659  call assert_equal(3, winsaveview()['leftcol'])
660
661  " Test for zL
662  norm! 0zL
663  call assert_equal(16, col('.'))
664  norm! yl
665  call assert_equal('p', @0)
666  call assert_equal(10, winsaveview()['leftcol'])
667  norm! 2zL
668  call assert_equal(26, col('.'))
669  norm! yl
670  call assert_equal('z', @0)
671  call assert_equal(15, winsaveview()['leftcol'])
672
673  " Test for zH
674  norm! 2zH
675  call assert_equal(15, col('.'))
676  call assert_equal(0, winsaveview()['leftcol'])
677  norm! yl
678  call assert_equal('o', @0)
679
680  " Test for zs
681  norm! $zs
682  call assert_equal(26, col('.'))
683  call assert_equal(20, winsaveview()['leftcol'])
684  norm! yl
685  call assert_equal('z', @0)
686
687  " Test for ze
688  norm! ze
689  call assert_equal(26, col('.'))
690  call assert_equal(11, winsaveview()['leftcol'])
691  norm! yl
692  call assert_equal('z', @0)
693
694  " cleanup
695  set wrap listchars=eol:$ sidescrolloff=0
696  bw!
697endfunc
698
699func! Test_normal18_z_fold()
700  " basic tests for foldopen/folddelete
701  if !has("folding")
702    return
703  endif
704  call Setup_NewWindow()
705  50
706  setl foldenable fdm=marker foldlevel=5
707
708  " Test for zF
709  " First fold
710  norm! 4zF
711  " check that folds have been created
712  call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
713
714  " Test for zd
715  51
716  norm! 2zF
717  call assert_equal(2, foldlevel('.'))
718  norm! kzd
719  call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
720  norm! j
721  call assert_equal(1, foldlevel('.'))
722
723  " Test for zD
724  " also deletes partially selected folds recursively
725  51
726  norm! zF
727  call assert_equal(2, foldlevel('.'))
728  norm! kV2jzD
729  call assert_equal(['50', '51', '52', '53'], getline(50,53))
730
731  " Test for zE
732  85
733  norm! 4zF
734  86
735  norm! 2zF
736  90
737  norm! 4zF
738  call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
739  norm! zE
740  call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
741
742  " Test for zn
743  50
744  set foldlevel=0
745  norm! 2zF
746  norm! zn
747  norm! k
748  call assert_equal('49', getline('.'))
749  norm! j
750  call assert_equal('50/*{{{*/', getline('.'))
751  norm! j
752  call assert_equal('51/*}}}*/', getline('.'))
753  norm! j
754  call assert_equal('52', getline('.'))
755  call assert_equal(0, &foldenable)
756
757  " Test for zN
758  49
759  norm! zN
760  call assert_equal('49', getline('.'))
761  norm! j
762  call assert_equal('50/*{{{*/', getline('.'))
763  norm! j
764  call assert_equal('52', getline('.'))
765  call assert_equal(1, &foldenable)
766
767  " Test for zi
768  norm! zi
769  call assert_equal(0, &foldenable)
770  norm! zi
771  call assert_equal(1, &foldenable)
772  norm! zi
773  call assert_equal(0, &foldenable)
774  norm! zi
775  call assert_equal(1, &foldenable)
776
777  " Test for za
778  50
779  norm! za
780  norm! k
781  call assert_equal('49', getline('.'))
782  norm! j
783  call assert_equal('50/*{{{*/', getline('.'))
784  norm! j
785  call assert_equal('51/*}}}*/', getline('.'))
786  norm! j
787  call assert_equal('52', getline('.'))
788  50
789  norm! za
790  norm! k
791  call assert_equal('49', getline('.'))
792  norm! j
793  call assert_equal('50/*{{{*/', getline('.'))
794  norm! j
795  call assert_equal('52', getline('.'))
796
797  49
798  norm! 5zF
799  norm! k
800  call assert_equal('48', getline('.'))
801  norm! j
802  call assert_equal('49/*{{{*/', getline('.'))
803  norm! j
804  call assert_equal('55', getline('.'))
805  49
806  norm! za
807  call assert_equal('49/*{{{*/', getline('.'))
808  norm! j
809  call assert_equal('50/*{{{*/', getline('.'))
810  norm! j
811  call assert_equal('52', getline('.'))
812  set nofoldenable
813  " close fold and set foldenable
814  norm! za
815  call assert_equal(1, &foldenable)
816
817  50
818  " have to use {count}za to open all folds and make the cursor visible
819  norm! 2za
820  norm! 2k
821  call assert_equal('48', getline('.'))
822  norm! j
823  call assert_equal('49/*{{{*/', getline('.'))
824  norm! j
825  call assert_equal('50/*{{{*/', getline('.'))
826  norm! j
827  call assert_equal('51/*}}}*/', getline('.'))
828  norm! j
829  call assert_equal('52', getline('.'))
830
831  " Test for zA
832  49
833  set foldlevel=0
834  50
835  norm! zA
836  norm! 2k
837  call assert_equal('48', getline('.'))
838  norm! j
839  call assert_equal('49/*{{{*/', getline('.'))
840  norm! j
841  call assert_equal('50/*{{{*/', getline('.'))
842  norm! j
843  call assert_equal('51/*}}}*/', getline('.'))
844  norm! j
845  call assert_equal('52', getline('.'))
846
847  " zA on a opened fold when foldenale is not set
848  50
849  set nofoldenable
850  norm! zA
851  call assert_equal(1, &foldenable)
852  norm! k
853  call assert_equal('48', getline('.'))
854  norm! j
855  call assert_equal('49/*{{{*/', getline('.'))
856  norm! j
857  call assert_equal('55', getline('.'))
858
859  " Test for zc
860  norm! zE
861  50
862  norm! 2zF
863  49
864  norm! 5zF
865  set nofoldenable
866  50
867  " There most likely is a bug somewhere:
868  " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
869  " TODO: Should this only close the inner most fold or both folds?
870  norm! zc
871  call assert_equal(1, &foldenable)
872  norm! k
873  call assert_equal('48', getline('.'))
874  norm! j
875  call assert_equal('49/*{{{*/', getline('.'))
876  norm! j
877  call assert_equal('55', getline('.'))
878  set nofoldenable
879  50
880  norm! Vjzc
881  norm! k
882  call assert_equal('48', getline('.'))
883  norm! j
884  call assert_equal('49/*{{{*/', getline('.'))
885  norm! j
886  call assert_equal('55', getline('.'))
887
888  " Test for zC
889  set nofoldenable
890  50
891  norm! zCk
892  call assert_equal('48', getline('.'))
893  norm! j
894  call assert_equal('49/*{{{*/', getline('.'))
895  norm! j
896  call assert_equal('55', getline('.'))
897
898  " Test for zx
899  " 1) close folds at line 49-54
900  set nofoldenable
901  48
902  norm! zx
903  call assert_equal(1, &foldenable)
904  norm! j
905  call assert_equal('49/*{{{*/', getline('.'))
906  norm! j
907  call assert_equal('55', getline('.'))
908
909  " 2) do not close fold under curser
910  51
911  set nofoldenable
912  norm! zx
913  call assert_equal(1, &foldenable)
914  norm! 3k
915  call assert_equal('48', getline('.'))
916  norm! j
917  call assert_equal('49/*{{{*/', getline('.'))
918  norm! j
919  call assert_equal('50/*{{{*/', getline('.'))
920  norm! j
921  call assert_equal('51/*}}}*/', getline('.'))
922  norm! j
923  call assert_equal('52', getline('.'))
924  norm! j
925  call assert_equal('53', getline('.'))
926  norm! j
927  call assert_equal('54/*}}}*/', getline('.'))
928  norm! j
929  call assert_equal('55', getline('.'))
930
931  " 3) close one level of folds
932  48
933  set nofoldenable
934  set foldlevel=1
935  norm! zx
936  call assert_equal(1, &foldenable)
937  call assert_equal('48', getline('.'))
938  norm! j
939  call assert_equal('49/*{{{*/', getline('.'))
940  norm! j
941  call assert_equal('50/*{{{*/', getline('.'))
942  norm! j
943  call assert_equal('52', getline('.'))
944  norm! j
945  call assert_equal('53', getline('.'))
946  norm! j
947  call assert_equal('54/*}}}*/', getline('.'))
948  norm! j
949  call assert_equal('55', getline('.'))
950
951  " Test for zX
952  " Close all folds
953  set foldlevel=0 nofoldenable
954  50
955  norm! zX
956  call assert_equal(1, &foldenable)
957  norm! k
958  call assert_equal('48', getline('.'))
959  norm! j
960  call assert_equal('49/*{{{*/', getline('.'))
961  norm! j
962  call assert_equal('55', getline('.'))
963
964  " Test for zm
965  50
966  set nofoldenable foldlevel=2
967  norm! zm
968  call assert_equal(1, &foldenable)
969  call assert_equal(1, &foldlevel)
970  norm! zm
971  call assert_equal(0, &foldlevel)
972  norm! zm
973  call assert_equal(0, &foldlevel)
974  norm! k
975  call assert_equal('48', getline('.'))
976  norm! j
977  call assert_equal('49/*{{{*/', getline('.'))
978  norm! j
979  call assert_equal('55', getline('.'))
980
981  " Test for zM
982  48
983  set nofoldenable foldlevel=99
984  norm! zM
985  call assert_equal(1, &foldenable)
986  call assert_equal(0, &foldlevel)
987  call assert_equal('48', getline('.'))
988  norm! j
989  call assert_equal('49/*{{{*/', getline('.'))
990  norm! j
991  call assert_equal('55', getline('.'))
992
993  " Test for zr
994  48
995  set nofoldenable foldlevel=0
996  norm! zr
997  call assert_equal(0, &foldenable)
998  call assert_equal(1, &foldlevel)
999  set foldlevel=0 foldenable
1000  norm! zr
1001  call assert_equal(1, &foldenable)
1002  call assert_equal(1, &foldlevel)
1003  norm! zr
1004  call assert_equal(2, &foldlevel)
1005  call assert_equal('48', getline('.'))
1006  norm! j
1007  call assert_equal('49/*{{{*/', getline('.'))
1008  norm! j
1009  call assert_equal('50/*{{{*/', getline('.'))
1010  norm! j
1011  call assert_equal('51/*}}}*/', getline('.'))
1012  norm! j
1013  call assert_equal('52', getline('.'))
1014
1015  " Test for zR
1016  48
1017  set nofoldenable foldlevel=0
1018  norm! zR
1019  call assert_equal(0, &foldenable)
1020  call assert_equal(2, &foldlevel)
1021  set foldenable foldlevel=0
1022  norm! zR
1023  call assert_equal(1, &foldenable)
1024  call assert_equal(2, &foldlevel)
1025  call assert_equal('48', getline('.'))
1026  norm! j
1027  call assert_equal('49/*{{{*/', getline('.'))
1028  norm! j
1029  call assert_equal('50/*{{{*/', getline('.'))
1030  norm! j
1031  call assert_equal('51/*}}}*/', getline('.'))
1032  norm! j
1033  call assert_equal('52', getline('.'))
1034  call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1035  48
1036  call assert_equal('48', getline('.'))
1037  norm! j
1038  call assert_equal('49/*{{{*/', getline('.'))
1039  norm! j
1040  call assert_equal('50/*{{{*/', getline('.'))
1041  norm! j
1042  call assert_equal('a /*{{{*/', getline('.'))
1043  norm! j
1044  call assert_equal('51/*}}}*/', getline('.'))
1045  norm! j
1046  call assert_equal('52', getline('.'))
1047  48
1048  norm! zR
1049  call assert_equal(1, &foldenable)
1050  call assert_equal(3, &foldlevel)
1051  call assert_equal('48', getline('.'))
1052  norm! j
1053  call assert_equal('49/*{{{*/', getline('.'))
1054  norm! j
1055  call assert_equal('50/*{{{*/', getline('.'))
1056  norm! j
1057  call assert_equal('a /*{{{*/', getline('.'))
1058  norm! j
1059  call assert_equal('b /*}}}*/', getline('.'))
1060  norm! j
1061  call assert_equal('51/*}}}*/', getline('.'))
1062  norm! j
1063  call assert_equal('52', getline('.'))
1064
1065  " clean up
1066  setl nofoldenable fdm=marker foldlevel=0
1067  bw!
1068endfunc
1069
1070func! Test_normal19_z_spell()
1071  if !has("spell") || !has('syntax')
1072    return
1073  endif
1074  new
1075  call append(0, ['1 good', '2 goood', '3 goood'])
1076  set spell spellfile=./Xspellfile.add spelllang=en
1077  let oldlang=v:lang
1078  lang C
1079
1080  " Test for zg
1081  1
1082  norm! ]s
1083  call assert_equal('2 goood', getline('.'))
1084  norm! zg
1085  1
1086  let a=execute('unsilent :norm! ]s')
1087  call assert_equal('1 good', getline('.'))
1088  call assert_equal('search hit BOTTOM, continuing at TOP', a[1:])
1089  let cnt=readfile('./Xspellfile.add')
1090  call assert_equal('goood', cnt[0])
1091
1092  " Test for zw
1093  2
1094  norm! $zw
1095  1
1096  norm! ]s
1097  call assert_equal('2 goood', getline('.'))
1098  let cnt=readfile('./Xspellfile.add')
1099  call assert_equal('#oood', cnt[0])
1100  call assert_equal('goood/!', cnt[1])
1101
1102  " Test for zg in visual mode
1103  let a=execute('unsilent :norm! V$zg')
1104  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
1105  1
1106  norm! ]s
1107  call assert_equal('3 goood', getline('.'))
1108  let cnt=readfile('./Xspellfile.add')
1109  call assert_equal('2 goood', cnt[2])
1110  " Remove "2 good" from spellfile
1111  2
1112  let a=execute('unsilent norm! V$zw')
1113  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
1114  let cnt=readfile('./Xspellfile.add')
1115  call assert_equal('2 goood/!', cnt[3])
1116
1117  " Test for zG
1118  let a=execute('unsilent norm! V$zG')
1119  call assert_match("Word '2 goood' added to .*", a)
1120  let fname=matchstr(a, 'to\s\+\zs\f\+$')
1121  let cnt=readfile(fname)
1122  call assert_equal('2 goood', cnt[0])
1123
1124  " Test for zW
1125  let a=execute('unsilent norm! V$zW')
1126  call assert_match("Word '2 goood' added to .*", a)
1127  let cnt=readfile(fname)
1128  call assert_equal('# goood', cnt[0])
1129  call assert_equal('2 goood/!', cnt[1])
1130
1131  " Test for zuW
1132  let a=execute('unsilent norm! V$zuW')
1133  call assert_match("Word '2 goood' removed from .*", a)
1134  let cnt=readfile(fname)
1135  call assert_equal('# goood', cnt[0])
1136  call assert_equal('# goood/!', cnt[1])
1137
1138  " Test for zuG
1139  let a=execute('unsilent norm! $zG')
1140  call assert_match("Word 'goood' added to .*", a)
1141  let cnt=readfile(fname)
1142  call assert_equal('# goood', cnt[0])
1143  call assert_equal('# goood/!', cnt[1])
1144  call assert_equal('goood', cnt[2])
1145  let a=execute('unsilent norm! $zuG')
1146  let cnt=readfile(fname)
1147  call assert_match("Word 'goood' removed from .*", a)
1148  call assert_equal('# goood', cnt[0])
1149  call assert_equal('# goood/!', cnt[1])
1150  call assert_equal('#oood', cnt[2])
1151  " word not found in wordlist
1152  let a=execute('unsilent norm! V$zuG')
1153  let cnt=readfile(fname)
1154  call assert_match("", a)
1155  call assert_equal('# goood', cnt[0])
1156  call assert_equal('# goood/!', cnt[1])
1157  call assert_equal('#oood', cnt[2])
1158
1159  " Test for zug
1160  call delete('./Xspellfile.add')
1161  2
1162  let a=execute('unsilent norm! $zg')
1163  let cnt=readfile('./Xspellfile.add')
1164  call assert_equal('goood', cnt[0])
1165  let a=execute('unsilent norm! $zug')
1166  call assert_match("Word 'goood' removed from \./Xspellfile.add", a)
1167  let cnt=readfile('./Xspellfile.add')
1168  call assert_equal('#oood', cnt[0])
1169  " word not in wordlist
1170  let a=execute('unsilent norm! V$zug')
1171  call assert_match('', a)
1172  let cnt=readfile('./Xspellfile.add')
1173  call assert_equal('#oood', cnt[0])
1174
1175  " Test for zuw
1176  call delete('./Xspellfile.add')
1177  2
1178  let a=execute('unsilent norm! Vzw')
1179  let cnt=readfile('./Xspellfile.add')
1180  call assert_equal('2 goood/!', cnt[0])
1181  let a=execute('unsilent norm! Vzuw')
1182  call assert_match("Word '2 goood' removed from \./Xspellfile.add", a)
1183  let cnt=readfile('./Xspellfile.add')
1184  call assert_equal('# goood/!', cnt[0])
1185  " word not in wordlist
1186  let a=execute('unsilent norm! $zug')
1187  call assert_match('', a)
1188  let cnt=readfile('./Xspellfile.add')
1189  call assert_equal('# goood/!', cnt[0])
1190
1191  " add second entry to spellfile setting
1192  set spellfile=./Xspellfile.add,./Xspellfile2.add
1193  call delete('./Xspellfile.add')
1194  2
1195  let a=execute('unsilent norm! $2zg')
1196  let cnt=readfile('./Xspellfile2.add')
1197  call assert_match("Word 'goood' added to ./Xspellfile2.add", a)
1198  call assert_equal('goood', cnt[0])
1199
1200  " clean up
1201  exe "lang" oldlang
1202  call delete("./Xspellfile.add")
1203  call delete("./Xspellfile2.add")
1204  call delete("./Xspellfile.add.spl")
1205  call delete("./Xspellfile2.add.spl")
1206
1207  " zux -> no-op
1208  2
1209  norm! $zux
1210  call assert_equal([], glob('Xspellfile.add',0,1))
1211  call assert_equal([], glob('Xspellfile2.add',0,1))
1212
1213  set spellfile=
1214  bw!
1215endfunc
1216
1217func! Test_normal20_exmode()
1218  if !has("unix")
1219    " Reading from redirected file doesn't work on MS-Windows
1220    return
1221  endif
1222  call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1223  call writefile(['1', '2'], 'Xfile')
1224  call system(v:progpath .' -e -s < Xscript Xfile')
1225  let a=readfile('Xfile2')
1226  call assert_equal(['1', 'foo', 'bar', '2'], a)
1227
1228  " clean up
1229  for file in ['Xfile', 'Xfile2', 'Xscript']
1230    call delete(file)
1231  endfor
1232  bw!
1233endfunc
1234
1235func! Test_normal21_nv_hat()
1236  set hidden
1237  new
1238  " to many buffers opened already, will not work
1239  "call assert_fails(":b#", 'E23')
1240  "call assert_equal('', @#)
1241  e Xfoobar
1242  e Xfile2
1243  call feedkeys("\<c-^>", 't')
1244  call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
1245  call feedkeys("f\<c-^>", 't')
1246  call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
1247  " clean up
1248  set nohidden
1249  bw!
1250endfunc
1251
1252func! Test_normal22_zet()
1253  " Test for ZZ
1254  " let shell = &shell
1255  " let &shell = 'sh'
1256  call writefile(['1', '2'], 'Xfile')
1257  let args = ' -u NONE -N -U NONE -i NONE --noplugins -X --not-a-term'
1258  call system(v:progpath . args . ' -c "%d" -c ":norm! ZZ" Xfile')
1259  let a = readfile('Xfile')
1260  call assert_equal([], a)
1261  " Test for ZQ
1262  call writefile(['1', '2'], 'Xfile')
1263  call system(v:progpath . args . ' -c "%d" -c ":norm! ZQ" Xfile')
1264  let a = readfile('Xfile')
1265  call assert_equal(['1', '2'], a)
1266
1267  " clean up
1268  for file in ['Xfile']
1269    call delete(file)
1270  endfor
1271  " let &shell = shell
1272endfunc
1273
1274func! Test_normal23_K()
1275  " Test for K command
1276  new
1277  call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
1278  let k = &keywordprg
1279  set keywordprg=:help
1280  1
1281  norm! VK
1282  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1283  call assert_equal('help', &ft)
1284  call assert_match('\*version8.txt\*', getline('.'))
1285  helpclose
1286  norm! 0K
1287  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1288  call assert_equal('help', &ft)
1289  call assert_match('\*version8\.0\*', getline('.'))
1290  helpclose
1291
1292  set keywordprg=:new
1293  set iskeyword+=%
1294  set iskeyword+=\|
1295  2
1296  norm! K
1297  call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1298  bwipe!
1299  3
1300  norm! K
1301  call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1302  bwipe!
1303  if !has('win32')
1304    4
1305    norm! K
1306    call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1307    bwipe!
1308  endif
1309  set iskeyword-=%
1310  set iskeyword-=\|
1311
1312  " Only expect "man" to work on Unix
1313  if !has("unix")
1314    let &keywordprg = k
1315    bw!
1316    return
1317  endif
1318  set keywordprg=man\ --pager=cat
1319  " Test for using man
1320  2
1321  let a = execute('unsilent norm! K')
1322  call assert_match("man --pager=cat 'man'", a)
1323
1324  " clean up
1325  let &keywordprg = k
1326  bw!
1327endfunc
1328
1329func! Test_normal24_rot13()
1330  " This test uses multi byte characters
1331  if !has("multi_byte")
1332    return
1333  endif
1334  " Testing for g?? g?g?
1335  new
1336  call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1337  1
1338  norm! g??
1339  call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1340  norm! g?g?
1341  call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1342
1343  " clean up
1344  bw!
1345endfunc
1346
1347func! Test_normal25_tag()
1348  " Testing for CTRL-] g CTRL-] g]
1349  " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1350  h
1351  " Test for CTRL-]
1352  call search('\<x\>$')
1353  exe "norm! \<c-]>"
1354  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1355  norm! yiW
1356  call assert_equal("*x*", @0)
1357  exe ":norm \<c-o>"
1358
1359  " Test for g_CTRL-]
1360  call search('\<v_u\>$')
1361  exe "norm! g\<c-]>"
1362  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1363  norm! yiW
1364  call assert_equal("*v_u*", @0)
1365  exe ":norm \<c-o>"
1366
1367  " Test for g]
1368  call search('\<i_<Esc>$')
1369  let a = execute(":norm! g]")
1370  call assert_match('i_<Esc>.*insert.txt', a)
1371
1372  if !empty(exepath('cscope')) && has('cscope')
1373    " setting cscopetag changes how g] works
1374    set cst
1375    exe "norm! g]"
1376    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1377    norm! yiW
1378    call assert_equal("*i_<Esc>*", @0)
1379    exe ":norm \<c-o>"
1380    " Test for CTRL-W g]
1381    exe "norm! \<C-W>g]"
1382    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1383    norm! yiW
1384    call assert_equal("*i_<Esc>*", @0)
1385    call assert_equal(3, winnr('$'))
1386    helpclose
1387    set nocst
1388  endif
1389
1390  " Test for CTRL-W g]
1391  let a = execute("norm! \<C-W>g]")
1392  call assert_match('i_<Esc>.*insert.txt', a)
1393
1394  " Test for CTRL-W CTRL-]
1395  exe "norm! \<C-W>\<C-]>"
1396  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1397  norm! yiW
1398  call assert_equal("*i_<Esc>*", @0)
1399  call assert_equal(3, winnr('$'))
1400  helpclose
1401
1402  " Test for CTRL-W g CTRL-]
1403  exe "norm! \<C-W>g\<C-]>"
1404  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1405  norm! yiW
1406  call assert_equal("*i_<Esc>*", @0)
1407  call assert_equal(3, winnr('$'))
1408  helpclose
1409
1410  " clean up
1411  helpclose
1412endfunc
1413
1414func! Test_normal26_put()
1415  " Test for ]p ]P [p and [P
1416  new
1417  call append(0, ['while read LINE', 'do', '  ((count++))', '  if [ $? -ne 0 ]; then', "    echo 'Error writing file'", '  fi', 'done'])
1418  1
1419  /Error/y a
1420  2
1421  norm! "a]pj"a[p
1422  call assert_equal(['do', "echo 'Error writing file'", "  echo 'Error writing file'", '  ((count++))'], getline(2,5))
1423  1
1424  /^\s\{4}/
1425  exe "norm!  \"a]P3Eldt'"
1426  exe "norm! j\"a[P2Eldt'"
1427  call assert_equal(['  if [ $? -ne 0 ]; then', "    echo 'Error writing'", "    echo 'Error'", "    echo 'Error writing file'", '  fi'], getline(6,10))
1428
1429  " clean up
1430  bw!
1431endfunc
1432
1433func! Test_normal27_bracket()
1434  " Test for [' [` ]' ]`
1435  call Setup_NewWindow()
1436  1,21s/.\+/  &   b/
1437  1
1438  norm! $ma
1439  5
1440  norm! $mb
1441  10
1442  norm! $mc
1443  15
1444  norm! $md
1445  20
1446  norm! $me
1447
1448  " Test for ['
1449  9
1450  norm! 2['
1451  call assert_equal('  1   b', getline('.'))
1452  call assert_equal(1, line('.'))
1453  call assert_equal(3, col('.'))
1454
1455  " Test for ]'
1456  norm! ]'
1457  call assert_equal('  5   b', getline('.'))
1458  call assert_equal(5, line('.'))
1459  call assert_equal(3, col('.'))
1460
1461  " No mark after line 21, cursor moves to first non blank on current line
1462  21
1463  norm! $]'
1464  call assert_equal('  21   b', getline('.'))
1465  call assert_equal(21, line('.'))
1466  call assert_equal(3, col('.'))
1467
1468  " Test for [`
1469  norm! 2[`
1470  call assert_equal('  15   b', getline('.'))
1471  call assert_equal(15, line('.'))
1472  call assert_equal(8, col('.'))
1473
1474  " Test for ]`
1475  norm! ]`
1476  call assert_equal('  20   b', getline('.'))
1477  call assert_equal(20, line('.'))
1478  call assert_equal(8, col('.'))
1479
1480  " clean up
1481  bw!
1482endfunc
1483
1484func! Test_normal28_parenthesis()
1485  " basic testing for ( and )
1486  new
1487  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1488
1489  $
1490  norm! d(
1491  call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1492  norm! 2d(
1493  call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1494  1
1495  norm! 0d)
1496  call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1497
1498  call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1499  $
1500  norm! $d(
1501  call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1502
1503  " clean up
1504  bw!
1505endfunc
1506
1507fun! Test_normal29_brace()
1508  " basic test for { and } movements
1509  let text= ['A paragraph begins after each empty line, and also at each of a set of',
1510  \ 'paragraph macros, specified by the pairs of characters in the ''paragraphs''',
1511  \ 'option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to',
1512  \ 'the macros ".IP", ".LP", etc.  (These are nroff macros, so the dot must be in',
1513  \ 'the first column).  A section boundary is also a paragraph boundary.',
1514  \ 'Note that a blank line (only containing white space) is NOT a paragraph',
1515  \ 'boundary.',
1516  \ '',
1517  \ '',
1518  \ 'Also note that this does not include a ''{'' or ''}'' in the first column.  When',
1519  \ 'the ''{'' flag is in ''cpoptions'' then ''{'' in the first column is used as a',
1520  \ 'paragraph boundary |posix|.',
1521  \ '{',
1522  \ 'This is no paragaraph',
1523  \ 'unless the ''{'' is set',
1524  \ 'in ''cpoptions''',
1525  \ '}',
1526  \ '.IP',
1527  \ 'The nroff macros IP seperates a paragraph',
1528  \ 'That means, it must be a ''.''',
1529  \ 'followed by IP',
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  new
1538  call append(0, text)
1539  1
1540  norm! 0d2}
1541  call assert_equal(['.IP',
1542    \  'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''', 'followed by IP',
1543    \ '.LPIt does not matter, if afterwards some', 'more characters follow.', '.SHAlso section boundaries from the nroff',
1544    \  'macros terminate a paragraph. That means', 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
1545  norm! 0d}
1546  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
1547    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
1548    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1, '$'))
1549  $
1550  norm! d{
1551  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
1552	\ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means', 'a character like this:', ''], getline(1, '$'))
1553  norm! d{
1554  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.', ''], getline(1,'$'))
1555  " Test with { in cpooptions
1556  %d
1557  call append(0, text)
1558  set cpo+={
1559  1
1560  norm! 0d2}
1561  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
1562    \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
1563    \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
1564    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
1565    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
1566  $
1567  norm! d}
1568  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
1569    \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
1570    \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
1571    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
1572    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
1573  norm! gg}
1574  norm! d5}
1575  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}', ''], getline(1,'$'))
1576
1577  " clean up
1578  set cpo-={
1579  bw!
1580endfunc
1581
1582fun! Test_normal30_changecase()
1583  " This test uses multi byte characters
1584  if !has("multi_byte")
1585    return
1586  endif
1587  new
1588  call append(0, 'This is a simple test: äüöß')
1589  norm! 1ggVu
1590  call assert_equal('this is a simple test: äüöß', getline('.'))
1591  norm! VU
1592  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1593  norm! guu
1594  call assert_equal('this is a simple test: äüöss', getline('.'))
1595  norm! gUgU
1596  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1597  norm! gugu
1598  call assert_equal('this is a simple test: äüöss', getline('.'))
1599  norm! gUU
1600  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1601  norm! 010~
1602  call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
1603  norm! V~
1604  call assert_equal('THIS IS A simple test: äüöss', getline('.'))
1605
1606  " clean up
1607  bw!
1608endfunc
1609
1610fun! Test_normal31_r_cmd()
1611  " Test for r command
1612  new
1613  call append(0, 'This is a simple test: abcd')
1614  exe "norm! 1gg$r\<cr>"
1615  call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
1616  exe "norm! 1gg2wlr\<cr>"
1617  call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
1618  exe "norm! 2gg0W5r\<cr>"
1619  call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
1620  set autoindent
1621  call setline(2, ['simple test: abc', ''])
1622  exe "norm! 2gg0W5r\<cr>"
1623  call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
1624  exe "norm! 1ggVr\<cr>"
1625  call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
1626  call setline(1, 'This is a')
1627  exe "norm! 1gg05rf"
1628  call assert_equal('fffffis a', getline(1))
1629
1630  " clean up
1631  set noautoindent
1632  bw!
1633endfunc
1634
1635func! Test_normal32_g_cmd1()
1636  " Test for g*, g#
1637  new
1638  call append(0, ['abc.x_foo', 'x_foobar.abc'])
1639  1
1640  norm! $g*
1641  call assert_equal('x_foo', @/)
1642  call assert_equal('x_foobar.abc', getline('.'))
1643  norm! $g#
1644  call assert_equal('abc', @/)
1645  call assert_equal('abc.x_foo', getline('.'))
1646
1647  " clean up
1648  bw!
1649endfunc
1650
1651fun! Test_normal33_g_cmd2()
1652  if !has("jumplist")
1653    return
1654  endif
1655  " Tests for g cmds
1656  call Setup_NewWindow()
1657  " Test for g`
1658  clearjumps
1659  norm! ma10j
1660  let a=execute(':jumps')
1661  " empty jumplist
1662  call assert_equal('>', a[-1:])
1663  norm! g`a
1664  call assert_equal('>', a[-1:])
1665  call assert_equal(1, line('.'))
1666  call assert_equal('1', getline('.'))
1667
1668  " Test for g; and g,
1669  norm! g;
1670  " there is only one change in the changelist
1671  " currently, when we setup the window
1672  call assert_equal(2, line('.'))
1673  call assert_fails(':norm! g;', 'E662')
1674  call assert_fails(':norm! g,', 'E663')
1675  let &ul=&ul
1676  call append('$', ['a', 'b', 'c', 'd'])
1677  let &ul=&ul
1678  call append('$', ['Z', 'Y', 'X', 'W'])
1679  let a = execute(':changes')
1680  call assert_match('2\s\+0\s\+2', a)
1681  call assert_match('101\s\+0\s\+a', a)
1682  call assert_match('105\s\+0\s\+Z', a)
1683  norm! 3g;
1684  call assert_equal(2, line('.'))
1685  norm! 2g,
1686  call assert_equal(105, line('.'))
1687
1688  " Test for g& - global substitute
1689  %d
1690  call setline(1, range(1,10))
1691  call append('$', ['a', 'b', 'c', 'd'])
1692  $s/\w/&&/g
1693  exe "norm! /[1-8]\<cr>"
1694  norm! g&
1695  call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
1696
1697  " Test for gv
1698  %d
1699  call append('$', repeat(['abcdefgh'], 8))
1700  exe "norm! 2gg02l\<c-v>2j2ly"
1701  call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
1702  " in visual mode, gv swaps current and last selected region
1703  exe "norm! G0\<c-v>4k4lgvd"
1704  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
1705  exe "norm! G0\<c-v>4k4ly"
1706  exe "norm! gvood"
1707  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
1708
1709  " Test for gk/gj
1710  %d
1711  15vsp
1712  set wrap listchars= sbr=
1713  let lineA='abcdefghijklmnopqrstuvwxyz'
1714  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1715  $put =lineA
1716  $put =lineB
1717
1718  norm! 3gg0dgk
1719  call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
1720  set nu
1721  norm! 3gg0gjdgj
1722  call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1723
1724  " Test for gJ
1725  norm! 2gggJ
1726  call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1727  call assert_equal(16, col('.'))
1728  " shouldn't do anything
1729  norm! 10gJ
1730  call assert_equal(1, col('.'))
1731
1732  " Test for g0 g^ gm g$
1733  exe "norm! 2gg0gji   "
1734  call assert_equal(['', 'abcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1735  norm! g0yl
1736  call assert_equal(12, col('.'))
1737  call assert_equal(' ', getreg(0))
1738  norm! g$yl
1739  call assert_equal(22, col('.'))
1740  call assert_equal('3', getreg(0))
1741  norm! gmyl
1742  call assert_equal(17, col('.'))
1743  call assert_equal('n', getreg(0))
1744  norm! g^yl
1745  call assert_equal(15, col('.'))
1746  call assert_equal('l', getreg(0))
1747
1748  " Test for g Ctrl-G
1749  set ff=unix
1750  let a=execute(":norm! g\<c-g>")
1751  call assert_match('Col 15 of 43; Line 2 of 2; Word 2 of 2; Byte 16 of 45', a)
1752
1753  " Test for gI
1754  norm! gIfoo
1755  call assert_equal(['', 'fooabcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1756
1757  " Test for gi
1758  wincmd c
1759  %d
1760  set tw=0
1761  call setline(1, ['foobar', 'new line'])
1762  norm! A next word
1763  $put ='third line'
1764  norm! gi another word
1765  call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
1766
1767  " clean up
1768  bw!
1769endfunc
1770
1771fun! Test_normal34_g_cmd3()
1772  if !has("multi_byte")
1773    return
1774  endif
1775  " Test for g8
1776  new
1777  call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1778  let a=execute(':norm! 1gg$g8')
1779  call assert_equal('c3 b6 ', a[1:])
1780
1781  " Test for gp gP
1782  call append(1, range(1,10))
1783  " clean up
1784  bw!
1785endfunc
1786
1787fun! Test_normal35_g_cmd4()
1788  " Test for g<
1789  " Cannot capture its output,
1790  " probably a bug, therefore, test disabled:
1791  throw "Skipped: output of g< can't be tested currently"
1792  echo "a\nb\nc\nd"
1793  let b=execute(':norm! g<')
1794  call assert_true(!empty(b), 'failed `execute(g<)`')
1795endfunc
1796
1797fun! Test_normal36_g_cmd5()
1798  new
1799  call append(0, 'abcdefghijklmnopqrstuvwxyz')
1800  set ff=unix
1801  " Test for gp gP
1802  call append(1, range(1,10))
1803  1
1804  norm! 1yy
1805  3
1806  norm! gp
1807  call assert_equal([0, 5, 1, 0, 1], getcurpos())
1808  $
1809  norm! gP
1810  call assert_equal([0, 14, 1, 0, 1], getcurpos())
1811
1812  " Test for go
1813  norm! 26go
1814  call assert_equal([0, 1, 26, 0, 26], getcurpos())
1815  norm! 27go
1816  call assert_equal([0, 1, 26, 0, 26], getcurpos())
1817  norm! 28go
1818  call assert_equal([0, 2, 1, 0, 1], getcurpos())
1819  set ff=dos
1820  norm! 29go
1821  call assert_equal([0, 2, 1, 0, 1], getcurpos())
1822  set ff=unix
1823  norm! gg0
1824  norm! 101go
1825  call assert_equal([0, 13, 26, 0, 26], getcurpos())
1826  norm! 103go
1827  call assert_equal([0, 14, 1, 0, 1], getcurpos())
1828  " count > buffer content
1829  norm! 120go
1830  call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
1831  " clean up
1832  bw!
1833endfunc
1834
1835fun! Test_normal37_g_cmd6()
1836  " basic test for gt and gT
1837  tabnew 1.txt
1838  tabnew 2.txt
1839  tabnew 3.txt
1840  norm! 1gt
1841  call assert_equal(1, tabpagenr())
1842  norm! 3gt
1843  call assert_equal(3, tabpagenr())
1844  norm! 1gT
1845  " count gT goes not to the absolute tabpagenumber
1846  " but, but goes to the count previous tabpagenumber
1847  call assert_equal(2, tabpagenr())
1848  " wrap around
1849  norm! 3gT
1850  call assert_equal(3, tabpagenr())
1851  " gt does not wrap around
1852  norm! 5gt
1853  call assert_equal(3, tabpagenr())
1854
1855  for i in range(3)
1856    tabclose
1857  endfor
1858  " clean up
1859  call assert_fails(':tabclose', 'E784')
1860endfunc
1861
1862fun! Test_normal38_nvhome()
1863  " Test for <Home> and <C-Home> key
1864  new
1865  call setline(1, range(10))
1866  $
1867  setl et sw=2
1868  norm! V10>$
1869  " count is ignored
1870  exe "norm! 10\<home>"
1871  call assert_equal(1, col('.'))
1872  exe "norm! \<home>"
1873  call assert_equal([0, 10, 1, 0, 1], getcurpos())
1874  exe "norm! 5\<c-home>"
1875  call assert_equal([0, 5, 1, 0, 1], getcurpos())
1876  exe "norm! \<c-home>"
1877  call assert_equal([0, 1, 1, 0, 1], getcurpos())
1878
1879  " clean up
1880  bw!
1881endfunc
1882
1883fun! Test_normal39_cw()
1884  " Test for cw and cW on whitespace
1885  " and cpo+=w setting
1886  new
1887  set tw=0
1888  call append(0, 'here      are   some words')
1889  norm! 1gg0elcwZZZ
1890  call assert_equal('hereZZZare   some words', getline('.'))
1891  norm! 1gg0elcWYYY
1892  call assert_equal('hereZZZareYYYsome words', getline('.'))
1893  set cpo+=w
1894  call setline(1, 'here      are   some words')
1895  norm! 1gg0elcwZZZ
1896  call assert_equal('hereZZZ     are   some words', getline('.'))
1897  norm! 1gg2elcWYYY
1898  call assert_equal('hereZZZ     areYYY  some words', getline('.'))
1899  set cpo-=w
1900  norm! 2gg0cwfoo
1901  call assert_equal('foo', getline('.'))
1902
1903  " clean up
1904  bw!
1905endfunc
1906
1907fun! Test_normal40_ctrl_bsl()
1908  " Basic test for CTRL-\ commands
1909  new
1910  call append(0, 'here      are   some words')
1911  exe "norm! 1gg0a\<C-\>\<C-N>"
1912  call assert_equal('n', mode())
1913  call assert_equal(1, col('.'))
1914  call assert_equal('', visualmode())
1915  exe "norm! 1gg0viw\<C-\>\<C-N>"
1916  call assert_equal('n', mode())
1917  call assert_equal(4, col('.'))
1918  exe "norm! 1gg0a\<C-\>\<C-G>"
1919  call assert_equal('n', mode())
1920  call assert_equal(1, col('.'))
1921  "imap <buffer> , <c-\><c-n>
1922  set im
1923  exe ":norm! \<c-\>\<c-n>dw"
1924  set noim
1925  call assert_equal('are   some words', getline(1))
1926  call assert_false(&insertmode)
1927
1928  " clean up
1929  bw!
1930endfunc
1931
1932fun! Test_normal41_insert_reg()
1933  " Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>=
1934  " in insert mode
1935  new
1936  set sts=2 sw=2 ts=8 tw=0
1937  call append(0, ["aaa\tbbb\tccc", '', '', ''])
1938  let a=getline(1)
1939  norm! 2gg0
1940  exe "norm! a\<c-r>=a\<cr>"
1941  norm! 3gg0
1942  exe "norm! a\<c-r>\<c-r>=a\<cr>"
1943  norm! 4gg0
1944  exe "norm! a\<c-r>\<c-o>=a\<cr>"
1945  call assert_equal(['aaa	bbb	ccc', 'aaa bbb	ccc', 'aaa bbb	ccc', 'aaa	bbb	ccc', ''], getline(1, '$'))
1946
1947  " clean up
1948  set sts=0 sw=8 ts=8
1949  bw!
1950endfunc
1951
1952func! Test_normal42_halfpage()
1953  " basic test for Ctrl-D and Ctrl-U
1954  call Setup_NewWindow()
1955  call assert_equal(5, &scroll)
1956  exe "norm! \<c-d>"
1957  call assert_equal('6', getline('.'))
1958  exe "norm! 2\<c-d>"
1959  call assert_equal('8', getline('.'))
1960  call assert_equal(2, &scroll)
1961  set scroll=5
1962  exe "norm! \<c-u>"
1963  call assert_equal('3', getline('.'))
1964  1
1965  set scrolloff=5
1966  exe "norm! \<c-d>"
1967  call assert_equal('10', getline('.'))
1968  exe "norm! \<c-u>"
1969  call assert_equal('5', getline('.'))
1970  1
1971  set scrolloff=99
1972  exe "norm! \<c-d>"
1973  call assert_equal('10', getline('.'))
1974  set scrolloff=0
1975  100
1976  exe "norm! $\<c-u>"
1977  call assert_equal('95', getline('.'))
1978  call assert_equal([0, 95, 1, 0, 1], getcurpos())
1979  100
1980  set nostartofline
1981  exe "norm! $\<c-u>"
1982  call assert_equal('95', getline('.'))
1983  call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
1984  " cleanup
1985  set startofline
1986  bw!
1987endfunc
1988
1989fun! Test_normal43_textobject1()
1990  " basic tests for text object aw
1991  new
1992  call append(0, ['foobar,eins,foobar', 'foo,zwei,foo    '])
1993  " diw
1994  norm! 1gg0diw
1995  call assert_equal([',eins,foobar', 'foo,zwei,foo    ', ''], getline(1,'$'))
1996  " daw
1997  norm! 2ggEdaw
1998  call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
1999  %d
2000  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
2001  " diW
2002  norm! 2ggwd2iW
2003  call assert_equal(['foo	eins	foobar', 'foo	foo   ', ''], getline(1,'$'))
2004  " daW
2005  norm! 1ggd2aW
2006  call assert_equal(['foobar', 'foo	foo   ', ''], getline(1,'$'))
2007
2008  %d
2009  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
2010  " aw in visual line mode switches to characterwise mode
2011  norm! 2gg$Vawd
2012  call assert_equal(['foo	eins	foobar', 'foo	zwei	foo'], getline(1,'$'))
2013  norm! 1gg$Viwd
2014  call assert_equal(['foo	eins	', 'foo	zwei	foo'], getline(1,'$'))
2015
2016  " clean up
2017  bw!
2018endfunc
2019
2020func! Test_normal44_textobjects2()
2021  " basic testing for is and as text objects
2022  new
2023  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
2024  " Test for dis - does not remove trailing whitespace
2025  norm! 1gg0dis
2026  call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
2027  " Test for das - removes leading whitespace
2028  norm! 3ggf?ldas
2029  call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
2030  " when used in visual mode, is made characterwise
2031  norm! 3gg$Visy
2032  call assert_equal('v', visualmode())
2033  " reset visualmode()
2034  norm! 3ggVy
2035  norm! 3gg$Vasy
2036  call assert_equal('v', visualmode())
2037  " basic testing for textobjects a< and at
2038  %d
2039  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
2040  " a<
2041  norm! 1gg0da<
2042  call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2043  norm! 1pj
2044  call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2045  " at
2046  norm! d2at
2047  call assert_equal([' '], getline(1,'$'))
2048  %d
2049  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
2050  " i<
2051  norm! 1gg0di<
2052  call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2053  norm! 1Pj
2054  call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
2055  norm! d2it
2056  call assert_equal(['<div></div>',' '], getline(1,'$'))
2057  " basic testing for a[ and i[ text object
2058  %d
2059  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2060  norm! 3gg0di[
2061  call assert_equal([' ', '[', ']'], getline(1,'$'))
2062  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2063  norm! 3gg0ftd2a[
2064  call assert_equal([' '], getline(1,'$'))
2065  %d
2066  " Test for i" when cursor is in front of a quoted object
2067  call append(0, 'foo "bar"')
2068  norm! 1gg0di"
2069  call assert_equal(['foo ""', ''], getline(1,'$'))
2070
2071  " clean up
2072  bw!
2073endfunc
2074
2075func! Test_normal45_drop()
2076  if !has("dnd")
2077    return
2078  endif
2079  " basic test for :drop command
2080  " unfortunately, without a gui, we can't really test much here,
2081  " so simply test that ~p fails (which uses the drop register)
2082  new
2083  call assert_fails(':norm! "~p', 'E353')
2084  call assert_equal([],  getreg('~', 1, 1))
2085  " the ~ register is read only
2086  call assert_fails(':let @~="1"', 'E354')
2087  bw!
2088endfunc
2089
2090func! Test_normal46_ignore()
2091  " This test uses multi byte characters
2092  if !has("multi_byte")
2093    return
2094  endif
2095
2096  new
2097  " How to test this?
2098  " let's just for now test, that the buffer
2099  " does not change
2100  call feedkeys("\<c-s>", 't')
2101  call assert_equal([''], getline(1,'$'))
2102
2103  " no valid commands
2104  exe "norm! \<char-0x100>"
2105  call assert_equal([''], getline(1,'$'))
2106
2107  exe "norm! ä"
2108  call assert_equal([''], getline(1,'$'))
2109
2110  " clean up
2111  bw!
2112endfunc
2113
2114func! Test_normal47_visual_buf_wipe()
2115  " This was causing a crash or ml_get error.
2116  enew!
2117  call setline(1,'xxx')
2118  normal $
2119  new
2120  call setline(1, range(1,2))
2121  2
2122  exe "norm \<C-V>$"
2123  bw!
2124  norm yp
2125  set nomodified
2126endfunc
2127
2128func! Test_normal47_autocmd()
2129  " disabled, does not seem to be possible currently
2130  throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
2131  new
2132  call append(0, repeat('-',20))
2133  au CursorHold * call feedkeys('2l', '')
2134  1
2135  set updatetime=20
2136  " should delete 12 chars (d12l)
2137  call feedkeys('d1', '!')
2138  call assert_equal('--------', getline(1))
2139
2140  " clean up
2141  au! CursorHold
2142  set updatetime=4000
2143  bw!
2144endfunc
2145
2146func! Test_normal48_wincmd()
2147  new
2148  exe "norm! \<c-w>c"
2149  call assert_equal(1, winnr('$'))
2150  call assert_fails(":norm! \<c-w>c", "E444")
2151endfunc
2152
2153func! Test_normal49_counts()
2154  new
2155  call setline(1, 'one two three four five six seven eight nine ten')
2156  1
2157  norm! 3d2w
2158  call assert_equal('seven eight nine ten', getline(1))
2159  bw!
2160endfunc
2161
2162func! Test_normal50_commandline()
2163  if !has("timers") || !has("cmdline_hist") || !has("vertsplit")
2164    return
2165  endif
2166  func! DoTimerWork(id)
2167    call assert_equal('[Command Line]', bufname(''))
2168    " should fail, with E11, but does fail with E23?
2169    "call feedkeys("\<c-^>", 'tm')
2170
2171    " should also fail with E11
2172    call assert_fails(":wincmd p", 'E11')
2173    " return from commandline window
2174    call feedkeys("\<cr>")
2175  endfunc
2176
2177  let oldlang=v:lang
2178  lang C
2179  set updatetime=20
2180  call timer_start(100, 'DoTimerWork')
2181  try
2182    " throws E23, for whatever reason...
2183    call feedkeys('q:', 'x!')
2184  catch /E23/
2185    " no-op
2186  endtry
2187  " clean up
2188  set updatetime=4000
2189  exe "lang" oldlang
2190  bw!
2191endfunc
2192
2193func! Test_normal51_FileChangedRO()
2194  if !has("autocmd")
2195    return
2196  endif
2197  " Don't sleep after the warning message.
2198  call test_settime(1)
2199  call writefile(['foo'], 'Xreadonly.log')
2200  new Xreadonly.log
2201  setl ro
2202  au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
2203  call assert_fails(":norm! Af", 'E788')
2204  call assert_equal(['foo'], getline(1,'$'))
2205  call assert_equal('Xreadonly.log', bufname(''))
2206
2207  " cleanup
2208  call test_settime(0)
2209  bw!
2210  call delete("Xreadonly.log")
2211endfunc
2212
2213func! Test_normal52_rl()
2214  if !has("rightleft")
2215    return
2216  endif
2217  new
2218  call setline(1, 'abcde fghij klmnopq')
2219  norm! 1gg$
2220  set rl
2221  call assert_equal(19, col('.'))
2222  call feedkeys('l', 'tx')
2223  call assert_equal(18, col('.'))
2224  call feedkeys('h', 'tx')
2225  call assert_equal(19, col('.'))
2226  call feedkeys("\<right>", 'tx')
2227  call assert_equal(18, col('.'))
2228  call feedkeys("\<s-right>", 'tx')
2229  call assert_equal(13, col('.'))
2230  call feedkeys("\<c-right>", 'tx')
2231  call assert_equal(7, col('.'))
2232  call feedkeys("\<c-left>", 'tx')
2233  call assert_equal(13, col('.'))
2234  call feedkeys("\<s-left>", 'tx')
2235  call assert_equal(19, col('.'))
2236  call feedkeys("<<", 'tx')
2237  call assert_equal('	abcde fghij klmnopq',getline(1))
2238  call feedkeys(">>", 'tx')
2239  call assert_equal('abcde fghij klmnopq',getline(1))
2240
2241  " cleanup
2242  set norl
2243  bw!
2244endfunc
2245
2246func! Test_normal53_digraph()
2247  if !has('digraphs')
2248    return
2249  endif
2250  new
2251  call setline(1, 'abcdefgh|')
2252  exe "norm! 1gg0f\<c-k>!!"
2253  call assert_equal(9, col('.'))
2254  set cpo+=D
2255  exe "norm! 1gg0f\<c-k>!!"
2256  call assert_equal(1, col('.'))
2257
2258  set cpo-=D
2259  bw!
2260endfunc
2261
2262func Test_normal54_Ctrl_bsl()
2263  new
2264  call setline(1, 'abcdefghijklmn')
2265  exe "norm! df\<c-\>\<c-n>"
2266  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2267  exe "norm! df\<c-\>\<c-g>"
2268  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2269  exe "norm! df\<c-\>m"
2270  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2271  if !has("multi_byte")
2272    return
2273  endif
2274  call setline(2, 'abcdefghijklmnāf')
2275  norm! 2gg0
2276  exe "norm! df\<Char-0x101>"
2277  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2278  norm! 1gg0
2279  exe "norm! df\<esc>"
2280  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2281
2282  " clean up
2283  bw!
2284endfunc
2285
2286func Test_normal_large_count()
2287  " This may fail with 32bit long, how do we detect that?
2288  new
2289  normal o
2290  normal 6666666666dL
2291  bwipe!
2292endfunc
2293