unittests,syntax: Check for sanity of highlight_init_cmdline

Also fixes some errors found.
This commit is contained in:
ZyX
2017-11-12 16:59:36 +03:00
parent 45445e2e03
commit 556451a7f2
4 changed files with 169 additions and 8 deletions

View File

@@ -6020,7 +6020,7 @@ static const char *highlight_init_dark[] = {
NULL
};
static const char *highlight_init_cmdline[] = {
const char *const highlight_init_cmdline[] = {
// XXX When modifying a list modify it in both valid and invalid halfs.
// TODO(ZyX-I): merge valid and invalid groups via a macros.
@@ -6047,6 +6047,7 @@ static const char *highlight_init_cmdline[] = {
"default link NVimComparison NVimBinaryOperator",
"default link NVimComparisonModifier NVimComparison",
"default link NVimBinaryPlus NVimBinaryOperator",
"default link NVimBinaryMinus NVimBinaryOperator",
"default link NVimConcat NVimBinaryOperator",
"default link NVimConcatOrSubscript NVimConcat",
"default link NVimOr NVimBinaryOperator",
@@ -6108,9 +6109,6 @@ static const char *highlight_init_cmdline[] = {
"default link NVimDoubleQuote NVimStringQuote",
"default link NVimDoubleQuotedBody NVimStringBody",
"default link NVimDoubleQuotedEscape NVimStringSpecial",
// Not actually invalid, but we highlight user that he is doing something
// wrong.
"default link NVimDoubleQuotedUnknownEscape NVimInvalidValue",
"default link NVimFigureBrace NVimInternalError",
"default link NVimSingleQuotedUnknownEscape NVimInternalError",
@@ -6144,6 +6142,7 @@ static const char *highlight_init_cmdline[] = {
"default link NVimInvalidComparison NVimInvalidBinaryOperator",
"default link NVimInvalidComparisonModifier NVimInvalidComparison",
"default link NVimInvalidBinaryPlus NVimInvalidBinaryOperator",
"default link NVimInvalidBinaryMinus NVimInvalidBinaryOperator",
"default link NVimInvalidConcat NVimInvalidBinaryOperator",
"default link NVimInvalidConcatOrSubscript NVimInvalidConcat",
"default link NVimInvalidOr NVimInvalidBinaryOperator",
@@ -6217,12 +6216,17 @@ static const char *highlight_init_cmdline[] = {
"default link NVimInvalidFigureBrace NVimInvalidDelimiter",
"default link NVimInvalidSpacing ErrorMsg",
// Not actually invalid, but we highlight user that he is doing something
// wrong.
"default link NVimDoubleQuotedUnknownEscape NVimInvalidValue",
NULL,
};
/// Create default links for NVim* highlight groups used for cmdline coloring
void syn_init_cmdline_highlight(bool reset, bool init)
{
for (size_t i = 0 ; i < ARRAY_SIZE(highlight_init_cmdline) ; i++) {
for (size_t i = 0 ; highlight_init_cmdline[i] != NULL ; i++) {
do_highlight(highlight_init_cmdline[i], reset, init);
}
}

View File

@@ -45,6 +45,9 @@ typedef struct {
} color_name_table_T;
extern color_name_table_T color_name_table[];
/// Array of highlight definitions, used for unit testing
extern const char *const highlight_init_cmdline[];
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "syntax.h.generated.h"
#endif

View File

@@ -899,7 +899,6 @@ describe('Expressions coloring support', function()
]])
end)
-- FIXME: Test expr coloring when using -u NORC and -u NONE.
-- FIXME: Test all highlight groups, using long expression.
-- FIXME: Test different ways of triggering expression highlighting (:<C-r>=,
-- i<C-r>=, :<C-\>e, "=).
end)

View File

@@ -7,11 +7,13 @@ local make_enum_conv_tab = helpers.make_enum_conv_tab
local child_call_once = helpers.child_call_once
local alloc_log_new = helpers.alloc_log_new
local kvi_destroy = helpers.kvi_destroy
local array_size = helpers.array_size
local conv_enum = helpers.conv_enum
local debug_log = helpers.debug_log
local ptr2key = helpers.ptr2key
local cimport = helpers.cimport
local ffi = helpers.ffi
local neq = helpers.neq
local eq = helpers.eq
local conv_ccs = viml_helpers.conv_ccs
@@ -26,10 +28,158 @@ local format_luav = global_helpers.format_luav
local intchar2lua = global_helpers.intchar2lua
local REMOVE_THIS = global_helpers.REMOVE_THIS
local lib = cimport('./src/nvim/viml/parser/expressions.h')
local lib = cimport('./src/nvim/viml/parser/expressions.h',
'./src/nvim/syntax.h')
local alloc_log = alloc_log_new()
local predefined_hl_defs = {
-- From highlight_init_both
Conceal=true,
Cursor=true,
lCursor=true,
DiffText=true,
ErrorMsg=true,
IncSearch=true,
ModeMsg=true,
NonText=true,
PmenuSbar=true,
StatusLine=true,
StatusLineNC=true,
TabLineFill=true,
TabLineSel=true,
TermCursor=true,
VertSplit=true,
WildMenu=true,
EndOfBuffer=true,
QuickFixLine=true,
Substitute=true,
Whitespace=true,
-- From highlight_init_(dark|light)
ColorColumn=true,
CursorColumn=true,
CursorLine=true,
CursorLineNr=true,
DiffAdd=true,
DiffChange=true,
DiffDelete=true,
Directory=true,
FoldColumn=true,
Folded=true,
LineNr=true,
MatchParen=true,
MoreMsg=true,
Pmenu=true,
PmenuSel=true,
PmenuThumb=true,
Question=true,
Search=true,
SignColumn=true,
SpecialKey=true,
SpellBad=true,
SpellCap=true,
SpellLocal=true,
SpellRare=true,
TabLine=true,
Title=true,
Visual=true,
WarningMsg=true,
Normal=true,
-- From syncolor.vim, if &background
Comment=true,
Constant=true,
Special=true,
Identifier=true,
Statement=true,
PreProc=true,
Type=true,
Underlined=true,
Ignore=true,
-- From syncolor.vim, below if &background
Error=true,
Todo=true,
-- From syncolor.vim, links at the bottom
String=true,
Character=true,
Number=true,
Boolean=true,
Float=true,
Function=true,
Conditional=true,
Repeat=true,
Label=true,
Operator=true,
Keyword=true,
Exception=true,
Include=true,
Define=true,
Macro=true,
PreCondit=true,
StorageClass=true,
Structure=true,
Typedef=true,
Tag=true,
SpecialChar=true,
Delimiter=true,
SpecialComment=true,
Debug=true,
}
local nvim_hl_defs = {}
child_call_once(function()
local i = 0
while lib.highlight_init_cmdline[i] ~= nil do
local hl_args = lib.highlight_init_cmdline[i]
local s = ffi.string(hl_args)
local err, msg = pcall(function()
if s:sub(1, 13) == 'default link ' then
local new_grp, grp_link = s:match('^default link (%w+) (%w+)$')
neq(nil, new_grp)
-- Note: group to link to must be already defined at the time of
-- linking, otherwise it will be created as cleared. So existence
-- of the group is checked here and not in the next pass over
-- nvim_hl_defs.
eq(true, not not (nvim_hl_defs[grp_link]
or predefined_hl_defs[grp_link]))
nvim_hl_defs[new_grp] = {'link', grp_link}
else
local new_grp, grp_args = s:match('^(%w+) (.*)')
neq(nil, new_grp)
eq(false, not not (nvim_hl_defs[grp_link]
or predefined_hl_defs[grp_link]))
nvim_hl_defs[new_grp] = {'definition', grp_args}
end
end)
if not err then
msg = format_string(
'Error while processing string %s at position %u:\n%s', s, i, msg)
error(msg)
end
i = i + 1
end
for k, _ in ipairs(nvim_hl_defs) do
eq('NVim', k:sub(1, 4))
-- NVimInvalid
-- 12345678901
local err, msg = pcall(function()
if k:sub(5, 11) == 'Invalid' then
neq(nil, nvim_hl_defs['NVim' .. k:sub(12)])
else
neq(nil, nvim_hl_defs['NVimInvalid' .. k:sub(5)])
end
end)
if not err then
msg = format_string('Error while processing group %s:\n%s', k, msg)
error(msg)
end
end
end)
local function format_check(expr, flags, ast, hls)
-- That forces specific order.
print( format_string('\ncheck_parsing(%r, %u, {', expr, flags))
@@ -237,6 +387,8 @@ end)
describe('Expressions parser', function()
local function check_parsing(str, exp_ast, exp_highlighting_fs, nz_flags_exps)
nz_flags_exps = nz_flags_exps or {}
local format_check_data = function()
end
for _, flags in ipairs({0, 1, 2, 3}) do
debug_log(('Running test case (%s, %u)'):format(str, flags))
local err, msg = pcall(function()
@@ -266,7 +418,7 @@ describe('Expressions parser', function()
end
end
if exp_ast == nil then
format_check(str, flags, ast, hls)
format_check(str, ast, hls)
else
eq(exps.ast, ast)
if exp_highlighting_fs then
@@ -292,6 +444,9 @@ describe('Expressions parser', function()
end
local function hl(group, str, shift)
return function(next_col)
if nvim_hl_defs['NVim' .. group] == nil then
error(('Unknown group: NVim%s'):format(group))
end
local col = next_col + (shift or 0)
return (('%s:%u:%u:%s'):format(
'NVim' .. group,