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