blob: 052b3f3685697490557440f12c95c9d3bcef2f51 [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'
249
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200250" Test for the 'I' flag in 'cpo' (deleting autoindent when using arrow keys)
251func Test_cpo_I()
252 let save_cpo = &cpo
253 new
254 setlocal autoindent
255 set cpo+=I
256 exe "normal i one\<CR>\<Up>"
257 call assert_equal(' ', getline(2))
258 set cpo-=I
259 %d
260 exe "normal i one\<CR>\<Up>"
261 call assert_equal('', getline(2))
262 close!
263 let &cpo = save_cpo
264endfunc
265
Bram Moolenaardf7df592020-06-14 13:50:55 +0200266" Test for the 'j' flag in 'cpo' is in the test_join.vim file.
267
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200268" Test for the 'J' flag in 'cpo' (two spaces after a sentence)
269func Test_cpo_J()
270 let save_cpo = &cpo
271 new
272 set cpo-=J
273 call setline(1, 'one. two! three? four."'' five.)]')
274 normal 0
275 for colnr in [6, 12, 19, 28, 34]
276 normal )
277 call assert_equal(colnr, col('.'))
278 endfor
279 for colnr in [28, 19, 12, 6, 1]
280 normal (
281 call assert_equal(colnr, col('.'))
282 endfor
283 set cpo+=J
284 normal 0
285 for colnr in [12, 28, 34]
286 normal )
287 call assert_equal(colnr, col('.'))
288 endfor
289 for colnr in [28, 12, 1]
290 normal (
291 call assert_equal(colnr, col('.'))
292 endfor
293 close!
294 let &cpo = save_cpo
295endfunc
296
Bram Moolenaardf7df592020-06-14 13:50:55 +0200297" TODO: Add a test for the 'k' flag in 'cpo'
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200298
Bram Moolenaardf7df592020-06-14 13:50:55 +0200299" TODO: Add a test for the 'K' flag in 'cpo'
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200300
301" Test for the 'l' flag in 'cpo' (backslash in a [] range)
302func Test_cpo_l()
303 let save_cpo = &cpo
304 new
305 call setline(1, ['', "a\tc" .. '\t'])
306 set cpo-=l
307 exe 'normal gg/[\t]' .. "\<CR>"
308 call assert_equal([2, 8], [col('.'), virtcol('.')])
309 set cpo+=l
310 exe 'normal gg/[\t]' .. "\<CR>"
311 call assert_equal([4, 10], [col('.'), virtcol('.')])
312 close!
313 let &cpo = save_cpo
314endfunc
315
316" Test for inserting tab in virtual replace mode ('L' flag in 'cpoptions')
317func Test_cpo_L()
318 let save_cpo = &cpo
319 new
320 set cpo-=L
321 call setline(1, 'abcdefghijklmnopqr')
322 exe "normal 0gR\<Tab>"
323 call assert_equal("\<Tab>ijklmnopqr", getline(1))
324 set cpo+=L
325 set list
326 call setline(1, 'abcdefghijklmnopqr')
327 exe "normal 0gR\<Tab>"
328 call assert_equal("\<Tab>cdefghijklmnopqr", getline(1))
329 set nolist
330 call setline(1, 'abcdefghijklmnopqr')
331 exe "normal 0gR\<Tab>"
332 call assert_equal("\<Tab>ijklmnopqr", getline(1))
333 close!
334 let &cpo = save_cpo
335endfunc
336
Bram Moolenaardf7df592020-06-14 13:50:55 +0200337" TODO: Add a test for the 'm' flag in 'cpo'
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200338
339" Test for the 'M' flag in 'cpo' (% with escape parenthesis)
340func Test_cpo_M()
341 let save_cpo = &cpo
342 new
343 call setline(1, ['( \( )', '\( ( \)'])
344
345 set cpo-=M
346 call cursor(1, 1)
347 normal %
348 call assert_equal(6, col('.'))
349 call cursor(1, 4)
350 call assert_beeps('normal %')
351 call cursor(2, 2)
352 normal %
353 call assert_equal(7, col('.'))
354 call cursor(2, 4)
355 call assert_beeps('normal %')
356
357 set cpo+=M
358 call cursor(1, 4)
359 normal %
360 call assert_equal(6, col('.'))
361 call cursor(1, 1)
362 call assert_beeps('normal %')
363 call cursor(2, 4)
364 normal %
365 call assert_equal(7, col('.'))
366 call cursor(2, 1)
367 call assert_beeps('normal %')
368
369 close!
370 let &cpo = save_cpo
371endfunc
372
373" Test for the 'n' flag in 'cpo' (using number column for wrapped lines)
374func Test_cpo_n()
375 let save_cpo = &cpo
376 new
377 call setline(1, repeat('a', &columns))
378 setlocal number
379 set cpo-=n
380 redraw!
381 call assert_equal(' aaaa', Screenline(2))
382 set cpo+=n
383 redraw!
384 call assert_equal('aaaa', Screenline(2))
385 close!
386 let &cpo = save_cpo
387endfunc
388
389" Test for the 'o' flag in 'cpo' (line offset to search command)
390func Test_cpo_o()
391 let save_cpo = &cpo
392 new
393 call setline(1, ['', 'one', 'two', 'three', 'one', 'two', 'three'])
394 set cpo-=o
395 exe "normal /one/+2\<CR>"
396 normal n
397 call assert_equal(7, line('.'))
398 set cpo+=o
399 exe "normal /one/+2\<CR>"
400 normal n
401 call assert_equal(5, line('.'))
402 close!
403 let &cpo = save_cpo
404endfunc
405
406" Test for the 'O' flag in 'cpo' (overwriting an existing file)
407func Test_cpo_O()
408 let save_cpo = &cpo
409 new Xfile
410 call setline(1, 'one')
411 call writefile(['two'], 'Xfile')
412 set cpo-=O
413 call assert_fails('write', 'E13:')
414 set cpo+=O
415 write
416 call assert_equal(['one'], readfile('Xfile'))
417 close!
418 call delete('Xfile')
419 let &cpo = save_cpo
420endfunc
421
Bram Moolenaardf7df592020-06-14 13:50:55 +0200422" Test for the 'p' flag in 'cpo' is in the test_lispwords.vim file.
423
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200424" Test for the 'P' flag in 'cpo' (appending to a file sets the current file
425" name)
426func Test_cpo_P()
427 let save_cpo = &cpo
428 call writefile([], 'Xfile')
429 new
430 call setline(1, 'one')
431 set cpo+=F
432 set cpo-=P
433 write >> Xfile
434 call assert_equal('', @%)
435 set cpo+=P
436 write >> Xfile
437 call assert_equal('Xfile', @%)
438 close!
439 call delete('Xfile')
440 let &cpo = save_cpo
441endfunc
442
443" Test for the 'q' flag in 'cpo' (joining multiple lines)
444func Test_cpo_q()
445 let save_cpo = &cpo
446 new
447 call setline(1, ['one', 'two', 'three', 'four', 'five'])
448 set cpo-=q
449 normal gg4J
450 call assert_equal(14, col('.'))
451 %d
452 call setline(1, ['one', 'two', 'three', 'four', 'five'])
453 set cpo+=q
454 normal gg4J
455 call assert_equal(4, col('.'))
456 close!
457 let &cpo = save_cpo
458endfunc
459
460" Test for the 'r' flag in 'cpo' (redo command with a search motion)
461func Test_cpo_r()
462 let save_cpo = &cpo
463 new
464 call setline(1, repeat(['one two three four'], 2))
465 set cpo-=r
466 exe "normal ggc/two\<CR>abc "
467 let @/ = 'three'
468 normal 2G.
469 call assert_equal('abc two three four', getline(2))
470 %d
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 three four', getline(2))
477 close!
478 let &cpo = save_cpo
479endfunc
480
481" Test for the 'R' flag in 'cpo' (clear marks after a filter command)
482func Test_cpo_R()
483 CheckUnix
484 let save_cpo = &cpo
485 new
486 call setline(1, ['three', 'one', 'two'])
487 set cpo-=R
488 3mark r
489 %!sort
490 call assert_equal(3, line("'r"))
491 %d
492 call setline(1, ['three', 'one', 'two'])
493 set cpo+=R
494 3mark r
495 %!sort
496 call assert_equal(0, line("'r"))
497 close!
498 let &cpo = save_cpo
499endfunc
500
Bram Moolenaardf7df592020-06-14 13:50:55 +0200501" TODO: Add a test for the 's' flag in 'cpo'
502
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200503" Test for the 'S' flag in 'cpo' (copying buffer options)
504func Test_cpo_S()
505 let save_cpo = &cpo
506 new Xfile1
507 set noautoindent
508 new Xfile2
509 set cpo-=S
510 set autoindent
511 wincmd p
512 call assert_equal(0, &autoindent)
513 wincmd p
514 call assert_equal(1, &autoindent)
515 set cpo+=S
516 wincmd p
517 call assert_equal(1, &autoindent)
518 set noautoindent
519 wincmd p
520 call assert_equal(0, &autoindent)
521 wincmd t
522 close!
523 close!
524 let &cpo = save_cpo
525endfunc
526
Bram Moolenaardf7df592020-06-14 13:50:55 +0200527" Test for the 't' flag in 'cpo' is in the test_tagjump.vim file.
528
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200529" Test for the 'u' flag in 'cpo' (Vi-compatible undo)
530func Test_cpo_u()
531 let save_cpo = &cpo
532 new
533 set cpo-=u
534 exe "normal iabc\<C-G>udef\<C-G>ughi"
535 normal uu
536 call assert_equal('abc', getline(1))
537 %d
538 set cpo+=u
539 exe "normal iabc\<C-G>udef\<C-G>ughi"
540 normal uu
541 call assert_equal('abcdefghi', getline(1))
542 close!
543 let &cpo = save_cpo
544endfunc
545
Bram Moolenaardf7df592020-06-14 13:50:55 +0200546" TODO: Add a test for the 'v' flag in 'cpo' (backspace doesn't remove
547" characters from the screen)
548
549" Test for the 'w' flag in 'cpo' ('cw' on a blank character changes only one
550" character)
551func Test_cpo_w()
552 let save_cpo = &cpo
553 new
554 set cpo+=w
555 call setline(1, 'here are some words')
556 norm! 1gg0elcwZZZ
557 call assert_equal('hereZZZ are some words', getline('.'))
558 norm! 1gg2elcWYYY
559 call assert_equal('hereZZZ areYYY some words', getline('.'))
560 set cpo-=w
561 call setline(1, 'here are some words')
562 norm! 1gg0elcwZZZ
563 call assert_equal('hereZZZare some words', getline('.'))
564 norm! 1gg2elcWYYY
565 call assert_equal('hereZZZare someYYYwords', getline('.'))
566 close!
567 let &cpo = save_cpo
568endfunc
569
570" Test for the 'W' flag in 'cpo' is in the test_writefile.vim file
571
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200572" Test for the 'x' flag in 'cpo' (Esc on command-line executes command)
573func Test_cpo_x()
574 let save_cpo = &cpo
575 set cpo-=x
576 let i = 1
577 call feedkeys(":let i=10\<Esc>", 'xt')
578 call assert_equal(1, i)
579 set cpo+=x
580 call feedkeys(":let i=10\<Esc>", 'xt')
581 call assert_equal(10, i)
582 let &cpo = save_cpo
583endfunc
584
585" Test for the 'X' flag in 'cpo' ('R' with a count)
586func Test_cpo_X()
587 let save_cpo = &cpo
588 new
589 call setline(1, 'aaaaaa')
590 set cpo-=X
591 normal gg4Rx
592 call assert_equal('xxxxaa', getline(1))
593 normal ggRy
594 normal 4.
595 call assert_equal('yyyyaa', getline(1))
596 call setline(1, 'aaaaaa')
597 set cpo+=X
598 normal gg4Rx
599 call assert_equal('xxxxaaaaa', getline(1))
600 normal ggRy
601 normal 4.
602 call assert_equal('yyyyxxxaaaaa', getline(1))
603 close!
604 let &cpo = save_cpo
605endfunc
606
607" Test for the 'y' flag in 'cpo' (repeating a yank command)
608func Test_cpo_y()
609 let save_cpo = &cpo
610 new
611 call setline(1, ['one', 'two'])
612 set cpo-=y
613 normal ggyy
614 normal 2G.
615 call assert_equal("one\n", @")
616 %d
617 call setline(1, ['one', 'two'])
618 set cpo+=y
619 normal ggyy
620 normal 2G.
621 call assert_equal("two\n", @")
622 close!
623 let &cpo = save_cpo
624endfunc
625
626" Test for the 'Z' flag in 'cpo' (write! resets 'readonly')
627func Test_cpo_Z()
628 let save_cpo = &cpo
629 call writefile([], 'Xfile')
630 new Xfile
631 setlocal readonly
632 set cpo-=Z
633 write!
634 call assert_equal(0, &readonly)
635 set cpo+=Z
636 setlocal readonly
637 write!
638 call assert_equal(1, &readonly)
639 close!
640 call delete('Xfile')
641 let &cpo = save_cpo
642endfunc
643
Bram Moolenaardf7df592020-06-14 13:50:55 +0200644" Test for the '!' flag in 'cpo' is in the test_normal.vim file
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200645
646" Test for displaying dollar when changing text ('$' flag in 'cpoptions')
647func Test_cpo_dollar()
648 new
649 let g:Line = ''
650 func SaveFirstLine()
651 let g:Line = Screenline(1)
652 return ''
653 endfunc
654 inoremap <expr> <buffer> <F2> SaveFirstLine()
655 call test_override('redraw_flag', 1)
656 set cpo+=$
657 call setline(1, 'one two three')
658 redraw!
659 exe "normal c2w\<F2>vim"
660 call assert_equal('one tw$ three', g:Line)
661 call assert_equal('vim three', getline(1))
662 set cpo-=$
663 call test_override('ALL', 0)
664 delfunc SaveFirstLine
665 %bw!
666endfunc
667
Bram Moolenaardf7df592020-06-14 13:50:55 +0200668" Test for the '%' flag in 'cpo' (parenthesis matching inside strings)
669func Test_cpo_percent()
670 let save_cpo = &cpo
671 new
672 call setline(1, ' if (strcmp("ab)cd(", s))')
673 set cpo-=%
674 normal 8|%
675 call assert_equal(28, col('.'))
676 normal 15|%
677 call assert_equal(27, col('.'))
678 normal 27|%
679 call assert_equal(15, col('.'))
680 call assert_beeps("normal 19|%")
681 call assert_beeps("normal 22|%")
682 set cpo+=%
683 normal 8|%
684 call assert_equal(28, col('.'))
685 normal 15|%
686 call assert_equal(19, col('.'))
687 normal 27|%
688 call assert_equal(22, col('.'))
689 normal 19|%
690 call assert_equal(15, col('.'))
691 normal 22|%
692 call assert_equal(27, col('.'))
693 close!
694 let &cpo = save_cpo
695endfunc
696
697" Test for cursor movement with '-' in 'cpoptions'
698func Test_cpo_minus()
699 new
700 call setline(1, ['foo', 'bar', 'baz'])
701 let save_cpo = &cpo
702 set cpo+=-
703 call assert_beeps('normal 10j')
704 call assert_equal(1, line('.'))
705 normal G
706 call assert_beeps('normal 10k')
707 call assert_equal(3, line('.'))
708 call assert_fails(10, 'E16:')
709 close!
710 let &cpo = save_cpo
711endfunc
712
713" Test for the '+' flag in 'cpo' ('write file' command resets the 'modified'
714" flag)
715func Test_cpo_plus()
716 let save_cpo = &cpo
717 call writefile([], 'Xfile')
718 new Xfile
719 call setline(1, 'foo')
720 write X1
721 call assert_equal(1, &modified)
722 set cpo+=+
723 write X2
724 call assert_equal(0, &modified)
725 close!
726 call delete('Xfile')
727 call delete('X1')
728 call delete('X2')
729 let &cpo = save_cpo
730endfunc
731
732" Test for the '*' flag in 'cpo' (':*' is same as ':@')
733func Test_cpo_star()
734 let save_cpo = &cpo
735 let x = 0
736 new
737 set cpo-=*
738 let @a = 'let x += 1'
739 call assert_fails('*a', 'E20:')
740 set cpo+=*
741 *a
742 call assert_equal(1, x)
743 close!
744 let &cpo = save_cpo
745endfunc
746
747" Test for the '<' flag in 'cpo' is in the test_mapping.vim file
748
749" Test for the '>' flag in 'cpo' (use a new line when appending to a register)
750func Test_cpo_gt()
751 let save_cpo = &cpo
752 new
753 call setline(1, 'one two')
754 set cpo-=>
755 let @r = ''
756 normal gg"Rye
757 normal "Rye
758 call assert_equal("oneone", @r)
759 set cpo+=>
760 let @r = ''
761 normal gg"Rye
762 normal "Rye
763 call assert_equal("\none\none", @r)
764 close!
765 let &cpo = save_cpo
766endfunc
767
768" Test for the ';' flag in 'cpo'
769" Test for t,f,F,T movement commands and 'cpo-;' setting
770func Test_cpo_semicolon()
771 let save_cpo = &cpo
772 new
773 call append(0, ["aaa two three four", " zzz", "yyy ",
774 \ "bbb yee yoo four", "ccc two three four",
775 \ "ddd yee yoo four"])
776 set cpo-=;
777 1
778 normal! 0tt;D
779 2
780 normal! 0fz;D
781 3
782 normal! $Fy;D
783 4
784 normal! $Ty;D
785 set cpo+=;
786 5
787 normal! 0tt;;D
788 6
789 normal! $Ty;;D
790
791 call assert_equal('aaa two', getline(1))
792 call assert_equal(' z', getline(2))
793 call assert_equal('y', getline(3))
794 call assert_equal('bbb y', getline(4))
795 call assert_equal('ccc', getline(5))
796 call assert_equal('ddd yee y', getline(6))
797 close!
798 let &cpo = save_cpo
799endfunc
800
801" Test for the '#' flag in 'cpo' (count before 'D', 'o' and 'O' operators)
802func Test_cpo_hash()
803 let save_cpo = &cpo
804 new
805 set cpo-=#
806 call setline(1, ['one', 'two', 'three'])
807 normal gg2D
808 call assert_equal(['three'], getline(1, '$'))
809 normal gg2ofour
810 call assert_equal(['three', 'four', 'four'], getline(1, '$'))
811 normal gg2Otwo
812 call assert_equal(['two', 'two', 'three', 'four', 'four'], getline(1, '$'))
813 %d
814 set cpo+=#
815 call setline(1, ['one', 'two', 'three'])
816 normal gg2D
817 call assert_equal(['', 'two', 'three'], getline(1, '$'))
818 normal gg2oone
819 call assert_equal(['', 'one', 'two', 'three'], getline(1, '$'))
820 normal gg2Ozero
821 call assert_equal(['zero', '', 'one', 'two', 'three'], getline(1, '$'))
822 close!
823 let &cpo = save_cpo
824endfunc
825
826" Test for the '&' flag in 'cpo'. The swap file is kept when a buffer is still
827" loaded and ':preserve' is used.
828func Test_cpo_ampersand()
829 call writefile(['one'], 'Xfile')
830 let after =<< trim [CODE]
831 set cpo+=&
832 preserve
833 qall
834 [CODE]
835 if RunVim([], after, 'Xfile')
836 call assert_equal(1, filereadable('.Xfile.swp'))
837 call delete('.Xfile.swp')
838 endif
839 call delete('Xfile')
840endfunc
841
842" Test for the '\' flag in 'cpo' (backslash in a [] range in a search pattern)
843func Test_cpo_backslash()
844 let save_cpo = &cpo
845 new
846 call setline(1, ['', " \\-string"])
847 set cpo-=\
848 exe 'normal gg/[ \-]' .. "\<CR>n"
849 call assert_equal(3, col('.'))
850 set cpo+=\
851 exe 'normal gg/[ \-]' .. "\<CR>n"
852 call assert_equal(2, col('.'))
853 close!
854 let &cpo = save_cpo
855endfunc
856
857" Test for the '/' flag in 'cpo' is in the test_substitute.vim file
858
859" Test for the '{' flag in 'cpo' (the "{" and "}" commands stop at a {
860" character at the start of a line)
861func Test_cpo_brace()
862 let save_cpo = &cpo
863 new
864 call setline(1, ['', '{', ' int i;', '}', ''])
865 set cpo-={
866 normal gg}
867 call assert_equal(5, line('.'))
868 normal G{
869 call assert_equal(1, line('.'))
870 set cpo+={
871 normal gg}
872 call assert_equal(2, line('.'))
873 normal G{
874 call assert_equal(2, line('.'))
875 close!
876 let &cpo = save_cpo
877endfunc
878
879" Test for the '.' flag in 'cpo' (:cd command fails if the current buffer is
880" modified)
881func Test_cpo_dot()
882 let save_cpo = &cpo
883 new Xfoo
884 call setline(1, 'foo')
885 let save_dir = getcwd()
886 set cpo+=.
887
888 " :cd should fail when buffer is modified and 'cpo' contains dot.
889 call assert_fails('cd ..', 'E747:')
890 call assert_equal(save_dir, getcwd())
891
892 " :cd with exclamation mark should succeed.
893 cd! ..
894 call assert_notequal(save_dir, getcwd())
895
896 " :cd should succeed when buffer has been written.
897 w!
898 exe 'cd ' .. fnameescape(save_dir)
899 call assert_equal(save_dir, getcwd())
900
901 call delete('Xfoo')
902 set cpo&
903 close!
904 let &cpo = save_cpo
905endfunc
906
Bram Moolenaarc9630d22020-06-13 13:20:48 +0200907" vim: shiftwidth=2 sts=2 expandtab