aboutsummaryrefslogtreecommitdiff
path: root/test/functional/editor/fold_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/editor/fold_spec.lua')
-rw-r--r--test/functional/editor/fold_spec.lua226
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)