aboutsummaryrefslogtreecommitdiff
path: root/test/functional/ui/screen.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/ui/screen.lua')
-rw-r--r--test/functional/ui/screen.lua99
1 files changed, 72 insertions, 27 deletions
diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua
index ef99c2a536..cd8c2bc399 100644
--- a/test/functional/ui/screen.lua
+++ b/test/functional/ui/screen.lua
@@ -54,12 +54,18 @@
-- having the exact same set of attributes will be substituted by "{K:S}",
-- where K is a key associated the attribute set via the second argument of
-- "expect".
+-- If a transformation table is present, unexpected attribute sets in the final
+-- state is considered an error. To make testing simpler, a list of attribute
+-- sets that should be ignored can be passed as a third argument. Alternatively,
+-- this third argument can be "true" to indicate that all unexpected attribute
+-- sets should be ignored.
--
--- Too illustrate how this works, let's say that in the above example we wanted
+-- To illustrate how this works, let's say that in the above example we wanted
-- to assert that the "-- INSERT --" string is highlighted with the bold
-- attribute(which normally is), here's how the call to "expect" should look
-- like:
--
+-- NonText = Screen.colors.Blue
-- screen:expect([[
-- hello screen \
-- ~ \
@@ -71,11 +77,34 @@
-- ~ \
-- ~ \
-- {b:-- INSERT --} \
--- ]], {b = {bold = true}})
+-- ]], {b = {bold = true}}, {{bold = true, foreground = NonText}})
--
-- In this case "b" is a string associated with the set composed of one
-- attribute: bold. Note that since the {b:} markup is not a real part of the
--- screen, the delimiter(|) had to be moved right
+-- screen, the delimiter(|) had to be moved right. Also, the highlighting of the
+-- NonText markers (~) is ignored in this test.
+--
+-- Multiple expect:s will likely share a group of attribute sets to test.
+-- Therefore these could be specified at the beginning of a test like this:
+-- NonText = Screen.colors.Blue
+-- screen:set_default_attr_ids( {
+-- [1] = {reverse = true, bold = true},
+-- [2] = {reverse = true}
+-- })
+-- screen:set_default_attr_ignore( {{}, {bold=true, foreground=NonText}} )
+-- These can be overridden for a specific expect expression, by passing
+-- different sets as parameters.
+--
+-- To help writing screen tests, there is a utility function
+-- "screen:snapshot_util()", that can be placed in a test file at any point an
+-- "expect(...)" should be. It will wait a short amount of time and then dump
+-- the current state of the screen, in the form of an "expect(..)" expression
+-- that would match it exactly. "snapshot_util" optionally also take the
+-- transformation and ignore set as parameters, like expect, or uses the default
+-- set. It will generate a larger attribute transformation set, if needed.
+-- To generate a text-only test without highlight checks,
+-- use `screen:snapshot_util({},true)`
+
local helpers = require('test.functional.helpers')
local request, run, stop = helpers.request, helpers.run, helpers.stop
local eq, dedent = helpers.eq, helpers.dedent
@@ -90,6 +119,16 @@ if os.getenv('VALGRIND') then
default_screen_timeout = 7500
end
+local colors = request('vim_get_color_map')
+local colornames = {}
+for name, rgb in pairs(colors) do
+ -- we disregard the case that colornames might not be unique, as
+ -- this is just a helper to get any canonical name of a color
+ colornames[rgb] = name
+end
+
+Screen.colors = colors
+
function Screen.debug(command)
if not command then
command = 'pynvim -n -g -c '
@@ -158,19 +197,11 @@ function Screen:expect(expected, attr_ids, attr_ignore)
table.insert(expected_rows, row)
end
local ids = attr_ids or self._default_attr_ids
- if attr_ignore == nil and self._default_attr_ignore ~= nil then
- attr_ignore = {}
- -- don't ignore something we specified in attr_ids
- for i,a in pairs(self._default_attr_ignore) do
- if attr_index(ids, a) == nil then
- table.insert(attr_ignore, a)
- end
- end
- end
+ local ignore = attr_ignore or self._default_attr_ignore
self:wait(function()
for i = 1, self._height do
local expected_row = expected_rows[i]
- local actual_row = self:_row_repr(self._rows[i], ids, attr_ignore)
+ local actual_row = self:_row_repr(self._rows[i], ids, ignore)
if expected_row ~= actual_row then
return 'Row '..tostring(i)..' didnt match.\nExpected: "'..
expected_row..'"\nActual: "'..actual_row..'"'
@@ -417,12 +448,16 @@ function Screen:snapshot_util(attrs, ignore)
end
end
- for i = 1, self._height do
- local row = self._rows[i]
- for j = 1, self._width do
- local attr = row[j].attrs
- if attr_index(attrs, attr) == nil and attr_index(ignore, attr) == nil then
- table.insert(attrs, attr)
+ if ignore ~= true then
+ for i = 1, self._height do
+ local row = self._rows[i]
+ for j = 1, self._width do
+ local attr = row[j].attrs
+ if attr_index(attrs, attr) == nil and attr_index(ignore, attr) == nil then
+ if not equal_attrs(attr, {}) then
+ table.insert(attrs, attr)
+ end
+ end
end
end
end
@@ -438,11 +473,7 @@ function Screen:snapshot_util(attrs, ignore)
if self._default_attr_ids == nil or self._default_attr_ids[i] ~= a then
alldefault = false
end
- local items = {}
- for f, v in pairs(a) do
- table.insert(items, f.." = "..tostring(v))
- end
- local dict = "{"..table.concat(items, ", ").."}"
+ local dict = "{"..pprint_attrs(a).."}"
table.insert(attrstrs, "["..tostring(i).."] = "..dict)
end
local attrstr = "{"..table.concat(attrstrs, ", ").."}"
@@ -455,6 +486,19 @@ function Screen:snapshot_util(attrs, ignore)
end
end
+function pprint_attrs(attrs)
+ local items = {}
+ for f, v in pairs(attrs) do
+ local desc = tostring(v)
+ if f == "foreground" or f == "background" then
+ if colornames[v] ~= nil then
+ desc = "Screen.colors."..colornames[v]
+ end
+ end
+ table.insert(items, f.." = "..desc)
+ end
+ return table.concat(items, ", ")
+end
function backward_find_meaningful(tbl, from)
for i = from or #tbl, 1, -1 do
@@ -465,7 +509,7 @@ function backward_find_meaningful(tbl, from)
return from
end
-function get_attr_id(attr_ids, attr_ignore, attrs)
+function get_attr_id(attr_ids, ignore, attrs)
if not attr_ids then
return
end
@@ -474,11 +518,12 @@ function get_attr_id(attr_ids, attr_ignore, attrs)
return id
end
end
- if attr_ignore == nil or attr_index(attr_ignore, attrs) ~= nil then
+ if equal_attrs(attrs, {}) or
+ ignore == true or attr_index(ignore, attrs) ~= nil then
-- ignore this attrs
return nil
end
- return "UNEXPECTED"
+ return "UNEXPECTED "..pprint_attrs(attrs)
end
function equal_attrs(a, b)