Merge pull request #11206 from bfredl/testattr

tests/refactor: make screen.ui use "linegrid" representation internally
This commit is contained in:
Björn Linse 2019-10-13 23:43:06 +02:00 committed by GitHub
commit ba082885d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 169 additions and 315 deletions

View File

@ -15,10 +15,6 @@ describe("update_menu notification", function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
local function expect_sent(expected)
screen:expect{condition=function()
if screen.update_menu ~= expected then

View File

@ -963,9 +963,6 @@ describe("pty process teardown", function()
|
]])
end)
after_each(function()
screen:detach()
end)
it("does not prevent/delay exit. #4798 #4900", function()
if helpers.pending_win32(pending) then return end

View File

@ -144,7 +144,6 @@ describe('eval-API', function()
{5:~ }|
|
]])
screen:detach()
end)
it('cannot be called from sandbox', function()

View File

@ -121,10 +121,6 @@ describe('system()', function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
if iswin() then
local function test_more()
eq('root = true', eval([[get(split(system('"more" ".editorconfig"'), "\n"), 0, '')]]))

View File

@ -19,10 +19,6 @@ describe(":drop", function()
command("set laststatus=2 shortmess-=F")
end)
after_each(function()
screen:detach()
end)
it("works like :e when called with only one window open", function()
feed_command("drop tmp1.vim")
screen:expect([[

View File

@ -13,10 +13,6 @@ describe(':highlight', function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
it('invalid color name', function()
eq('Vim(highlight):E421: Color name or number not recognized: ctermfg=#181818',
exc_exec("highlight normal ctermfg=#181818"))

View File

@ -14,9 +14,6 @@ describe('folding', function()
screen = Screen.new(20, 8)
screen:attach()
end)
after_each(function()
screen:detach()
end)
it('creation, opening, moving (to the end) and closing', function()
insert([[

View File

@ -14,6 +14,10 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
it('is working', function()
local screen = Screen.new(40, 5)
screen:attach()
screen:set_default_attr_ids({
[0] = {bold = true, foreground = Screen.colors.Blue},
[1] = {background = Screen.colors.Red},
})
-- Check that "matcharg()" returns the correct group and pattern if a match
-- is defined.
@ -126,22 +130,22 @@ describe('063: Test for ":match", "matchadd()" and related functions', function(
command("call matchaddpos('MyGroup1', [[1, 5], [1, 8, 3]], 10, 3)")
screen:expect([[
abcd{1:e}fg{1:hij}klmnop^q |
~ |
~ |
~ |
{0:~ }|
{0:~ }|
{0:~ }|
|
]], {[1] = {background = Screen.colors.Red}}, {{bold = true, foreground = Screen.colors.Blue}})
]])
command("call clearmatches()")
command("call setline(1, 'abcdΣabcdef')")
command("call matchaddpos('MyGroup1', [[1, 4, 2], [1, 9, 2]])")
screen:expect([[
abc{1:}ab{1:cd}e^f |
~ |
~ |
~ |
{0:~ }|
{0:~ }|
{0:~ }|
|
]],{[1] = {background = Screen.colors.Red}}, {{bold = true, foreground = Screen.colors.Blue}})
]])
end)
end)

View File

@ -17,7 +17,10 @@ describe('search cmdline', function()
screen = Screen.new(20, 3)
screen:attach()
screen:set_default_attr_ids({
inc = {reverse = true}
inc = {reverse = true},
err = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
more = { bold = true, foreground = Screen.colors.SeaGreen4 },
tilde = { bold = true, foreground = Screen.colors.Blue1 },
})
end)
@ -404,15 +407,7 @@ describe('search cmdline', function()
end)
it('keeps the view after deleting a char from the search', function()
screen:detach()
screen = Screen.new(20, 6)
screen:attach()
screen:set_default_attr_ids({
inc = {reverse = true}
})
screen:set_default_attr_ignore({
{bold=true, reverse=true}, {bold=true, foreground=Screen.colors.Blue1}
})
screen:try_resize(20, 6)
tenlines()
feed('/foo')
@ -448,14 +443,7 @@ describe('search cmdline', function()
end)
it('restores original view after failed search', function()
screen:detach()
screen = Screen.new(40, 3)
screen:attach()
screen:set_default_attr_ids({
inc = {reverse = true},
err = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
more = { bold = true, foreground = Screen.colors.SeaGreen4 },
})
screen:try_resize(40, 3)
tenlines()
feed('0')
feed('/foo')
@ -484,15 +472,7 @@ describe('search cmdline', function()
it("CTRL-G with 'incsearch' and ? goes in the right direction", function()
-- oldtest: Test_search_cmdline4().
screen:detach()
screen = Screen.new(40, 4)
screen:attach()
screen:set_default_attr_ids({
inc = {reverse = true},
err = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
more = { bold = true, foreground = Screen.colors.SeaGreen4 },
tilde = { bold = true, foreground = Screen.colors.Blue1 },
})
screen:try_resize(40, 4)
command('enew!')
funcs.setline(1, {' 1 the first', ' 2 the second', ' 3 the third'})
command('set laststatus=0 shortmess+=s')

View File

@ -16,10 +16,6 @@ describe("'fillchars'", function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
local function shouldfail(val,errval)
errval = errval or val
eq('Vim(set):E474: Invalid argument: fillchars='..errval,
@ -100,10 +96,6 @@ describe("'listchars'", function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
it('is local to window', function()
feed('i<tab><tab><tab><esc>')
command('set laststatus=0')

View File

@ -116,8 +116,6 @@ describe('health.vim', function()
screen:set_default_attr_ids({
Ok = { foreground = Screen.colors.Grey3, background = 6291200 },
Error = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
})
screen:set_default_attr_ignore({
Heading = { bold=true, foreground=Screen.colors.Magenta },
Heading2 = { foreground = Screen.colors.SlateBlue },
Bar = { foreground=Screen.colors.Purple },
@ -126,18 +124,18 @@ describe('health.vim', function()
command("checkhealth foo success1")
command("1tabclose")
command("set laststatus=0")
screen:expect([[
screen:expect{grid=[[
^ |
health#foo#check |
========================================================================|
- {Error:ERROR:} No healthcheck found for "foo" plugin. |
{Heading:health#foo#check} |
{Bar:========================================================================}|
{Bullet: -} {Error:ERROR:} No healthcheck found for "foo" plugin. |
|
health#success1#check |
========================================================================|
## report 1 |
- {Ok:OK:} everything is fine |
{Heading:health#success1#check} |
{Bar:========================================================================}|
{Heading2:##}{Heading: report 1} |
{Bullet: -} {Ok:OK:} everything is fine |
|
]])
]]}
end)
it("gracefully handles invalid healthcheck", function()

View File

@ -19,38 +19,32 @@ describe(':Man', function()
u = { underline = true },
bi = { bold = true, italic = true },
biu = { bold = true, italic = true, underline = true },
})
screen:set_default_attr_ignore({
{ foreground = Screen.colors.Blue }, -- control chars
{ bold = true, foreground = Screen.colors.Blue } -- empty line '~'s
c = { foreground = Screen.colors.Blue }, -- control chars
eob = { bold = true, foreground = Screen.colors.Blue } -- empty line '~'s
})
screen:attach()
end)
after_each(function()
screen:detach()
end)
it('clears backspaces from text and adds highlights', function()
rawfeed([[
ithis i<C-v><C-h>is<C-v><C-h>s a<C-v><C-h>a test
with _<C-v><C-h>o_<C-v><C-h>v_<C-v><C-h>e_<C-v><C-h>r_<C-v><C-h>s_<C-v><C-h>t_<C-v><C-h>r_<C-v><C-h>u_<C-v><C-h>c_<C-v><C-h>k text<ESC>]])
screen:expect([[
this i^His^Hs a^Ha test |
with _^Ho_^Hv_^He_^Hr_^Hs_^Ht_^Hr_^Hu_^Hc_^Hk tex^t |
~ |
~ |
|
]])
screen:expect{grid=[[
this i{c:^H}is{c:^H}s a{c:^H}a test |
with _{c:^H}o_{c:^H}v_{c:^H}e_{c:^H}r_{c:^H}s_{c:^H}t_{c:^H}r_{c:^H}u_{c:^H}c_{c:^H}k tex^t |
{eob:~ }|
{eob:~ }|
|
]]}
eval('man#init_pager()')
screen:expect([[
^this {b:is} {b:a} test |
with {u:overstruck} text |
~ |
~ |
{eob:~ }|
{eob:~ }|
|
]])
end)
@ -60,21 +54,21 @@ describe(':Man', function()
ithis <C-v><ESC>[1mis <C-v><ESC>[3ma <C-v><ESC>[4mtest<C-v><ESC>[0m
<C-v><ESC>[4mwith<C-v><ESC>[24m <C-v><ESC>[4mescaped<C-v><ESC>[24m <C-v><ESC>[4mtext<C-v><ESC>[24m<ESC>]])
screen:expect([=[
this ^[[1mis ^[[3ma ^[[4mtest^[[0m |
^[[4mwith^[[24m ^[[4mescaped^[[24m ^[[4mtext^[[24^m |
~ |
~ |
|
]=])
screen:expect{grid=[=[
this {c:^[}[1mis {c:^[}[3ma {c:^[}[4mtest{c:^[}[0m |
{c:^[}[4mwith{c:^[}[24m {c:^[}[4mescaped{c:^[}[24m {c:^[}[4mtext{c:^[}[24^m |
{eob:~ }|
{eob:~ }|
|
]=]}
eval('man#init_pager()')
screen:expect([[
^this {b:is }{bi:a }{biu:test} |
{u:with} {u:escaped} {u:text} |
~ |
~ |
{eob:~ }|
{eob:~ }|
|
]])
end)
@ -88,8 +82,8 @@ describe(':Man', function()
screen:expect([[
^this {b:is} {b:} test |
with {u:överstrũck} te{i:xt} |
~ |
~ |
{eob:~ }|
{eob:~ }|
|
]])
end)
@ -105,7 +99,7 @@ describe(':Man', function()
{b:^_begins} |
{b:mid_dle} |
{u:mid_dle} |
~ |
{eob:~ }|
|
]])
end)
@ -121,7 +115,7 @@ describe(':Man', function()
^· {b:·} |
{b:·} |
{b:·} double |
~ |
{eob:~ }|
|
]])
end)

View File

@ -88,6 +88,11 @@ describe('clipboard', function()
before_each(function()
clear()
screen = Screen.new(72, 4)
screen:set_default_attr_ids({
[0] = {bold = true, foreground = Screen.colors.Blue},
[1] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
[2] = {bold = true, foreground = Screen.colors.SeaGreen4},
})
screen:attach()
command("set display-=msgsep")
end)
@ -103,22 +108,22 @@ describe('clipboard', function()
feed_command('redir @+> | :silent echo system("cat CONTRIBUTING.md") | redir END')
screen:expect([[
^ |
~ |
~ |
{0:~ }|
{0:~ }|
clipboard: No provider. Try ":checkhealth" or ":h clipboard". |
]], nil, {{bold = true, foreground = Screen.colors.Blue}})
]])
end)
it('`:redir @+>|bogus_cmd|redir END` + invalid g:clipboard must not recurse #7184',
function()
command("let g:clipboard = 'bogus'")
feed_command('redir @+> | bogus_cmd | redir END')
screen:expect([[
~ |
screen:expect{grid=[[
{0:~ }|
clipboard: No provider. Try ":checkhealth" or ":h clipboard". |
E492: Not an editor command: bogus_cmd | redir END |
Press ENTER or type command to continue^ |
]], nil, {{bold = true, foreground = Screen.colors.Blue}})
{1:E492: Not an editor command: bogus_cmd | redir END} |
{2:Press ENTER or type command to continue}^ |
]]}
end)
it('invalid g:clipboard shows hint if :redir is not active', function()
@ -131,10 +136,10 @@ describe('clipboard', function()
feed_command('let @+="foo"')
screen:expect([[
^ |
~ |
~ |
{0:~ }|
{0:~ }|
clipboard: No provider. Try ":checkhealth" or ":h clipboard". |
]], nil, {{bold = true, foreground = Screen.colors.Blue}})
]])
end)
it('valid g:clipboard', function()
@ -266,13 +271,17 @@ describe('clipboard (with fake clipboard.vim)', function()
function()
local screen = Screen.new(72, 4)
screen:attach()
screen:set_default_attr_ids({
[0] = {bold = true, foreground = Screen.colors.Blue},
[1] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
})
feed_command('redir @+> | bogus_cmd | redir END')
screen:expect([[
^ |
~ |
~ |
E492: Not an editor command: bogus_cmd | redir END |
]], nil, {{bold = true, foreground = Screen.colors.Blue}})
{0:~ }|
{0:~ }|
{1:E492: Not an editor command: bogus_cmd | redir END} |
]])
end)
it('has independent "* and unnamed registers by default', function()
@ -637,6 +646,9 @@ describe('clipboard (with fake clipboard.vim)', function()
feed_command('set mouse=a')
local screen = Screen.new(30, 5)
screen:set_default_attr_ids({
[0] = {bold = true, foreground = Screen.colors.Blue},
})
screen:attach()
insert([[
the source
@ -646,10 +658,10 @@ describe('clipboard (with fake clipboard.vim)', function()
screen:expect([[
the ^source |
a target |
~ |
~ |
{0:~ }|
{0:~ }|
|
]], nil, {{bold = true, foreground = Screen.colors.Blue}})
]])
feed('<MiddleMouse><0,1>')
expect([[

View File

@ -208,18 +208,18 @@ describe(':terminal buffer', function()
feed_command('terminal')
feed('<c-\\><c-n>')
feed_command('confirm bdelete')
screen:expect{any='Close "term://', attr_ignore=true}
screen:expect{any='Close "term://'}
end)
it('with &confirm', function()
feed_command('terminal')
feed('<c-\\><c-n>')
feed_command('bdelete')
screen:expect{any='E89', attr_ignore=true}
screen:expect{any='E89'}
feed('<cr>')
eq('terminal', eval('&buftype'))
feed_command('set confirm | bdelete')
screen:expect{any='Close "term://', attr_ignore=true}
screen:expect{any='Close "term://'}
feed('y')
neq('terminal', eval('&buftype'))
end)

View File

@ -52,7 +52,7 @@ local function screen_setup(extra_rows, command, cols, opts)
[3] = {bold = true},
[4] = {foreground = 12},
[5] = {bold = true, reverse = true},
[6] = {background = 11},
-- 6 was a duplicate item
[7] = {foreground = 130},
[8] = {foreground = 15, background = 1}, -- error message
[9] = {foreground = 4},

View File

@ -31,10 +31,6 @@ describe(':terminal mouse', function()
]])
end)
after_each(function()
screen:detach()
end)
describe('when the terminal has focus', function()
it('will exit focus on mouse-scroll', function()
eq('t', eval('mode()'))

View File

@ -21,10 +21,6 @@ describe(':terminal scrollback', function()
screen = thelpers.screen_setup(nil, nil, 30)
end)
after_each(function()
screen:detach()
end)
describe('when the limit is exceeded', function()
before_each(function()
local lines = {}
@ -406,8 +402,6 @@ describe("'scrollback' option", function()
feed_data(nvim_dir..'/shell-test REP 31 line'..(iswin() and '\r' or '\n'))
screen:expect{any='30: line '}
retry(nil, nil, function() expect_lines(7) end)
screen:detach()
end)
it('deletes lines (only) if necessary', function()
@ -464,8 +458,6 @@ describe("'scrollback' option", function()
-- Verify off-screen state
eq((iswin() and '36: line' or '35: line'), eval("getline(line('w0') - 1)"))
eq((iswin() and '27: line' or '26: line'), eval("getline(line('w0') - 10)"))
screen:detach()
end)
it('defaults to 10000 in :terminal buffers', function()

View File

@ -45,10 +45,6 @@ describe('TUI', function()
child_session = helpers.connect(child_server)
end)
after_each(function()
screen:detach()
end)
-- Wait for mode in the child Nvim (avoid "typeahead race" #10826).
local function wait_for_mode(mode)
retry(nil, nil, function()

View File

@ -37,10 +37,6 @@ describe('Buffer highlighting', function()
})
end)
after_each(function()
screen:detach()
end)
local add_highlight = curbufmeths.add_highlight
local clear_namespace = curbufmeths.clear_namespace

View File

@ -25,10 +25,6 @@ local function test_cmdline(linegrid)
screen = new_screen({rgb=true, ext_cmdline=true, ext_linegrid=linegrid})
end)
after_each(function()
screen:detach()
end)
it('works', function()
feed(':')
screen:expect{grid=[[
@ -804,10 +800,6 @@ describe('cmdline redraw', function()
screen = new_screen({rgb=true})
end)
after_each(function()
screen:detach()
end)
it('with timer', function()
feed(':012345678901234567890123456789')
screen:expect{grid=[[

View File

@ -13,10 +13,6 @@ describe('ui/cursor', function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
it("'guicursor' is published as a UI event", function()
local expected_mode_info = {
[1] = {

View File

@ -24,10 +24,6 @@ describe("folded lines", function()
})
end)
after_each(function()
screen:detach()
end)
it("work with more than one signcolumn", function()
command("set signcolumn=yes:9")
feed("i<cr><esc>")

View File

@ -35,7 +35,6 @@ describe('highlight: `:syntax manual`', function()
end)
after_each(function()
screen:detach()
os.remove('Xtest-functional-ui-highlight.tmp.vim')
end)
@ -97,10 +96,6 @@ describe('highlight defaults', function()
command("set display-=msgsep")
end)
after_each(function()
screen:detach()
end)
it('window status bar', function()
screen:set_default_attr_ids({
[0] = {bold=true, foreground=Screen.colors.Blue},
@ -346,17 +341,10 @@ describe('highlight defaults', function()
end)
describe('highlight', function()
local screen
before_each(function()
clear()
screen = Screen.new(25,10)
screen:attach()
end)
before_each(clear)
it('visual', function()
screen:detach()
screen = Screen.new(20,4)
local screen = Screen.new(20,4)
screen:attach()
screen:set_default_attr_ids({
[1] = {background = Screen.colors.LightGrey},
@ -389,8 +377,7 @@ describe('highlight', function()
end)
it('cterm=standout gui=standout', function()
screen:detach()
screen = Screen.new(20,5)
local screen = Screen.new(20,5)
screen:attach()
screen:set_default_attr_ids({
[1] = {bold = true, foreground = Screen.colors.Blue1},
@ -413,8 +400,7 @@ describe('highlight', function()
end)
it('strikethrough', function()
screen:detach()
screen = Screen.new(25,6)
local screen = Screen.new(25,6)
screen:attach()
feed_command('syntax on')
feed_command('syn keyword TmpKeyword foo')
@ -439,8 +425,7 @@ describe('highlight', function()
end)
it('nocombine', function()
screen:detach()
screen = Screen.new(25,6)
local screen = Screen.new(25,6)
screen:set_default_attr_ids{
[1] = {foreground = Screen.colors.SlateBlue, underline = true},
[2] = {bold = true, foreground = Screen.colors.Blue1},
@ -487,6 +472,8 @@ describe('highlight', function()
end)
it('guisp (special/undercurl)', function()
local screen = Screen.new(25,10)
screen:attach()
feed_command('syntax on')
feed_command('syn keyword TmpKeyword neovim')
feed_command('syn keyword TmpKeyword1 special')
@ -542,10 +529,6 @@ describe("'listchars' highlight", function()
screen:attach()
end)
after_each(function()
screen:detach()
end)
it("'cursorline' and 'cursorcolumn'", function()
screen:set_default_attr_ids({
[0] = {bold=true, foreground=Screen.colors.Blue},

View File

@ -259,7 +259,7 @@ describe('ext_hlstate detailed highlights', function()
it("can use independent cterm and rgb colors", function()
-- tell test module to save all attributes (doesn't change nvim options)
screen:set_hlstate_cterm(true)
screen:set_rgb_cterm(true)
screen:set_default_attr_ids({
[1] = {{bold = true, foreground = Screen.colors.Blue1}, {foreground = 12}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},

View File

@ -556,7 +556,6 @@ describe(":substitute, 'inccommand' preserves undo", function()
]])
end
end
screen:detach()
end)
it('with undolevels=2', function()
@ -647,7 +646,6 @@ describe(":substitute, 'inccommand' preserves undo", function()
Already ...t change |
]])
end
screen:detach()
end
end)
@ -713,7 +711,6 @@ describe(":substitute, 'inccommand' preserves undo", function()
Already ...t change |
]])
end
screen:detach()
end)
end)
@ -726,10 +723,6 @@ describe(":substitute, inccommand=split", function()
common_setup(screen, "split", default_text .. default_text)
end)
after_each(function()
screen:detach()
end)
it("preserves 'modified' buffer flag", function()
feed_command("set nomodified")
feed(":%s/tw")
@ -1241,10 +1234,6 @@ describe("inccommand=nosplit", function()
common_setup(screen, "nosplit", default_text .. default_text)
end)
after_each(function()
if screen then screen:detach() end
end)
it("works with :smagic, :snomagic", function()
feed_command("set hlsearch")
insert("Line *.3.* here")
@ -1719,10 +1708,6 @@ describe("'inccommand' split windows", function()
common_setup(screen, "split", default_text)
end
after_each(function()
screen:detach()
end)
it('work after more splits', function()
refresh()

View File

@ -26,6 +26,8 @@ describe('ui/mouse/input', function()
},
[4] = {reverse = true},
[5] = {bold = true, reverse = true},
[6] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
[7] = {bold = true, foreground = Screen.colors.SeaGreen4},
})
command("set display-=msgsep")
feed('itesting<cr>mouse<cr>support and selection<esc>')
@ -38,10 +40,6 @@ describe('ui/mouse/input', function()
]])
end)
after_each(function()
screen:detach()
end)
it('single left click moves cursor', function()
feed('<LeftMouse><2,1>')
screen:expect([[
@ -620,12 +618,12 @@ describe('ui/mouse/input', function()
meths.set_option('tags', './non-existent-tags-file')
feed('<C-LeftMouse><0,0>')
screen:expect([[
E433: No tags file |
E426: tag not found: test|
ing |
Press ENTER or type comma|
nd to continue^ |
]],nil,true)
{6:E433: No tags file} |
{6:E426: tag not found: test}|
{6:ing} |
{7:Press ENTER or type comma}|
{7:nd to continue}^ |
]])
feed('<cr>')
end)

View File

@ -21,10 +21,6 @@ describe("multibyte rendering", function()
})
end)
after_each(function()
screen:detach()
end)
it("works with composed char at start of line", function()
insert([[
̊
@ -131,10 +127,6 @@ describe('multibyte rendering: statusline', function()
command('set laststatus=2')
end)
after_each(function()
screen:detach()
end)
it('last char shows (multibyte)', function()
command('set statusline=你好')
screen:expect([[

View File

@ -37,10 +37,6 @@ describe('ext_multigrid', function()
})
end)
after_each(function()
screen:detach()
end)
it('default initial screen', function()
screen:expect{grid=[[
## grid 1

View File

@ -40,10 +40,6 @@ describe('ui receives option updates', function()
return defaults
end
after_each(function()
screen:detach()
end)
it("for defaults", function()
local expected = reset()
screen:expect(function()

View File

@ -31,7 +31,6 @@ describe("shell command :!", function()
after_each(function()
child_session.feed_data("\3") -- Ctrl-C
screen:detach()
end)
it("displays output without LF/EOF. #4646 #4569 #3772", function()

View File

@ -66,7 +66,6 @@
-- [1] = {reverse = true, bold = true},
-- [2] = {reverse = true}
-- })
-- screen:set_default_attr_ignore( {{}, {bold=true, foreground=NonText}} )
--
-- To help write screen tests, see Screen:snapshot_util().
-- To debug screen tests, see Screen:redraw_debug().
@ -169,12 +168,11 @@ function Screen.new(width, height)
ruler = {},
hl_groups = {},
_default_attr_ids = nil,
_default_attr_ignore = nil,
_mouse_enabled = true,
_attrs = {},
_hl_info = {},
_hl_info = {[0]={}},
_attr_table = {[0]={{},{}}},
_clear_attrs = {},
_clear_attrs = nil,
_new_attrs = false,
_width = width,
_height = height,
@ -202,12 +200,8 @@ function Screen:get_default_attr_ids()
return deepcopy(self._default_attr_ids)
end
function Screen:set_default_attr_ignore(attr_ignore)
self._default_attr_ignore = attr_ignore
end
function Screen:set_hlstate_cterm(val)
self._hlstate_cterm = val
function Screen:set_rgb_cterm(val)
self._rgb_cterm = val
end
function Screen:attach(options, session)
@ -223,7 +217,7 @@ function Screen:attach(options, session)
self._session = session
self._options = options
self._clear_attrs = (options.ext_linegrid and {{},{}}) or {}
self._clear_attrs = (not options.ext_linegrid) and {} or nil
self:_handle_resize(self._width, self._height)
self.uimeths.attach(self._width, self._height, options)
if self._options.rgb == nil then
@ -265,7 +259,7 @@ local ext_keys = {
-- Asserts that the screen state eventually matches an expected state.
--
-- Can be called with positional args:
-- screen:expect(grid, [attr_ids, attr_ignore])
-- screen:expect(grid, [attr_ids])
-- screen:expect(condition)
-- or keyword args (supports more options):
-- screen:expect{grid=[[...]], cmdline={...}, condition=function() ... end}
@ -282,8 +276,6 @@ local ext_keys = {
-- attributes in the final state are an error.
-- Use screen:set_default_attr_ids() to define attributes for many
-- expect() calls.
-- attr_ignore: Ignored text attributes, or `true` to ignore all. By default
-- nothing is ignored.
-- condition: Function asserting some arbitrary condition. Return value is
-- ignored, throw an error (use eq() or similar) to signal failure.
-- any: Lua pattern string expected to match a screen line. NB: the
@ -318,13 +310,13 @@ local ext_keys = {
-- cmdline_block: Expected ext_cmdline block (for function definitions)
-- wildmenu_items: Expected items for ext_wildmenu
-- wildmenu_pos: Expected position for ext_wildmenu
function Screen:expect(expected, attr_ids, attr_ignore, ...)
function Screen:expect(expected, attr_ids, ...)
local grid, condition = nil, nil
local expected_rows = {}
assert(next({...}) == nil, "invalid args to expect()")
if type(expected) == "table" then
assert(not (attr_ids ~= nil or attr_ignore ~= nil))
local is_key = {grid=true, attr_ids=true, attr_ignore=true, condition=true,
assert(not (attr_ids ~= nil))
local is_key = {grid=true, attr_ids=true, condition=true,
any=true, mode=true, unchanged=true, intermediate=true,
reset=true, timeout=true, request_cb=true, hl_groups=true}
for _, v in ipairs(ext_keys) do
@ -337,14 +329,13 @@ function Screen:expect(expected, attr_ids, attr_ignore, ...)
end
grid = expected.grid
attr_ids = expected.attr_ids
attr_ignore = expected.attr_ignore
condition = expected.condition
assert(not (expected.any ~= nil and grid ~= nil))
elseif type(expected) == "string" then
grid = expected
expected = {}
elseif type(expected) == "function" then
assert(not (attr_ids ~= nil or attr_ignore ~= nil))
assert(not (attr_ids ~= nil))
condition = expected
expected = {}
else
@ -361,10 +352,9 @@ function Screen:expect(expected, attr_ids, attr_ignore, ...)
end
local attr_state = {
ids = attr_ids or self._default_attr_ids,
ignore = attr_ignore or self._default_attr_ignore,
}
if self._options.ext_hlstate then
attr_state.id_to_index = self:hlstate_check_attrs(attr_state.ids or {})
if self._options.ext_linegrid then
attr_state.id_to_index = self:linegrid_check_attrs(attr_state.ids or {})
end
self._new_attrs = false
self:_wait(function()
@ -375,8 +365,8 @@ function Screen:expect(expected, attr_ids, attr_ignore, ...)
end
end
if self._options.ext_hlstate and self._new_attrs then
attr_state.id_to_index = self:hlstate_check_attrs(attr_state.ids or {})
if self._options.ext_linegrid and self._new_attrs then
attr_state.id_to_index = self:linegrid_check_attrs(attr_state.ids or {})
end
local actual_rows = self:render(not expected.any, attr_state)
@ -898,19 +888,16 @@ function Screen:_handle_grid_line(grid, row, col, items)
assert(self._options.ext_linegrid)
local line = self._grids[grid].rows[row+1]
local colpos = col+1
local hl = self._clear_attrs
local hl_id = 0
for _,item in ipairs(items) do
local text, hl_id_cell, count = unpack(item)
if hl_id_cell ~= nil then
hl_id = hl_id_cell
hl = self._attr_table[hl_id]
end
for _ = 1, (count or 1) do
local cell = line[colpos]
cell.text = text
cell.hl_id = hl_id
cell.attrs = hl
colpos = colpos+1
end
end
@ -1070,6 +1057,7 @@ function Screen:_clear_row_section(grid, rownum, startcol, stopcol, invalid)
for i = startcol, stopcol do
row[i].text = (invalid and '<EFBFBD>' or ' ')
row[i].attrs = self._clear_attrs
row[i].hl_id = 0
end
end
@ -1100,11 +1088,7 @@ function Screen:_row_repr(gridnr, rownr, attr_state, cursor)
end
if not did_window then
local attrs = row[i].attrs
if self._options.ext_linegrid then
attrs = attrs[(self._options.rgb and 1) or 2]
end
local attr_id = self:_get_attr_id(attr_state, attrs, row[i].hl_id)
local attr_id = self:_get_attr_id(attr_state, row[i].attrs, row[i].hl_id)
if current_attr_id and attr_id ~= current_attr_id then
-- close current attribute bracket
table.insert(rv, '}')
@ -1261,8 +1245,8 @@ function Screen:get_snapshot(attrs, ignore)
attr_state.ids[i] = a
end
end
if self._options.ext_hlstate then
attr_state.id_to_index = self:hlstate_check_attrs(attr_state.ids)
if self._options.ext_linegrid then
attr_state.id_to_index = self:linegrid_check_attrs(attr_state.ids)
end
local lines = self:render(true, attr_state, true)
@ -1299,8 +1283,8 @@ function Screen:print_snapshot(attrs, ignore)
local attrstrs = {}
for i, a in pairs(attr_state.ids) do
local dict
if self._options.ext_hlstate then
dict = self:_pprint_hlstate(a)
if self._options.ext_linegrid then
dict = self:_pprint_hlitem(a)
else
dict = "{"..self:_pprint_attrs(a).."}"
end
@ -1328,37 +1312,41 @@ function Screen:_insert_hl_id(attr_state, hl_id)
return attr_state.id_to_index[hl_id]
end
local raw_info = self._hl_info[hl_id]
local info = {}
if #raw_info > 1 then
for i, item in ipairs(raw_info) do
info[i] = self:_insert_hl_id(attr_state, item.id)
end
else
info[1] = {}
for k, v in pairs(raw_info[1]) do
if k ~= "id" then
info[1][k] = v
local info = nil
if self._options.ext_hlstate then
info = {}
if #raw_info > 1 then
for i, item in ipairs(raw_info) do
info[i] = self:_insert_hl_id(attr_state, item.id)
end
else
info[1] = {}
for k, v in pairs(raw_info[1]) do
if k ~= "id" then
info[1][k] = v
end
end
end
end
local entry = self._attr_table[hl_id]
local attrval
if self._hlstate_cterm then
if self._rgb_cterm then
attrval = {entry[1], entry[2], info} -- unpack() doesn't work
else
elseif self._options.ext_hlstate then
attrval = {entry[1], info}
else
attrval = self._options.rgb and entry[1] or entry[2]
end
table.insert(attr_state.ids, attrval)
attr_state.id_to_index[hl_id] = #attr_state.ids
return #attr_state.ids
end
function Screen:hlstate_check_attrs(attrs)
function Screen:linegrid_check_attrs(attrs)
local id_to_index = {}
for i = 1,#self._attr_table do
for i, def_attr in pairs(self._attr_table) do
local iinfo = self._hl_info[i]
local matchinfo = {}
if #iinfo > 1 then
@ -1370,13 +1358,16 @@ function Screen:hlstate_check_attrs(attrs)
end
for k,v in pairs(attrs) do
local attr, info, attr_rgb, attr_cterm
if self._hlstate_cterm then
if self._rgb_cterm then
attr_rgb, attr_cterm, info = unpack(v)
attr = {attr_rgb, attr_cterm}
else
elseif self._options.ext_hlstate then
attr, info = unpack(v)
else
attr = v
info = {}
end
if self:_equal_attr_def(attr, self._attr_table[i]) then
if self:_equal_attr_def(attr, def_attr) then
if #info == #matchinfo then
local match = false
if #info == 1 then
@ -1397,24 +1388,31 @@ function Screen:hlstate_check_attrs(attrs)
end
end
end
if self:_equal_attr_def(self._rgb_cterm and {{}, {}} or {}, def_attr) and #self._hl_info[i] == 0 then
id_to_index[i] = ""
end
end
return id_to_index
end
function Screen:_pprint_hlstate(item)
function Screen:_pprint_hlitem(item)
-- print(inspect(item))
local attrdict = "{"..self:_pprint_attrs(item[1]).."}, "
local multi = self._rgb_cterm or self._options.ext_hlstate
local attrdict = "{"..self:_pprint_attrs(multi and item[1] or item).."}"
local attrdict2, hlinfo
if self._hlstate_cterm then
attrdict2 = "{"..self:_pprint_attrs(item[2]).."}, "
local descdict = ""
if self._rgb_cterm then
attrdict2 = ", {"..self:_pprint_attrs(item[2]).."}"
hlinfo = item[3]
else
attrdict2 = ""
hlinfo = item[2]
end
local descdict = "{"..self:_pprint_hlinfo(hlinfo).."}"
return "{"..attrdict..attrdict2..descdict.."}"
if self._options.ext_hlstate then
descdict = ", {"..self:_pprint_hlinfo(hlinfo).."}"
end
return (multi and "{" or "")..attrdict..attrdict2..descdict..(multi and "}" or "")
end
function Screen:_pprint_hlinfo(states)
@ -1464,9 +1462,11 @@ function Screen:_get_attr_id(attr_state, attrs, hl_id)
return
end
if self._options.ext_hlstate then
if self._options.ext_linegrid then
local id = attr_state.id_to_index[hl_id]
if id ~= nil or hl_id == 0 then
if id == "" then -- sentinel for empty it
return nil
elseif id ~= nil then
return id
end
if attr_state.mutable then
@ -1476,9 +1476,7 @@ function Screen:_get_attr_id(attr_state, attrs, hl_id)
end
return "UNEXPECTED "..self:_pprint_attrs(self._attr_table[hl_id][1])
else
if self:_equal_attrs(attrs, {}) or
attr_state.ignore == true or
self:_attr_index(attr_state.ignore, attrs) ~= nil then
if self:_equal_attrs(attrs, {}) then
-- ignore this attrs
return nil
end
@ -1497,10 +1495,12 @@ function Screen:_get_attr_id(attr_state, attrs, hl_id)
end
function Screen:_equal_attr_def(a, b)
if self._hlstate_cterm then
if self._rgb_cterm then
return self:_equal_attrs(a[1],b[1]) and self:_equal_attrs(a[2],b[2])
else
elseif self._options.rgb then
return self:_equal_attrs(a,b[1])
else
return self:_equal_attrs(a,b[2])
end
end

View File

@ -26,10 +26,6 @@ describe('Signs', function()
} )
end)
after_each(function()
screen:detach()
end)
describe(':sign place', function()
it('allows signs with combining characters', function()
feed('ia<cr>b<cr><esc>')

View File

@ -20,10 +20,6 @@ describe("'spell'", function()
})
end)
after_each(function()
screen:detach()
end)
it('joins long lines #7937', function()
feed_command('set spell')
insert([[

View File

@ -22,10 +22,6 @@ describe('Screen', function()
} )
end)
after_each(function()
screen:detach()
end)
describe("match and conceal", function()
before_each(function()

View File

@ -17,10 +17,6 @@ describe('ui/ext_tabline', function()
end)
end)
after_each(function()
screen:detach()
end)
it('publishes UI events', function()
command("tabedit another-tab")