diff options
Diffstat (limited to 'test/functional/editor/jump_spec.lua')
-rw-r--r-- | test/functional/editor/jump_spec.lua | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/test/functional/editor/jump_spec.lua b/test/functional/editor/jump_spec.lua index d09c20f226..63f522fe6e 100644 --- a/test/functional/editor/jump_spec.lua +++ b/test/functional/editor/jump_spec.lua @@ -1,4 +1,5 @@ local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') local clear = helpers.clear local command = helpers.command @@ -7,6 +8,7 @@ local funcs = helpers.funcs local feed = helpers.feed local exec_capture = helpers.exec_capture local write_file = helpers.write_file +local curbufmeths = helpers.curbufmeths describe('jumplist', function() local fname1 = 'Xtest-functional-normal-jump' @@ -137,3 +139,144 @@ describe("jumpoptions=stack behaves like 'tagstack'", function() 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" + end + return table.concat(c, "\n") + end + before_each(function() + clear() + write_file(file1, content(), false, false) + write_file(file2, content(), false, false) + command('set jumpoptions=view') + end) + after_each(function() + os.remove(file1) + os.remove(file2) + end) + + it('restores the view', function() + local screen = Screen.new(5, 8) + screen:attach() + command("edit " .. file1) + feed("12Gztj") + feed("gg<C-o>") + screen:expect([[ + 12 line | + ^13 line | + 14 line | + 15 line | + 16 line | + 17 line | + 18 line | + | + ]]) + end) + + 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") + screen:expect([[ + 27 line | + 28 line | + 29 line | + ^30 line | + | + ]]) + feed("<C-o><C-o>") + screen:expect([[ + ^12 line | + 13 line | + 14 line | + 15 line | + | + ]]) + end) + + 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") + screen:expect([[ + 27 line | + 28 line | + 29 line | + ^30 line | + | + ]]) + feed("<C-^>") + screen:expect([[ + ^12 line | + 13 line | + 14 line | + 15 line | + | + ]]) + end) + + 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, {}) + -- 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>") + screen:expect([[ + 4 line | + 5 line | + 6 line | + ^7 line | + 8 line | + 9 line | + 10 line | + | + ]]) + end) + + it('falls back to standard behavior for a mark without a view', function() + local screen = Screen.new(5, 8) + screen:attach() + command('edit ' .. file1) + feed('10ggzzvwy') + screen:expect([[ + 7 line | + 8 line | + 9 line | + ^10 line | + 11 line | + 12 line | + 13 line | + | + ]]) + feed('`]') + screen:expect([[ + 7 line | + 8 line | + 9 line | + 10 ^line | + 11 line | + 12 line | + 13 line | + | + ]]) + end) +end) |