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