Files
neovim/test/functional/ui/tabline_spec.lua
bfredl e61228a214 fix(tests): needing two calls to setup a screen is cringe
Before calling "attach" a screen object is just a dummy container for
(row, col) values whose purpose is to be sent as part of the "attach"
function call anyway.

Just create the screen in an attached state directly. Keep the complete
(row, col, options) config together. It is still completely valid to
later detach and re-attach as needed, including to another session.
2024-11-14 12:40:57 +01:00

218 lines
6.2 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local clear, command, eq = n.clear, n.command, t.eq
local insert = n.insert
local api = n.api
local assert_alive = n.assert_alive
describe('ui/ext_tabline', function()
local screen
local event_tabs, event_curtab, event_curbuf, event_buffers
before_each(function()
clear()
screen = Screen.new(25, 5, { rgb = true, ext_tabline = true })
function screen:_handle_tabline_update(curtab, tabs, curbuf, buffers)
event_curtab = curtab
event_tabs = tabs
event_curbuf = curbuf
event_buffers = buffers
end
end)
it('publishes UI events', function()
command('tabedit another-tab')
local expected_tabs = {
{ tab = 1, name = '[No Name]' },
{ tab = 2, name = 'another-tab' },
}
screen:expect {
grid = [[
^ |
{1:~ }|*3
|
]],
condition = function()
eq(2, event_curtab)
eq(expected_tabs, event_tabs)
end,
}
command('tabNext')
screen:expect {
grid = [[
^ |
{1:~ }|*3
|
]],
condition = function()
eq(1, event_curtab)
eq(expected_tabs, event_tabs)
end,
}
end)
it('buffer UI events', function()
local expected_buffers_initial = {
{ buffer = 1, name = '[No Name]' },
}
screen:expect {
grid = [[
^ |
{1:~ }|*3
|
]],
condition = function()
eq(1, event_curbuf)
eq(expected_buffers_initial, event_buffers)
end,
}
command('badd another-buffer')
command('bnext')
local expected_buffers = {
{ buffer = 1, name = '[No Name]' },
{ buffer = 2, name = 'another-buffer' },
}
screen:expect {
grid = [[
^ |
{1:~ }|*3
|
]],
condition = function()
eq(2, event_curbuf)
eq(expected_buffers, event_buffers)
end,
}
end)
end)
describe('tabline', function()
local screen
before_each(function()
clear()
screen = Screen.new(42, 5)
end)
it('redraws when tabline option is set', function()
command('set tabline=asdf')
command('set showtabline=2')
screen:expect {
grid = [[
{2:asdf }|
^ |
{1:~ }|*2
|
]],
}
command('set tabline=jkl')
screen:expect {
grid = [[
{2:jkl }|
^ |
{1:~ }|*2
|
]],
}
end)
it('combines highlight attributes', function()
screen:set_default_attr_ids({
[1] = { foreground = Screen.colors.Blue1, bold = true }, -- StatusLine
[2] = { bold = true, italic = true }, -- StatusLine
[3] = { bold = true, italic = true, foreground = Screen.colors.Red }, -- NonText combined with StatusLine
})
command('hi TabLineFill gui=bold,italic')
command('hi Identifier guifg=red')
command('set tabline=Test%#Identifier#here')
command('set showtabline=2')
screen:expect {
grid = [[
{2:Test}{3:here }|
^ |
{1:~ }|*2
|
]],
}
end)
it('click definitions do not leak memory #21765', function()
command('set tabline=%@MyClickFunc@MyClickText%T')
command('set showtabline=2')
command('redrawtabline')
end)
it('clicks work with truncated double-width label #24187', function()
insert('tab1')
command('tabnew')
insert('tab2')
command('tabprev')
api.nvim_set_option_value('tabline', '%1T口口%2Ta' .. ('b'):rep(38) .. '%999Xc', {})
screen:expect {
grid = [[
{2:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
tab^1 |
{1:~ }|*2
|
]],
}
assert_alive()
api.nvim_input_mouse('left', 'press', '', 0, 0, 1)
screen:expect {
grid = [[
{2:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
tab^2 |
{1:~ }|*2
|
]],
}
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
screen:expect {
grid = [[
{2:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
tab^1 |
{1:~ }|*2
|
]],
}
api.nvim_input_mouse('left', 'press', '', 0, 0, 39)
screen:expect {
grid = [[
{2:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
tab^2 |
{1:~ }|*2
|
]],
}
api.nvim_input_mouse('left', 'press', '', 0, 0, 40)
screen:expect {
grid = [[
tab^1 |
{1:~ }|*3
|
]],
}
end)
it('middle-click closes tab', function()
command('tabnew')
command('tabnew')
command('tabnew')
command('tabprev')
eq({ 3, 4 }, api.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
api.nvim_input_mouse('middle', 'press', '', 0, 0, 1)
eq({ 2, 3 }, api.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
api.nvim_input_mouse('middle', 'press', '', 0, 0, 20)
eq({ 2, 2 }, api.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
api.nvim_input_mouse('middle', 'press', '', 0, 0, 1)
eq({ 1, 1 }, api.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
end)
end)