neovim/test/functional/options/chars_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

223 lines
7.7 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local clear, command = n.clear, n.command
local pcall_err = t.pcall_err
local eval = n.eval
local eq = t.eq
local insert = n.insert
local feed = n.feed
local api = n.api
describe("'fillchars'", function()
local screen
before_each(function()
clear()
screen = Screen.new(25, 5)
end)
describe('"eob" flag', function()
it("uses '~' by default", function()
eq('', eval('&fillchars'))
screen:expect([[
^ |
{1:~ }|*3
|
]])
end)
it('supports whitespace', function()
screen:expect([[
^ |
{1:~ }|*3
|
]])
command('set fillchars=eob:\\ ')
screen:expect([[
^ |
{1: }|*3
|
]])
end)
it('supports multibyte char', function()
command('set fillchars=eob:ñ')
screen:expect([[
^ |
{1:ñ }|*3
|
]])
end)
it('supports composing multibyte char', function()
command('set fillchars=eob:å̲')
screen:expect([[
^ |
{1:å̲ }|*3
|
]])
end)
it('handles invalid values', function()
eq(
'Vim(set):E1511: Wrong number of characters for field "eob": fillchars=eob:',
pcall_err(command, 'set fillchars=eob:') -- empty string
)
eq(
'Vim(set):E1512: Wrong character width for field "eob": fillchars=eob:馬',
pcall_err(command, 'set fillchars=eob:馬') -- doublewidth char
)
eq(
'Vim(set):E1511: Wrong number of characters for field "eob": fillchars=eob:xy',
pcall_err(command, 'set fillchars=eob:xy') -- two ascii chars
)
eq(
'Vim(set):E1512: Wrong character width for field "eob": fillchars=eob:<ff>',
pcall_err(command, 'set fillchars=eob:\255') -- invalid UTF-8
)
end)
end)
it('"diff" flag', function()
screen:try_resize(45, 8)
screen:set_default_attr_ids({
[1] = { background = Screen.colors.Grey, foreground = Screen.colors.DarkBlue },
[2] = { background = Screen.colors.LightCyan1, bold = true, foreground = Screen.colors.Blue1 },
[3] = { background = Screen.colors.LightBlue },
[4] = { reverse = true },
[5] = { reverse = true, bold = true },
})
command('set fillchars=diff:…')
insert('a\nb\nc\nd\ne')
command('vnew')
insert('a\nd\ne\nf')
command('windo diffthis')
screen:expect([[
{1: }a │{1: }a |
{1: }{2:……………………………………………………}│{1: }{3:b }|
{1: }{2:……………………………………………………}│{1: }{3:c }|
{1: }d │{1: }d |
{1: }e │{1: }^e |
{1: }{3:f }│{1: }{2:……………………………………………………}|
{4:[No Name] [+] }{5:[No Name] [+] }|
|
]])
end)
it('has global value', function()
screen:try_resize(50, 5)
insert('foo\nbar')
command('set laststatus=0')
command('1,2fold')
command('vsplit')
command('set fillchars=fold:x')
screen:expect([[
{13:^+-- 2 lines: fooxxxxxxxx}│{13:+-- 2 lines: fooxxxxxxx}|
{1:~ }│{1:~ }|*3
|
]])
end)
it('has window-local value', function()
screen:try_resize(50, 5)
insert('foo\nbar')
command('set laststatus=0')
command('1,2fold')
command('vsplit')
command('setl fillchars=fold:x')
screen:expect([[
{13:^+-- 2 lines: fooxxxxxxxx}│{13:+-- 2 lines: foo·······}|
{1:~ }│{1:~ }|*3
|
]])
end)
it('using :set clears window-local value', function()
screen:try_resize(50, 5)
insert('foo\nbar')
command('set laststatus=0')
command('setl fillchars=fold:x')
command('1,2fold')
command('vsplit')
command('set fillchars&')
screen:expect([[
{13:^+-- 2 lines: foo········}│{13:+-- 2 lines: fooxxxxxxx}|
{1:~ }│{1:~ }|*3
|
]])
end)
end)
describe("'listchars'", function()
local screen
before_each(function()
clear()
screen = Screen.new(50, 5)
end)
it('has global value', function()
feed('i<tab><tab><tab><esc>')
command('set list laststatus=0')
command('vsplit')
command('set listchars=tab:<->')
screen:expect([[
{1:<------><------>^<------>} │{1:<------><------><------>}|
{1:~ }│{1:~ }|*3
|
]])
end)
it('has window-local value', function()
feed('i<tab><tab><tab><esc>')
command('set list laststatus=0')
command('setl listchars=tab:<->')
command('vsplit')
command('setl listchars<')
screen:expect([[
{1:> > ^> } │{1:<------><------><------>}|
{1:~ }│{1:~ }|*3
|
]])
end)
it('using :set clears window-local value', function()
feed('i<tab><tab><tab><esc>')
command('set list laststatus=0')
command('setl listchars=tab:<->')
command('vsplit')
command('set listchars=tab:>-,eol:$')
screen:expect([[
{1:>------->-------^>-------$}│{1:<------><------><------>}|
{1:~ }│{1:~ }|*3
|
]])
end)
it('supports composing chars', function()
screen:set_default_attr_ids {
[1] = { foreground = Screen.colors.Blue1, bold = true },
}
feed('i<tab><tab><tab>x<esc>')
command('set list laststatus=0')
-- tricky: the tab value forms three separate one-cell chars,
-- thus it should be accepted despite being a mess.
command('set listchars=tab:d̞̄̃̒̉̎ò́̌̌̂̐l̞̀̄̆̌̚,eol:å̲')
screen:expect([[
{1:d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚}^x{1:å̲} |
{1:~ }|*3
|
]])
api.nvim__invalidate_glyph_cache()
screen:_reset()
screen:expect([[
{1:d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚d̞̄̃̒̉̎ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐ò́̌̌̂̐l̞̀̄̆̌̚}^x{1:å̲} |
{1:~ }|*3
|
]])
end)
end)