neovim/test/functional/ui/options_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

235 lines
5.8 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local clear = n.clear
local command = n.command
local eq = t.eq
local shallowcopy = t.shallowcopy
local eval = n.eval
describe('UI receives option updates', function()
local screen
local function reset(screen_opts, clear_opts)
local defaults = {
ambiwidth = 'single',
arabicshape = true,
emoji = true,
guifont = '',
guifontwide = '',
linespace = 0,
pumblend = 0,
mousefocus = false,
mousehide = true,
mousemoveevent = false,
showtabline = 1,
termguicolors = false,
termsync = true,
ttimeout = true,
ttimeoutlen = 50,
verbose = 0,
ext_cmdline = false,
ext_popupmenu = false,
ext_tabline = false,
ext_wildmenu = false,
ext_linegrid = false,
ext_hlstate = false,
ext_multigrid = false,
ext_messages = false,
ext_termcolors = false,
}
clear_opts = shallowcopy(clear_opts or {})
clear_opts.args_rm = clear_opts.args_rm or {}
table.insert(clear_opts.args_rm or {}, '--cmd')
clear(clear_opts)
screen = Screen.new(20, 5, screen_opts)
-- NB: UI test suite can be run in both "linegrid" and legacy grid mode.
-- In both cases check that the received value is the one requested.
defaults.ext_linegrid = screen._options.ext_linegrid or false
return defaults
end
it('for defaults', function()
local expected = reset()
screen:expect(function()
eq(expected, screen.options)
end)
end)
it('on attach #11372', function()
clear { args_rm = { '--headless' } }
local evs = {}
screen = Screen.new(20, 5)
-- Override mouse_on/mouse_off handlers.
function screen:_handle_mouse_on()
table.insert(evs, 'mouse_on')
end
function screen:_handle_mouse_off()
table.insert(evs, 'mouse_off')
end
screen:expect(function()
eq({ 'mouse_on' }, evs)
end)
command('set mouse=')
screen:expect(function()
eq({ 'mouse_on', 'mouse_off' }, evs)
end)
command('set mouse&')
screen:expect(function()
eq({ 'mouse_on', 'mouse_off', 'mouse_on' }, evs)
end)
screen:detach()
eq({ 'mouse_on', 'mouse_off', 'mouse_on' }, evs)
screen:attach()
screen:expect(function()
eq({ 'mouse_on', 'mouse_off', 'mouse_on', 'mouse_on' }, evs)
end)
end)
it('when setting options', function()
local expected = reset()
local defaults = shallowcopy(expected)
command('set termguicolors')
expected.termguicolors = true
screen:expect(function()
eq(expected, screen.options)
end)
command('set pumblend=50')
expected.pumblend = 50
screen:expect(function()
eq(expected, screen.options)
end)
-- check handling of out-of-bounds value
command('set pumblend=-1')
expected.pumblend = 0
screen:expect(function()
eq(expected, screen.options)
end)
command('set guifont=Comic\\ Sans')
expected.guifont = 'Comic Sans'
screen:expect(function()
eq(expected, screen.options)
end)
command('set showtabline=0')
expected.showtabline = 0
screen:expect(function()
eq(expected, screen.options)
end)
command('set linespace=13')
expected.linespace = 13
screen:expect(function()
eq(expected, screen.options)
end)
command('set linespace=-11')
expected.linespace = -11
screen:expect(function()
eq(expected, screen.options)
end)
command('set mousefocus')
expected.mousefocus = true
screen:expect(function()
eq(expected, screen.options)
end)
command('set nomousehide')
expected.mousehide = false
screen:expect(function()
eq(expected, screen.options)
end)
command('set mousemoveevent')
expected.mousemoveevent = true
screen:expect(function()
eq(expected, screen.options)
end)
command('set nottimeout')
expected.ttimeout = false
screen:expect(function()
eq(expected, screen.options)
end)
command('set ttimeoutlen=100')
expected.ttimeoutlen = 100
screen:expect(function()
eq(expected, screen.options)
end)
command('set all&')
screen:expect(function()
eq(defaults, screen.options)
end)
end)
it('with UI extensions', function()
local expected = reset({ ext_cmdline = true, ext_wildmenu = true })
expected.ext_cmdline = true
expected.ext_wildmenu = true
screen:expect(function()
eq(expected, screen.options)
end)
screen:set_option('ext_popupmenu', true)
expected.ext_popupmenu = true
screen:expect(function()
eq(expected, screen.options)
end)
screen:set_option('ext_wildmenu', false)
expected.ext_wildmenu = false
screen:expect(function()
eq(expected, screen.options)
end)
end)
local function startup_test(headless)
local expected = reset(nil, {
args_rm = (headless and {} or { '--headless' }),
args = { '--cmd', 'set guifont=Comic\\ Sans\\ 12' },
})
expected.guifont = 'Comic Sans 12'
screen:expect(function()
eq(expected, screen.options)
end)
end
it('from startup options with --headless', function()
startup_test(true)
end)
it('from startup options with --embed', function()
startup_test(false)
end)
end)
describe('UI can set terminal option', function()
before_each(function()
-- by default we implicitly "--cmd 'set bg=light'" which ruins everything
clear { args_rm = { '--cmd' } }
end)
it('term_name', function()
eq('nvim', eval '&term')
local _ = Screen.new(20, 5, { term_name = 'xterm' })
eq('xterm', eval '&term')
end)
it('term_colors', function()
eq('256', eval '&t_Co')
local _ = Screen.new(20, 5, { term_colors = 8 })
eq('8', eval '&t_Co')
end)
end)