local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') local eq = helpers.eq local clear = helpers.clear local funcs = helpers.funcs local command = helpers.command local exc_exec = helpers.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, funcs.setmatches({{group=1, pattern=2, id=3, priority=4}})) eq({{ group='1', pattern='2', id=3, priority=4, }}, funcs.getmatches()) eq(0, funcs.setmatches({{group=1, pattern=2, id=3, priority=4, conceal=5}})) eq({{ group='1', pattern='2', id=3, priority=4, conceal='5', }}, funcs.getmatches()) eq(0, funcs.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', }}, funcs.getmatches()) end) it('does not fail if highlight group is not defined', function() eq(0, funcs.setmatches{{group=1, pattern=2, id=3, priority=4}}) eq({{group='1', pattern='2', id=3, priority=4}}, funcs.getmatches()) eq(0, funcs.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'}}, funcs.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, funcs.matchadd(1, 2, 3, 4, {conceal=5})) eq({{ group='1', pattern='2', priority=3, id=4, conceal='5', }}, funcs.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, funcs.matchaddpos('PreProc', {1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) funcs.matchdelete(4) eq(4, funcs.matchaddpos('PreProc', {{0}, 1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) funcs.matchdelete(4) eq(4, funcs.matchaddpos('PreProc', {0, 1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) end) it('works with negative numbers', function() command('hi clear PreProc') eq(4, funcs.matchaddpos('PreProc', {-10, 1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) funcs.matchdelete(4) eq(4, funcs.matchaddpos('PreProc', {{-10}, 1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) funcs.matchdelete(4) eq(4, funcs.matchaddpos('PreProc', {{2, -1}, 1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) funcs.matchdelete(4) eq(4, funcs.matchaddpos('PreProc', {{2, 0, -1}, 1}, 3, 4)) eq({{ group='PreProc', pos1 = {1}, priority=3, id=4, }}, funcs.getmatches()) end) it('works with zero length', function() local screen = Screen.new(40, 5) screen:attach() funcs.setline(1, 'abcdef') command('hi PreProc guifg=Red') eq(4, funcs.matchaddpos('PreProc', {{1, 2, 0}}, 3, 4)) eq({{ group='PreProc', pos1 = {1, 2, 0}, priority=3, id=4, }}, funcs.getmatches()) screen:expect([[ ^a{1:b}cdef | {2:~ }|*3 | ]], {[1] = {foreground = Screen.colors.Red}, [2] = {bold = true, foreground = Screen.colors.Blue1}}) end) end)