neovim/test/functional/ui/hlstate_spec.lua

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

300 lines
13 KiB
Lua
Raw Normal View History

2018-06-17 04:31:13 -07:00
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, insert = helpers.clear, helpers.insert
local command = helpers.command
local meths = helpers.meths
local testprg = helpers.testprg
2018-06-17 04:31:13 -07:00
local thelpers = require('test.functional.terminal.helpers')
local skip = helpers.skip
local is_os = helpers.is_os
2018-06-17 04:31:13 -07:00
describe('ext_hlstate detailed highlights', function()
local screen
before_each(function()
clear()
command('syntax on')
command('hi VertSplit gui=reverse')
2018-06-17 04:31:13 -07:00
screen = Screen.new(40, 8)
screen:attach({ext_hlstate=true})
end)
after_each(function()
screen:detach()
end)
it('work with combined UI and syntax highlights', function()
insert([[
these are some lines
with colorful text]])
meths.buf_add_highlight(0, -1, "String", 0 , 10, 14)
meths.buf_add_highlight(0, -1, "Statement", 1 , 5, -1)
command("/th co")
screen:expect([[
these are {1:some} lines |
^wi{2:th }{4:co}{3:lorful text} |
{5:~ }|
{5:~ }|
{5:~ }|
{5:~ }|
{5:~ }|
{8:search hit BOTTOM, continuing at TOP}{7: }|
2018-06-17 04:31:13 -07:00
]], {
[1] = {{foreground = Screen.colors.Magenta},
{{hi_name = "Constant", kind = "syntax"}}},
[2] = {{background = Screen.colors.Yellow},
{{hi_name = "Search", ui_name = "Search", kind = "ui"}}},
[3] = {{bold = true, foreground = Screen.colors.Brown},
{{hi_name = "Statement", kind = "syntax"}}},
[4] = {{bold = true, background = Screen.colors.Yellow, foreground = Screen.colors.Brown}, {3, 2}},
[5] = {{bold = true, foreground = Screen.colors.Blue1},
{{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
[6] = {{foreground = Screen.colors.Red},
{{hi_name = "WarningMsg", ui_name = "WarningMsg", kind = "ui"}}},
[7] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
[8] = {{foreground = Screen.colors.Red}, {7, 6}},
2018-06-17 04:31:13 -07:00
})
end)
it('work with cleared UI highlights', function()
screen:set_default_attr_ids({
[1] = {{}, {{hi_name = "Normal", ui_name = "WinSeparator", kind = "ui"}}},
2018-06-17 04:31:13 -07:00
[2] = {{bold = true, foreground = Screen.colors.Blue1},
{{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
[3] = {{bold = true, reverse = true},
{{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}} ,
[4] = {{reverse = true},
{{hi_name = "StatusLineNC", ui_name = "StatusLineNC" , kind = "ui"}}},
[5] = {{}, {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}},
[6] = {{}, {{hi_name = "StatusLineNC", ui_name = "StatusLineNC", kind = "ui"}}},
[7] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
2018-06-17 04:31:13 -07:00
})
feat(highlight): update default color scheme Problem: Default color scheme is suboptimal. Solution: Start using new color scheme. Introduce new `vim` color scheme for opt-in backward compatibility. ------ Main design ideas - Be "Neovim branded". - Be minimal for 256 colors with a bit more shades for true colors. - Be accessible through high enough contrast ratios. - Be suitable for dark and light backgrounds via exchange of dark and light palettes. ------ Palettes - Have dark and light variants. Implemented through exporeted `NvimDark*` and `NvimLight*` hex colors. - Palettes have 4 shades of grey for UI elements and 6 colors (red, yellow, green, cyan, blue, magenta). - Actual values are computed procedurally in Oklch color space based on a handful of hyperparameters. - Each color has a 256 colors variant with perceptually closest color. ------ Highlight groups Use: - Grey shades for general UI according to their design. - Bold text for keywords (`Statement` highlight group). This is an important choice to increase accessibility for people with color deficiencies, as it doesn't rely on actual color. - Green for strings, `DiffAdd` (as background), `DiagnosticOk`, and some minor text UI elements. - Cyan as main syntax color, i.e. for function usage (`Function` highlight group), `DiffText`, `DiagnosticInfo`, and some minor text UI elements. - Red to generally mean high user attention, i.e. errors; in particular for `ErrorMsg`, `DiffDelete`, `DiagnosticError`. - Yellow very sparingly only with true colors to mean mild user attention, i.e. warnings. That is, `DiagnosticWarn` and `WarningMsg`. - Blue very sparingly only with true colors as `DiagnosticHint` and some additional important syntax group (like `Identifier`). - Magenta very carefully (if at all). ------ Notes - To make tests work without relatively larege updates, each one is prepended with an equivalent of the call `:colorscheme vim`. Plus some tests which spawn new Neovim instances also now use 'vim' color scheme. In some cases tests are updated to fit new default color scheme.
2023-11-29 13:16:09 -07:00
command("hi clear WinSeparator")
2018-06-17 04:31:13 -07:00
command("vsplit")
screen:expect([[
^ {1:} |
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{3:[No Name] }{4:[No Name] }|
{7: }|
2018-06-17 04:31:13 -07:00
]])
command("hi clear StatusLine | hi clear StatuslineNC")
screen:expect([[
^ {1:} |
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{5:[No Name] }{6:[No Name] }|
{7: }|
2018-06-17 04:31:13 -07:00
]])
-- redrawing is done even if visible highlights didn't change
command("wincmd w")
screen:expect([[
{1:}^ |
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{2:~ }{1:}{2:~ }|
{6:[No Name] }{5:[No Name] }|
{7: }|
2018-06-17 04:31:13 -07:00
]])
end)
it("work with window-local highlights", function()
screen:set_default_attr_ids({
[1] = {{foreground = Screen.colors.Brown}, {{hi_name = "LineNr", ui_name = "LineNr", kind = "ui"}}},
[2] = {{bold = true, foreground = Screen.colors.Blue1}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
[3] = {{bold = true, reverse = true}, {{hi_name = "StatusLine", ui_name = "StatusLine", kind = "ui"}}},
[4] = {{reverse = true}, {{hi_name = "StatusLineNC", ui_name = "StatusLineNC", kind = "ui"}}},
[5] = {{background = Screen.colors.Red, foreground = Screen.colors.Grey100}, {{hi_name = "ErrorMsg", ui_name = "LineNr", kind = "ui"}}},
[6] = {{bold = true, reverse = true}, {{hi_name = "Normal", ui_name = "Normal", kind = "ui"}}},
2018-06-17 04:31:13 -07:00
[7] = {{foreground = Screen.colors.Brown, bold = true, reverse = true}, {6, 1}},
[8] = {{foreground = Screen.colors.Blue1, bold = true, reverse = true}, {6, 14}},
[9] = {{bold = true, foreground = Screen.colors.Brown}, {{hi_name = "NormalNC", ui_name = "NormalNC", kind = "ui"}}},
2018-06-17 04:31:13 -07:00
[10] = {{bold = true, foreground = Screen.colors.Brown}, {9, 1}},
[11] = {{bold = true, foreground = Screen.colors.Blue1}, {9, 14}},
[12] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
[13] = {{background = Screen.colors.Red1, foreground = Screen.colors.Gray100}, {{ui_name = "LineNr", kind = "ui", hi_name = "LineNr"}}};
[14] = {{bold = true, foreground = Screen.colors.Blue}, {{ui_name = "EndOfBuffer", kind = "ui", hi_name = "EndOfBuffer"}}};
2018-06-17 04:31:13 -07:00
})
command("set number")
command("split")
-- NormalNC is not applied if not set, to avoid spurious redraws
screen:expect([[
{1: 1 }^ |
{2:~ }|
{2:~ }|
{3:[No Name] }|
{1: 1 } |
{2:~ }|
{4:[No Name] }|
{12: }|
2018-06-17 04:31:13 -07:00
]])
command("set winhl=LineNr:ErrorMsg")
screen:expect{grid=[[
{13: 1 }^ |
{14:~ }|
{14:~ }|
2018-06-17 04:31:13 -07:00
{3:[No Name] }|
{1: 1 } |
{2:~ }|
{4:[No Name] }|
{12: }|
]]}
2018-06-17 04:31:13 -07:00
command("set winhl=Normal:MsgSeparator,NormalNC:Statement")
screen:expect([[
{7: 1 }{6:^ }|
{8:~ }|
{8:~ }|
{3:[No Name] }|
{1: 1 } |
{2:~ }|
{4:[No Name] }|
{12: }|
2018-06-17 04:31:13 -07:00
]])
command("wincmd w")
screen:expect([[
{10: 1 }{9: }|
{11:~ }|
{11:~ }|
{4:[No Name] }|
{1: 1 }^ |
{2:~ }|
{3:[No Name] }|
{12: }|
2018-06-17 04:31:13 -07:00
]])
end)
it("work with :terminal", function()
skip(is_os('win'))
2022-02-19 03:11:05 -07:00
2018-06-17 04:31:13 -07:00
screen:set_default_attr_ids({
[1] = {{}, {{hi_name = "TermCursorNC", ui_name = "TermCursorNC", kind = "ui"}}},
[2] = {{foreground = tonumber('0x00ccff'), fg_indexed=true}, {{kind = "term"}}},
[3] = {{bold = true, foreground = tonumber('0x00ccff'), fg_indexed=true}, {{kind = "term"}}},
[4] = {{foreground = tonumber('0x00ccff'), fg_indexed=true}, {2, 1}},
[5] = {{foreground = tonumber('0x40ffff'), fg_indexed=true}, {{kind = "term"}}},
[6] = {{foreground = tonumber('0x40ffff'), fg_indexed=true}, {5, 1}},
[7] = {{}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
2018-06-17 04:31:13 -07:00
})
command(("enew | call termopen(['%s'])"):format(testprg('tty-test')))
2018-06-17 04:31:13 -07:00
screen:expect([[
^tty ready |
{1: } |
|
|
|
|
|
{7: }|
2018-06-17 04:31:13 -07:00
]])
thelpers.feed_data('x ')
thelpers.set_fg(45)
thelpers.feed_data('y ')
thelpers.set_bold()
thelpers.feed_data('z\n')
-- TODO(bfredl): check if this distinction makes sense
if is_os('win') then
2018-06-17 04:31:13 -07:00
screen:expect([[
^tty ready |
x {5:y z} |
{1: } |
|
|
|
|
{7: }|
2018-06-17 04:31:13 -07:00
]])
else
screen:expect([[
^tty ready |
x {2:y }{3:z} |
{1: } |
|
|
|
|
{7: }|
2018-06-17 04:31:13 -07:00
]])
end
thelpers.feed_termcode("[A")
thelpers.feed_termcode("[2C")
if is_os('win') then
2018-06-17 04:31:13 -07:00
screen:expect([[
^tty ready |
x {6:y}{5: z} |
|
|
|
|
|
{7: }|
2018-06-17 04:31:13 -07:00
]])
else
screen:expect([[
^tty ready |
x {4:y}{2: }{3:z} |
|
|
|
|
|
{7: }|
2018-06-17 04:31:13 -07:00
]])
end
end)
it("can use independent cterm and rgb colors", function()
-- tell test module to save all attributes (doesn't change nvim options)
screen:set_rgb_cterm(true)
2018-06-17 04:31:13 -07:00
screen:set_default_attr_ids({
[1] = {{bold = true, foreground = Screen.colors.Blue1}, {foreground = 12}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
[2] = {{reverse = true, foreground = Screen.colors.Red}, {foreground = 10, italic=true}, {{hi_name = "NonText", ui_name = "EndOfBuffer", kind = "ui"}}},
[3] = {{}, {}, {{hi_name = "MsgArea", ui_name = "MsgArea", kind = "ui"}}},
2018-06-17 04:31:13 -07:00
})
screen:expect([[
^ |
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
{3: }|
2018-06-17 04:31:13 -07:00
]])
command("hi NonText guifg=Red gui=reverse ctermfg=Green cterm=italic")
screen:expect([[
^ |
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
{2:~ }|
{3: }|
2018-06-17 04:31:13 -07:00
]])
end)
end)