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