xref: /vim-8.2.3635/src/testdir/test_fold.vim (revision 8fe1000e)
1" Test for folding
2
3source check.vim
4source view_util.vim
5source screendump.vim
6
7func PrepIndent(arg)
8  return [a:arg] + repeat(["\t".a:arg], 5)
9endfu
10
11func Test_address_fold()
12  new
13  call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
14	      \ 'after fold 1', 'after fold 2', 'after fold 3'])
15  setl fen fdm=marker
16  " The next commands should all copy the same part of the buffer,
17  " regardless of the addressing type, since the part to be copied
18  " is folded away
19  :1y
20  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
21  :.y
22  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
23  :.+y
24  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
25  :.,.y
26  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
27  :sil .1,.y
28  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
29  " use silent to make E493 go away
30  :sil .+,.y
31  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
32  :,y
33  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
34  :,+y
35  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/','after fold 1'], getreg(0,1,1))
36  " using .+3 as second address should copy the whole folded line + the next 3
37  " lines
38  :.,+3y
39  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/',
40	      \ 'after fold 1', 'after fold 2', 'after fold 3'], getreg(0,1,1))
41  :sil .,-2y
42  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
43
44  " now test again with folding disabled
45  set nofoldenable
46  :1y
47  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
48  :.y
49  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
50  :.+y
51  call assert_equal(['1'], getreg(0,1,1))
52  :.,.y
53  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
54  " use silent to make E493 go away
55  :sil .1,.y
56  call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
57  " use silent to make E493 go away
58  :sil .+,.y
59  call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
60  :,y
61  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
62  :,+y
63  call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
64  " using .+3 as second address should copy the whole folded line + the next 3
65  " lines
66  :.,+3y
67  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3'], getreg(0,1,1))
68  :7
69  :sil .,-2y
70  call assert_equal(['4', '5', '}/*}}}*/'], getreg(0,1,1))
71
72  quit!
73endfunc
74
75func Test_indent_fold()
76    new
77    call setline(1, ['', 'a', '    b', '    c'])
78    setl fen fdm=indent
79    2
80    norm! >>
81    let a=map(range(1,4), 'foldclosed(v:val)')
82    call assert_equal([-1,-1,-1,-1], a)
83    bw!
84endfunc
85
86func Test_indent_fold2()
87    new
88    call setline(1, ['', '{{{', '}}}', '{{{', '}}}'])
89    setl fen fdm=marker
90    2
91    norm! >>
92    let a=map(range(1,5), 'v:val->foldclosed()')
93    call assert_equal([-1,-1,-1,4,4], a)
94    bw!
95endfunc
96
97func Test_manual_fold_with_filter()
98  if !executable('cat')
99    return
100  endif
101  for type in ['manual', 'marker']
102    exe 'set foldmethod=' . type
103    new
104    call setline(1, range(1, 20))
105    4,$fold
106    %foldopen
107    10,$fold
108    %foldopen
109    " This filter command should not have an effect
110    1,8! cat
111    call feedkeys('5ggzdzMGdd', 'xt')
112    call assert_equal(['1', '2', '3', '4', '5', '6', '7', '8', '9'], getline(1, '$'))
113
114    bwipe!
115    set foldmethod&
116  endfor
117endfunc
118
119func Test_indent_fold_with_read()
120  new
121  set foldmethod=indent
122  call setline(1, repeat(["\<Tab>a"], 4))
123  for n in range(1, 4)
124    call assert_equal(1, foldlevel(n))
125  endfor
126
127  call writefile(["a", "", "\<Tab>a"], 'Xfile')
128  foldopen
129  2read Xfile
130  %foldclose
131  call assert_equal(1, foldlevel(1))
132  call assert_equal(2, foldclosedend(1))
133  call assert_equal(0, foldlevel(3))
134  call assert_equal(0, foldlevel(4))
135  call assert_equal(1, foldlevel(5))
136  call assert_equal(7, 5->foldclosedend())
137
138  bwipe!
139  set foldmethod&
140  call delete('Xfile')
141endfunc
142
143func Test_combining_folds_indent()
144  new
145  let one = "\<Tab>a"
146  let zero = 'a'
147  call setline(1, [one, one, zero, zero, zero, one, one, one])
148  set foldmethod=indent
149  3,5d
150  %foldclose
151  call assert_equal(5, foldclosedend(1))
152
153  set foldmethod&
154  bwipe!
155endfunc
156
157func Test_combining_folds_marker()
158  new
159  call setline(1, ['{{{', '}}}', '', '', '', '{{{', '', '}}}'])
160  set foldmethod=marker
161  3,5d
162  %foldclose
163  call assert_equal(2, foldclosedend(1))
164
165  set foldmethod&
166  bwipe!
167endfunc
168
169func Test_folds_marker_in_comment()
170  new
171  call setline(1, ['" foo', 'bar', 'baz'])
172  setl fen fdm=marker
173  setl com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\" cms=\"%s
174  norm! zf2j
175  setl nofen
176  :1y
177  call assert_equal(['" foo{{{'], getreg(0,1,1))
178  :+2y
179  call assert_equal(['baz"}}}'], getreg(0,1,1))
180
181  set foldmethod&
182  bwipe!
183endfunc
184
185func s:TestFoldExpr(lnum)
186  let thisline = getline(a:lnum)
187  if thisline == 'a'
188    return 1
189  elseif thisline == 'b'
190    return 0
191  elseif thisline == 'c'
192    return '<1'
193  elseif thisline == 'd'
194    return '>1'
195  endif
196  return 0
197endfunction
198
199func Test_update_folds_expr_read()
200  new
201  call setline(1, ['a', 'a', 'a', 'a', 'a', 'a'])
202  set foldmethod=expr
203  set foldexpr=s:TestFoldExpr(v:lnum)
204  2
205  foldopen
206  call writefile(['b', 'b', 'a', 'a', 'd', 'a', 'a', 'c'], 'Xfile')
207  read Xfile
208  %foldclose
209  call assert_equal(2, foldclosedend(1))
210  call assert_equal(0, foldlevel(3))
211  call assert_equal(0, 4->foldlevel())
212  call assert_equal(6, foldclosedend(5))
213  call assert_equal(10, foldclosedend(7))
214  call assert_equal(14, foldclosedend(11))
215
216  call delete('Xfile')
217  bwipe!
218  set foldmethod& foldexpr&
219endfunc
220
221func Check_foldlevels(expected)
222  call assert_equal(a:expected, map(range(1, line('$')), 'foldlevel(v:val)'))
223endfunc
224
225func Test_move_folds_around_manual()
226  new
227  let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
228  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
229  let folds=[-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14]
230  " all folds closed
231  set foldenable foldlevel=0 fdm=indent
232  " needs a forced redraw
233  redraw!
234  set fdm=manual
235  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
236  call assert_equal(input, getline(1, '$'))
237  7,12m0
238  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
239  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
240  10,12m0
241  call assert_equal(PrepIndent("a")[1:] + PrepIndent("b") + ["a"] +  PrepIndent("c"), getline(1, '$'))
242  call assert_equal([1, 1, 1, 1, 1, -1, 7, 7, 7, 7, 7, -1, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
243  " moving should not close the folds
244  %d
245  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
246  set fdm=indent
247  redraw!
248  set fdm=manual
249  call cursor(2, 1)
250  %foldopen
251  7,12m0
252  let folds=repeat([-1], 18)
253  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
254  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
255  norm! zM
256  " folds are not corrupted and all have been closed
257  call assert_equal([-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
258  %d
259  call setline(1, ["a", "\tb", "\tc", "\td", "\te"])
260  set fdm=indent
261  redraw!
262  set fdm=manual
263  %foldopen
264  3m4
265  %foldclose
266  call assert_equal(["a", "\tb", "\td", "\tc", "\te"], getline(1, '$'))
267  call assert_equal([-1, 5, 5, 5, 5], map(range(1, line('$')), 'foldclosedend(v:val)'))
268  %d
269  call setline(1, ["a", "\tb", "\tc", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"])
270  set fdm=indent foldlevel=0
271  set fdm=manual
272  %foldopen
273  3m1
274  %foldclose
275  call assert_equal(["a", "\tc", "\tb", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"], getline(1, '$'))
276  call assert_equal(0, foldlevel(2))
277  call assert_equal(5, foldclosedend(3))
278  call assert_equal([-1, -1, 3, 3, 3, -1, 7, 7, 7, 7], map(range(1, line('$')), 'foldclosed(v:val)'))
279  2,6m$
280  %foldclose
281  call assert_equal(5, foldclosedend(2))
282  call assert_equal(0, foldlevel(6))
283  call assert_equal(9, foldclosedend(7))
284  call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
285
286  %d
287  " Ensure moving around the edges still works.
288  call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
289  set fdm=indent foldlevel=0
290  set fdm=manual
291  %foldopen
292  6m$
293  " The first fold has been truncated to the 5'th line.
294  " Second fold has been moved up because the moved line is now below it.
295  call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 0])
296
297  %delete
298  set fdm=indent foldlevel=0
299  call setline(1, [
300	\ "a",
301	\ "\ta",
302	\ "\t\ta",
303	\ "\t\ta",
304	\ "\t\ta",
305	\ "a",
306	\ "a"])
307  set fdm=manual
308  %foldopen!
309  4,5m6
310  call Check_foldlevels([0, 1, 2, 0, 0, 0, 0])
311
312  %delete
313  set fdm=indent
314  call setline(1, [
315	\ "\ta",
316	\ "\t\ta",
317	\ "\t\ta",
318	\ "\t\ta",
319	\ "\ta",
320	\ "\t\ta",
321	\ "\t\ta",
322	\ "\t\ta",
323	\ "\ta",
324	\ "\t\ta",
325	\ "\t\ta",
326	\ "\t\ta",
327	\ "\t\ta",
328	\ "\ta",
329	\ "a"])
330  set fdm=manual
331  %foldopen!
332  13m7
333  call Check_foldlevels([1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0])
334
335  bw!
336endfunc
337
338func Test_move_folds_around_indent()
339  new
340  let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
341  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
342  let folds=[-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14]
343  " all folds closed
344  set fdm=indent
345  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
346  call assert_equal(input, getline(1, '$'))
347  7,12m0
348  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
349  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
350  10,12m0
351  call assert_equal(PrepIndent("a")[1:] + PrepIndent("b") + ["a"] +  PrepIndent("c"), getline(1, '$'))
352  call assert_equal([1, 1, 1, 1, 1, -1, 7, 7, 7, 7, 7, -1, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
353  " moving should not close the folds
354  %d
355  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
356  set fdm=indent
357  call cursor(2, 1)
358  %foldopen
359  7,12m0
360  let folds=repeat([-1], 18)
361  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
362  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
363  norm! zM
364  " folds are not corrupted and all have been closed
365  call assert_equal([-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14], map(range(1, line('$')), 'foldclosed(v:val)'))
366  %d
367  call setline(1, ["a", "\tb", "\tc", "\td", "\te"])
368  set fdm=indent
369  %foldopen
370  3m4
371  %foldclose
372  call assert_equal(["a", "\tb", "\td", "\tc", "\te"], getline(1, '$'))
373  call assert_equal([-1, 5, 5, 5, 5], map(range(1, line('$')), 'foldclosedend(v:val)'))
374  %d
375  call setline(1, ["a", "\tb", "\tc", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"])
376  set fdm=indent foldlevel=0
377  %foldopen
378  3m1
379  %foldclose
380  call assert_equal(["a", "\tc", "\tb", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"], getline(1, '$'))
381  call assert_equal(1, foldlevel(2))
382  call assert_equal(5, foldclosedend(3))
383  call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, 7], map(range(1, line('$')), 'foldclosed(v:val)'))
384  2,6m$
385  %foldclose
386  call assert_equal(9, foldclosedend(2))
387  call assert_equal(1, foldlevel(6))
388  call assert_equal(9, foldclosedend(7))
389  call assert_equal([-1, 2, 2, 2, 2, 2, 2, 2, 2, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
390  " Ensure moving around the edges still works.
391  %d
392  call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
393  set fdm=indent foldlevel=0
394  %foldopen
395  6m$
396  " The first fold has been truncated to the 5'th line.
397  " Second fold has been moved up because the moved line is now below it.
398  call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 1])
399  bw!
400endfunc
401
402func Test_folddoopen_folddoclosed()
403  new
404  call setline(1, range(1, 9))
405  set foldmethod=manual
406  1,3 fold
407  6,8 fold
408
409  " Test without range.
410  folddoopen   s/$/o/
411  folddoclosed s/$/c/
412  call assert_equal(['1c', '2c', '3c',
413  \                  '4o', '5o',
414  \                  '6c', '7c', '8c',
415  \                  '9o'], getline(1, '$'))
416
417  " Test with range.
418  call setline(1, range(1, 9))
419  1,8 folddoopen   s/$/o/
420  4,$ folddoclosed s/$/c/
421  call assert_equal(['1',  '2', '3',
422  \                  '4o', '5o',
423  \                  '6c', '7c', '8c',
424  \                  '9'], getline(1, '$'))
425
426  set foldmethod&
427  bw!
428endfunc
429
430func Test_fold_error()
431  new
432  call setline(1, [1, 2])
433
434  for fm in ['indent', 'expr', 'syntax', 'diff']
435    exe 'set foldmethod=' . fm
436    call assert_fails('norm zf', 'E350:')
437    call assert_fails('norm zd', 'E351:')
438    call assert_fails('norm zE', 'E352:')
439  endfor
440
441  set foldmethod=manual
442  call assert_fails('norm zd', 'E490:')
443  call assert_fails('norm zo', 'E490:')
444  call assert_fails('3fold',   'E16:')
445
446  set foldmethod=marker
447  set nomodifiable
448  call assert_fails('1,2fold', 'E21:')
449
450  set modifiable&
451  set foldmethod&
452  bw!
453endfunc
454
455func Test_foldtext_recursive()
456  new
457  call setline(1, ['{{{', 'some text', '}}}'])
458  setlocal foldenable foldmethod=marker foldtext=foldtextresult(v\:foldstart)
459  " This was crashing because of endless recursion.
460  2foldclose
461  redraw
462  call assert_equal(1, foldlevel(2))
463  call assert_equal(1, foldclosed(2))
464  call assert_equal(3, foldclosedend(2))
465  bwipe!
466endfunc
467
468" Various fold related tests
469
470" Basic test if a fold can be created, opened, moving to the end and closed
471func Test_fold_manual()
472  enew!
473  set fdm=manual
474
475  let content = ['1 aa', '2 bb', '3 cc']
476  call append(0, content)
477  call cursor(1, 1)
478  normal zf2j
479  call assert_equal('1 aa', getline(foldclosed('.')))
480  normal zo
481  call assert_equal(-1, foldclosed('.'))
482  normal ]z
483  call assert_equal('3 cc', getline('.'))
484  normal zc
485  call assert_equal('1 aa', getline(foldclosed('.')))
486
487  set fdm&
488  enew!
489endfunc
490
491" test folding with markers.
492func Test_fold_marker()
493  enew!
494  set fdm=marker fdl=1 fdc=3
495
496  let content = ['4 dd {{{', '5 ee {{{ }}}', '6 ff }}}']
497  call append(0, content)
498  call cursor(2, 1)
499  call assert_equal(2, foldlevel('.'))
500  normal [z
501  call assert_equal(1, foldlevel('.'))
502  exe "normal jo{{ \<Esc>r{jj"
503  call assert_equal(1, foldlevel('.'))
504  normal kYpj
505  call assert_equal(0, foldlevel('.'))
506
507  set fdm& fdl& fdc&
508  enew!
509endfunc
510
511" test create fold markers with C filetype
512func Test_fold_create_marker_in_C()
513  enew!
514  set fdm=marker fdl=9
515  set filetype=c
516
517  let content =<< trim [CODE]
518    /*
519     * comment
520     *
521     *
522     */
523    int f(int* p) {
524        *p = 3;
525        return 0;
526    }
527  [CODE]
528
529  for c in range(len(content) - 1)
530    bw!
531    call append(0, content)
532    call cursor(c + 1, 1)
533    norm! zfG
534    call assert_equal(content[c] . (c < 4 ? '{{{' : '/*{{{*/'), getline(c + 1))
535  endfor
536
537  set fdm& fdl&
538  enew!
539endfunc
540
541" test folding with indent
542func Test_fold_indent()
543  enew!
544  set fdm=indent sw=2
545
546  let content = ['1 aa', '2 bb', '3 cc']
547  call append(0, content)
548  call cursor(2, 1)
549  exe "normal i  \<Esc>jI    "
550  call assert_equal(2, foldlevel('.'))
551  normal k
552  call assert_equal(1, foldlevel('.'))
553
554  set fdm& sw&
555  enew!
556endfunc
557
558" test syntax folding
559func Test_fold_syntax()
560  if !has('syntax')
561    return
562  endif
563
564  enew!
565  set fdm=syntax fdl=0
566
567  syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
568  syn region Fd1 start="ee" end="ff" fold contained
569  syn region Fd2 start="gg" end="hh" fold contained
570  syn region Fd3 start="commentstart" end="commentend" fold contained
571  let content = ['3 cc', '4 dd {{{', '5 ee {{{ }}}', '{{{{', '6 ff }}}',
572	      \ '6 ff }}}', '7 gg', '8 hh', '9 ii']
573  call append(0, content)
574  normal Gzk
575  call assert_equal('9 ii', getline('.'))
576  normal k
577  call assert_equal('3 cc', getline('.'))
578  exe "normal jAcommentstart   \<Esc>Acommentend"
579  set fdl=1
580  normal 3j
581  call assert_equal('7 gg', getline('.'))
582  set fdl=0
583  exe "normal zO\<C-L>j"
584  call assert_equal('8 hh', getline('.'))
585  syn clear Fd1 Fd2 Fd3 Hup
586
587  set fdm& fdl&
588  enew!
589endfunc
590
591func Flvl()
592  let l = getline(v:lnum)
593  if l =~ "bb$"
594    return 2
595  elseif l =~ "gg$"
596    return "s1"
597  elseif l =~ "ii$"
598    return ">2"
599  elseif l =~ "kk$"
600    return "0"
601  endif
602  return "="
603endfun
604
605" test expression folding
606func Test_fold_expr()
607  enew!
608  set fdm=expr fde=Flvl()
609
610  let content = ['1 aa',
611	      \ '2 bb',
612	      \ '3 cc',
613	      \ '4 dd {{{commentstart  commentend',
614	      \ '5 ee {{{ }}}',
615	      \ '{{{',
616	      \ '6 ff }}}',
617	      \ '6 ff }}}',
618	      \ '  7 gg',
619	      \ '    8 hh',
620	      \ '9 ii',
621	      \ 'a jj',
622	      \ 'b kk']
623  call append(0, content)
624  call cursor(1, 1)
625  exe "normal /bb$\<CR>"
626  call assert_equal(2, foldlevel('.'))
627  exe "normal /hh$\<CR>"
628  call assert_equal(1, foldlevel('.'))
629  exe "normal /ii$\<CR>"
630  call assert_equal(2, foldlevel('.'))
631  exe "normal /kk$\<CR>"
632  call assert_equal(0, foldlevel('.'))
633
634  set fdm& fde&
635  enew!
636endfunc
637
638" Bug with fdm=indent and moving folds
639" Moving a fold a few times, messes up the folds below the moved fold.
640" Fixed by 7.4.700
641func Test_fold_move()
642  enew!
643  set fdm=indent sw=2 fdl=0
644
645  let content = ['', '', 'Line1', '  Line2', '  Line3',
646	      \ 'Line4', '  Line5', '  Line6',
647	      \ 'Line7', '  Line8', '  Line9']
648  call append(0, content)
649  normal zM
650  call cursor(4, 1)
651  move 2
652  move 1
653  call assert_equal(7, foldclosed(7))
654  call assert_equal(8, foldclosedend(7))
655  call assert_equal(0, foldlevel(9))
656  call assert_equal(10, foldclosed(10))
657  call assert_equal(11, foldclosedend(10))
658  call assert_equal('+--  2 lines: Line2', foldtextresult(2))
659  call assert_equal('+--  2 lines: Line8', 10->foldtextresult())
660
661  set fdm& sw& fdl&
662  enew!
663endfunc
664
665" test for patch 7.3.637
666" Cannot catch the error caused by a foldopen when there is no fold.
667func Test_foldopen_exception()
668  enew!
669  let a = 'No error caught'
670  try
671    foldopen
672  catch
673    let a = matchstr(v:exception,'^[^ ]*')
674  endtry
675  call assert_equal('Vim(foldopen):E490:', a)
676
677  let a = 'No error caught'
678  try
679    foobar
680  catch
681    let a = matchstr(v:exception,'^[^ ]*')
682  endtry
683  call assert_match('E492:', a)
684endfunc
685
686func Test_fold_last_line_with_pagedown()
687  enew!
688  set fdm=manual
689
690  let expect = '+-- 11 lines: 9---'
691  let content = range(1,19)
692  call append(0, content)
693  normal dd9G
694  normal zfG
695  normal zt
696  call assert_equal('9', getline(foldclosed('.')))
697  call assert_equal('19', getline(foldclosedend('.')))
698  call assert_equal(expect, ScreenLines(1, len(expect))[0])
699  call feedkeys("\<C-F>", 'xt')
700  call assert_equal(expect, ScreenLines(1, len(expect))[0])
701  call feedkeys("\<C-F>", 'xt')
702  call assert_equal(expect, ScreenLines(1, len(expect))[0])
703  call feedkeys("\<C-B>\<C-F>\<C-F>", 'xt')
704  call assert_equal(expect, ScreenLines(1, len(expect))[0])
705
706  set fdm&
707  enew!
708endfunc
709
710func Test_folds_with_rnu()
711  CheckScreendump
712
713  call writefile([
714	\ 'set fdm=marker rnu foldcolumn=2',
715	\ 'call setline(1, ["{{{1", "nline 1", "{{{1", "line 2"])',
716	\ ], 'Xtest_folds_with_rnu')
717  let buf = RunVimInTerminal('-S Xtest_folds_with_rnu', {})
718
719  call VerifyScreenDump(buf, 'Test_folds_with_rnu_01', {})
720  call term_sendkeys(buf, "j")
721  call VerifyScreenDump(buf, 'Test_folds_with_rnu_02', {})
722
723  " clean up
724  call StopVimInTerminal(buf)
725  call delete('Xtest_folds_with_rnu')
726endfunc
727
728func Test_folds_marker_in_comment2()
729  new
730  call setline(1, ['Lorem ipsum dolor sit', 'Lorem ipsum dolor sit', 'Lorem ipsum dolor sit'])
731  setl fen fdm=marker
732  setl commentstring=<!--%s-->
733  setl comments=s:<!--,m:\ \ \ \ ,e:-->
734  norm! zf2j
735  setl nofen
736  :1y
737  call assert_equal(['Lorem ipsum dolor sit<!--{{{-->'], getreg(0,1,1))
738  :+2y
739  call assert_equal(['Lorem ipsum dolor sit<!--}}}-->'], getreg(0,1,1))
740
741  set foldmethod&
742  bwipe!
743endfunc
744
745func Test_fold_delete_with_marker()
746  new
747  call setline(1, ['func Func() {{{1', 'endfunc'])
748  1,2yank
749  new
750  set fdm=marker
751  call setline(1, 'x')
752  normal! Vp
753  normal! zd
754  call assert_equal(['func Func() ', 'endfunc'], getline(1, '$'))
755
756  set fdm&
757  bwipe!
758  bwipe!
759endfunc
760