neovim/test/functional/vimscript/match_functions_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

201 lines
4.8 KiB
Lua

local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local eq = t.eq
local clear = n.clear
local fn = n.fn
local command = n.command
local exc_exec = n.exc_exec
before_each(clear)
describe('setmatches()', function()
it('correctly handles case when both group and pattern entries are numbers', function()
command('hi def link 1 PreProc')
eq(0, fn.setmatches({ { group = 1, pattern = 2, id = 3, priority = 4 } }))
eq({
{
group = '1',
pattern = '2',
id = 3,
priority = 4,
},
}, fn.getmatches())
eq(0, fn.setmatches({ { group = 1, pattern = 2, id = 3, priority = 4, conceal = 5 } }))
eq({
{
group = '1',
pattern = '2',
id = 3,
priority = 4,
conceal = '5',
},
}, fn.getmatches())
eq(
0,
fn.setmatches({
{ group = 1, pos1 = { 2 }, pos2 = { 6 }, id = 3, priority = 4, conceal = 5 },
})
)
eq({
{
group = '1',
pos1 = { 2 },
pos2 = { 6 },
id = 3,
priority = 4,
conceal = '5',
},
}, fn.getmatches())
end)
it('does not fail if highlight group is not defined', function()
eq(0, fn.setmatches { { group = 1, pattern = 2, id = 3, priority = 4 } })
eq({ { group = '1', pattern = '2', id = 3, priority = 4 } }, fn.getmatches())
eq(
0,
fn.setmatches {
{ group = 1, pos1 = { 2 }, pos2 = { 6 }, id = 3, priority = 4, conceal = 5 },
}
)
eq(
{ { group = '1', pos1 = { 2 }, pos2 = { 6 }, id = 3, priority = 4, conceal = '5' } },
fn.getmatches()
)
end)
end)
describe('matchadd()', function()
it('correctly works when first two arguments and conceal are numbers at once', function()
command('hi def link 1 PreProc')
eq(4, fn.matchadd(1, 2, 3, 4, { conceal = 5 }))
eq({
{
group = '1',
pattern = '2',
priority = 3,
id = 4,
conceal = '5',
},
}, fn.getmatches())
end)
end)
describe('matchaddpos()', function()
it('errors out on invalid input', function()
command('hi clear PreProc')
eq(
'Vim(let):E5030: Empty list at position 0',
exc_exec('let val = matchaddpos("PreProc", [[]])')
)
eq(
'Vim(let):E5030: Empty list at position 1',
exc_exec('let val = matchaddpos("PreProc", [1, v:_null_list])')
)
eq(
'Vim(let):E5031: List or number required at position 1',
exc_exec('let val = matchaddpos("PreProc", [1, v:_null_dict])')
)
end)
it('works with 0 lnum', function()
command('hi clear PreProc')
eq(4, fn.matchaddpos('PreProc', { 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
fn.matchdelete(4)
eq(4, fn.matchaddpos('PreProc', { { 0 }, 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
fn.matchdelete(4)
eq(4, fn.matchaddpos('PreProc', { 0, 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
end)
it('works with negative numbers', function()
command('hi clear PreProc')
eq(4, fn.matchaddpos('PreProc', { -10, 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
fn.matchdelete(4)
eq(4, fn.matchaddpos('PreProc', { { -10 }, 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
fn.matchdelete(4)
eq(4, fn.matchaddpos('PreProc', { { 2, -1 }, 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
fn.matchdelete(4)
eq(4, fn.matchaddpos('PreProc', { { 2, 0, -1 }, 1 }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1 },
priority = 3,
id = 4,
},
}, fn.getmatches())
end)
it('works with zero length', function()
local screen = Screen.new(40, 5)
fn.setline(1, 'abcdef')
command('hi PreProc guifg=Red')
eq(4, fn.matchaddpos('PreProc', { { 1, 2, 0 } }, 3, 4))
eq({
{
group = 'PreProc',
pos1 = { 1, 2, 0 },
priority = 3,
id = 4,
},
}, fn.getmatches())
screen:expect(
[[
^a{1:b}cdef |
{2:~ }|*3
|
]],
{
[1] = { foreground = Screen.colors.Red },
[2] = { bold = true, foreground = Screen.colors.Blue1 },
}
)
end)
end)