xref: /vim-8.2.3635/src/testdir/test_fold.vim (revision 68ffe8ca)
1ded27827SBram Moolenaar" Test for folding
2ded27827SBram Moolenaar
38c5a278fSBram Moolenaarsource check.vim
4907dad72SBram Moolenaarsource view_util.vim
57701f308SBram Moolenaarsource screendump.vim
6907dad72SBram Moolenaar
794be619eSBram Moolenaarfunc PrepIndent(arg)
888d298aeSBram Moolenaar  return [a:arg] + repeat(["\t".a:arg], 5)
988d298aeSBram Moolenaarendfu
1088d298aeSBram Moolenaar
1194be619eSBram Moolenaarfunc Test_address_fold()
12ded27827SBram Moolenaar  new
13ded27827SBram Moolenaar  call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
14ded27827SBram Moolenaar	      \ 'after fold 1', 'after fold 2', 'after fold 3'])
15ded27827SBram Moolenaar  setl fen fdm=marker
16518c9b13SBram Moolenaar  " The next commands should all copy the same part of the buffer,
17518c9b13SBram Moolenaar  " regardless of the addressing type, since the part to be copied
18ded27827SBram Moolenaar  " is folded away
19ded27827SBram Moolenaar  :1y
20ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
21ded27827SBram Moolenaar  :.y
22ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
23ded27827SBram Moolenaar  :.+y
24ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
25ded27827SBram Moolenaar  :.,.y
26ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
27ded27827SBram Moolenaar  :sil .1,.y
28ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
29ded27827SBram Moolenaar  " use silent to make E493 go away
30ded27827SBram Moolenaar  :sil .+,.y
31ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
32ded27827SBram Moolenaar  :,y
33ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
34ded27827SBram Moolenaar  :,+y
35ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/','after fold 1'], getreg(0,1,1))
36ded27827SBram Moolenaar  " using .+3 as second address should copy the whole folded line + the next 3
37ded27827SBram Moolenaar  " lines
38ded27827SBram Moolenaar  :.,+3y
39ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/',
40ded27827SBram Moolenaar	      \ 'after fold 1', 'after fold 2', 'after fold 3'], getreg(0,1,1))
41ded27827SBram Moolenaar  :sil .,-2y
42ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3', '4', '5', '}/*}}}*/'], getreg(0,1,1))
43ded27827SBram Moolenaar
44ded27827SBram Moolenaar  " now test again with folding disabled
45ded27827SBram Moolenaar  set nofoldenable
46ded27827SBram Moolenaar  :1y
47ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
48ded27827SBram Moolenaar  :.y
49ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
50ded27827SBram Moolenaar  :.+y
51ded27827SBram Moolenaar  call assert_equal(['1'], getreg(0,1,1))
52ded27827SBram Moolenaar  :.,.y
53ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
54ded27827SBram Moolenaar  " use silent to make E493 go away
55ded27827SBram Moolenaar  :sil .1,.y
56ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
57ded27827SBram Moolenaar  " use silent to make E493 go away
58ded27827SBram Moolenaar  :sil .+,.y
59ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
60ded27827SBram Moolenaar  :,y
61ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/'], getreg(0,1,1))
62ded27827SBram Moolenaar  :,+y
63ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1'], getreg(0,1,1))
64ded27827SBram Moolenaar  " using .+3 as second address should copy the whole folded line + the next 3
65ded27827SBram Moolenaar  " lines
66ded27827SBram Moolenaar  :.,+3y
67ded27827SBram Moolenaar  call assert_equal(['int FuncName() {/*{{{*/', '1', '2', '3'], getreg(0,1,1))
68ded27827SBram Moolenaar  :7
69ded27827SBram Moolenaar  :sil .,-2y
70ded27827SBram Moolenaar  call assert_equal(['4', '5', '}/*}}}*/'], getreg(0,1,1))
71ded27827SBram Moolenaar
72ded27827SBram Moolenaar  quit!
731159b168SBram Moolenaarendfunc
7454b2bfa3SBram Moolenaar
7594be619eSBram Moolenaarfunc Test_indent_fold()
7654b2bfa3SBram Moolenaar    new
7754b2bfa3SBram Moolenaar    call setline(1, ['', 'a', '    b', '    c'])
7854b2bfa3SBram Moolenaar    setl fen fdm=indent
7954b2bfa3SBram Moolenaar    2
8054b2bfa3SBram Moolenaar    norm! >>
8154b2bfa3SBram Moolenaar    let a=map(range(1,4), 'foldclosed(v:val)')
8254b2bfa3SBram Moolenaar    call assert_equal([-1,-1,-1,-1], a)
8354b2bfa3SBram Moolenaar    bw!
841159b168SBram Moolenaarendfunc
8554b2bfa3SBram Moolenaar
8694be619eSBram Moolenaarfunc Test_indent_fold2()
8754b2bfa3SBram Moolenaar    new
8854b2bfa3SBram Moolenaar    call setline(1, ['', '{{{', '}}}', '{{{', '}}}'])
8954b2bfa3SBram Moolenaar    setl fen fdm=marker
9054b2bfa3SBram Moolenaar    2
9154b2bfa3SBram Moolenaar    norm! >>
92a4208966SBram Moolenaar    let a=map(range(1,5), 'v:val->foldclosed()')
9354b2bfa3SBram Moolenaar    call assert_equal([-1,-1,-1,4,4], a)
9454b2bfa3SBram Moolenaar    bw!
951159b168SBram Moolenaarendfunc
961159b168SBram Moolenaar
975c504f68SBram Moolenaar" Test for fold indent with indents greater than 'foldnestmax'
985c504f68SBram Moolenaarfunc Test_indent_fold_max()
995c504f68SBram Moolenaar  new
1005c504f68SBram Moolenaar  setlocal foldmethod=indent
1015c504f68SBram Moolenaar  setlocal shiftwidth=2
1025c504f68SBram Moolenaar  " 'foldnestmax' default value is 20
1035c504f68SBram Moolenaar  call setline(1, "\t\t\t\t\t\ta")
1045c504f68SBram Moolenaar  call assert_equal(20, foldlevel(1))
1055c504f68SBram Moolenaar  setlocal foldnestmax=10
1065c504f68SBram Moolenaar  call assert_equal(10, foldlevel(1))
1075c504f68SBram Moolenaar  setlocal foldnestmax=-1
1085c504f68SBram Moolenaar  call assert_equal(0, foldlevel(1))
1095c504f68SBram Moolenaar  bw!
1105c504f68SBram Moolenaarendfunc
1115c504f68SBram Moolenaar
1121159b168SBram Moolenaarfunc Test_manual_fold_with_filter()
113aeb313f3SBram Moolenaar  CheckExecutable cat
1143f3897e4SBram Moolenaar  for type in ['manual', 'marker']
1153f3897e4SBram Moolenaar    exe 'set foldmethod=' . type
1161159b168SBram Moolenaar    new
1171159b168SBram Moolenaar    call setline(1, range(1, 20))
1181159b168SBram Moolenaar    4,$fold
1191159b168SBram Moolenaar    %foldopen
1201159b168SBram Moolenaar    10,$fold
1211159b168SBram Moolenaar    %foldopen
1221159b168SBram Moolenaar    " This filter command should not have an effect
1231159b168SBram Moolenaar    1,8! cat
1241159b168SBram Moolenaar    call feedkeys('5ggzdzMGdd', 'xt')
1251159b168SBram Moolenaar    call assert_equal(['1', '2', '3', '4', '5', '6', '7', '8', '9'], getline(1, '$'))
1263f3897e4SBram Moolenaar
1271159b168SBram Moolenaar    bwipe!
1283f3897e4SBram Moolenaar    set foldmethod&
1293f3897e4SBram Moolenaar  endfor
1301159b168SBram Moolenaarendfunc
131eadbc2b4SBram Moolenaar
13294be619eSBram Moolenaarfunc Test_indent_fold_with_read()
133eadbc2b4SBram Moolenaar  new
134eadbc2b4SBram Moolenaar  set foldmethod=indent
135eadbc2b4SBram Moolenaar  call setline(1, repeat(["\<Tab>a"], 4))
136eadbc2b4SBram Moolenaar  for n in range(1, 4)
137eadbc2b4SBram Moolenaar    call assert_equal(1, foldlevel(n))
138eadbc2b4SBram Moolenaar  endfor
139eadbc2b4SBram Moolenaar
140eadbc2b4SBram Moolenaar  call writefile(["a", "", "\<Tab>a"], 'Xfile')
141eadbc2b4SBram Moolenaar  foldopen
142eadbc2b4SBram Moolenaar  2read Xfile
143eadbc2b4SBram Moolenaar  %foldclose
144eadbc2b4SBram Moolenaar  call assert_equal(1, foldlevel(1))
145eadbc2b4SBram Moolenaar  call assert_equal(2, foldclosedend(1))
146eadbc2b4SBram Moolenaar  call assert_equal(0, foldlevel(3))
147eadbc2b4SBram Moolenaar  call assert_equal(0, foldlevel(4))
148eadbc2b4SBram Moolenaar  call assert_equal(1, foldlevel(5))
149a4208966SBram Moolenaar  call assert_equal(7, 5->foldclosedend())
150eadbc2b4SBram Moolenaar
151eadbc2b4SBram Moolenaar  bwipe!
152eadbc2b4SBram Moolenaar  set foldmethod&
153eadbc2b4SBram Moolenaar  call delete('Xfile')
154eadbc2b4SBram Moolenaarendfunc
155eadbc2b4SBram Moolenaar
156eadbc2b4SBram Moolenaarfunc Test_combining_folds_indent()
157eadbc2b4SBram Moolenaar  new
158eadbc2b4SBram Moolenaar  let one = "\<Tab>a"
159eadbc2b4SBram Moolenaar  let zero = 'a'
160eadbc2b4SBram Moolenaar  call setline(1, [one, one, zero, zero, zero, one, one, one])
161eadbc2b4SBram Moolenaar  set foldmethod=indent
162eadbc2b4SBram Moolenaar  3,5d
163eadbc2b4SBram Moolenaar  %foldclose
164eadbc2b4SBram Moolenaar  call assert_equal(5, foldclosedend(1))
165eadbc2b4SBram Moolenaar
166eadbc2b4SBram Moolenaar  set foldmethod&
167eadbc2b4SBram Moolenaar  bwipe!
168eadbc2b4SBram Moolenaarendfunc
169eadbc2b4SBram Moolenaar
170eadbc2b4SBram Moolenaarfunc Test_combining_folds_marker()
171eadbc2b4SBram Moolenaar  new
172eadbc2b4SBram Moolenaar  call setline(1, ['{{{', '}}}', '', '', '', '{{{', '', '}}}'])
173eadbc2b4SBram Moolenaar  set foldmethod=marker
174eadbc2b4SBram Moolenaar  3,5d
175eadbc2b4SBram Moolenaar  %foldclose
176eadbc2b4SBram Moolenaar  call assert_equal(2, foldclosedend(1))
177eadbc2b4SBram Moolenaar
178eadbc2b4SBram Moolenaar  set foldmethod&
179eadbc2b4SBram Moolenaar  bwipe!
180eadbc2b4SBram Moolenaarendfunc
181eadbc2b4SBram Moolenaar
182025a6b70SBram Moolenaarfunc Test_folds_marker_in_comment()
183025a6b70SBram Moolenaar  new
184025a6b70SBram Moolenaar  call setline(1, ['" foo', 'bar', 'baz'])
185025a6b70SBram Moolenaar  setl fen fdm=marker
186025a6b70SBram Moolenaar  setl com=sO:\"\ -,mO:\"\ \ ,eO:\"\",:\" cms=\"%s
187025a6b70SBram Moolenaar  norm! zf2j
188025a6b70SBram Moolenaar  setl nofen
189025a6b70SBram Moolenaar  :1y
190025a6b70SBram Moolenaar  call assert_equal(['" foo{{{'], getreg(0,1,1))
191025a6b70SBram Moolenaar  :+2y
192025a6b70SBram Moolenaar  call assert_equal(['baz"}}}'], getreg(0,1,1))
193025a6b70SBram Moolenaar
194025a6b70SBram Moolenaar  set foldmethod&
195025a6b70SBram Moolenaar  bwipe!
196025a6b70SBram Moolenaarendfunc
197025a6b70SBram Moolenaar
198eadbc2b4SBram Moolenaarfunc s:TestFoldExpr(lnum)
199eadbc2b4SBram Moolenaar  let thisline = getline(a:lnum)
200eadbc2b4SBram Moolenaar  if thisline == 'a'
201eadbc2b4SBram Moolenaar    return 1
202eadbc2b4SBram Moolenaar  elseif thisline == 'b'
203eadbc2b4SBram Moolenaar    return 0
204eadbc2b4SBram Moolenaar  elseif thisline == 'c'
205eadbc2b4SBram Moolenaar    return '<1'
206eadbc2b4SBram Moolenaar  elseif thisline == 'd'
207eadbc2b4SBram Moolenaar    return '>1'
208eadbc2b4SBram Moolenaar  endif
209eadbc2b4SBram Moolenaar  return 0
210eadbc2b4SBram Moolenaarendfunction
211eadbc2b4SBram Moolenaar
212eadbc2b4SBram Moolenaarfunc Test_update_folds_expr_read()
213eadbc2b4SBram Moolenaar  new
214eadbc2b4SBram Moolenaar  call setline(1, ['a', 'a', 'a', 'a', 'a', 'a'])
215eadbc2b4SBram Moolenaar  set foldmethod=expr
216eadbc2b4SBram Moolenaar  set foldexpr=s:TestFoldExpr(v:lnum)
217eadbc2b4SBram Moolenaar  2
218eadbc2b4SBram Moolenaar  foldopen
219eadbc2b4SBram Moolenaar  call writefile(['b', 'b', 'a', 'a', 'd', 'a', 'a', 'c'], 'Xfile')
220eadbc2b4SBram Moolenaar  read Xfile
221eadbc2b4SBram Moolenaar  %foldclose
222eadbc2b4SBram Moolenaar  call assert_equal(2, foldclosedend(1))
223eadbc2b4SBram Moolenaar  call assert_equal(0, foldlevel(3))
224a4208966SBram Moolenaar  call assert_equal(0, 4->foldlevel())
225eadbc2b4SBram Moolenaar  call assert_equal(6, foldclosedend(5))
226eadbc2b4SBram Moolenaar  call assert_equal(10, foldclosedend(7))
227eadbc2b4SBram Moolenaar  call assert_equal(14, foldclosedend(11))
228eadbc2b4SBram Moolenaar
229eadbc2b4SBram Moolenaar  call delete('Xfile')
230eadbc2b4SBram Moolenaar  bwipe!
231eadbc2b4SBram Moolenaar  set foldmethod& foldexpr&
232eadbc2b4SBram Moolenaarendfunc
23388d298aeSBram Moolenaar
23494be619eSBram Moolenaarfunc Check_foldlevels(expected)
23594be619eSBram Moolenaar  call assert_equal(a:expected, map(range(1, line('$')), 'foldlevel(v:val)'))
23694be619eSBram Moolenaarendfunc
23794be619eSBram Moolenaar
23894be619eSBram Moolenaarfunc Test_move_folds_around_manual()
23988d298aeSBram Moolenaar  new
24088d298aeSBram Moolenaar  let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
24188d298aeSBram Moolenaar  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
24288d298aeSBram Moolenaar  let folds=[-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14]
24388d298aeSBram Moolenaar  " all folds closed
24488d298aeSBram Moolenaar  set foldenable foldlevel=0 fdm=indent
24588d298aeSBram Moolenaar  " needs a forced redraw
24688d298aeSBram Moolenaar  redraw!
24788d298aeSBram Moolenaar  set fdm=manual
24888d298aeSBram Moolenaar  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
24988d298aeSBram Moolenaar  call assert_equal(input, getline(1, '$'))
25088d298aeSBram Moolenaar  7,12m0
25188d298aeSBram Moolenaar  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
25288d298aeSBram Moolenaar  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
25388d298aeSBram Moolenaar  10,12m0
25488d298aeSBram Moolenaar  call assert_equal(PrepIndent("a")[1:] + PrepIndent("b") + ["a"] +  PrepIndent("c"), getline(1, '$'))
25588d298aeSBram Moolenaar  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)'))
25688d298aeSBram Moolenaar  " moving should not close the folds
25788d298aeSBram Moolenaar  %d
25888d298aeSBram Moolenaar  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
25988d298aeSBram Moolenaar  set fdm=indent
26088d298aeSBram Moolenaar  redraw!
26188d298aeSBram Moolenaar  set fdm=manual
26288d298aeSBram Moolenaar  call cursor(2, 1)
26340ebc0afSBram Moolenaar  %foldopen
26488d298aeSBram Moolenaar  7,12m0
26588d298aeSBram Moolenaar  let folds=repeat([-1], 18)
26688d298aeSBram Moolenaar  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
26788d298aeSBram Moolenaar  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
26888d298aeSBram Moolenaar  norm! zM
26988d298aeSBram Moolenaar  " folds are not corrupted and all have been closed
27088d298aeSBram Moolenaar  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)'))
27188d298aeSBram Moolenaar  %d
27288d298aeSBram Moolenaar  call setline(1, ["a", "\tb", "\tc", "\td", "\te"])
27388d298aeSBram Moolenaar  set fdm=indent
27488d298aeSBram Moolenaar  redraw!
27588d298aeSBram Moolenaar  set fdm=manual
27688d298aeSBram Moolenaar  %foldopen
27788d298aeSBram Moolenaar  3m4
27888d298aeSBram Moolenaar  %foldclose
27988d298aeSBram Moolenaar  call assert_equal(["a", "\tb", "\td", "\tc", "\te"], getline(1, '$'))
28088d298aeSBram Moolenaar  call assert_equal([-1, 5, 5, 5, 5], map(range(1, line('$')), 'foldclosedend(v:val)'))
28188d298aeSBram Moolenaar  %d
28288d298aeSBram Moolenaar  call setline(1, ["a", "\tb", "\tc", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"])
28388d298aeSBram Moolenaar  set fdm=indent foldlevel=0
28488d298aeSBram Moolenaar  set fdm=manual
28588d298aeSBram Moolenaar  %foldopen
28688d298aeSBram Moolenaar  3m1
28788d298aeSBram Moolenaar  %foldclose
28888d298aeSBram Moolenaar  call assert_equal(["a", "\tc", "\tb", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"], getline(1, '$'))
28988d298aeSBram Moolenaar  call assert_equal(0, foldlevel(2))
29088d298aeSBram Moolenaar  call assert_equal(5, foldclosedend(3))
29188d298aeSBram Moolenaar  call assert_equal([-1, -1, 3, 3, 3, -1, 7, 7, 7, 7], map(range(1, line('$')), 'foldclosed(v:val)'))
29288d298aeSBram Moolenaar  2,6m$
29388d298aeSBram Moolenaar  %foldclose
29488d298aeSBram Moolenaar  call assert_equal(5, foldclosedend(2))
29588d298aeSBram Moolenaar  call assert_equal(0, foldlevel(6))
29688d298aeSBram Moolenaar  call assert_equal(9, foldclosedend(7))
29788d298aeSBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
298495b7dd2SBram Moolenaar
29940ebc0afSBram Moolenaar  %d
30040ebc0afSBram Moolenaar  " Ensure moving around the edges still works.
30140ebc0afSBram Moolenaar  call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
30240ebc0afSBram Moolenaar  set fdm=indent foldlevel=0
30340ebc0afSBram Moolenaar  set fdm=manual
30440ebc0afSBram Moolenaar  %foldopen
30540ebc0afSBram Moolenaar  6m$
30640ebc0afSBram Moolenaar  " The first fold has been truncated to the 5'th line.
30740ebc0afSBram Moolenaar  " Second fold has been moved up because the moved line is now below it.
30894be619eSBram Moolenaar  call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 0])
30994be619eSBram Moolenaar
31094be619eSBram Moolenaar  %delete
31194be619eSBram Moolenaar  set fdm=indent foldlevel=0
31294be619eSBram Moolenaar  call setline(1, [
31394be619eSBram Moolenaar	\ "a",
31494be619eSBram Moolenaar	\ "\ta",
31594be619eSBram Moolenaar	\ "\t\ta",
31694be619eSBram Moolenaar	\ "\t\ta",
31794be619eSBram Moolenaar	\ "\t\ta",
31894be619eSBram Moolenaar	\ "a",
31994be619eSBram Moolenaar	\ "a"])
32094be619eSBram Moolenaar  set fdm=manual
32194be619eSBram Moolenaar  %foldopen!
32294be619eSBram Moolenaar  4,5m6
32394be619eSBram Moolenaar  call Check_foldlevels([0, 1, 2, 0, 0, 0, 0])
32494be619eSBram Moolenaar
32594be619eSBram Moolenaar  %delete
32694be619eSBram Moolenaar  set fdm=indent
32794be619eSBram Moolenaar  call setline(1, [
32894be619eSBram Moolenaar	\ "\ta",
32994be619eSBram Moolenaar	\ "\t\ta",
33094be619eSBram Moolenaar	\ "\t\ta",
33194be619eSBram Moolenaar	\ "\t\ta",
33294be619eSBram Moolenaar	\ "\ta",
33394be619eSBram Moolenaar	\ "\t\ta",
33494be619eSBram Moolenaar	\ "\t\ta",
33594be619eSBram Moolenaar	\ "\t\ta",
33694be619eSBram Moolenaar	\ "\ta",
33794be619eSBram Moolenaar	\ "\t\ta",
33894be619eSBram Moolenaar	\ "\t\ta",
33994be619eSBram Moolenaar	\ "\t\ta",
34094be619eSBram Moolenaar	\ "\t\ta",
34194be619eSBram Moolenaar	\ "\ta",
34294be619eSBram Moolenaar	\ "a"])
34394be619eSBram Moolenaar  set fdm=manual
34494be619eSBram Moolenaar  %foldopen!
34594be619eSBram Moolenaar  13m7
34694be619eSBram Moolenaar  call Check_foldlevels([1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0])
34794be619eSBram Moolenaar
34888d298aeSBram Moolenaar  bw!
34988d298aeSBram Moolenaarendfunc
35088d298aeSBram Moolenaar
35194be619eSBram Moolenaarfunc Test_move_folds_around_indent()
35288d298aeSBram Moolenaar  new
35388d298aeSBram Moolenaar  let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
35488d298aeSBram Moolenaar  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
35588d298aeSBram Moolenaar  let folds=[-1, 2, 2, 2, 2, 2, -1, 8, 8, 8, 8, 8, -1, 14, 14, 14, 14, 14]
35688d298aeSBram Moolenaar  " all folds closed
35788d298aeSBram Moolenaar  set fdm=indent
35888d298aeSBram Moolenaar  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
35988d298aeSBram Moolenaar  call assert_equal(input, getline(1, '$'))
36088d298aeSBram Moolenaar  7,12m0
36188d298aeSBram Moolenaar  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
36288d298aeSBram Moolenaar  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
36388d298aeSBram Moolenaar  10,12m0
36488d298aeSBram Moolenaar  call assert_equal(PrepIndent("a")[1:] + PrepIndent("b") + ["a"] +  PrepIndent("c"), getline(1, '$'))
36588d298aeSBram Moolenaar  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)'))
36688d298aeSBram Moolenaar  " moving should not close the folds
36788d298aeSBram Moolenaar  %d
36888d298aeSBram Moolenaar  call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
36988d298aeSBram Moolenaar  set fdm=indent
37088d298aeSBram Moolenaar  call cursor(2, 1)
37140ebc0afSBram Moolenaar  %foldopen
37288d298aeSBram Moolenaar  7,12m0
37388d298aeSBram Moolenaar  let folds=repeat([-1], 18)
37488d298aeSBram Moolenaar  call assert_equal(PrepIndent("b") + PrepIndent("a") + PrepIndent("c"), getline(1, '$'))
37588d298aeSBram Moolenaar  call assert_equal(folds, map(range(1, line('$')), 'foldclosed(v:val)'))
37688d298aeSBram Moolenaar  norm! zM
37788d298aeSBram Moolenaar  " folds are not corrupted and all have been closed
37888d298aeSBram Moolenaar  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)'))
37988d298aeSBram Moolenaar  %d
38088d298aeSBram Moolenaar  call setline(1, ["a", "\tb", "\tc", "\td", "\te"])
38188d298aeSBram Moolenaar  set fdm=indent
38288d298aeSBram Moolenaar  %foldopen
38388d298aeSBram Moolenaar  3m4
38488d298aeSBram Moolenaar  %foldclose
38588d298aeSBram Moolenaar  call assert_equal(["a", "\tb", "\td", "\tc", "\te"], getline(1, '$'))
38688d298aeSBram Moolenaar  call assert_equal([-1, 5, 5, 5, 5], map(range(1, line('$')), 'foldclosedend(v:val)'))
38788d298aeSBram Moolenaar  %d
38888d298aeSBram Moolenaar  call setline(1, ["a", "\tb", "\tc", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"])
38988d298aeSBram Moolenaar  set fdm=indent foldlevel=0
39088d298aeSBram Moolenaar  %foldopen
39188d298aeSBram Moolenaar  3m1
39288d298aeSBram Moolenaar  %foldclose
39388d298aeSBram Moolenaar  call assert_equal(["a", "\tc", "\tb", "\td", "\te", "z", "\ty", "\tx", "\tw", "\tv"], getline(1, '$'))
39488d298aeSBram Moolenaar  call assert_equal(1, foldlevel(2))
39588d298aeSBram Moolenaar  call assert_equal(5, foldclosedend(3))
39688d298aeSBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, -1, 7, 7, 7, 7], map(range(1, line('$')), 'foldclosed(v:val)'))
39788d298aeSBram Moolenaar  2,6m$
39888d298aeSBram Moolenaar  %foldclose
39988d298aeSBram Moolenaar  call assert_equal(9, foldclosedend(2))
40088d298aeSBram Moolenaar  call assert_equal(1, foldlevel(6))
40188d298aeSBram Moolenaar  call assert_equal(9, foldclosedend(7))
40288d298aeSBram Moolenaar  call assert_equal([-1, 2, 2, 2, 2, 2, 2, 2, 2, -1], map(range(1, line('$')), 'foldclosed(v:val)'))
40340ebc0afSBram Moolenaar  " Ensure moving around the edges still works.
40440ebc0afSBram Moolenaar  %d
40540ebc0afSBram Moolenaar  call setline(1, PrepIndent("a") + repeat(["a"], 3) + ["\ta"])
40640ebc0afSBram Moolenaar  set fdm=indent foldlevel=0
40740ebc0afSBram Moolenaar  %foldopen
40840ebc0afSBram Moolenaar  6m$
40940ebc0afSBram Moolenaar  " The first fold has been truncated to the 5'th line.
41040ebc0afSBram Moolenaar  " Second fold has been moved up because the moved line is now below it.
41194be619eSBram Moolenaar  call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 1])
41288d298aeSBram Moolenaar  bw!
41388d298aeSBram Moolenaarendfunc
414518c9b13SBram Moolenaar
415518c9b13SBram Moolenaarfunc Test_folddoopen_folddoclosed()
416518c9b13SBram Moolenaar  new
417518c9b13SBram Moolenaar  call setline(1, range(1, 9))
418518c9b13SBram Moolenaar  set foldmethod=manual
419518c9b13SBram Moolenaar  1,3 fold
420518c9b13SBram Moolenaar  6,8 fold
421518c9b13SBram Moolenaar
422518c9b13SBram Moolenaar  " Test without range.
423518c9b13SBram Moolenaar  folddoopen   s/$/o/
424518c9b13SBram Moolenaar  folddoclosed s/$/c/
425518c9b13SBram Moolenaar  call assert_equal(['1c', '2c', '3c',
426518c9b13SBram Moolenaar  \                  '4o', '5o',
427518c9b13SBram Moolenaar  \                  '6c', '7c', '8c',
428518c9b13SBram Moolenaar  \                  '9o'], getline(1, '$'))
429518c9b13SBram Moolenaar
430518c9b13SBram Moolenaar  " Test with range.
431518c9b13SBram Moolenaar  call setline(1, range(1, 9))
432518c9b13SBram Moolenaar  1,8 folddoopen   s/$/o/
433518c9b13SBram Moolenaar  4,$ folddoclosed s/$/c/
434518c9b13SBram Moolenaar  call assert_equal(['1',  '2', '3',
435518c9b13SBram Moolenaar  \                  '4o', '5o',
436518c9b13SBram Moolenaar  \                  '6c', '7c', '8c',
437518c9b13SBram Moolenaar  \                  '9'], getline(1, '$'))
438518c9b13SBram Moolenaar
439518c9b13SBram Moolenaar  set foldmethod&
440518c9b13SBram Moolenaar  bw!
441518c9b13SBram Moolenaarendfunc
442518c9b13SBram Moolenaar
443518c9b13SBram Moolenaarfunc Test_fold_error()
444518c9b13SBram Moolenaar  new
445518c9b13SBram Moolenaar  call setline(1, [1, 2])
446518c9b13SBram Moolenaar
447518c9b13SBram Moolenaar  for fm in ['indent', 'expr', 'syntax', 'diff']
448518c9b13SBram Moolenaar    exe 'set foldmethod=' . fm
449518c9b13SBram Moolenaar    call assert_fails('norm zf', 'E350:')
450518c9b13SBram Moolenaar    call assert_fails('norm zd', 'E351:')
451518c9b13SBram Moolenaar    call assert_fails('norm zE', 'E352:')
452518c9b13SBram Moolenaar  endfor
453518c9b13SBram Moolenaar
454518c9b13SBram Moolenaar  set foldmethod=manual
455518c9b13SBram Moolenaar  call assert_fails('norm zd', 'E490:')
456518c9b13SBram Moolenaar  call assert_fails('norm zo', 'E490:')
457518c9b13SBram Moolenaar  call assert_fails('3fold',   'E16:')
458518c9b13SBram Moolenaar
459518c9b13SBram Moolenaar  set foldmethod=marker
460518c9b13SBram Moolenaar  set nomodifiable
461518c9b13SBram Moolenaar  call assert_fails('1,2fold', 'E21:')
462518c9b13SBram Moolenaar
463518c9b13SBram Moolenaar  set modifiable&
464518c9b13SBram Moolenaar  set foldmethod&
465518c9b13SBram Moolenaar  bw!
466518c9b13SBram Moolenaarendfunc
467495b7dd2SBram Moolenaar
468495b7dd2SBram Moolenaarfunc Test_foldtext_recursive()
469495b7dd2SBram Moolenaar  new
470495b7dd2SBram Moolenaar  call setline(1, ['{{{', 'some text', '}}}'])
471495b7dd2SBram Moolenaar  setlocal foldenable foldmethod=marker foldtext=foldtextresult(v\:foldstart)
472495b7dd2SBram Moolenaar  " This was crashing because of endless recursion.
473495b7dd2SBram Moolenaar  2foldclose
474495b7dd2SBram Moolenaar  redraw
475495b7dd2SBram Moolenaar  call assert_equal(1, foldlevel(2))
476495b7dd2SBram Moolenaar  call assert_equal(1, foldclosed(2))
477495b7dd2SBram Moolenaar  call assert_equal(3, foldclosedend(2))
478495b7dd2SBram Moolenaar  bwipe!
479495b7dd2SBram Moolenaarendfunc
480430dc5d3SBram Moolenaar
481430dc5d3SBram Moolenaar" Various fold related tests
482430dc5d3SBram Moolenaar
483430dc5d3SBram Moolenaar" Basic test if a fold can be created, opened, moving to the end and closed
484430dc5d3SBram Moolenaarfunc Test_fold_manual()
4855c504f68SBram Moolenaar  new
486430dc5d3SBram Moolenaar  set fdm=manual
487430dc5d3SBram Moolenaar
488430dc5d3SBram Moolenaar  let content = ['1 aa', '2 bb', '3 cc']
489430dc5d3SBram Moolenaar  call append(0, content)
490430dc5d3SBram Moolenaar  call cursor(1, 1)
491430dc5d3SBram Moolenaar  normal zf2j
492430dc5d3SBram Moolenaar  call assert_equal('1 aa', getline(foldclosed('.')))
493430dc5d3SBram Moolenaar  normal zo
494430dc5d3SBram Moolenaar  call assert_equal(-1, foldclosed('.'))
495430dc5d3SBram Moolenaar  normal ]z
496430dc5d3SBram Moolenaar  call assert_equal('3 cc', getline('.'))
497430dc5d3SBram Moolenaar  normal zc
498430dc5d3SBram Moolenaar  call assert_equal('1 aa', getline(foldclosed('.')))
499430dc5d3SBram Moolenaar
500*68ffe8caSBram Moolenaar  " Create a fold inside a closed fold after setting 'foldlevel'
501*68ffe8caSBram Moolenaar  %d _
502*68ffe8caSBram Moolenaar  call setline(1, range(1, 5))
503*68ffe8caSBram Moolenaar  1,5fold
504*68ffe8caSBram Moolenaar  normal zR
505*68ffe8caSBram Moolenaar  2,4fold
506*68ffe8caSBram Moolenaar  set foldlevel=1
507*68ffe8caSBram Moolenaar  3fold
508*68ffe8caSBram Moolenaar  call assert_equal([1, 3, 3, 3, 1], map(range(1, 5), {->foldlevel(v:val)}))
509*68ffe8caSBram Moolenaar  set foldlevel&
510*68ffe8caSBram Moolenaar
511*68ffe8caSBram Moolenaar  " Create overlapping folds (at the start and at the end)
512*68ffe8caSBram Moolenaar  normal zE
513*68ffe8caSBram Moolenaar  2,3fold
514*68ffe8caSBram Moolenaar  normal zR
515*68ffe8caSBram Moolenaar  3,4fold
516*68ffe8caSBram Moolenaar  call assert_equal([0, 2, 2, 1, 0], map(range(1, 5), {->foldlevel(v:val)}))
517*68ffe8caSBram Moolenaar  normal zE
518*68ffe8caSBram Moolenaar  3,4fold
519*68ffe8caSBram Moolenaar  normal zR
520*68ffe8caSBram Moolenaar  2,3fold
521*68ffe8caSBram Moolenaar  call assert_equal([0, 1, 2, 2, 0], map(range(1, 5), {->foldlevel(v:val)}))
522*68ffe8caSBram Moolenaar
523*68ffe8caSBram Moolenaar  " Create a nested fold across two non-adjoining folds
524*68ffe8caSBram Moolenaar  %d _
525*68ffe8caSBram Moolenaar  call setline(1, range(1, 7))
526*68ffe8caSBram Moolenaar  1,2fold
527*68ffe8caSBram Moolenaar  normal zR
528*68ffe8caSBram Moolenaar  4,5fold
529*68ffe8caSBram Moolenaar  normal zR
530*68ffe8caSBram Moolenaar  6,7fold
531*68ffe8caSBram Moolenaar  normal zR
532*68ffe8caSBram Moolenaar  1,5fold
533*68ffe8caSBram Moolenaar  call assert_equal([2, 2, 1, 2, 2, 1, 1],
534*68ffe8caSBram Moolenaar        \ map(range(1, 7), {->foldlevel(v:val)}))
535*68ffe8caSBram Moolenaar
536*68ffe8caSBram Moolenaar  " A newly created nested fold should be closed
537*68ffe8caSBram Moolenaar  %d _
538*68ffe8caSBram Moolenaar  call setline(1, range(1, 6))
539*68ffe8caSBram Moolenaar  1,6fold
540*68ffe8caSBram Moolenaar  normal zR
541*68ffe8caSBram Moolenaar  3,4fold
542*68ffe8caSBram Moolenaar  normal zR
543*68ffe8caSBram Moolenaar  2,5fold
544*68ffe8caSBram Moolenaar  call assert_equal([1, 2, 3, 3, 2, 1], map(range(1, 6), {->foldlevel(v:val)}))
545*68ffe8caSBram Moolenaar  call assert_equal(2, foldclosed(4))
546*68ffe8caSBram Moolenaar  call assert_equal(5, foldclosedend(4))
547*68ffe8caSBram Moolenaar
548*68ffe8caSBram Moolenaar  " Test zO, zC and zA on a line with no folds.
549*68ffe8caSBram Moolenaar  normal zE
550*68ffe8caSBram Moolenaar  call assert_fails('normal zO', 'E490:')
551*68ffe8caSBram Moolenaar  call assert_fails('normal zC', 'E490:')
552*68ffe8caSBram Moolenaar  call assert_fails('normal zA', 'E490:')
553*68ffe8caSBram Moolenaar
554430dc5d3SBram Moolenaar  set fdm&
5555c504f68SBram Moolenaar  bw!
556430dc5d3SBram Moolenaarendfunc
557430dc5d3SBram Moolenaar
558430dc5d3SBram Moolenaar" test folding with markers.
559430dc5d3SBram Moolenaarfunc Test_fold_marker()
5605c504f68SBram Moolenaar  new
561430dc5d3SBram Moolenaar  set fdm=marker fdl=1 fdc=3
562430dc5d3SBram Moolenaar
563430dc5d3SBram Moolenaar  let content = ['4 dd {{{', '5 ee {{{ }}}', '6 ff }}}']
564430dc5d3SBram Moolenaar  call append(0, content)
565430dc5d3SBram Moolenaar  call cursor(2, 1)
566430dc5d3SBram Moolenaar  call assert_equal(2, foldlevel('.'))
567430dc5d3SBram Moolenaar  normal [z
568430dc5d3SBram Moolenaar  call assert_equal(1, foldlevel('.'))
569430dc5d3SBram Moolenaar  exe "normal jo{{ \<Esc>r{jj"
570430dc5d3SBram Moolenaar  call assert_equal(1, foldlevel('.'))
571430dc5d3SBram Moolenaar  normal kYpj
572430dc5d3SBram Moolenaar  call assert_equal(0, foldlevel('.'))
573430dc5d3SBram Moolenaar
5745c504f68SBram Moolenaar  " Use only closing fold marker (without and with a count)
5755c504f68SBram Moolenaar  set fdl&
5765c504f68SBram Moolenaar  %d _
5775c504f68SBram Moolenaar  call setline(1, ['one }}}', 'two'])
5785c504f68SBram Moolenaar  call assert_equal([0, 0], [foldlevel(1), foldlevel(2)])
5795c504f68SBram Moolenaar  %d _
5805c504f68SBram Moolenaar  call setline(1, ['one }}}4', 'two'])
5815c504f68SBram Moolenaar  call assert_equal([4, 3], [foldlevel(1), foldlevel(2)])
5825c504f68SBram Moolenaar
583430dc5d3SBram Moolenaar  set fdm& fdl& fdc&
5845c504f68SBram Moolenaar  bw!
585430dc5d3SBram Moolenaarendfunc
586430dc5d3SBram Moolenaar
5874af7259bSBram Moolenaar" test create fold markers with C filetype
5884af7259bSBram Moolenaarfunc Test_fold_create_marker_in_C()
5895c504f68SBram Moolenaar  bw!
5904af7259bSBram Moolenaar  set fdm=marker fdl=9
5914af7259bSBram Moolenaar  set filetype=c
5924af7259bSBram Moolenaar
593c79745a8SBram Moolenaar  let content =<< trim [CODE]
594c79745a8SBram Moolenaar    /*
595c79745a8SBram Moolenaar     * comment
596c79745a8SBram Moolenaar     *
597c79745a8SBram Moolenaar     *
598c79745a8SBram Moolenaar     */
599c79745a8SBram Moolenaar    int f(int* p) {
600c79745a8SBram Moolenaar        *p = 3;
601c79745a8SBram Moolenaar        return 0;
602c79745a8SBram Moolenaar    }
603c79745a8SBram Moolenaar  [CODE]
604c79745a8SBram Moolenaar
6054af7259bSBram Moolenaar  for c in range(len(content) - 1)
6064af7259bSBram Moolenaar    bw!
6074af7259bSBram Moolenaar    call append(0, content)
6084af7259bSBram Moolenaar    call cursor(c + 1, 1)
6094af7259bSBram Moolenaar    norm! zfG
6104af7259bSBram Moolenaar    call assert_equal(content[c] . (c < 4 ? '{{{' : '/*{{{*/'), getline(c + 1))
6114af7259bSBram Moolenaar  endfor
6124af7259bSBram Moolenaar
6134af7259bSBram Moolenaar  set fdm& fdl&
6145c504f68SBram Moolenaar  bw!
6154af7259bSBram Moolenaarendfunc
6164af7259bSBram Moolenaar
617430dc5d3SBram Moolenaar" test folding with indent
618430dc5d3SBram Moolenaarfunc Test_fold_indent()
6195c504f68SBram Moolenaar  new
620430dc5d3SBram Moolenaar  set fdm=indent sw=2
621430dc5d3SBram Moolenaar
622430dc5d3SBram Moolenaar  let content = ['1 aa', '2 bb', '3 cc']
623430dc5d3SBram Moolenaar  call append(0, content)
624430dc5d3SBram Moolenaar  call cursor(2, 1)
625430dc5d3SBram Moolenaar  exe "normal i  \<Esc>jI    "
626430dc5d3SBram Moolenaar  call assert_equal(2, foldlevel('.'))
627430dc5d3SBram Moolenaar  normal k
628430dc5d3SBram Moolenaar  call assert_equal(1, foldlevel('.'))
629430dc5d3SBram Moolenaar
630430dc5d3SBram Moolenaar  set fdm& sw&
6315c504f68SBram Moolenaar  bw!
632430dc5d3SBram Moolenaarendfunc
633430dc5d3SBram Moolenaar
634430dc5d3SBram Moolenaar" test syntax folding
635430dc5d3SBram Moolenaarfunc Test_fold_syntax()
6366d91bcb4SBram Moolenaar  CheckFeature syntax
637430dc5d3SBram Moolenaar
6385c504f68SBram Moolenaar  new
639430dc5d3SBram Moolenaar  set fdm=syntax fdl=0
640430dc5d3SBram Moolenaar
641430dc5d3SBram Moolenaar  syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
642430dc5d3SBram Moolenaar  syn region Fd1 start="ee" end="ff" fold contained
643430dc5d3SBram Moolenaar  syn region Fd2 start="gg" end="hh" fold contained
644430dc5d3SBram Moolenaar  syn region Fd3 start="commentstart" end="commentend" fold contained
645430dc5d3SBram Moolenaar  let content = ['3 cc', '4 dd {{{', '5 ee {{{ }}}', '{{{{', '6 ff }}}',
646430dc5d3SBram Moolenaar	      \ '6 ff }}}', '7 gg', '8 hh', '9 ii']
647430dc5d3SBram Moolenaar  call append(0, content)
648430dc5d3SBram Moolenaar  normal Gzk
649430dc5d3SBram Moolenaar  call assert_equal('9 ii', getline('.'))
650430dc5d3SBram Moolenaar  normal k
651430dc5d3SBram Moolenaar  call assert_equal('3 cc', getline('.'))
652430dc5d3SBram Moolenaar  exe "normal jAcommentstart   \<Esc>Acommentend"
653430dc5d3SBram Moolenaar  set fdl=1
654430dc5d3SBram Moolenaar  normal 3j
655430dc5d3SBram Moolenaar  call assert_equal('7 gg', getline('.'))
656430dc5d3SBram Moolenaar  set fdl=0
657430dc5d3SBram Moolenaar  exe "normal zO\<C-L>j"
658430dc5d3SBram Moolenaar  call assert_equal('8 hh', getline('.'))
659430dc5d3SBram Moolenaar  syn clear Fd1 Fd2 Fd3 Hup
660430dc5d3SBram Moolenaar
661430dc5d3SBram Moolenaar  set fdm& fdl&
6625c504f68SBram Moolenaar  bw!
663430dc5d3SBram Moolenaarendfunc
664430dc5d3SBram Moolenaar
665430dc5d3SBram Moolenaarfunc Flvl()
666430dc5d3SBram Moolenaar  let l = getline(v:lnum)
667430dc5d3SBram Moolenaar  if l =~ "bb$"
668430dc5d3SBram Moolenaar    return 2
669430dc5d3SBram Moolenaar  elseif l =~ "gg$"
670430dc5d3SBram Moolenaar    return "s1"
671430dc5d3SBram Moolenaar  elseif l =~ "ii$"
672430dc5d3SBram Moolenaar    return ">2"
673430dc5d3SBram Moolenaar  elseif l =~ "kk$"
674430dc5d3SBram Moolenaar    return "0"
675430dc5d3SBram Moolenaar  endif
676430dc5d3SBram Moolenaar  return "="
677430dc5d3SBram Moolenaarendfun
678430dc5d3SBram Moolenaar
679430dc5d3SBram Moolenaar" test expression folding
680430dc5d3SBram Moolenaarfunc Test_fold_expr()
6815c504f68SBram Moolenaar  new
682430dc5d3SBram Moolenaar  set fdm=expr fde=Flvl()
683430dc5d3SBram Moolenaar
684430dc5d3SBram Moolenaar  let content = ['1 aa',
685430dc5d3SBram Moolenaar	      \ '2 bb',
686430dc5d3SBram Moolenaar	      \ '3 cc',
687430dc5d3SBram Moolenaar	      \ '4 dd {{{commentstart  commentend',
688430dc5d3SBram Moolenaar	      \ '5 ee {{{ }}}',
689430dc5d3SBram Moolenaar	      \ '{{{',
690430dc5d3SBram Moolenaar	      \ '6 ff }}}',
691430dc5d3SBram Moolenaar	      \ '6 ff }}}',
692430dc5d3SBram Moolenaar	      \ '  7 gg',
693430dc5d3SBram Moolenaar	      \ '    8 hh',
694430dc5d3SBram Moolenaar	      \ '9 ii',
695430dc5d3SBram Moolenaar	      \ 'a jj',
696430dc5d3SBram Moolenaar	      \ 'b kk']
697430dc5d3SBram Moolenaar  call append(0, content)
698430dc5d3SBram Moolenaar  call cursor(1, 1)
699430dc5d3SBram Moolenaar  exe "normal /bb$\<CR>"
700430dc5d3SBram Moolenaar  call assert_equal(2, foldlevel('.'))
701430dc5d3SBram Moolenaar  exe "normal /hh$\<CR>"
702430dc5d3SBram Moolenaar  call assert_equal(1, foldlevel('.'))
703430dc5d3SBram Moolenaar  exe "normal /ii$\<CR>"
704430dc5d3SBram Moolenaar  call assert_equal(2, foldlevel('.'))
705430dc5d3SBram Moolenaar  exe "normal /kk$\<CR>"
706430dc5d3SBram Moolenaar  call assert_equal(0, foldlevel('.'))
707430dc5d3SBram Moolenaar
708430dc5d3SBram Moolenaar  set fdm& fde&
7095c504f68SBram Moolenaar  bw!
710430dc5d3SBram Moolenaarendfunc
711430dc5d3SBram Moolenaar
712430dc5d3SBram Moolenaar" Bug with fdm=indent and moving folds
713430dc5d3SBram Moolenaar" Moving a fold a few times, messes up the folds below the moved fold.
714430dc5d3SBram Moolenaar" Fixed by 7.4.700
715430dc5d3SBram Moolenaarfunc Test_fold_move()
7165c504f68SBram Moolenaar  new
717430dc5d3SBram Moolenaar  set fdm=indent sw=2 fdl=0
718430dc5d3SBram Moolenaar
719430dc5d3SBram Moolenaar  let content = ['', '', 'Line1', '  Line2', '  Line3',
720430dc5d3SBram Moolenaar	      \ 'Line4', '  Line5', '  Line6',
721430dc5d3SBram Moolenaar	      \ 'Line7', '  Line8', '  Line9']
722430dc5d3SBram Moolenaar  call append(0, content)
723430dc5d3SBram Moolenaar  normal zM
724430dc5d3SBram Moolenaar  call cursor(4, 1)
725430dc5d3SBram Moolenaar  move 2
726430dc5d3SBram Moolenaar  move 1
727430dc5d3SBram Moolenaar  call assert_equal(7, foldclosed(7))
728430dc5d3SBram Moolenaar  call assert_equal(8, foldclosedend(7))
729430dc5d3SBram Moolenaar  call assert_equal(0, foldlevel(9))
730430dc5d3SBram Moolenaar  call assert_equal(10, foldclosed(10))
731430dc5d3SBram Moolenaar  call assert_equal(11, foldclosedend(10))
732430dc5d3SBram Moolenaar  call assert_equal('+--  2 lines: Line2', foldtextresult(2))
733a4208966SBram Moolenaar  call assert_equal('+--  2 lines: Line8', 10->foldtextresult())
734430dc5d3SBram Moolenaar
735430dc5d3SBram Moolenaar  set fdm& sw& fdl&
7365c504f68SBram Moolenaar  bw!
737430dc5d3SBram Moolenaarendfunc
738fb094e14SBram Moolenaar
739fb094e14SBram Moolenaar" test for patch 7.3.637
740fb094e14SBram Moolenaar" Cannot catch the error caused by a foldopen when there is no fold.
741fb094e14SBram Moolenaarfunc Test_foldopen_exception()
7425c504f68SBram Moolenaar  new
743fb094e14SBram Moolenaar  let a = 'No error caught'
744fb094e14SBram Moolenaar  try
745fb094e14SBram Moolenaar    foldopen
746fb094e14SBram Moolenaar  catch
747fb094e14SBram Moolenaar    let a = matchstr(v:exception,'^[^ ]*')
748fb094e14SBram Moolenaar  endtry
749fb094e14SBram Moolenaar  call assert_equal('Vim(foldopen):E490:', a)
750fb094e14SBram Moolenaar
751fb094e14SBram Moolenaar  let a = 'No error caught'
752fb094e14SBram Moolenaar  try
753fb094e14SBram Moolenaar    foobar
754fb094e14SBram Moolenaar  catch
755fb094e14SBram Moolenaar    let a = matchstr(v:exception,'^[^ ]*')
756fb094e14SBram Moolenaar  endtry
757fb094e14SBram Moolenaar  call assert_match('E492:', a)
7585c504f68SBram Moolenaar  bw!
759fb094e14SBram Moolenaarendfunc
760907dad72SBram Moolenaar
761907dad72SBram Moolenaarfunc Test_fold_last_line_with_pagedown()
7625c504f68SBram Moolenaar  new
763907dad72SBram Moolenaar  set fdm=manual
764907dad72SBram Moolenaar
765907dad72SBram Moolenaar  let expect = '+-- 11 lines: 9---'
766907dad72SBram Moolenaar  let content = range(1,19)
767907dad72SBram Moolenaar  call append(0, content)
768907dad72SBram Moolenaar  normal dd9G
769907dad72SBram Moolenaar  normal zfG
770907dad72SBram Moolenaar  normal zt
771907dad72SBram Moolenaar  call assert_equal('9', getline(foldclosed('.')))
772907dad72SBram Moolenaar  call assert_equal('19', getline(foldclosedend('.')))
773907dad72SBram Moolenaar  call assert_equal(expect, ScreenLines(1, len(expect))[0])
774907dad72SBram Moolenaar  call feedkeys("\<C-F>", 'xt')
775907dad72SBram Moolenaar  call assert_equal(expect, ScreenLines(1, len(expect))[0])
776907dad72SBram Moolenaar  call feedkeys("\<C-F>", 'xt')
777907dad72SBram Moolenaar  call assert_equal(expect, ScreenLines(1, len(expect))[0])
778907dad72SBram Moolenaar  call feedkeys("\<C-B>\<C-F>\<C-F>", 'xt')
779907dad72SBram Moolenaar  call assert_equal(expect, ScreenLines(1, len(expect))[0])
780907dad72SBram Moolenaar
781907dad72SBram Moolenaar  set fdm&
7825c504f68SBram Moolenaar  bw!
783907dad72SBram Moolenaarendfunc
7847701f308SBram Moolenaar
7857701f308SBram Moolenaarfunc Test_folds_with_rnu()
7868c5a278fSBram Moolenaar  CheckScreendump
7877701f308SBram Moolenaar
7887701f308SBram Moolenaar  call writefile([
7897701f308SBram Moolenaar	\ 'set fdm=marker rnu foldcolumn=2',
7907701f308SBram Moolenaar	\ 'call setline(1, ["{{{1", "nline 1", "{{{1", "line 2"])',
7917701f308SBram Moolenaar	\ ], 'Xtest_folds_with_rnu')
7927701f308SBram Moolenaar  let buf = RunVimInTerminal('-S Xtest_folds_with_rnu', {})
7937701f308SBram Moolenaar
7947701f308SBram Moolenaar  call VerifyScreenDump(buf, 'Test_folds_with_rnu_01', {})
7957701f308SBram Moolenaar  call term_sendkeys(buf, "j")
7967701f308SBram Moolenaar  call VerifyScreenDump(buf, 'Test_folds_with_rnu_02', {})
7977701f308SBram Moolenaar
7987701f308SBram Moolenaar  " clean up
7997701f308SBram Moolenaar  call StopVimInTerminal(buf)
8007701f308SBram Moolenaar  call delete('Xtest_folds_with_rnu')
8017701f308SBram Moolenaarendfunc
80253932819SBram Moolenaar
80353932819SBram Moolenaarfunc Test_folds_marker_in_comment2()
80453932819SBram Moolenaar  new
80553932819SBram Moolenaar  call setline(1, ['Lorem ipsum dolor sit', 'Lorem ipsum dolor sit', 'Lorem ipsum dolor sit'])
80653932819SBram Moolenaar  setl fen fdm=marker
80753932819SBram Moolenaar  setl commentstring=<!--%s-->
80853932819SBram Moolenaar  setl comments=s:<!--,m:\ \ \ \ ,e:-->
80953932819SBram Moolenaar  norm! zf2j
81053932819SBram Moolenaar  setl nofen
81153932819SBram Moolenaar  :1y
81253932819SBram Moolenaar  call assert_equal(['Lorem ipsum dolor sit<!--{{{-->'], getreg(0,1,1))
81353932819SBram Moolenaar  :+2y
81453932819SBram Moolenaar  call assert_equal(['Lorem ipsum dolor sit<!--}}}-->'], getreg(0,1,1))
81553932819SBram Moolenaar
81653932819SBram Moolenaar  set foldmethod&
81753932819SBram Moolenaar  bwipe!
81853932819SBram Moolenaarendfunc
8199a4a8c4dSBram Moolenaar
8209a4a8c4dSBram Moolenaarfunc Test_fold_delete_with_marker()
8219a4a8c4dSBram Moolenaar  new
8229a4a8c4dSBram Moolenaar  call setline(1, ['func Func() {{{1', 'endfunc'])
8239a4a8c4dSBram Moolenaar  1,2yank
8249a4a8c4dSBram Moolenaar  new
8259a4a8c4dSBram Moolenaar  set fdm=marker
8269a4a8c4dSBram Moolenaar  call setline(1, 'x')
8279a4a8c4dSBram Moolenaar  normal! Vp
8289a4a8c4dSBram Moolenaar  normal! zd
8299a4a8c4dSBram Moolenaar  call assert_equal(['func Func() ', 'endfunc'], getline(1, '$'))
8309a4a8c4dSBram Moolenaar
8319a4a8c4dSBram Moolenaar  set fdm&
8329a4a8c4dSBram Moolenaar  bwipe!
8339a4a8c4dSBram Moolenaar  bwipe!
8349a4a8c4dSBram Moolenaarendfunc
8357a9bd7c1SBram Moolenaar
8367a9bd7c1SBram Moolenaarfunc Test_fold_delete_with_marker_and_whichwrap()
8377a9bd7c1SBram Moolenaar  new
8387a9bd7c1SBram Moolenaar  let content1 = ['']
8397a9bd7c1SBram Moolenaar  let content2 = ['folded line 1 "{{{1', '  test', '  test2', '  test3', '', 'folded line 2 "{{{1', '  test', '  test2', '  test3']
8407a9bd7c1SBram Moolenaar  call setline(1, content1 + content2)
8417a9bd7c1SBram Moolenaar  set fdm=marker ww+=l
8427a9bd7c1SBram Moolenaar  normal! x
8437a9bd7c1SBram Moolenaar  call assert_equal(content2, getline(1, '$'))
8447a9bd7c1SBram Moolenaar  set fdm& ww&
8457a9bd7c1SBram Moolenaar  bwipe!
8467a9bd7c1SBram Moolenaarendfunc
8473b68123cSBram Moolenaar
8483b68123cSBram Moolenaarfunc Test_fold_delete_first_line()
8493b68123cSBram Moolenaar  new
8503b68123cSBram Moolenaar  call setline(1, [
8513b68123cSBram Moolenaar	\ '" x {{{1',
8523b68123cSBram Moolenaar	\ '" a',
8533b68123cSBram Moolenaar	\ '" aa',
8543b68123cSBram Moolenaar	\ '" x {{{1',
8553b68123cSBram Moolenaar	\ '" b',
8563b68123cSBram Moolenaar	\ '" bb',
8573b68123cSBram Moolenaar	\ '" x {{{1',
8583b68123cSBram Moolenaar	\ '" c',
8593b68123cSBram Moolenaar	\ '" cc',
8603b68123cSBram Moolenaar	\ ])
8613b68123cSBram Moolenaar  set foldmethod=marker
8623b68123cSBram Moolenaar  1
8633b68123cSBram Moolenaar  normal dj
8643b68123cSBram Moolenaar  call assert_equal([
8653b68123cSBram Moolenaar	\ '" x {{{1',
8663b68123cSBram Moolenaar	\ '" c',
8673b68123cSBram Moolenaar	\ '" cc',
8683b68123cSBram Moolenaar	\ ], getline(1,'$'))
8693b68123cSBram Moolenaar  bwipe!
8703b68123cSBram Moolenaar  set foldmethod&
8713b68123cSBram Moolenaarendfunc
8729d8d0b5cSBram Moolenaar
873*68ffe8caSBram Moolenaar" Add a test for deleting the outer fold of a nested fold and promoting the
874*68ffe8caSBram Moolenaar" inner folds to one level up with already a fold at that level following the
875*68ffe8caSBram Moolenaar" nested fold.
876*68ffe8caSBram Moolenaarfunc Test_fold_delete_recursive_fold()
877*68ffe8caSBram Moolenaar  new
878*68ffe8caSBram Moolenaar  call setline(1, range(1, 7))
879*68ffe8caSBram Moolenaar  2,3fold
880*68ffe8caSBram Moolenaar  normal zR
881*68ffe8caSBram Moolenaar  4,5fold
882*68ffe8caSBram Moolenaar  normal zR
883*68ffe8caSBram Moolenaar  1,5fold
884*68ffe8caSBram Moolenaar  normal zR
885*68ffe8caSBram Moolenaar  6,7fold
886*68ffe8caSBram Moolenaar  normal zR
887*68ffe8caSBram Moolenaar  normal 1Gzd
888*68ffe8caSBram Moolenaar  normal 1Gzj
889*68ffe8caSBram Moolenaar  call assert_equal(2, line('.'))
890*68ffe8caSBram Moolenaar  normal zj
891*68ffe8caSBram Moolenaar  call assert_equal(4, line('.'))
892*68ffe8caSBram Moolenaar  normal zj
893*68ffe8caSBram Moolenaar  call assert_equal(6, line('.'))
894*68ffe8caSBram Moolenaar  bw!
895*68ffe8caSBram Moolenaarendfunc
896*68ffe8caSBram Moolenaar
8979d8d0b5cSBram Moolenaar" Test for errors in 'foldexpr'
8989d8d0b5cSBram Moolenaarfunc Test_fold_expr_error()
8999d8d0b5cSBram Moolenaar  new
9009d8d0b5cSBram Moolenaar  call setline(1, ['one', 'two', 'three'])
9015c504f68SBram Moolenaar  " In a window with no folds, foldlevel() should return 0
9025c504f68SBram Moolenaar  call assert_equal(0, foldlevel(1))
9039d8d0b5cSBram Moolenaar
9049d8d0b5cSBram Moolenaar  " Return a list from the expression
9059d8d0b5cSBram Moolenaar  set foldexpr=[]
9069d8d0b5cSBram Moolenaar  set foldmethod=expr
9079d8d0b5cSBram Moolenaar  for i in range(3)
9089d8d0b5cSBram Moolenaar    call assert_equal(0, foldlevel(i))
9099d8d0b5cSBram Moolenaar  endfor
9109d8d0b5cSBram Moolenaar
9119d8d0b5cSBram Moolenaar  " expression error
9129d8d0b5cSBram Moolenaar  set foldexpr=[{]
9139d8d0b5cSBram Moolenaar  set foldmethod=expr
9149d8d0b5cSBram Moolenaar  for i in range(3)
9159d8d0b5cSBram Moolenaar    call assert_equal(0, foldlevel(i))
9169d8d0b5cSBram Moolenaar  endfor
9179d8d0b5cSBram Moolenaar
9189d8d0b5cSBram Moolenaar  set foldmethod& foldexpr&
9199d8d0b5cSBram Moolenaar  close!
9209d8d0b5cSBram Moolenaarendfunc
9219d8d0b5cSBram Moolenaar
922da697645SBram Moolenaarfunc Test_undo_fold_deletion()
923da697645SBram Moolenaar  new
924da697645SBram Moolenaar  set fdm=marker
925da697645SBram Moolenaar  let lines =<< trim END
926da697645SBram Moolenaar      " {{{
927da697645SBram Moolenaar      " }}}1
928da697645SBram Moolenaar      " {{{
929da697645SBram Moolenaar  END
930da697645SBram Moolenaar  call setline(1, lines)
931da697645SBram Moolenaar  3d
932da697645SBram Moolenaar  g/"/d
933da697645SBram Moolenaar  undo
934da697645SBram Moolenaar  redo
935da697645SBram Moolenaar  eval getline(1, '$')->assert_equal([''])
936da697645SBram Moolenaar
937da697645SBram Moolenaar  set fdm&vim
938da697645SBram Moolenaar  bwipe!
939da697645SBram Moolenaarendfunc
940da697645SBram Moolenaar
941c136a352SBram Moolenaar" this was crashing
942c136a352SBram Moolenaarfunc Test_move_no_folds()
943c136a352SBram Moolenaar  new
944c136a352SBram Moolenaar  fold
945c136a352SBram Moolenaar  setlocal fdm=expr
946c136a352SBram Moolenaar  normal zj
947c136a352SBram Moolenaar  bwipe!
948c136a352SBram Moolenaarendfunc
949c136a352SBram Moolenaar
9505e1f22ffSBram Moolenaar" this was crashing
9515e1f22ffSBram Moolenaarfunc Test_fold_create_delete_create()
9525e1f22ffSBram Moolenaar  new
9535e1f22ffSBram Moolenaar  fold
9545e1f22ffSBram Moolenaar  fold
9555e1f22ffSBram Moolenaar  normal zd
9565e1f22ffSBram Moolenaar  fold
9575e1f22ffSBram Moolenaar  bwipe!
9585e1f22ffSBram Moolenaarendfunc
9595e1f22ffSBram Moolenaar
9606a78f328SBram Moolenaar" this was crashing
9616a78f328SBram Moolenaarfunc Test_fold_create_delete()
9626a78f328SBram Moolenaar  new
9636a78f328SBram Moolenaar  norm zFzFzdzj
9646a78f328SBram Moolenaar  bwipe!
9656a78f328SBram Moolenaarendfunc
9666a78f328SBram Moolenaar
967e71996bdSBram Moolenaarfunc Test_fold_relative_move()
9685c504f68SBram Moolenaar  new
969e71996bdSBram Moolenaar  set fdm=indent sw=2 wrap tw=80
970e71996bdSBram Moolenaar
9713c49e74eSBram Moolenaar  let longtext = repeat('x', &columns + 1)
9723c49e74eSBram Moolenaar  let content = [ '  foo', '  ' .. longtext, '  baz',
9733c49e74eSBram Moolenaar              \   longtext,
9743c49e74eSBram Moolenaar              \   '  foo', '  ' .. longtext, '  baz'
975e71996bdSBram Moolenaar              \ ]
976e71996bdSBram Moolenaar  call append(0, content)
977e71996bdSBram Moolenaar
978e71996bdSBram Moolenaar  normal zM
979e71996bdSBram Moolenaar
9803c49e74eSBram Moolenaar  for lnum in range(1, 3)
9813c49e74eSBram Moolenaar    call cursor(lnum, 1)
982e71996bdSBram Moolenaar    call assert_true(foldclosed(line('.')))
983e71996bdSBram Moolenaar    normal gj
984e71996bdSBram Moolenaar    call assert_equal(2, winline())
9853c49e74eSBram Moolenaar  endfor
986e71996bdSBram Moolenaar
987e71996bdSBram Moolenaar  call cursor(2, 1)
988e71996bdSBram Moolenaar  call assert_true(foldclosed(line('.')))
989e71996bdSBram Moolenaar  normal 2gj
990e71996bdSBram Moolenaar  call assert_equal(3, winline())
991e71996bdSBram Moolenaar
9923c49e74eSBram Moolenaar  for lnum in range(5, 7)
9933c49e74eSBram Moolenaar    call cursor(lnum, 1)
994e71996bdSBram Moolenaar    call assert_true(foldclosed(line('.')))
995e71996bdSBram Moolenaar    normal gk
996e71996bdSBram Moolenaar    call assert_equal(3, winline())
9973c49e74eSBram Moolenaar  endfor
998e71996bdSBram Moolenaar
999e71996bdSBram Moolenaar  call cursor(6, 1)
1000e71996bdSBram Moolenaar  call assert_true(foldclosed(line('.')))
1001e71996bdSBram Moolenaar  normal 2gk
1002e71996bdSBram Moolenaar  call assert_equal(2, winline())
1003e71996bdSBram Moolenaar
1004e71996bdSBram Moolenaar  set fdm& sw& wrap& tw&
10055c504f68SBram Moolenaar  bw!
1006e71996bdSBram Moolenaarendfunc
1007e71996bdSBram Moolenaar
10084fa11757SBram Moolenaar" Test for using multibyte characters as 'foldopen', 'foldclose' and
10094fa11757SBram Moolenaar" 'foldsetp' items in 'fillchars'
10104fa11757SBram Moolenaarfunc s:mbyte_fillchar_tests(fo, fc, fs)
10114fa11757SBram Moolenaar  setlocal foldcolumn=3
10124fa11757SBram Moolenaar
10134fa11757SBram Moolenaar  normal zE
10144fa11757SBram Moolenaar  1,2fold
10154fa11757SBram Moolenaar  call assert_equal([a:fc .. '  +--  2 ', '   three  '],
10164fa11757SBram Moolenaar        \ ScreenLines([1, 2], 10))
10174fa11757SBram Moolenaar  1,2foldopen
10184fa11757SBram Moolenaar  call assert_equal([a:fo .. '  one ', a:fs .. '  two '],
10194fa11757SBram Moolenaar        \ ScreenLines([1, 2], 7))
10204fa11757SBram Moolenaar  1,2foldclose
10214fa11757SBram Moolenaar  redraw!
10224fa11757SBram Moolenaar  call assert_equal([a:fc .. '  +--  2 ', '   three  '],
10234fa11757SBram Moolenaar        \  ScreenLines([1, 2], 10))
10244fa11757SBram Moolenaar
10254fa11757SBram Moolenaar  " Two level fold
10264fa11757SBram Moolenaar  normal zE
10274fa11757SBram Moolenaar  2,3fold
10284fa11757SBram Moolenaar  1,4fold
10294fa11757SBram Moolenaar  call assert_equal([a:fc .. '  +--  4 ', '   five   '],
10304fa11757SBram Moolenaar        \ ScreenLines([1, 2], 10))
10314fa11757SBram Moolenaar  1,4foldopen
10324fa11757SBram Moolenaar  call assert_equal([a:fo .. '  one    ', a:fs .. a:fc .. ' +---  2'],
10334fa11757SBram Moolenaar        \ ScreenLines([1, 2], 10))
10344fa11757SBram Moolenaar  1,4foldopen
10354fa11757SBram Moolenaar  call assert_equal([a:fo .. '  one    ', a:fs .. a:fo .. ' two    ',
10364fa11757SBram Moolenaar        \ a:fs .. a:fs .. ' three  '], ScreenLines([1, 3], 10))
10374fa11757SBram Moolenaar  2,3foldclose
10384fa11757SBram Moolenaar  call assert_equal([a:fo .. '  one    ', a:fs .. a:fc .. ' +---  2'],
10394fa11757SBram Moolenaar        \ ScreenLines([1, 2], 10))
10404fa11757SBram Moolenaar  1,4foldclose
10414fa11757SBram Moolenaar  call assert_equal([a:fc .. '  +--  4 ', '   five   '],
10424fa11757SBram Moolenaar        \ ScreenLines([1, 2], 10))
10434fa11757SBram Moolenaar
10444fa11757SBram Moolenaar  " Three level fold
10454fa11757SBram Moolenaar  normal zE
10464fa11757SBram Moolenaar  3,4fold
10474fa11757SBram Moolenaar  2,5fold
10484fa11757SBram Moolenaar  1,6fold
10494fa11757SBram Moolenaar  call assert_equal([a:fc .. '  +--  6 '], ScreenLines(1, 10))
10504fa11757SBram Moolenaar  " open all the folds
10514fa11757SBram Moolenaar  normal zR
10524fa11757SBram Moolenaar  call assert_equal([
10534fa11757SBram Moolenaar        \ a:fo .. '  one    ',
10544fa11757SBram Moolenaar        \ a:fs .. a:fo .. ' two    ',
10554fa11757SBram Moolenaar        \ '2' .. a:fo .. ' three  ',
10564fa11757SBram Moolenaar        \ '23 four   ',
10574fa11757SBram Moolenaar        \ a:fs .. a:fs .. ' five   ',
10584fa11757SBram Moolenaar        \ a:fs .. '  six    ',
10594fa11757SBram Moolenaar        \ ], ScreenLines([1, 6], 10))
10604fa11757SBram Moolenaar  " close the innermost fold
10614fa11757SBram Moolenaar  3,4foldclose
10624fa11757SBram Moolenaar  call assert_equal([
10634fa11757SBram Moolenaar        \ a:fo .. '  one    ',
10644fa11757SBram Moolenaar        \ a:fs .. a:fo .. ' two    ',
10654fa11757SBram Moolenaar        \ a:fs .. a:fs .. a:fc .. '+----  ',
10664fa11757SBram Moolenaar        \ a:fs .. a:fs .. ' five   ',
10674fa11757SBram Moolenaar        \ a:fs .. '  six    ',
10684fa11757SBram Moolenaar        \ ], ScreenLines([1, 5], 10))
10694fa11757SBram Moolenaar  " close the next fold
10704fa11757SBram Moolenaar  2,5foldclose
10714fa11757SBram Moolenaar  call assert_equal([
10724fa11757SBram Moolenaar        \ a:fo .. '  one    ',
10734fa11757SBram Moolenaar        \ a:fs .. a:fc .. ' +---  4',
10744fa11757SBram Moolenaar        \ a:fs .. '  six    ',
10754fa11757SBram Moolenaar        \ ], ScreenLines([1, 3], 10))
10764fa11757SBram Moolenaar
10774fa11757SBram Moolenaar  " set the fold column size to 2
10784fa11757SBram Moolenaar  setlocal fdc=2
10794fa11757SBram Moolenaar  normal zR
10804fa11757SBram Moolenaar  call assert_equal([
10814fa11757SBram Moolenaar        \ a:fo .. ' one  ',
10824fa11757SBram Moolenaar        \ a:fo .. ' two  ',
10834fa11757SBram Moolenaar        \ a:fo .. ' three',
10844fa11757SBram Moolenaar        \ '3 four ',
10854fa11757SBram Moolenaar        \ '2 five ',
10864fa11757SBram Moolenaar        \ a:fs .. ' six  ',
10874fa11757SBram Moolenaar        \ ], ScreenLines([1, 6], 7))
10884fa11757SBram Moolenaar
10894fa11757SBram Moolenaar  " set the fold column size to 1
10904fa11757SBram Moolenaar  setlocal fdc=1
10914fa11757SBram Moolenaar  normal zR
10924fa11757SBram Moolenaar  call assert_equal([
10934fa11757SBram Moolenaar        \ a:fo .. 'one   ',
10944fa11757SBram Moolenaar        \ a:fo .. 'two   ',
10954fa11757SBram Moolenaar        \ a:fo .. 'three ',
10964fa11757SBram Moolenaar        \ '3four  ',
10974fa11757SBram Moolenaar        \ '2five  ',
10984fa11757SBram Moolenaar        \ a:fs .. 'six   ',
10994fa11757SBram Moolenaar        \ ], ScreenLines([1, 6], 7))
11004fa11757SBram Moolenaar
1101008bff96SBram Moolenaar  " Enable number and sign columns and place some signs
1102008bff96SBram Moolenaar  setlocal fdc=3
1103008bff96SBram Moolenaar  setlocal number
1104008bff96SBram Moolenaar  setlocal signcolumn=auto
1105008bff96SBram Moolenaar  sign define S1 text=->
1106008bff96SBram Moolenaar  sign place 10 line=3 name=S1
1107008bff96SBram Moolenaar  call assert_equal([
1108008bff96SBram Moolenaar        \ a:fo .. '      1 one  ',
1109008bff96SBram Moolenaar        \ a:fs .. a:fo .. '     2 two  ',
1110008bff96SBram Moolenaar        \ '2' .. a:fo .. ' ->  3 three',
1111008bff96SBram Moolenaar        \ '23     4 four ',
1112008bff96SBram Moolenaar        \ a:fs .. a:fs .. '     5 five ',
1113008bff96SBram Moolenaar        \ a:fs .. '      6 six  '
1114008bff96SBram Moolenaar        \ ], ScreenLines([1, 6], 14))
1115008bff96SBram Moolenaar
1116008bff96SBram Moolenaar  " Test with 'rightleft'
1117008bff96SBram Moolenaar  if has('rightleft')
1118008bff96SBram Moolenaar    setlocal rightleft
1119008bff96SBram Moolenaar    let lines = ScreenLines([1, 6], winwidth(0))
1120008bff96SBram Moolenaar    call assert_equal('o 1      ' .. a:fo,
1121008bff96SBram Moolenaar          \  strcharpart(lines[0], strchars(lines[0]) - 10, 10))
1122008bff96SBram Moolenaar    call assert_equal('t 2     ' .. a:fo .. a:fs,
1123008bff96SBram Moolenaar          \  strcharpart(lines[1], strchars(lines[1]) - 10, 10))
1124008bff96SBram Moolenaar    call assert_equal('t 3  >- ' .. a:fo .. '2',
1125008bff96SBram Moolenaar          \  strcharpart(lines[2], strchars(lines[2]) - 10, 10))
1126008bff96SBram Moolenaar    call assert_equal('f 4     32',
1127008bff96SBram Moolenaar          \  strcharpart(lines[3], strchars(lines[3]) - 10, 10))
1128008bff96SBram Moolenaar    call assert_equal('f 5     ' .. a:fs .. a:fs,
1129008bff96SBram Moolenaar          \  strcharpart(lines[4], strchars(lines[4]) - 10, 10))
1130008bff96SBram Moolenaar    call assert_equal('s 6      ' .. a:fs,
1131008bff96SBram Moolenaar          \  strcharpart(lines[5], strchars(lines[5]) - 10, 10))
1132008bff96SBram Moolenaar    setlocal norightleft
1133008bff96SBram Moolenaar  endif
1134008bff96SBram Moolenaar
1135008bff96SBram Moolenaar  sign unplace *
1136008bff96SBram Moolenaar  sign undefine S1
1137008bff96SBram Moolenaar  setlocal number& signcolumn&
1138008bff96SBram Moolenaar
1139008bff96SBram Moolenaar  " Add a test with more than 9 folds (and then delete some folds)
1140008bff96SBram Moolenaar  normal zE
1141008bff96SBram Moolenaar  for i in range(1, 10)
1142008bff96SBram Moolenaar    normal zfGzo
1143008bff96SBram Moolenaar  endfor
1144008bff96SBram Moolenaar  normal zR
1145008bff96SBram Moolenaar  call assert_equal([
1146008bff96SBram Moolenaar        \ a:fo .. a:fo .. ' one ',
1147008bff96SBram Moolenaar        \ '9> two '
1148008bff96SBram Moolenaar        \ ], ScreenLines([1, 2], 7))
1149008bff96SBram Moolenaar  normal 1Gzd
1150008bff96SBram Moolenaar  call assert_equal([
1151008bff96SBram Moolenaar        \ a:fo .. a:fo .. ' one ',
1152008bff96SBram Moolenaar        \ '89 two '
1153008bff96SBram Moolenaar        \ ], ScreenLines([1, 2], 7))
1154008bff96SBram Moolenaar  normal 1Gzdzdzdzdzdzdzd
1155008bff96SBram Moolenaar  call assert_equal([
1156008bff96SBram Moolenaar        \ a:fo .. a:fo .. ' one ',
1157008bff96SBram Moolenaar        \ a:fs .. a:fs .. ' two '
1158008bff96SBram Moolenaar        \ ], ScreenLines([1, 2], 7))
1159008bff96SBram Moolenaar
1160008bff96SBram Moolenaar  setlocal foldcolumn& number& signcolumn&
11614fa11757SBram Moolenaarendfunc
11624fa11757SBram Moolenaar
11634fa11757SBram Moolenaarfunc Test_foldcolumn_multibyte_char()
11644fa11757SBram Moolenaar  new
11654fa11757SBram Moolenaar  call setline(1, ['one', 'two', 'three', 'four', 'five', 'six'])
11664fa11757SBram Moolenaar  setlocal foldenable foldmethod=manual
11674fa11757SBram Moolenaar
11684fa11757SBram Moolenaar  " First test with the default setting
11694fa11757SBram Moolenaar  call s:mbyte_fillchar_tests('-', '+', '|')
11704fa11757SBram Moolenaar
11714fa11757SBram Moolenaar  " Use multi-byte characters
11724fa11757SBram Moolenaar  set fillchars+=foldopen:▾,foldsep:│,foldclose:▸
11734fa11757SBram Moolenaar  call s:mbyte_fillchar_tests('▾', '▸', '│')
11744fa11757SBram Moolenaar
1175196a1f74SBram Moolenaar  " Use a mix of multi-byte and single-byte characters
1176196a1f74SBram Moolenaar  set fillchars+=foldopen:¬,foldsep:\|,foldclose:+
1177196a1f74SBram Moolenaar  call s:mbyte_fillchar_tests('¬', '+', '|')
1178196a1f74SBram Moolenaar  set fillchars+=foldopen:+,foldsep:\|,foldclose:¬
1179196a1f74SBram Moolenaar  call s:mbyte_fillchar_tests('+', '¬', '|')
1180196a1f74SBram Moolenaar
11814fa11757SBram Moolenaar  bw!
11824fa11757SBram Moolenaar  set foldenable& fdc& fdm& fillchars&
11834fa11757SBram Moolenaarendfunc
11844fa11757SBram Moolenaar
11855c504f68SBram Moolenaar" Test for calling foldlevel() from a fold expression
11865c504f68SBram Moolenaarlet g:FoldLevels = []
11875c504f68SBram Moolenaarfunc FoldExpr1(lnum)
11885c504f68SBram Moolenaar  let f = [a:lnum]
11895c504f68SBram Moolenaar  for i in range(1, line('$'))
11905c504f68SBram Moolenaar    call add(f, foldlevel(i))
11915c504f68SBram Moolenaar  endfor
11925c504f68SBram Moolenaar  call add(g:FoldLevels, f)
11935c504f68SBram Moolenaar  return getline(a:lnum)[0] == "\t"
11945c504f68SBram Moolenaarendfunc
11955c504f68SBram Moolenaar
11965c504f68SBram Moolenaarfunc Test_foldexpr_foldlevel()
11975c504f68SBram Moolenaar  new
11985c504f68SBram Moolenaar  call setline(1, ['one', "\ttwo", "\tthree"])
11995c504f68SBram Moolenaar  setlocal foldmethod=expr
12005c504f68SBram Moolenaar  setlocal foldexpr=FoldExpr1(v:lnum)
12015c504f68SBram Moolenaar  setlocal foldenable
12025c504f68SBram Moolenaar  setlocal foldcolumn=3
12035c504f68SBram Moolenaar  redraw!
12045c504f68SBram Moolenaar  call assert_equal([[1, -1, -1, -1], [2, -1, -1, -1], [3, 0, 1, -1]],
12055c504f68SBram Moolenaar        \ g:FoldLevels)
12065c504f68SBram Moolenaar  set foldmethod& foldexpr& foldenable& foldcolumn&
12075c504f68SBram Moolenaar  bw!
12085c504f68SBram Moolenaarendfunc
12095c504f68SBram Moolenaar
12105c504f68SBram Moolenaar" Test for returning different values from a fold expression
12115c504f68SBram Moolenaarfunc FoldExpr2(lnum)
12125c504f68SBram Moolenaar  if a:lnum == 1 || a:lnum == 4
12135c504f68SBram Moolenaar    return -2
12145c504f68SBram Moolenaar  elseif a:lnum == 2
12155c504f68SBram Moolenaar    return 'a1'
12165c504f68SBram Moolenaar  elseif a:lnum == 3
12175c504f68SBram Moolenaar    return 's4'
12185c504f68SBram Moolenaar  endif
12195c504f68SBram Moolenaar  return '='
12205c504f68SBram Moolenaarendfunc
12215c504f68SBram Moolenaar
12225c504f68SBram Moolenaarfunc Test_foldexpr_2()
12235c504f68SBram Moolenaar  new
12245c504f68SBram Moolenaar  call setline(1, ['one', 'two', 'three', 'four'])
12255c504f68SBram Moolenaar  setlocal foldexpr=FoldExpr2(v:lnum)
12265c504f68SBram Moolenaar  setlocal foldmethod=expr
12275c504f68SBram Moolenaar  call assert_equal([0, 1, 1, 0], [foldlevel(1), foldlevel(2), foldlevel(3),
12285c504f68SBram Moolenaar        \ foldlevel(4)])
12295c504f68SBram Moolenaar  bw!
12305c504f68SBram Moolenaarendfunc
12315c504f68SBram Moolenaar
12325c504f68SBram Moolenaar" Test for the 'foldclose' option
12335c504f68SBram Moolenaarfunc Test_foldclose_opt()
12345c504f68SBram Moolenaar  CheckScreendump
12355c504f68SBram Moolenaar
12365c504f68SBram Moolenaar  let lines =<< trim END
12375c504f68SBram Moolenaar    set foldmethod=manual foldclose=all foldopen=all
12385c504f68SBram Moolenaar    call setline(1, ['one', 'two', 'three', 'four'])
12395c504f68SBram Moolenaar    2,3fold
12405c504f68SBram Moolenaar    func XsaveFoldLevels()
12415c504f68SBram Moolenaar      redraw!
12425c504f68SBram Moolenaar      call writefile([json_encode([foldclosed(1), foldclosed(2), foldclosed(3),
12435c504f68SBram Moolenaar        \ foldclosed(4)])], 'Xoutput', 'a')
12445c504f68SBram Moolenaar    endfunc
12455c504f68SBram Moolenaar  END
12465c504f68SBram Moolenaar  call writefile(lines, 'Xscript')
12475c504f68SBram Moolenaar  let rows = 10
12485c504f68SBram Moolenaar  let buf = RunVimInTerminal('-S Xscript', {'rows': rows})
12495c504f68SBram Moolenaar  call term_wait(buf)
12505c504f68SBram Moolenaar  call term_sendkeys(buf, ":set noruler\n")
12515c504f68SBram Moolenaar  call term_wait(buf)
12525c504f68SBram Moolenaar  call term_sendkeys(buf, ":call XsaveFoldLevels()\n")
12535c504f68SBram Moolenaar  call term_sendkeys(buf, "2G")
12545c504f68SBram Moolenaar  call WaitForAssert({-> assert_equal('two', term_getline(buf, 2))})
12555c504f68SBram Moolenaar  call term_sendkeys(buf, ":call XsaveFoldLevels()\n")
12565c504f68SBram Moolenaar  call term_sendkeys(buf, "4G")
12575c504f68SBram Moolenaar  call WaitForAssert({-> assert_equal('four', term_getline(buf, 3))})
12585c504f68SBram Moolenaar  call term_sendkeys(buf, ":call XsaveFoldLevels()\n")
12595c504f68SBram Moolenaar  call term_sendkeys(buf, "3G")
12605c504f68SBram Moolenaar  call WaitForAssert({-> assert_equal('three', term_getline(buf, 3))})
12615c504f68SBram Moolenaar  call term_sendkeys(buf, ":call XsaveFoldLevels()\n")
12625c504f68SBram Moolenaar  call term_sendkeys(buf, "1G")
12635c504f68SBram Moolenaar  call WaitForAssert({-> assert_equal('four', term_getline(buf, 3))})
12645c504f68SBram Moolenaar  call term_sendkeys(buf, ":call XsaveFoldLevels()\n")
1265*68ffe8caSBram Moolenaar  call term_sendkeys(buf, "2G")
1266*68ffe8caSBram Moolenaar  call WaitForAssert({-> assert_equal('two', term_getline(buf, 2))})
1267*68ffe8caSBram Moolenaar  call term_sendkeys(buf, "k")
1268*68ffe8caSBram Moolenaar  call WaitForAssert({-> assert_equal('four', term_getline(buf, 3))})
12695c504f68SBram Moolenaar
12705c504f68SBram Moolenaar  " clean up
12715c504f68SBram Moolenaar  call StopVimInTerminal(buf)
12725c504f68SBram Moolenaar
12735c504f68SBram Moolenaar  call assert_equal(['[-1,2,2,-1]', '[-1,-1,-1,-1]', '[-1,2,2,-1]',
12745c504f68SBram Moolenaar        \ '[-1,-1,-1,-1]', '[-1,2,2,-1]'], readfile('Xoutput'))
12755c504f68SBram Moolenaar  call delete('Xscript')
12765c504f68SBram Moolenaar  call delete('Xoutput')
12775c504f68SBram Moolenaarendfunc
12785c504f68SBram Moolenaar
12795c504f68SBram Moolenaar" Test for foldtextresult()
12805c504f68SBram Moolenaarfunc Test_foldtextresult()
12815c504f68SBram Moolenaar  new
12825c504f68SBram Moolenaar  call assert_equal('', foldtextresult(-1))
12835c504f68SBram Moolenaar  call assert_equal('', foldtextresult(0))
12845c504f68SBram Moolenaar  call assert_equal('', foldtextresult(1))
12855c504f68SBram Moolenaar  call setline(1, ['one', 'two', 'three', 'four'])
12865c504f68SBram Moolenaar  2,3fold
12875c504f68SBram Moolenaar  call assert_equal('', foldtextresult(1))
12885c504f68SBram Moolenaar  call assert_equal('+--  2 lines: two', foldtextresult(2))
12895c504f68SBram Moolenaar  setlocal foldtext=
12905c504f68SBram Moolenaar  call assert_equal('+--  2 lines folded ', foldtextresult(2))
12915c504f68SBram Moolenaar
12925c504f68SBram Moolenaar  " Fold text for a C comment fold
12935c504f68SBram Moolenaar  %d _
12945c504f68SBram Moolenaar  setlocal foldtext&
12955c504f68SBram Moolenaar  call setline(1, ['', '/*', ' * Comment', ' */', ''])
12965c504f68SBram Moolenaar  2,4fold
12975c504f68SBram Moolenaar  call assert_equal('+--  3 lines: Comment', foldtextresult(2))
12985c504f68SBram Moolenaar
12995c504f68SBram Moolenaar  bw!
13005c504f68SBram Moolenaarendfunc
13015c504f68SBram Moolenaar
13025c504f68SBram Moolenaar" Test for merging two recursive folds when an intermediate line with no fold
13035c504f68SBram Moolenaar" is removed
13045c504f68SBram Moolenaarfunc Test_fold_merge_recrusive()
13055c504f68SBram Moolenaar  new
13065c504f68SBram Moolenaar  call setline(1, ['  one', '    two', 'xxxx', '    three',
13075c504f68SBram Moolenaar        \ '      four', "\tfive"])
13085c504f68SBram Moolenaar  setlocal foldmethod=indent shiftwidth=2
13095c504f68SBram Moolenaar  3d_
13105c504f68SBram Moolenaar  %foldclose
13115c504f68SBram Moolenaar  call assert_equal([1, 5], [foldclosed(5), foldclosedend(1)])
13125c504f68SBram Moolenaar  bw!
13135c504f68SBram Moolenaarendfunc
13145c504f68SBram Moolenaar
13155c504f68SBram Moolenaar" Test for moving a line which is the start of a fold from a recursive fold to
13165c504f68SBram Moolenaar" outside. The fold length should reduce.
13175c504f68SBram Moolenaarfunc Test_fold_move_foldlevel()
13185c504f68SBram Moolenaar  new
13195c504f68SBram Moolenaar  call setline(1, ['a{{{', 'b{{{', 'c{{{', 'd}}}', 'e}}}', 'f}}}', 'g'])
13205c504f68SBram Moolenaar  setlocal foldmethod=marker
13215c504f68SBram Moolenaar  normal zR
13225c504f68SBram Moolenaar  call assert_equal([3, 2, 1], [foldlevel(4), foldlevel(5), foldlevel(6)])
13235c504f68SBram Moolenaar  3move 7
13245c504f68SBram Moolenaar  call assert_equal([2, 1, 0], [foldlevel(3), foldlevel(4), foldlevel(5)])
13255c504f68SBram Moolenaar  call assert_equal(1, foldlevel(7))
13265c504f68SBram Moolenaar
13275c504f68SBram Moolenaar  " Move a line from outside a fold to inside the fold.
13285c504f68SBram Moolenaar  %d _
13295c504f68SBram Moolenaar  call setline(1, ['a', 'b{{{', 'c}}}'])
13305c504f68SBram Moolenaar  normal zR
13315c504f68SBram Moolenaar  1move 2
13325c504f68SBram Moolenaar  call assert_equal([1, 1, 1], [foldlevel(1), foldlevel(2), foldlevel(3)])
13335c504f68SBram Moolenaar
13345c504f68SBram Moolenaar  " Move the start of one fold to inside another fold
13355c504f68SBram Moolenaar  %d _
13365c504f68SBram Moolenaar  call setline(1, ['a', 'b{{{', 'c}}}', 'd{{{', 'e}}}'])
13375c504f68SBram Moolenaar  normal zR
13385c504f68SBram Moolenaar  call assert_equal([0, 1, 1, 1, 1], [foldlevel(1), foldlevel(2),
13395c504f68SBram Moolenaar        \ foldlevel(3), foldlevel(4), foldlevel(5)])
13405c504f68SBram Moolenaar  1,2move 4
13415c504f68SBram Moolenaar  call assert_equal([0, 1, 1, 2, 2], [foldlevel(1), foldlevel(2),
13425c504f68SBram Moolenaar        \ foldlevel(3), foldlevel(4), foldlevel(5)])
13435c504f68SBram Moolenaar
13445c504f68SBram Moolenaar  bw!
13455c504f68SBram Moolenaarendfunc
13465c504f68SBram Moolenaar
1347*68ffe8caSBram Moolenaar" Test for using zj and zk to move downwards and upwards to the start and end
1348*68ffe8caSBram Moolenaar" of the next fold.
1349*68ffe8caSBram Moolenaar" Test for using [z and ]z in a closed fold to jump to the beginning and end
1350*68ffe8caSBram Moolenaar" of the fold.
1351*68ffe8caSBram Moolenaarfunc Test_fold_jump()
1352*68ffe8caSBram Moolenaar  new
1353*68ffe8caSBram Moolenaar  call setline(1, ["\t1", "\t2", "\t\t3", "\t\t4", "\t\t\t5", "\t\t\t6", "\t\t7", "\t\t8", "\t9", "\t10"])
1354*68ffe8caSBram Moolenaar  setlocal foldmethod=indent
1355*68ffe8caSBram Moolenaar  normal zR
1356*68ffe8caSBram Moolenaar  normal zj
1357*68ffe8caSBram Moolenaar  call assert_equal(3, line('.'))
1358*68ffe8caSBram Moolenaar  normal zj
1359*68ffe8caSBram Moolenaar  call assert_equal(5, line('.'))
1360*68ffe8caSBram Moolenaar  call assert_beeps('normal zj')
1361*68ffe8caSBram Moolenaar  call assert_equal(5, line('.'))
1362*68ffe8caSBram Moolenaar  call assert_beeps('normal 9Gzj')
1363*68ffe8caSBram Moolenaar  call assert_equal(9, line('.'))
1364*68ffe8caSBram Moolenaar  normal Gzk
1365*68ffe8caSBram Moolenaar  call assert_equal(8, line('.'))
1366*68ffe8caSBram Moolenaar  normal zk
1367*68ffe8caSBram Moolenaar  call assert_equal(6, line('.'))
1368*68ffe8caSBram Moolenaar  call assert_beeps('normal zk')
1369*68ffe8caSBram Moolenaar  call assert_equal(6, line('.'))
1370*68ffe8caSBram Moolenaar  call assert_beeps('normal 2Gzk')
1371*68ffe8caSBram Moolenaar  call assert_equal(2, line('.'))
1372*68ffe8caSBram Moolenaar
1373*68ffe8caSBram Moolenaar  " Using [z or ]z in a closed fold should not move the cursor
1374*68ffe8caSBram Moolenaar  %d _
1375*68ffe8caSBram Moolenaar  call setline(1, ["1", "\t2", "\t3", "\t4", "\t5", "\t6", "7"])
1376*68ffe8caSBram Moolenaar  normal zR4Gzc
1377*68ffe8caSBram Moolenaar  call assert_equal(4, line('.'))
1378*68ffe8caSBram Moolenaar  call assert_beeps('normal [z')
1379*68ffe8caSBram Moolenaar  call assert_equal(4, line('.'))
1380*68ffe8caSBram Moolenaar  call assert_beeps('normal ]z')
1381*68ffe8caSBram Moolenaar  call assert_equal(4, line('.'))
1382*68ffe8caSBram Moolenaar  bw!
1383*68ffe8caSBram Moolenaarendfunc
1384*68ffe8caSBram Moolenaar
13859d8d0b5cSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1386