diff options
Diffstat (limited to 'test/functional/editor/jump_spec.lua')
-rw-r--r-- | test/functional/editor/jump_spec.lua | 310 |
1 files changed, 223 insertions, 87 deletions
diff --git a/test/functional/editor/jump_spec.lua b/test/functional/editor/jump_spec.lua index dc056cb252..fe03d82164 100644 --- a/test/functional/editor/jump_spec.lua +++ b/test/functional/editor/jump_spec.lua @@ -3,16 +3,17 @@ local Screen = require('test.functional.ui.screen') local clear = helpers.clear local command = helpers.command +local dedent = helpers.dedent local eq = helpers.eq -local funcs = helpers.funcs +local fn = helpers.fn local feed = helpers.feed local exec_capture = helpers.exec_capture local write_file = helpers.write_file -local curbufmeths = helpers.curbufmeths +local api = helpers.api describe('jumplist', function() local fname1 = 'Xtest-functional-normal-jump' - local fname2 = fname1..'2' + local fname2 = fname1 .. '2' before_each(clear) after_each(function() os.remove(fname1) @@ -20,33 +21,33 @@ describe('jumplist', function() end) it('does not add a new entry on startup', function() - eq('\n jump line col file/text\n>', funcs.execute('jumps')) + eq('\n jump line col file/text\n>', fn.execute('jumps')) end) it('does not require two <C-O> strokes to jump back', function() write_file(fname1, 'first file contents') write_file(fname2, 'second file contents') - command('args '..fname1..' '..fname2) - local buf1 = funcs.bufnr(fname1) - local buf2 = funcs.bufnr(fname2) + command('args ' .. fname1 .. ' ' .. fname2) + local buf1 = fn.bufnr(fname1) + local buf2 = fn.bufnr(fname2) command('next') feed('<C-O>') - eq(buf1, funcs.bufnr('%')) + eq(buf1, fn.bufnr('%')) command('first') command('snext') feed('<C-O>') - eq(buf1, funcs.bufnr('%')) + eq(buf1, fn.bufnr('%')) feed('<C-I>') - eq(buf2, funcs.bufnr('%')) + eq(buf2, fn.bufnr('%')) feed('<C-O>') - eq(buf1, funcs.bufnr('%')) + eq(buf1, fn.bufnr('%')) - command('drop '..fname2) + command('drop ' .. fname2) feed('<C-O>') - eq(buf1, funcs.bufnr('%')) + eq(buf1, fn.bufnr('%')) end) it('<C-O> scrolls cursor halfway when switching buffer #25763', function() @@ -56,11 +57,12 @@ describe('jumplist', function() local screen = Screen.new(5, 25) screen:attach() command('set number') - command('edit '..fname1) + command('edit ' .. fname1) feed('35gg') - command('edit '..fname2) + command('edit ' .. fname2) feed('<C-O>') - screen:expect{grid=[[ + screen:expect { + grid = [[ {1: 24 }foobar | {1: 25 }foobar | {1: 26 }foobar | @@ -86,9 +88,11 @@ describe('jumplist', function() {1: 46 }foobar | {1: 47 }foobar | | - ]], attr_ids={ - [1] = {foreground = Screen.colors.Brown}; - }} + ]], + attr_ids = { + [1] = { foreground = Screen.colors.Brown }, + }, + } end) end) @@ -98,9 +102,8 @@ describe("jumpoptions=stack behaves like 'tagstack'", function() feed(':clearjumps<cr>') -- Add lines so that we have locations to jump to. - for i = 1,101,1 - do - feed('iLine ' .. i .. '<cr><esc>') + for i = 1, 101, 1 do + feed('iLine ' .. i .. '<cr><esc>') end -- Jump around to add some locations to the jump list. @@ -115,82 +118,215 @@ describe("jumpoptions=stack behaves like 'tagstack'", function() end) after_each(function() - feed('set jumpoptions=') + feed('set jumpoptions=') end) it('discards the tail when navigating from the middle', function() feed('<C-O>') feed('<C-O>') - eq( '' - .. ' jump line col file/text\n' - .. ' 4 102 0 \n' - .. ' 3 1 0 Line 1\n' - .. ' 2 10 0 Line 10\n' - .. ' 1 20 0 Line 20\n' - .. '> 0 30 0 Line 30\n' - .. ' 1 40 0 Line 40\n' - .. ' 2 50 0 Line 50', - exec_capture('jumps')) + eq( + '' + .. ' jump line col file/text\n' + .. ' 4 102 0 \n' + .. ' 3 1 0 Line 1\n' + .. ' 2 10 0 Line 10\n' + .. ' 1 20 0 Line 20\n' + .. '> 0 30 0 Line 30\n' + .. ' 1 40 0 Line 40\n' + .. ' 2 50 0 Line 50', + exec_capture('jumps') + ) feed('90gg') - eq( '' - .. ' jump line col file/text\n' - .. ' 5 102 0 \n' - .. ' 4 1 0 Line 1\n' - .. ' 3 10 0 Line 10\n' - .. ' 2 20 0 Line 20\n' - .. ' 1 30 0 Line 30\n' - .. '>', - exec_capture('jumps')) + eq( + '' + .. ' jump line col file/text\n' + .. ' 5 102 0 \n' + .. ' 4 1 0 Line 1\n' + .. ' 3 10 0 Line 10\n' + .. ' 2 20 0 Line 20\n' + .. ' 1 30 0 Line 30\n' + .. '>', + exec_capture('jumps') + ) end) it('does not add the same location twice adjacently', function() feed('60gg') feed('60gg') - eq( '' - .. ' jump line col file/text\n' - .. ' 7 102 0 \n' - .. ' 6 1 0 Line 1\n' - .. ' 5 10 0 Line 10\n' - .. ' 4 20 0 Line 20\n' - .. ' 3 30 0 Line 30\n' - .. ' 2 40 0 Line 40\n' - .. ' 1 50 0 Line 50\n' - .. '>', - exec_capture('jumps')) + eq( + '' + .. ' jump line col file/text\n' + .. ' 7 102 0 \n' + .. ' 6 1 0 Line 1\n' + .. ' 5 10 0 Line 10\n' + .. ' 4 20 0 Line 20\n' + .. ' 3 30 0 Line 30\n' + .. ' 2 40 0 Line 40\n' + .. ' 1 50 0 Line 50\n' + .. '>', + exec_capture('jumps') + ) end) it('does add the same location twice nonadjacently', function() feed('10gg') feed('20gg') - eq( '' - .. ' jump line col file/text\n' - .. ' 8 102 0 \n' - .. ' 7 1 0 Line 1\n' - .. ' 6 10 0 Line 10\n' - .. ' 5 20 0 Line 20\n' - .. ' 4 30 0 Line 30\n' - .. ' 3 40 0 Line 40\n' - .. ' 2 50 0 Line 50\n' - .. ' 1 10 0 Line 10\n' - .. '>', - exec_capture('jumps')) + eq( + '' + .. ' jump line col file/text\n' + .. ' 8 102 0 \n' + .. ' 7 1 0 Line 1\n' + .. ' 6 10 0 Line 10\n' + .. ' 5 20 0 Line 20\n' + .. ' 4 30 0 Line 30\n' + .. ' 3 40 0 Line 40\n' + .. ' 2 50 0 Line 50\n' + .. ' 1 10 0 Line 10\n' + .. '>', + exec_capture('jumps') + ) end) end) -describe("jumpoptions=view", function() +describe('buffer deletion', function() + local base_file = 'Xtest-functional-buffer-deletion' + local file1 = base_file .. '1' + local file2 = base_file .. '2' + local file3 = base_file .. '3' + local base_content = 'text' + local content1 = base_content .. '1' + local content2 = base_content .. '2' + local content3 = base_content .. '3' + + local function format_jumplist(input) + return dedent(input) + :gsub('%{file1%}', file1) + :gsub('%{file2%}', file2) + :gsub('%{file3%}', file3) + :gsub('%{content1%}', content1) + :gsub('%{content2%}', content2) + :gsub('%{content3%}', content3) + end + + before_each(function() + clear() + command('clearjumps') + + write_file(file1, content1, false, false) + write_file(file2, content2, false, false) + write_file(file3, content3, false, false) + + command('edit ' .. file1) + command('edit ' .. file2) + command('edit ' .. file3) + end) + + it('deletes jump list entries when the current buffer is deleted', function() + command('edit ' .. file1) + + eq( + format_jumplist([[ + jump line col file/text + 3 1 0 {content1} + 2 1 0 {file2} + 1 1 0 {file3} + >]]), + exec_capture('jumps') + ) + + command('bwipeout') + + eq( + format_jumplist([[ + jump line col file/text + 1 1 0 {file2} + > 0 1 0 {content3}]]), + exec_capture('jumps') + ) + end) + + it('deletes jump list entries when another buffer is deleted', function() + eq( + format_jumplist([[ + jump line col file/text + 2 1 0 {file1} + 1 1 0 {file2} + >]]), + exec_capture('jumps') + ) + + command('bwipeout ' .. file2) + + eq( + format_jumplist([[ + jump line col file/text + 1 1 0 {file1} + >]]), + exec_capture('jumps') + ) + end) + + it('sets the correct jump index when the current buffer is deleted', function() + feed('<C-O>') + + eq( + format_jumplist([[ + jump line col file/text + 1 1 0 {file1} + > 0 1 0 {content2} + 1 1 0 {file3}]]), + exec_capture('jumps') + ) + + command('bw') + + eq( + format_jumplist([[ + jump line col file/text + 1 1 0 {file1} + > 0 1 0 {content3}]]), + exec_capture('jumps') + ) + end) + + it('sets the correct jump index when the another buffer is deleted', function() + feed('<C-O>') + + eq( + format_jumplist([[ + jump line col file/text + 1 1 0 {file1} + > 0 1 0 {content2} + 1 1 0 {file3}]]), + exec_capture('jumps') + ) + + command('bwipeout ' .. file1) + + eq( + format_jumplist([[ + jump line col file/text + > 0 1 0 {content2} + 1 1 0 {file3}]]), + exec_capture('jumps') + ) + end) +end) + +describe('jumpoptions=view', function() local file1 = 'Xtestfile-functional-editor-jumps' local file2 = 'Xtestfile-functional-editor-jumps-2' local function content() local c = {} - for i=1,30 do - c[i] = i .. " line" + for i = 1, 30 do + c[i] = i .. ' line' end - return table.concat(c, "\n") + return table.concat(c, '\n') end before_each(function() clear() @@ -206,9 +342,9 @@ describe("jumpoptions=view", function() it('restores the view', function() local screen = Screen.new(5, 8) screen:attach() - command("edit " .. file1) - feed("12Gztj") - feed("gg<C-o>") + command('edit ' .. file1) + feed('12Gztj') + feed('gg<C-o>') screen:expect([[ 12 line | ^13 line | @@ -224,10 +360,10 @@ describe("jumpoptions=view", function() it('restores the view across files', function() local screen = Screen.new(5, 5) screen:attach() - command("args " .. file1 .. " " .. file2) - feed("12Gzt") - command("next") - feed("G") + command('args ' .. file1 .. ' ' .. file2) + feed('12Gzt') + command('next') + feed('G') screen:expect([[ 27 line | 28 line | @@ -235,7 +371,7 @@ describe("jumpoptions=view", function() ^30 line | | ]]) - feed("<C-o><C-o>") + feed('<C-o><C-o>') screen:expect([[ ^12 line | 13 line | @@ -248,10 +384,10 @@ describe("jumpoptions=view", function() it('restores the view across files with <C-^>', function() local screen = Screen.new(5, 5) screen:attach() - command("args " .. file1 .. " " .. file2) - feed("12Gzt") - command("next") - feed("G") + command('args ' .. file1 .. ' ' .. file2) + feed('12Gzt') + command('next') + feed('G') screen:expect([[ 27 line | 28 line | @@ -259,7 +395,7 @@ describe("jumpoptions=view", function() ^30 line | | ]]) - feed("<C-^>") + feed('<C-^>') screen:expect([[ ^12 line | 13 line | @@ -269,19 +405,19 @@ describe("jumpoptions=view", function() ]]) end) - it('falls back to standard behavior when view can\'t be recovered', function() + it("falls back to standard behavior when view can't be recovered", function() local screen = Screen.new(5, 8) screen:attach() - command("edit " .. file1) - feed("7GzbG") - curbufmeths.set_lines(0, 2, true, {}) + command('edit ' .. file1) + feed('7GzbG') + api.nvim_buf_set_lines(0, 0, 2, true, {}) -- Move to line 7, and set it as the last line visible on the view with zb, meaning to recover -- the view it needs to put the cursor 7 lines from the top line. Then go to the end of the -- file, delete 2 lines before line 7, meaning the jump/mark is moved 2 lines up to line 5. -- Therefore when trying to jump back to it it's not possible to set a 7 line offset from the -- mark position to the top line, since there's only 5 lines from the mark position to line 0. -- Therefore falls back to standard behavior which is centering the view/line. - feed("<C-o>") + feed('<C-o>') screen:expect([[ 4 line | 5 line | |