neovim/test/functional/autocmd/tabnewentered_spec.lua

484 lines
16 KiB
Lua
Raw Normal View History

local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local command = helpers.command
local dedent = helpers.dedent
local eval = helpers.eval
local eq = helpers.eq
local feed = helpers.feed
local nvim = helpers.nvim
local redir_exec = helpers.redir_exec
describe('TabNewEntered', function()
describe('au TabNewEntered', function()
describe('with * as <afile>', function()
it('matches when entering any new tab', function()
clear()
nvim('command', 'au! TabNewEntered * echom "tabnewentered:".tabpagenr().":".bufnr("")')
2019-12-01 23:43:16 -07:00
eq("tabnewentered:2:2", nvim('exec', 'tabnew', true))
eq("tabnewentered:3:3", nvim('exec', 'tabnew test.x2', true))
end)
end)
describe('with FILE as <afile>', function()
it('matches when opening a new tab for FILE', function()
2017-01-11 21:08:19 -07:00
nvim('command', 'au! TabNewEntered Xtest-tabnewentered echom "tabnewentered:match"')
eq('tabnewentered:4:4\ntabnewentered:match',
2019-12-01 23:43:16 -07:00
nvim('exec', 'tabnew Xtest-tabnewentered', true))
end)
end)
describe('with CTRL-W T', function()
it('works when opening a new tab with CTRL-W T', function()
clear()
nvim('command', 'au! TabNewEntered * echom "entered"')
nvim('command', 'tabnew test.x2')
nvim('command', 'split')
2019-12-01 23:43:16 -07:00
eq('entered', nvim('exec', 'execute "normal \\<C-W>T"', true))
end)
end)
end)
end)
describe('TabEnter', function()
before_each(clear)
it('has correct previous tab when entering any new tab', function()
command('augroup TEMP')
nvim('command', 'au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
command('augroup END')
eq("tabenter:2:1", nvim('exec', 'tabnew', true))
eq("tabenter:3:2", nvim('exec', 'tabnew test.x2', true))
command('augroup! TEMP')
end)
it('has correct previous tab when entering any preexisting tab', function()
command('tabnew')
command('tabnew')
command('augroup TEMP')
nvim('command', 'au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
command('augroup END')
eq("tabenter:1:3", nvim('exec', 'tabnext', true))
eq("tabenter:2:1", nvim('exec', 'tabnext', true))
command('augroup! TEMP')
end)
end)
describe('tabpage/previous', function()
before_each(clear)
local function switches_to_previous_after_new_tab_creation_at_end(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- The previous tab is now the third.
eq(3, eval('tabpagenr(\'#\')'))
-- Switch to the previous (third) tab
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
[No Name]
Tab page 3
> [No Name]
Tab page 4
[No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the fourth.
eq(4, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after new tab creation at end',
switches_to_previous_after_new_tab_creation_at_end('g<Tab>'))
it('switches to previous via <C-W>g<Tab>. after new tab creation at end', switches_to_previous_after_new_tab_creation_at_end('<C-W>g<Tab>'))
it('switches to previous via <C-Tab>. after new tab creation at end', switches_to_previous_after_new_tab_creation_at_end('<C-Tab>'))
local function switches_to_previous_after_new_tab_creation_in_middle(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the second tab
command('tabnext 2')
-- Add a new tab after the second tab
command('tabnew')
-- The previous tab is now the second.
eq(2, eval('tabpagenr(\'#\')'))
-- Switch to the previous (second) tab
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
> [No Name]
Tab page 3
[No Name]
Tab page 4
[No Name]
Tab page 5
[No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the third.
eq(3, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after new tab creation in middle',
switches_to_previous_after_new_tab_creation_in_middle('g<Tab>'))
it('switches to previous via <C-W>g<Tab> after new tab creation in middle',
switches_to_previous_after_new_tab_creation_in_middle('<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after new tab creation in middle',
switches_to_previous_after_new_tab_creation_in_middle('<C-Tab>'))
local function switches_to_previous_after_switching_to_next_tab(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the next (first) tab
command('tabnext')
-- The previous tab is now the fourth.
eq(4, eval('tabpagenr(\'#\')'))
-- Switch to the previous (fourth) tab
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
[No Name]
Tab page 3
[No Name]
Tab page 4
> [No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the first.
eq(1, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after switching to next tab',
switches_to_previous_after_switching_to_next_tab('g<Tab>'))
it('switches to previous via <C-W>g<Tab> after switching to next tab',
switches_to_previous_after_switching_to_next_tab('<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after switching to next tab',
switches_to_previous_after_switching_to_next_tab('<C-Tab>'))
local function switches_to_previous_after_switching_to_last_tab(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the next (first) tab
command('tabnext')
-- Switch to the last (fourth) tab.
command('tablast')
-- The previous tab is now the second.
eq(1, eval('tabpagenr(\'#\')'))
-- Switch to the previous (second) tab
feed(characters)
eq(dedent([=[
Tab page 1
> [No Name]
Tab page 2
[No Name]
Tab page 3
[No Name]
Tab page 4
[No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the fourth.
eq(4, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous after switching to last tab',
switches_to_previous_after_switching_to_last_tab('g<Tab>'))
it('switches to previous after switching to last tab',
switches_to_previous_after_switching_to_last_tab('<C-W>g<Tab>'))
it('switches to previous after switching to last tab',
switches_to_previous_after_switching_to_last_tab('<C-Tab>'))
local function switches_to_previous_after_switching_to_previous_tab(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the previous (third) tab
command('tabprevious')
-- The previous tab is now the fourth.
eq(4, eval('tabpagenr(\'#\')'))
-- Switch to the previous (fourth) tab
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
[No Name]
Tab page 3
[No Name]
Tab page 4
> [No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the third.
eq(3, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after switching to previous tab',
switches_to_previous_after_switching_to_previous_tab('g<Tab>'))
it('switches to previous via <C-W>g<Tab> after switching to previous tab',
switches_to_previous_after_switching_to_previous_tab('<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after switching to previous tab',
switches_to_previous_after_switching_to_previous_tab('<C-Tab>'))
local function switches_to_previous_after_switching_to_first_tab(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the previous (third) tab
command('tabprevious')
-- Switch to the first tab
command('tabfirst')
-- The previous tab is now the third.
eq(3, eval('tabpagenr(\'#\')'))
-- Switch to the previous (third) tab
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
[No Name]
Tab page 3
> [No Name]
Tab page 4
[No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the first.
eq(1, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after switching to first tab',
switches_to_previous_after_switching_to_first_tab('g<Tab>'))
it('switches to previous via <C-W>g<Tab> after switching to first tab',
switches_to_previous_after_switching_to_first_tab('<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after switching to first tab',
switches_to_previous_after_switching_to_first_tab('<C-Tab>'))
local function switches_to_previous_after_numbered_tab_switch(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the second tab
command('tabnext 2')
-- The previous tab is now the fourth.
eq(4, eval('tabpagenr(\'#\')'))
-- Switch to the previous (fourth) tab
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
[No Name]
Tab page 3
[No Name]
Tab page 4
> [No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the second.
eq(2, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after numbered tab switch',
switches_to_previous_after_numbered_tab_switch('g<Tab>'))
it('switches to previous via <C-W>g<Tab> after numbered tab switch',
switches_to_previous_after_numbered_tab_switch('<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after numbered tab switch',
switches_to_previous_after_numbered_tab_switch('<C-Tab>'))
local function switches_to_previous_after_switching_to_previous(characters1, characters2)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Switch to the second tab
command('tabnext 2')
-- Switch to the previous (fourth) tab
feed(characters1)
-- The previous tab is now the second.
eq(2, eval('tabpagenr(\'#\')'))
-- Switch to the previous (second) tab
feed(characters2)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
> [No Name]
Tab page 3
[No Name]
Tab page 4
[No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the fourth.
eq(4, eval('tabpagenr(\'#\')'))
end
end
it('switches to previous via g<Tab> after switching to previous via g<Tab>',
switches_to_previous_after_switching_to_previous('g<Tab>', 'g<Tab>'))
it('switches to previous via <C-W>g<Tab> after switching to previous via g<Tab>',
switches_to_previous_after_switching_to_previous('g<Tab>', '<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after switching to previous via g<Tab>',
switches_to_previous_after_switching_to_previous('g<Tab>', '<C-Tab>'))
it('switches to previous via g<Tab> after switching to previous via <C-W>g<Tab>',
switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', 'g<Tab>'))
it('switches to previous via <C-W>g<Tab> after switching to previous via <C-W>g<Tab>',
switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', '<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after switching to previous via <C-W>g<Tab>',
switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', '<C-Tab>'))
it('switches to previous via g<Tab> after switching to previous via <C-Tab>',
switches_to_previous_after_switching_to_previous('<C-Tab>', 'g<Tab>'))
it('switches to previous via <C-W>g<Tab> after switching to previous via <C-Tab>',
switches_to_previous_after_switching_to_previous('<C-Tab>', '<C-W>g<Tab>'))
it('switches to previous via <C-Tab> after switching to previous via <C-Tab>',
switches_to_previous_after_switching_to_previous('<C-Tab>', '<C-Tab>'))
local function does_not_switch_to_previous_after_closing_current_tab(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- Close the current (fourth tab)
command('wincmd c')
-- The previous tab is now the "zeroth" -- there isn't one.
eq(0, eval('tabpagenr(\'#\')'))
-- At this point, switching to the "previous" (i.e. fourth) tab would mean
-- switching to either a dangling or a null pointer.
feed(characters)
eq(dedent([=[
Tab page 1
[No Name]
Tab page 2
[No Name]
Tab page 3
> [No Name]]=]),
redir_exec('tabs')
)
-- The previous tab is now the "zero".
eq(0, eval('tabpagenr(\'#\')'))
end
end
it('does not switch to previous via g<Tab> after closing current tab',
does_not_switch_to_previous_after_closing_current_tab('g<Tab>'))
it('does not switch to previous via <C-W>g<Tab> after closing current tab',
does_not_switch_to_previous_after_closing_current_tab('<C-W>g<Tab>'))
it('does not switch to previous via <C-Tab> after closing current tab',
does_not_switch_to_previous_after_closing_current_tab('<C-Tab>'))
local function does_not_switch_to_previous_after_entering_operator_pending(characters)
return function()
-- Add three tabs for a total of four
command('tabnew')
command('tabnew')
command('tabnew')
-- The previous tab is now the third.
eq(3, eval('tabpagenr(\'#\')'))
-- Enter operator pending mode.
feed('d')
eq('no', eval('mode(1)'))
-- At this point switching to the previous tab should have no effect
-- other than leaving operator pending mode.
feed(characters)
-- Attempting to switch tabs returns us to normal mode.
eq('n', eval('mode()'))
-- The current tab is still the fourth.
eq(4, eval('tabpagenr()'))
-- The previous tab is still the third.
eq(3, eval('tabpagenr(\'#\')'))
end
end
it('does not switch to previous via g<Tab> after entering operator pending',
does_not_switch_to_previous_after_entering_operator_pending('g<Tab>'))
-- NOTE: When in operator pending mode, attempting to switch to previous has
-- the following effect:
-- - Ctrl-W exits operator pending mode
-- - g<Tab> switches to the previous tab
-- In other words, the effect of "<C-W>g<Tab>" is to switch to the
-- previous tab even from operator pending mode, but only thanks to the
-- fact that the suffix after "<C-W>" in "<C-W>g<Tab>" just happens to
-- be the same as the normal mode command to switch to the previous tab.
-- it('does not switch to previous via <C-W>g<Tab> after entering operator pending',
-- does_not_switch_to_previous_after_entering_operator_pending('<C-W>g<Tab>'))
it('does not switch to previous via <C-Tab> after entering operator pending',
does_not_switch_to_previous_after_entering_operator_pending('<C-Tab>'))
end)