diff options
Diffstat (limited to 'test/functional/editor/fold_spec.lua')
-rw-r--r-- | test/functional/editor/fold_spec.lua | 226 |
1 files changed, 150 insertions, 76 deletions
diff --git a/test/functional/editor/fold_spec.lua b/test/functional/editor/fold_spec.lua index 424ce839a2..7950f6aea4 100644 --- a/test/functional/editor/fold_spec.lua +++ b/test/functional/editor/fold_spec.lua @@ -2,19 +2,24 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local insert = helpers.insert +local exec = helpers.exec local feed = helpers.feed local expect = helpers.expect local command = helpers.command -local funcs = helpers.funcs +local fn = helpers.fn local eq = helpers.eq local neq = helpers.neq -describe('Folds', function() +describe('Folding', function() local tempfname = 'Xtest-fold.txt' setup(clear) - before_each(function() command('bwipe! | new') end) - after_each(function() os.remove(tempfname) end) + before_each(function() + command('bwipe! | new') + end) + after_each(function() + os.remove(tempfname) + end) it('manual folding adjusts with filter', function() insert([[ @@ -71,8 +76,8 @@ describe('Folds', function() local function get_folds() local rettab = {} - for i = 1, funcs.line('$') do - table.insert(rettab, funcs.foldlevel(i)) + for i = 1, fn.line('$') do + table.insert(rettab, fn.foldlevel(i)) end return rettab end @@ -94,7 +99,8 @@ describe('Folds', function() end it('neither closes nor corrupts folds', function() - test_move_indent([[ + test_move_indent( + [[ a a a @@ -112,7 +118,9 @@ a a a a - a]], '7,12m0') + a]], + '7,12m0' + ) expect([[ a a @@ -133,25 +141,26 @@ a a a]]) -- lines are not closed, folds are correct - for i = 1,funcs.line('$') do - eq(-1, funcs.foldclosed(i)) + for i = 1, fn.line('$') do + eq(-1, fn.foldclosed(i)) if i == 1 or i == 7 or i == 13 then - eq(0, funcs.foldlevel(i)) + eq(0, fn.foldlevel(i)) elseif i == 4 then - eq(2, funcs.foldlevel(i)) + eq(2, fn.foldlevel(i)) else - eq(1, funcs.foldlevel(i)) + eq(1, fn.foldlevel(i)) end end -- folds are not corrupted feed('zM') - eq(6, funcs.foldclosedend(2)) - eq(12, funcs.foldclosedend(8)) - eq(18, funcs.foldclosedend(14)) + eq(6, fn.foldclosedend(2)) + eq(12, fn.foldclosedend(8)) + eq(18, fn.foldclosedend(14)) end) it("doesn't split a fold when the move is within it", function() - test_move_indent([[ + test_move_indent( + [[ a a a @@ -161,24 +170,30 @@ a a a a -a]], '5m6') - eq({0, 1, 1, 2, 2, 2, 2, 1, 1, 0}, get_folds()) +a]], + '5m6' + ) + eq({ 0, 1, 1, 2, 2, 2, 2, 1, 1, 0 }, get_folds()) end) it('truncates folds that end in the moved range', function() - test_move_indent([[ + test_move_indent( + [[ a a a a a a -a]], '4,5m6') - eq({0, 1, 2, 0, 0, 0, 0}, get_folds()) +a]], + '4,5m6' + ) + eq({ 0, 1, 2, 0, 0, 0, 0 }, get_folds()) end) it('moves folds that start between moved range and destination', function() - test_move_indent([[ + test_move_indent( + [[ a a a @@ -191,12 +206,15 @@ a a a a - a]], '3,4m$') - eq({0, 1, 1, 0, 0, 1, 2, 1, 0, 0, 1, 0, 0}, get_folds()) + a]], + '3,4m$' + ) + eq({ 0, 1, 1, 0, 0, 1, 2, 1, 0, 0, 1, 0, 0 }, get_folds()) end) it('does not affect folds outside changed lines', function() - test_move_indent([[ + test_move_indent( + [[ a a a @@ -205,12 +223,15 @@ a a a a - a]], '4m5') - eq({1, 1, 1, 0, 0, 0, 1, 1, 1}, get_folds()) + a]], + '4m5' + ) + eq({ 1, 1, 1, 0, 0, 0, 1, 1, 1 }, get_folds()) end) it('moves and truncates folds that start in moved range', function() - test_move_indent([[ + test_move_indent( + [[ a a a @@ -220,34 +241,43 @@ a a a a -a]], '1,3m7') - eq({0, 0, 0, 0, 0, 1, 2, 0, 0, 0}, get_folds()) +a]], + '1,3m7' + ) + eq({ 0, 0, 0, 0, 0, 1, 2, 0, 0, 0 }, get_folds()) end) it('breaks a fold when moving text into it', function() - test_move_indent([[ + test_move_indent( + [[ a a a a a a -a]], '$m4') - eq({0, 1, 2, 2, 0, 0, 0}, get_folds()) +a]], + '$m4' + ) + eq({ 0, 1, 2, 2, 0, 0, 0 }, get_folds()) end) it('adjusts correctly when moving a range backwards', function() - test_move_indent([[ + test_move_indent( + [[ a a a a -a]], '2,3m0') - eq({1, 2, 0, 0, 0}, get_folds()) +a]], + '2,3m0' + ) + eq({ 1, 2, 0, 0, 0 }, get_folds()) end) it('handles shifting all remaining folds', function() - test_move_indent([[ + test_move_indent( + [[ a a a @@ -262,18 +292,23 @@ a]], '2,3m0') a a a -a]], '13m7') - eq({1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0}, get_folds()) +a]], + '13m7' + ) + eq({ 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0 }, get_folds()) end) end) it('updates correctly on :read', function() -- luacheck: ignore 621 - helpers.write_file(tempfname, [[ + helpers.write_file( + tempfname, + [[ a - a]]) + a]] + ) insert([[ a a @@ -295,14 +330,14 @@ a]], '13m7') a a ]]) - for i = 1,2 do - eq(1, funcs.foldlevel(i)) + for i = 1, 2 do + eq(1, fn.foldlevel(i)) end - for i = 3,5 do - eq(0, funcs.foldlevel(i)) + for i = 3, 5 do + eq(0, fn.foldlevel(i)) end - for i = 6,8 do - eq(1, funcs.foldlevel(i)) + for i = 6, 8 do + eq(1, fn.foldlevel(i)) end end) @@ -320,7 +355,7 @@ a]], '13m7') ]]) command('setlocal foldmethod=indent') command('3,5d') - eq(5, funcs.foldclosedend(1)) + eq(5, fn.foldclosedend(1)) end) it("doesn't combine folds that have a specified end", function() @@ -337,7 +372,7 @@ a]], '13m7') command('setlocal foldmethod=marker') command('3,5d') command('%foldclose') - eq(2, funcs.foldclosedend(1)) + eq(2, fn.foldclosedend(1)) end) it('splits folds according to >N and <N with foldexpr', function() @@ -356,7 +391,9 @@ a]], '13m7') return 0 endfunction ]]) - helpers.write_file(tempfname, [[ + helpers.write_file( + tempfname, + [[ b b a @@ -364,7 +401,8 @@ a]], '13m7') d a a - c]]) + c]] + ) insert([[ a a @@ -378,20 +416,56 @@ a]], '13m7') command('foldopen') command('read ' .. tempfname) command('%foldclose') - eq(2, funcs.foldclosedend(1)) - eq(0, funcs.foldlevel(3)) - eq(0, funcs.foldlevel(4)) - eq(6, funcs.foldclosedend(5)) - eq(10, funcs.foldclosedend(7)) - eq(14, funcs.foldclosedend(11)) + eq(2, fn.foldclosedend(1)) + eq(0, fn.foldlevel(3)) + eq(0, fn.foldlevel(4)) + eq(6, fn.foldclosedend(5)) + eq(10, fn.foldclosedend(7)) + eq(14, fn.foldclosedend(11)) + end) + + it('fdm=expr works correctly with :move #18668', function() + exec([[ + set foldmethod=expr foldexpr=indent(v:lnum) + let content = ['', '', 'Line1', ' Line2', ' Line3', + \ 'Line4', ' Line5', ' Line6', + \ 'Line7', ' Line8', ' Line9'] + call append(0, content) + normal! zM + call cursor(4, 1) + move 2 + move 1 + ]]) + expect([[ + + Line2 + Line3 + + Line1 + Line4 + Line5 + Line6 + Line7 + Line8 + Line9 + ]]) + eq(0, fn.foldlevel(1)) + eq(3, fn.foldclosedend(2)) + eq(0, fn.foldlevel(4)) + eq(0, fn.foldlevel(5)) + eq(0, fn.foldlevel(6)) + eq(8, fn.foldclosedend(7)) + eq(0, fn.foldlevel(9)) + eq(11, fn.foldclosedend(10)) + eq(0, fn.foldlevel(12)) end) it('no folds remain if :delete makes buffer empty #19671', function() command('setlocal foldmethod=manual') - funcs.setline(1, {'foo', 'bar', 'baz'}) + fn.setline(1, { 'foo', 'bar', 'baz' }) command('2,3fold') command('%delete') - eq(0, funcs.foldlevel(1)) + eq(0, fn.foldlevel(1)) end) it('multibyte fold markers work #20438', function() @@ -405,21 +479,21 @@ a]], '13m7') bbbbb/*«*/ bbbbb bbbbb/*»*/]]) - eq(1, funcs.foldlevel(1)) + eq(1, fn.foldlevel(1)) end) - it('updates correctly with indent method and visual blockwise insertion #22898', function() + it('fdm=indent updates correctly with visual blockwise insertion #22898', function() insert([[ a b ]]) command('setlocal foldmethod=indent shiftwidth=2') feed('gg0<C-v>jI <Esc>') -- indent both lines using visual blockwise mode - eq(1, funcs.foldlevel(1)) - eq(1, funcs.foldlevel(2)) + eq(1, fn.foldlevel(1)) + eq(1, fn.foldlevel(2)) end) - it("doesn't open folds with indent method when inserting lower foldlevel line", function() + it("fdm=indent doesn't open folds when inserting lower foldlevel line", function() insert([[ insert an unindented line under this line keep the lines under this line folded @@ -427,22 +501,22 @@ a]], '13m7') keep this line folded 2 ]]) command('set foldmethod=indent shiftwidth=2 noautoindent') - eq(1, funcs.foldlevel(1)) - eq(1, funcs.foldlevel(2)) - eq(2, funcs.foldlevel(3)) - eq(2, funcs.foldlevel(4)) + eq(1, fn.foldlevel(1)) + eq(1, fn.foldlevel(2)) + eq(2, fn.foldlevel(3)) + eq(2, fn.foldlevel(4)) feed('zo') -- open the outer fold - neq(-1, funcs.foldclosed(3)) -- make sure the inner fold is not open + neq(-1, fn.foldclosed(3)) -- make sure the inner fold is not open feed('gg0oa<Esc>') -- insert unindented line - eq(1, funcs.foldlevel(1)) --| insert an unindented line under this line - eq(0, funcs.foldlevel(2)) --|a - eq(1, funcs.foldlevel(3)) --| keep the lines under this line folded - eq(2, funcs.foldlevel(4)) --| keep this line folded 1 - eq(2, funcs.foldlevel(5)) --| keep this line folded 2 + eq(1, fn.foldlevel(1)) --| insert an unindented line under this line + eq(0, fn.foldlevel(2)) --|a + eq(1, fn.foldlevel(3)) --| keep the lines under this line folded + eq(2, fn.foldlevel(4)) --| keep this line folded 1 + eq(2, fn.foldlevel(5)) --| keep this line folded 2 - neq(-1, funcs.foldclosed(4)) -- make sure the inner fold is still not open + neq(-1, fn.foldclosed(4)) -- make sure the inner fold is still not open end) end) |