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