aboutsummaryrefslogtreecommitdiff
path: root/test/functional/ui/screen.lua
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2023-11-29 22:39:54 +0000
committerJosh Rahm <joshuarahm@gmail.com>2023-11-29 22:39:54 +0000
commit21cb7d04c387e4198ca8098a884c78b56ffcf4c2 (patch)
tree84fe5690df1551f0bb2bdfe1a13aacd29ebc1de7 /test/functional/ui/screen.lua
parentd9c904f85a23a496df4eb6be42aa43f007b22d50 (diff)
parent4a8bf24ac690004aedf5540fa440e788459e5e34 (diff)
downloadrneovim-colorcolchar.tar.gz
rneovim-colorcolchar.tar.bz2
rneovim-colorcolchar.zip
Merge remote-tracking branch 'upstream/master' into colorcolcharcolorcolchar
Diffstat (limited to 'test/functional/ui/screen.lua')
-rw-r--r--test/functional/ui/screen.lua58
1 files changed, 43 insertions, 15 deletions
diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua
index 3b9cce0e6f..810a68d387 100644
--- a/test/functional/ui/screen.lua
+++ b/test/functional/ui/screen.lua
@@ -75,6 +75,7 @@ local busted = require('busted')
local deepcopy = helpers.deepcopy
local shallowcopy = helpers.shallowcopy
local concat_tables = helpers.concat_tables
+local pesc = helpers.pesc
local run_session = helpers.run_session
local eq = helpers.eq
local dedent = helpers.dedent
@@ -87,6 +88,7 @@ local function isempty(v)
return type(v) == 'table' and next(v) == nil
end
+--- @class test.functional.ui.screen
local Screen = {}
Screen.__index = Screen
@@ -149,6 +151,7 @@ function Screen.new(width, height)
msg_grid = nil,
msg_grid_pos = nil,
_session = nil,
+ rpc_async = false,
messages = {},
msg_history = {},
showmode = {},
@@ -172,9 +175,13 @@ function Screen.new(width, height)
_busy = false,
}, Screen)
local function ui(method, ...)
- local status, rv = self._session:request('nvim_ui_'..method, ...)
- if not status then
- error(rv[2])
+ if self.rpc_async then
+ self._session:notify('nvim_ui_'..method, ...)
+ else
+ local status, rv = self._session:request('nvim_ui_'..method, ...)
+ if not status then
+ error(rv[2])
+ end
end
end
self.uimeths = create_callindex(ui)
@@ -214,7 +221,7 @@ function Screen:attach(options, session)
-- simplify test code by doing the same.
self._options.rgb = true
end
- if self._options.ext_multigrid or self._options.ext_float then
+ if self._options.ext_multigrid then
self._options.ext_linegrid = true
end
end
@@ -257,7 +264,7 @@ local ext_keys = {
-- grid: Expected screen state (string). Each line represents a screen
-- row. Last character of each row (typically "|") is stripped.
-- Common indentation is stripped.
--- "{MATCH:x}|" lines are matched against Lua pattern `x`.
+-- "{MATCH:x}" in a line is matched against Lua pattern `x`.
-- attr_ids: Expected text attributes. Screen rows are transformed according
-- to this table, as follows: each substring S composed of
-- characters having the same attributes will be substituted by
@@ -382,8 +389,20 @@ function Screen:expect(expected, attr_ids, ...)
end
for i, row in ipairs(expected_rows) do
msg_expected_rows[i] = row
- local m = (row ~= actual_rows[i] and row:match('{MATCH:(.*)}') or nil)
- if row ~= actual_rows[i] and (not m or not (actual_rows[i] and actual_rows[i]:match(m))) then
+ local pat = nil
+ if actual_rows[i] and row ~= actual_rows[i] then
+ local after = row
+ while true do
+ local s, e, m = after:find('{MATCH:(.-)}')
+ if not s then
+ pat = pat and (pat .. pesc(after))
+ break
+ end
+ pat = (pat or '') .. pesc(after:sub(1, s - 1)) .. m
+ after = after:sub(e + 1)
+ end
+ end
+ if row ~= actual_rows[i] and (not pat or not actual_rows[i]:match(pat)) then
msg_expected_rows[i] = '*' .. msg_expected_rows[i]
if i <= #actual_rows then
actual_rows[i] = '*' .. actual_rows[i]
@@ -470,15 +489,19 @@ screen:redraw_debug() to show all intermediate screen states. ]])
end, expected)
end
-function Screen:expect_unchanged(waittime_ms, ignore_attrs, request_cb)
+function Screen:expect_unchanged(intermediate, waittime_ms, ignore_attrs)
waittime_ms = waittime_ms and waittime_ms or 100
-- Collect the current screen state.
- self:sleep(0, request_cb)
local kwargs = self:get_snapshot(nil, ignore_attrs)
- -- Check that screen state does not change.
- kwargs.unchanged = true
+ if intermediate then
+ kwargs.intermediate = true
+ else
+ kwargs.unchanged = true
+ end
+
kwargs.timeout = waittime_ms
+ -- Check that screen state does not change.
self:expect(kwargs)
end
@@ -540,6 +563,7 @@ function Screen:_wait(check, flags)
self._session:stop()
end
elseif success_seen and #args > 0 then
+ success_seen = false
failure_after_success = true
-- print(inspect(args))
end
@@ -785,14 +809,17 @@ function Screen:_handle_win_pos(grid, win, startrow, startcol, width, height)
self.float_pos[grid] = nil
end
-function Screen:_handle_win_viewport(grid, win, topline, botline, curline, curcol, linecount)
+function Screen:_handle_win_viewport(grid, win, topline, botline, curline, curcol, linecount, scroll_delta)
+ -- accumulate scroll delta
+ local last_scroll_delta = self.win_viewport[grid] and self.win_viewport[grid].sum_scroll_delta or 0
self.win_viewport[grid] = {
win = win,
topline = topline,
botline = botline,
curline = curline,
curcol = curcol,
- linecount = linecount
+ linecount = linecount,
+ sum_scroll_delta = scroll_delta + last_scroll_delta
}
end
@@ -926,6 +953,7 @@ end
function Screen:_handle_grid_line(grid, row, col, items)
assert(self._options.ext_linegrid)
+ assert(#items > 0)
local line = self._grids[grid].rows[row+1]
local colpos = col+1
local hl_id = 0
@@ -1248,7 +1276,7 @@ end
function Screen:render(headers, attr_state, preview)
headers = headers and (self._options.ext_multigrid or self._options._debug_float)
local rv = {}
- for igrid,grid in pairs(self._grids) do
+ for igrid,grid in vim.spairs(self._grids) do
if headers then
local suffix = ""
if igrid > 1 and self.win_position[igrid] == nil
@@ -1330,7 +1358,7 @@ local function fmt_ext_state(name, state)
for k,v in pairs(state) do
str = (str.." ["..k.."] = {win = {id = "..v.win.id.."}, topline = "
..v.topline..", botline = "..v.botline..", curline = "..v.curline
- ..", curcol = "..v.curcol..", linecount = "..v.linecount.."};\n")
+ ..", curcol = "..v.curcol..", linecount = "..v.linecount..", sum_scroll_delta = "..v.sum_scroll_delta.."};\n")
end
return str .. "}"
elseif name == "float_pos" then