1" Test for the various 'cpoptions' (cpo) flags
2
3source check.vim
4source shared.vim
5source view_util.vim
6
7" Test for the 'a' flag in 'cpo'. Reading a file should set the alternate
8" file name.
9func Test_cpo_a()
10  let save_cpo = &cpo
11  call writefile(['one'], 'Xfile')
12  " Wipe out all the buffers, so that the alternate file is empty
13  edit Xfoo | %bw
14  set cpo-=a
15  new
16  read Xfile
17  call assert_equal('', @#)
18  %d
19  set cpo+=a
20  read Xfile
21  call assert_equal('Xfile', @#)
22  close!
23  call delete('Xfile')
24  let &cpo = save_cpo
25endfunc
26
27" Test for the 'A' flag in 'cpo'. Writing a file should set the alternate
28" file name.
29func Test_cpo_A()
30  let save_cpo = &cpo
31  " Wipe out all the buffers, so that the alternate file is empty
32  edit Xfoo | %bw
33  set cpo-=A
34  new Xfile1
35  write Xfile2
36  call assert_equal('', @#)
37  %bw
38  call delete('Xfile2')
39  new Xfile1
40  set cpo+=A
41  write Xfile2
42  call assert_equal('Xfile2', @#)
43  close!
44  call delete('Xfile2')
45  let &cpo = save_cpo
46endfunc
47
48" Test for the 'b' flag in 'cpo'. "\|" at the end of a map command is
49" recognized as the end of the map.
50func Test_cpo_b()
51  let save_cpo = &cpo
52  set cpo+=b
53  nnoremap <F5> :pwd\<CR>\|let i = 1
54  call assert_equal(':pwd\<CR>\', maparg('<F5>'))
55  nunmap <F5>
56  exe "nnoremap <F5> :pwd\<C-V>|let i = 1"
57  call assert_equal(':pwd|let i = 1', maparg('<F5>'))
58  nunmap <F5>
59  set cpo-=b
60  nnoremap <F5> :pwd\<CR>\|let i = 1
61  call assert_equal(':pwd\<CR>|let i = 1', maparg('<F5>'))
62  let &cpo = save_cpo
63  nunmap <F5>
64endfunc
65
66" Test for the 'B' flag in 'cpo'. A backslash in mappings, abbreviations, user
67" commands and menu commands has no special meaning.
68func Test_cpo_B()
69  let save_cpo = &cpo
70  new
71  set cpo-=B
72  iabbr <buffer> abc ab\<BS>d
73  exe "normal iabc "
74  call assert_equal('ab<BS>d ', getline(1))
75  %d
76  set cpo+=B
77  iabbr <buffer> abc ab\<BS>d
78  exe "normal iabc "
79  call assert_equal('abd ', getline(1))
80  close!
81  let &cpo = save_cpo
82endfunc
83
84" Test for the 'c' flag in 'cpo'.
85func Test_cpo_c()
86  let save_cpo = &cpo
87  set cpo+=c
88  new
89  call setline(1, ' abababababab')
90  exe "normal gg/abab\<CR>"
91  call assert_equal(3, searchcount().total)
92  set cpo-=c
93  exe "normal gg/abab\<CR>"
94  call assert_equal(5, searchcount().total)
95  close!
96  let &cpo = save_cpo
97endfunc
98
99" Test for the 'C' flag in 'cpo' (line continuation)
100func Test_cpo_C()
101  let save_cpo = &cpo
102  call writefile(['let l = [', '\ 1,', '\ 2]'], 'Xfile')
103  set cpo-=C
104  source Xfile
105  call assert_equal([1, 2], g:l)
106  set cpo+=C
107  call assert_fails('source Xfile', ['E697:', 'E10:'])
108  call delete('Xfile')
109  let &cpo = save_cpo
110endfunc
111
112" Test for the 'd' flag in 'cpo' (tags relative to the current file)
113func Test_cpo_d()
114  let save_cpo = &cpo
115  call mkdir('Xdir')
116  call writefile(["one\tXfile1\t/^one$/"], 'tags')
117  call writefile(["two\tXfile2\t/^two$/"], 'Xdir/tags')
118  set tags=./tags
119  set cpo-=d
120  edit Xdir/Xfile
121  call assert_equal('two', taglist('.*')[0].name)
122  set cpo+=d
123  call assert_equal('one', taglist('.*')[0].name)
124  %bw!
125  call delete('tags')
126  call delete('Xdir', 'rf')
127  set tags&
128  let &cpo = save_cpo
129endfunc
130
131" Test for the 'D' flag in 'cpo' (digraph after a r, f or t)
132func Test_cpo_D()
133  CheckFeature digraphs
134  let save_cpo = &cpo
135  new
136  set cpo-=D
137  call setline(1, 'abcdefgh|')
138  exe "norm! 1gg0f\<c-k>!!"
139  call assert_equal(9, col('.'))
140  set cpo+=D
141  exe "norm! 1gg0f\<c-k>!!"
142  call assert_equal(1, col('.'))
143  set cpo-=D
144  close!
145  let &cpo = save_cpo
146endfunc
147
148" Test for the 'e' flag in 'cpo'
149func Test_cpo_e()
150  let save_cpo = &cpo
151  let @a='let i = 45'
152  set cpo+=e
153  call feedkeys(":@a\<CR>", 'xt')
154  call assert_equal(45, i)
155  set cpo-=e
156  call feedkeys(":@a\<CR>6\<CR>", 'xt')
157  call assert_equal(456, i)
158  let &cpo = save_cpo
159endfunc
160
161" Test for the 'E' flag in 'cpo' with yank, change, delete, etc. operators
162func Test_cpo_E()
163  new
164  call setline(1, '')
165  set cpo+=E
166  " yank an empty line
167  call assert_beeps('normal "ayl')
168  " change an empty line
169  call assert_beeps('normal lcTa')
170  call assert_beeps('normal 0c0')
171  " delete an empty line
172  call assert_beeps('normal D')
173  call assert_beeps('normal dl')
174  call assert_equal('', getline(1))
175  " change case of an empty line
176  call assert_beeps('normal gul')
177  call assert_beeps('normal gUl')
178  " replace a character
179  call assert_beeps('normal vrx')
180  " increment and decrement
181  call assert_beeps('exe "normal v\<C-A>"')
182  call assert_beeps('exe "normal v\<C-X>"')
183  set cpo-=E
184  close!
185endfunc
186
187" Test for the 'f' flag in 'cpo' (read in an empty buffer sets the file name)
188func Test_cpo_f()
189  let save_cpo = &cpo
190  new
191  set cpo-=f
192  read test_cpoptions.vim
193  call assert_equal('', @%)
194  %d
195  set cpo+=f
196  read test_cpoptions.vim
197  call assert_equal('test_cpoptions.vim', @%)
198  close!
199  let &cpo = save_cpo
200endfunc
201
202" Test for the 'F' flag in 'cpo' (write in an empty buffer sets the file name)
203func Test_cpo_F()
204  let save_cpo = &cpo
205  new
206  set cpo-=F
207  write Xfile
208  call assert_equal('', @%)
209  call delete('Xfile')
210  set cpo+=F
211  write Xfile
212  call assert_equal('Xfile', @%)
213  close!
214  call delete('Xfile')
215  let &cpo = save_cpo
216endfunc
217
218" Test for the 'g' flag in 'cpo' (jump to line 1 when re-editing a file)
219func Test_cpo_g()
220  let save_cpo = &cpo
221  new test_cpoptions.vim
222  set cpo-=g
223  normal 20G
224  edit
225  call assert_equal(20, line('.'))
226  set cpo+=g
227  edit
228  call assert_equal(1, line('.'))
229  close!
230  let &cpo = save_cpo
231endfunc
232
233" Test for inserting text in a line with only spaces ('H' flag in 'cpoptions')
234func Test_cpo_H()
235  let save_cpo = &cpo
236  new
237  set cpo-=H
238  call setline(1, '    ')
239  normal! Ia
240  call assert_equal('    a', getline(1))
241  set cpo+=H
242  call setline(1, '    ')
243  normal! Ia
244  call assert_equal('   a ', getline(1))
245  close!
246  let &cpo = save_cpo
247endfunc
248
249" TODO: Add a test for the 'i' flag in 'cpo'
250" Interrupting the reading of a file will leave it modified.
251
252" Test for the 'I' flag in 'cpo' (deleting autoindent when using arrow keys)
253func Test_cpo_I()
254  let save_cpo = &cpo
255  new
256  setlocal autoindent
257  set cpo+=I
258  exe "normal i    one\<CR>\<Up>"
259  call assert_equal('    ', getline(2))
260  set cpo-=I
261  %d
262  exe "normal i    one\<CR>\<Up>"
263  call assert_equal('', getline(2))
264  close!
265  let &cpo = save_cpo
266endfunc
267
268" Test for the 'j' flag in 'cpo' is in the test_join.vim file.
269
270" Test for the 'J' flag in 'cpo' (two spaces after a sentence)
271func Test_cpo_J()
272  let save_cpo = &cpo
273  new
274  set cpo-=J
275  call setline(1, 'one. two!  three? four."''  five.)]')
276  normal 0
277  for colnr in [6, 12, 19, 28, 34]
278    normal )
279    call assert_equal(colnr, col('.'))
280  endfor
281  for colnr in [28, 19, 12, 6, 1]
282    normal (
283    call assert_equal(colnr, col('.'))
284  endfor
285  set cpo+=J
286  normal 0
287  for colnr in [12, 28, 34]
288    normal )
289    call assert_equal(colnr, col('.'))
290  endfor
291  for colnr in [28, 12, 1]
292    normal (
293    call assert_equal(colnr, col('.'))
294  endfor
295  close!
296  let &cpo = save_cpo
297endfunc
298
299" TODO: Add a test for the 'k' flag in 'cpo'.
300" Disable the recognition of raw key codes in mappings, abbreviations, and the
301" "to" part of menu commands.
302
303" TODO: Add a test for the 'K' flag in 'cpo'.
304" Don't wait for a key code to complete when it is halfway a mapping.
305
306" Test for the 'l' flag in 'cpo' (backslash in a [] range)
307func Test_cpo_l()
308  let save_cpo = &cpo
309  new
310  call setline(1, ['', "a\tc" .. '\t'])
311  set cpo-=l
312  exe 'normal gg/[\t]' .. "\<CR>"
313  call assert_equal([2, 8], [col('.'), virtcol('.')])
314  set cpo+=l
315  exe 'normal gg/[\t]' .. "\<CR>"
316  call assert_equal([4, 10], [col('.'), virtcol('.')])
317  close!
318  let &cpo = save_cpo
319endfunc
320
321" Test for inserting tab in virtual replace mode ('L' flag in 'cpoptions')
322func Test_cpo_L()
323  let save_cpo = &cpo
324  new
325  set cpo-=L
326  call setline(1, 'abcdefghijklmnopqr')
327  exe "normal 0gR\<Tab>"
328  call assert_equal("\<Tab>ijklmnopqr", getline(1))
329  set cpo+=L
330  set list
331  call setline(1, 'abcdefghijklmnopqr')
332  exe "normal 0gR\<Tab>"
333  call assert_equal("\<Tab>cdefghijklmnopqr", getline(1))
334  set nolist
335  call setline(1, 'abcdefghijklmnopqr')
336  exe "normal 0gR\<Tab>"
337  call assert_equal("\<Tab>ijklmnopqr", getline(1))
338  close!
339  let &cpo = save_cpo
340endfunc
341
342" TODO: Add a test for the 'm' flag in 'cpo'.
343" When included, a showmatch will always wait half a second.  When not
344" included, a showmatch will wait half a second or until a character is typed.
345
346" Test for the 'M' flag in 'cpo' (% with escape parenthesis)
347func Test_cpo_M()
348  let save_cpo = &cpo
349  new
350  call setline(1, ['( \( )', '\( ( \)'])
351
352  set cpo-=M
353  call cursor(1, 1)
354  normal %
355  call assert_equal(6, col('.'))
356  call cursor(1, 4)
357  call assert_beeps('normal %')
358  call cursor(2, 2)
359  normal %
360  call assert_equal(7, col('.'))
361  call cursor(2, 4)
362  call assert_beeps('normal %')
363
364  set cpo+=M
365  call cursor(1, 4)
366  normal %
367  call assert_equal(6, col('.'))
368  call cursor(1, 1)
369  call assert_beeps('normal %')
370  call cursor(2, 4)
371  normal %
372  call assert_equal(7, col('.'))
373  call cursor(2, 1)
374  call assert_beeps('normal %')
375
376  close!
377  let &cpo = save_cpo
378endfunc
379
380" Test for the 'n' flag in 'cpo' (using number column for wrapped lines)
381func Test_cpo_n()
382  let save_cpo = &cpo
383  new
384  call setline(1, repeat('a', &columns))
385  setlocal number
386  set cpo-=n
387  redraw!
388  call assert_equal('    aaaa', Screenline(2))
389  set cpo+=n
390  redraw!
391  call assert_equal('aaaa', Screenline(2))
392  close!
393  let &cpo = save_cpo
394endfunc
395
396" Test for the 'o' flag in 'cpo' (line offset to search command)
397func Test_cpo_o()
398  let save_cpo = &cpo
399  new
400  call setline(1, ['', 'one', 'two', 'three', 'one', 'two', 'three'])
401  set cpo-=o
402  exe "normal /one/+2\<CR>"
403  normal n
404  call assert_equal(7, line('.'))
405  set cpo+=o
406  exe "normal /one/+2\<CR>"
407  normal n
408  call assert_equal(5, line('.'))
409  close!
410  let &cpo = save_cpo
411endfunc
412
413" Test for the 'O' flag in 'cpo' (overwriting an existing file)
414func Test_cpo_O()
415  let save_cpo = &cpo
416  new Xfile
417  call setline(1, 'one')
418  call writefile(['two'], 'Xfile')
419  set cpo-=O
420  call assert_fails('write', 'E13:')
421  set cpo+=O
422  write
423  call assert_equal(['one'], readfile('Xfile'))
424  close!
425  call delete('Xfile')
426  let &cpo = save_cpo
427endfunc
428
429" Test for the 'p' flag in 'cpo' is in the test_lispwords.vim file.
430
431" Test for the 'P' flag in 'cpo' (appending to a file sets the current file
432" name)
433func Test_cpo_P()
434  let save_cpo = &cpo
435  call writefile([], 'Xfile')
436  new
437  call setline(1, 'one')
438  set cpo+=F
439  set cpo-=P
440  write >> Xfile
441  call assert_equal('', @%)
442  set cpo+=P
443  write >> Xfile
444  call assert_equal('Xfile', @%)
445  close!
446  call delete('Xfile')
447  let &cpo = save_cpo
448endfunc
449
450" Test for the 'q' flag in 'cpo' (joining multiple lines)
451func Test_cpo_q()
452  let save_cpo = &cpo
453  new
454  call setline(1, ['one', 'two', 'three', 'four', 'five'])
455  set cpo-=q
456  normal gg4J
457  call assert_equal(14, col('.'))
458  %d
459  call setline(1, ['one', 'two', 'three', 'four', 'five'])
460  set cpo+=q
461  normal gg4J
462  call assert_equal(4, col('.'))
463  close!
464  let &cpo = save_cpo
465endfunc
466
467" Test for the 'r' flag in 'cpo' (redo command with a search motion)
468func Test_cpo_r()
469  let save_cpo = &cpo
470  new
471  call setline(1, repeat(['one two three four'], 2))
472  set cpo-=r
473  exe "normal ggc/two\<CR>abc "
474  let @/ = 'three'
475  normal 2G.
476  call assert_equal('abc two three four', getline(2))
477  %d
478  call setline(1, repeat(['one two three four'], 2))
479  set cpo+=r
480  exe "normal ggc/two\<CR>abc "
481  let @/ = 'three'
482  normal 2G.
483  call assert_equal('abc three four', getline(2))
484  close!
485  let &cpo = save_cpo
486endfunc
487
488" Test for the 'R' flag in 'cpo' (clear marks after a filter command)
489func Test_cpo_R()
490  CheckUnix
491  let save_cpo = &cpo
492  new
493  call setline(1, ['three', 'one', 'two'])
494  set cpo-=R
495  3mark r
496  %!sort
497  call assert_equal(3, line("'r"))
498  %d
499  call setline(1, ['three', 'one', 'two'])
500  set cpo+=R
501  3mark r
502  %!sort
503  call assert_equal(0, line("'r"))
504  close!
505  let &cpo = save_cpo
506endfunc
507
508" TODO: Add a test for the 's' flag in 'cpo'.
509" Set buffer options when entering the buffer for the first time.  If not
510" present the options are set when the buffer is created.
511
512" Test for the 'S' flag in 'cpo' (copying buffer options)
513func Test_cpo_S()
514  let save_cpo = &cpo
515  new Xfile1
516  set noautoindent
517  new Xfile2
518  set cpo-=S
519  set autoindent
520  wincmd p
521  call assert_equal(0, &autoindent)
522  wincmd p
523  call assert_equal(1, &autoindent)
524  set cpo+=S
525  wincmd p
526  call assert_equal(1, &autoindent)
527  set noautoindent
528  wincmd p
529  call assert_equal(0, &autoindent)
530  wincmd t
531  close!
532  close!
533  let &cpo = save_cpo
534endfunc
535
536" Test for the 't' flag in 'cpo' is in the test_tagjump.vim file.
537
538" Test for the 'u' flag in 'cpo' (Vi-compatible undo)
539func Test_cpo_u()
540  let save_cpo = &cpo
541  new
542  set cpo-=u
543  exe "normal iabc\<C-G>udef\<C-G>ughi"
544  normal uu
545  call assert_equal('abc', getline(1))
546  %d
547  set cpo+=u
548  exe "normal iabc\<C-G>udef\<C-G>ughi"
549  normal uu
550  call assert_equal('abcdefghi', getline(1))
551  close!
552  let &cpo = save_cpo
553endfunc
554
555" TODO: Add a test for the 'v' flag in 'cpo'.
556" Backspaced characters remain visible on the screen in Insert mode.
557
558" Test for the 'w' flag in 'cpo' ('cw' on a blank character changes only one
559" character)
560func Test_cpo_w()
561  let save_cpo = &cpo
562  new
563  set cpo+=w
564  call setline(1, 'here      are   some words')
565  norm! 1gg0elcwZZZ
566  call assert_equal('hereZZZ     are   some words', getline('.'))
567  norm! 1gg2elcWYYY
568  call assert_equal('hereZZZ     areYYY  some words', getline('.'))
569  set cpo-=w
570  call setline(1, 'here      are   some words')
571  norm! 1gg0elcwZZZ
572  call assert_equal('hereZZZare   some words', getline('.'))
573  norm! 1gg2elcWYYY
574  call assert_equal('hereZZZare   someYYYwords', getline('.'))
575  close!
576  let &cpo = save_cpo
577endfunc
578
579" Test for the 'W' flag in 'cpo' is in the test_writefile.vim file
580
581" Test for the 'x' flag in 'cpo' (Esc on command-line executes command)
582func Test_cpo_x()
583  let save_cpo = &cpo
584  set cpo-=x
585  let i = 1
586  call feedkeys(":let i=10\<Esc>", 'xt')
587  call assert_equal(1, i)
588  set cpo+=x
589  call feedkeys(":let i=10\<Esc>", 'xt')
590  call assert_equal(10, i)
591  let &cpo = save_cpo
592endfunc
593
594" Test for the 'X' flag in 'cpo' ('R' with a count)
595func Test_cpo_X()
596  let save_cpo = &cpo
597  new
598  call setline(1, 'aaaaaa')
599  set cpo-=X
600  normal gg4Rx
601  call assert_equal('xxxxaa', getline(1))
602  normal ggRy
603  normal 4.
604  call assert_equal('yyyyaa', getline(1))
605  call setline(1, 'aaaaaa')
606  set cpo+=X
607  normal gg4Rx
608  call assert_equal('xxxxaaaaa', getline(1))
609  normal ggRy
610  normal 4.
611  call assert_equal('yyyyxxxaaaaa', getline(1))
612  close!
613  let &cpo = save_cpo
614endfunc
615
616" Test for the 'y' flag in 'cpo' (repeating a yank command)
617func Test_cpo_y()
618  let save_cpo = &cpo
619  new
620  call setline(1, ['one', 'two'])
621  set cpo-=y
622  normal ggyy
623  normal 2G.
624  call assert_equal("one\n", @")
625  %d
626  call setline(1, ['one', 'two'])
627  set cpo+=y
628  normal ggyy
629  normal 2G.
630  call assert_equal("two\n", @")
631  close!
632  let &cpo = save_cpo
633endfunc
634
635" Test for the 'Z' flag in 'cpo' (write! resets 'readonly')
636func Test_cpo_Z()
637  let save_cpo = &cpo
638  call writefile([], 'Xfile')
639  new Xfile
640  setlocal readonly
641  set cpo-=Z
642  write!
643  call assert_equal(0, &readonly)
644  set cpo+=Z
645  setlocal readonly
646  write!
647  call assert_equal(1, &readonly)
648  close!
649  call delete('Xfile')
650  let &cpo = save_cpo
651endfunc
652
653" Test for the '!' flag in 'cpo' is in the test_normal.vim file
654
655" Test for displaying dollar when changing text ('$' flag in 'cpoptions')
656func Test_cpo_dollar()
657  new
658  let g:Line = ''
659  func SaveFirstLine()
660    let g:Line = Screenline(1)
661    return ''
662  endfunc
663  inoremap <expr> <buffer> <F2> SaveFirstLine()
664  call test_override('redraw_flag', 1)
665  set cpo+=$
666  call setline(1, 'one two three')
667  redraw!
668  exe "normal c2w\<F2>vim"
669  call assert_equal('one tw$ three', g:Line)
670  call assert_equal('vim three', getline(1))
671  set cpo-=$
672  call test_override('ALL', 0)
673  delfunc SaveFirstLine
674  %bw!
675endfunc
676
677" Test for the '%' flag in 'cpo' (parenthesis matching inside strings)
678func Test_cpo_percent()
679  let save_cpo = &cpo
680  new
681  call setline(1, '    if (strcmp("ab)cd(", s))')
682  set cpo-=%
683  normal 8|%
684  call assert_equal(28, col('.'))
685  normal 15|%
686  call assert_equal(27, col('.'))
687  normal 27|%
688  call assert_equal(15, col('.'))
689  call assert_beeps("normal 19|%")
690  call assert_beeps("normal 22|%")
691  set cpo+=%
692  normal 8|%
693  call assert_equal(28, col('.'))
694  normal 15|%
695  call assert_equal(19, col('.'))
696  normal 27|%
697  call assert_equal(22, col('.'))
698  normal 19|%
699  call assert_equal(15, col('.'))
700  normal 22|%
701  call assert_equal(27, col('.'))
702  close!
703  let &cpo = save_cpo
704endfunc
705
706" Test for cursor movement with '-' in 'cpoptions'
707func Test_cpo_minus()
708  new
709  call setline(1, ['foo', 'bar', 'baz'])
710  let save_cpo = &cpo
711  set cpo+=-
712  call assert_beeps('normal 10j')
713  call assert_equal(1, line('.'))
714  normal G
715  call assert_beeps('normal 10k')
716  call assert_equal(3, line('.'))
717  call assert_fails(10, 'E16:')
718  close!
719  let &cpo = save_cpo
720endfunc
721
722" Test for the '+' flag in 'cpo' ('write file' command resets the 'modified'
723" flag)
724func Test_cpo_plus()
725  let save_cpo = &cpo
726  call writefile([], 'Xfile')
727  new Xfile
728  call setline(1, 'foo')
729  write X1
730  call assert_equal(1, &modified)
731  set cpo+=+
732  write X2
733  call assert_equal(0, &modified)
734  close!
735  call delete('Xfile')
736  call delete('X1')
737  call delete('X2')
738  let &cpo = save_cpo
739endfunc
740
741" Test for the '*' flag in 'cpo' (':*' is same as ':@')
742func Test_cpo_star()
743  let save_cpo = &cpo
744  let x = 0
745  new
746  set cpo-=*
747  let @a = 'let x += 1'
748  call assert_fails('*a', 'E20:')
749  set cpo+=*
750  *a
751  call assert_equal(1, x)
752  close!
753  let &cpo = save_cpo
754endfunc
755
756" Test for the '<' flag in 'cpo' is in the test_mapping.vim file
757
758" Test for the '>' flag in 'cpo' (use a new line when appending to a register)
759func Test_cpo_gt()
760  let save_cpo = &cpo
761  new
762  call setline(1, 'one two')
763  set cpo-=>
764  let @r = ''
765  normal gg"Rye
766  normal "Rye
767  call assert_equal("oneone", @r)
768  set cpo+=>
769  let @r = ''
770  normal gg"Rye
771  normal "Rye
772  call assert_equal("\none\none", @r)
773  close!
774  let &cpo = save_cpo
775endfunc
776
777" Test for the ';' flag in 'cpo'
778" Test for t,f,F,T movement commands and 'cpo-;' setting
779func Test_cpo_semicolon()
780  let save_cpo = &cpo
781  new
782  call append(0, ["aaa two three four", "    zzz", "yyy   ",
783	      \ "bbb yee yoo four", "ccc two three four",
784	      \ "ddd yee yoo four"])
785  set cpo-=;
786  1
787  normal! 0tt;D
788  2
789  normal! 0fz;D
790  3
791  normal! $Fy;D
792  4
793  normal! $Ty;D
794  set cpo+=;
795  5
796  normal! 0tt;;D
797  6
798  normal! $Ty;;D
799
800  call assert_equal('aaa two', getline(1))
801  call assert_equal('    z', getline(2))
802  call assert_equal('y', getline(3))
803  call assert_equal('bbb y', getline(4))
804  call assert_equal('ccc', getline(5))
805  call assert_equal('ddd yee y', getline(6))
806  close!
807  let &cpo = save_cpo
808endfunc
809
810" Test for the '#' flag in 'cpo' (count before 'D', 'o' and 'O' operators)
811func Test_cpo_hash()
812  let save_cpo = &cpo
813  new
814  set cpo-=#
815  call setline(1, ['one', 'two', 'three'])
816  normal gg2D
817  call assert_equal(['three'], getline(1, '$'))
818  normal gg2ofour
819  call assert_equal(['three', 'four', 'four'], getline(1, '$'))
820  normal gg2Otwo
821  call assert_equal(['two', 'two', 'three', 'four', 'four'], getline(1, '$'))
822  %d
823  set cpo+=#
824  call setline(1, ['one', 'two', 'three'])
825  normal gg2D
826  call assert_equal(['', 'two', 'three'], getline(1, '$'))
827  normal gg2oone
828  call assert_equal(['', 'one', 'two', 'three'], getline(1, '$'))
829  normal gg2Ozero
830  call assert_equal(['zero', '', 'one', 'two', 'three'], getline(1, '$'))
831  close!
832  let &cpo = save_cpo
833endfunc
834
835" Test for the '&' flag in 'cpo'. The swap file is kept when a buffer is still
836" loaded and ':preserve' is used.
837func Test_cpo_ampersand()
838  call writefile(['one'], 'Xfile')
839  let after =<< trim [CODE]
840    set cpo+=&
841    preserve
842    qall
843  [CODE]
844  if RunVim([], after, 'Xfile')
845    call assert_equal(1, filereadable('.Xfile.swp'))
846    call delete('.Xfile.swp')
847  endif
848  call delete('Xfile')
849endfunc
850
851" Test for the '\' flag in 'cpo' (backslash in a [] range in a search pattern)
852func Test_cpo_backslash()
853  let save_cpo = &cpo
854  new
855  call setline(1, ['', " \\-string"])
856  set cpo-=\
857  exe 'normal gg/[ \-]' .. "\<CR>n"
858  call assert_equal(3, col('.'))
859  set cpo+=\
860  exe 'normal gg/[ \-]' .. "\<CR>n"
861  call assert_equal(2, col('.'))
862  close!
863  let &cpo = save_cpo
864endfunc
865
866" Test for the '/' flag in 'cpo' is in the test_substitute.vim file
867
868" Test for the '{' flag in 'cpo' (the "{" and "}" commands stop at a {
869" character at the start of a line)
870func Test_cpo_brace()
871  let save_cpo = &cpo
872  new
873  call setline(1, ['', '{', '    int i;', '}', ''])
874  set cpo-={
875  normal gg}
876  call assert_equal(5, line('.'))
877  normal G{
878  call assert_equal(1, line('.'))
879  set cpo+={
880  normal gg}
881  call assert_equal(2, line('.'))
882  normal G{
883  call assert_equal(2, line('.'))
884  close!
885  let &cpo = save_cpo
886endfunc
887
888" Test for the '.' flag in 'cpo' (:cd command fails if the current buffer is
889" modified)
890func Test_cpo_dot()
891  let save_cpo = &cpo
892  new Xfoo
893  call setline(1, 'foo')
894  let save_dir = getcwd()
895  set cpo+=.
896
897  " :cd should fail when buffer is modified and 'cpo' contains dot.
898  call assert_fails('cd ..', 'E747:')
899  call assert_equal(save_dir, getcwd())
900
901  " :cd with exclamation mark should succeed.
902  cd! ..
903  call assert_notequal(save_dir, getcwd())
904
905  " :cd should succeed when buffer has been written.
906  w!
907  exe 'cd ' .. fnameescape(save_dir)
908  call assert_equal(save_dir, getcwd())
909
910  call delete('Xfoo')
911  set cpo&
912  close!
913  let &cpo = save_cpo
914endfunc
915
916" vim: shiftwidth=2 sts=2 expandtab
917