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 ', function() it('matches when entering any new tab', function() clear() nvim('command', 'au! TabNewEntered * echom "tabnewentered:".tabpagenr().":".bufnr("")') eq("tabnewentered:2:2", nvim('exec', 'tabnew', true)) eq("tabnewentered:3:3", nvim('exec', 'tabnew test.x2', true)) end) end) describe('with FILE as ', function() it('matches when opening a new tab for FILE', function() nvim('command', 'au! TabNewEntered Xtest-tabnewentered echom "tabnewentered:match"') eq('tabnewentered:4:4\ntabnewentered:match', 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') eq('entered', nvim('exec', 'execute "normal \\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 after new tab creation at end', switches_to_previous_after_new_tab_creation_at_end('g')) it('switches to previous via g. after new tab creation at end', switches_to_previous_after_new_tab_creation_at_end('g')) it('switches to previous via . after new tab creation at end', switches_to_previous_after_new_tab_creation_at_end('')) 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 after new tab creation in middle', switches_to_previous_after_new_tab_creation_in_middle('g')) it('switches to previous via g after new tab creation in middle', switches_to_previous_after_new_tab_creation_in_middle('g')) it('switches to previous via after new tab creation in middle', switches_to_previous_after_new_tab_creation_in_middle('')) 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 after switching to next tab', switches_to_previous_after_switching_to_next_tab('g')) it('switches to previous via g after switching to next tab', switches_to_previous_after_switching_to_next_tab('g')) it('switches to previous via after switching to next tab', switches_to_previous_after_switching_to_next_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')) it('switches to previous after switching to last tab', switches_to_previous_after_switching_to_last_tab('g')) it('switches to previous after switching to last tab', switches_to_previous_after_switching_to_last_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 after switching to previous tab', switches_to_previous_after_switching_to_previous_tab('g')) it('switches to previous via g after switching to previous tab', switches_to_previous_after_switching_to_previous_tab('g')) it('switches to previous via after switching to previous tab', switches_to_previous_after_switching_to_previous_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 after switching to first tab', switches_to_previous_after_switching_to_first_tab('g')) it('switches to previous via g after switching to first tab', switches_to_previous_after_switching_to_first_tab('g')) it('switches to previous via after switching to first tab', switches_to_previous_after_switching_to_first_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 after numbered tab switch', switches_to_previous_after_numbered_tab_switch('g')) it('switches to previous via g after numbered tab switch', switches_to_previous_after_numbered_tab_switch('g')) it('switches to previous via after numbered tab switch', switches_to_previous_after_numbered_tab_switch('')) 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 after switching to previous via g', switches_to_previous_after_switching_to_previous('g', 'g')) it('switches to previous via g after switching to previous via g', switches_to_previous_after_switching_to_previous('g', 'g')) it('switches to previous via after switching to previous via g', switches_to_previous_after_switching_to_previous('g', '')) it('switches to previous via g after switching to previous via g', switches_to_previous_after_switching_to_previous('g', 'g')) it('switches to previous via g after switching to previous via g', switches_to_previous_after_switching_to_previous('g', 'g')) it('switches to previous via after switching to previous via g', switches_to_previous_after_switching_to_previous('g', '')) it('switches to previous via g after switching to previous via ', switches_to_previous_after_switching_to_previous('', 'g')) it('switches to previous via g after switching to previous via ', switches_to_previous_after_switching_to_previous('', 'g')) it('switches to previous via after switching to previous via ', switches_to_previous_after_switching_to_previous('', '')) 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 after closing current tab', does_not_switch_to_previous_after_closing_current_tab('g')) it('does not switch to previous via g after closing current tab', does_not_switch_to_previous_after_closing_current_tab('g')) it('does not switch to previous via after closing current tab', does_not_switch_to_previous_after_closing_current_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 after entering operator pending', does_not_switch_to_previous_after_entering_operator_pending('g')) -- NOTE: When in operator pending mode, attempting to switch to previous has -- the following effect: -- - Ctrl-W exits operator pending mode -- - g switches to the previous tab -- In other words, the effect of "g" is to switch to the -- previous tab even from operator pending mode, but only thanks to the -- fact that the suffix after "" in "g" just happens to -- be the same as the normal mode command to switch to the previous tab. -- it('does not switch to previous via g after entering operator pending', -- does_not_switch_to_previous_after_entering_operator_pending('g')) it('does not switch to previous via after entering operator pending', does_not_switch_to_previous_after_entering_operator_pending('')) end)