mirror of
https://github.com/neovim/neovim.git
synced 2025-10-26 12:27:24 +00:00
test: Refactor functional helpers to use vim_input
The vim_input function accepts raw terminal input and so is better to emulate real user, especially because it is not deferred as vim_feedkeys. Using this function required a number of changes: - expect() was refactored to use curbuf_contents() - The vim_eval function in request() was moved to curbuf_contents(). For most cases this is enough(we only care for synchronizing api calls with user input when verifying buffer contents). - <C-@>(NUL) is preprocessed before being passed to replace_termcodes. - Legacy test 4 had a bug that only became visible when using vim_input, it is fixed now. - An extra blank line deletion was required for test 101 The last two items show that vim_feedkeys because it is not 100% equivalent to receiving terminal input.
This commit is contained in:
@@ -42,7 +42,6 @@ local function request(method, ...)
|
||||
if not loop_stopped then
|
||||
-- Except when the loop has been stopped by a notification triggered
|
||||
-- by the initial request, for example.
|
||||
session:request('vim_eval', '1')
|
||||
end
|
||||
return rv
|
||||
end
|
||||
@@ -99,25 +98,20 @@ local function nvim_eval(expr)
|
||||
return request('vim_eval', expr)
|
||||
end
|
||||
|
||||
local function nvim_feed(input, mode)
|
||||
mode = mode or ''
|
||||
request('vim_feedkeys', input, mode)
|
||||
end
|
||||
|
||||
local function buffer_slice(start, stop, buffer_idx)
|
||||
local include_end = false
|
||||
if not stop then
|
||||
stop = -1
|
||||
include_end = true
|
||||
local function nvim_feed(input)
|
||||
while #input > 0 do
|
||||
local written = request('vim_input', input)
|
||||
input = input:sub(written + 1)
|
||||
end
|
||||
local buffer = request('vim_get_buffers')[buffer_idx or 1]
|
||||
local slice = request('buffer_get_line_slice', buffer, start or 0, stop,
|
||||
true, include_end)
|
||||
return table.concat(slice, '\n')
|
||||
end
|
||||
|
||||
local function nvim_replace_termcodes(input)
|
||||
return request('vim_replace_termcodes', input, false, true, true)
|
||||
-- small hack to stop <C-@> from being replaced by the internal
|
||||
-- representation(which is different and won't work for vim_input)
|
||||
local temp_replacement = 'CCCCCCCCC@@@@@@@@@@'
|
||||
input = input:gsub('<[Cc][-]@>', temp_replacement)
|
||||
local rv = request('vim_replace_termcodes', input, false, true, true)
|
||||
return rv:gsub(temp_replacement, '\000')
|
||||
end
|
||||
|
||||
local function dedent(str)
|
||||
@@ -150,7 +144,7 @@ end
|
||||
|
||||
local function rawfeed(...)
|
||||
for _, v in ipairs({...}) do
|
||||
nvim_feed(dedent(v), 'nt')
|
||||
nvim_feed(dedent(v))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -166,19 +160,19 @@ local function clear()
|
||||
end
|
||||
|
||||
local function insert(...)
|
||||
nvim_feed('i', 'nt')
|
||||
nvim_feed('i')
|
||||
rawfeed(...)
|
||||
nvim_feed(nvim_replace_termcodes('<ESC>'), 'nt')
|
||||
nvim_feed(nvim_replace_termcodes('<ESC>'))
|
||||
end
|
||||
|
||||
local function execute(...)
|
||||
for _, v in ipairs({...}) do
|
||||
if v:sub(1, 1) ~= '/' then
|
||||
-- not a search command, prefix with colon
|
||||
nvim_feed(':', 'nt')
|
||||
nvim_feed(':')
|
||||
end
|
||||
nvim_feed(v, 'nt')
|
||||
nvim_feed(nvim_replace_termcodes('<CR>'), 'nt')
|
||||
nvim_feed(v)
|
||||
nvim_feed(nvim_replace_termcodes('<CR>'))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -200,10 +194,6 @@ local function neq(expected, actual)
|
||||
return assert.are_not.same(expected, actual)
|
||||
end
|
||||
|
||||
local function expect(contents, first, last, buffer_index)
|
||||
return eq(dedent(contents), buffer_slice(first, last, buffer_index))
|
||||
end
|
||||
|
||||
local function ok(expr)
|
||||
assert.is_true(expr)
|
||||
end
|
||||
@@ -233,6 +223,10 @@ local function curbuf(method, ...)
|
||||
end
|
||||
|
||||
local function curbuf_contents()
|
||||
-- Before inspecting the buffer, execute 'vim_eval' to wait until all
|
||||
-- previously sent keys are processed(vim_eval is a deferred function, and
|
||||
-- only processed after all input)
|
||||
session:request('vim_eval', '1')
|
||||
return table.concat(curbuf('get_line_slice', 0, -1, true, true), '\n')
|
||||
end
|
||||
|
||||
@@ -252,6 +246,10 @@ local function curtab(method, ...)
|
||||
return tabpage(method, tab, ...)
|
||||
end
|
||||
|
||||
local function expect(contents)
|
||||
return eq(dedent(contents), curbuf_contents())
|
||||
end
|
||||
|
||||
clear()
|
||||
|
||||
return {
|
||||
|
||||
@@ -31,7 +31,7 @@ describe('BufEnter with modelines', function()
|
||||
execute('sp Xxx')
|
||||
|
||||
-- Append text with autoindent to this file
|
||||
feed('G?this is a<Esc>')
|
||||
feed('G?this is a<CR>')
|
||||
feed('othis should be auto-indented<Esc>')
|
||||
|
||||
-- Go to Xxx, no autocmd anymore
|
||||
@@ -39,7 +39,7 @@ describe('BufEnter with modelines', function()
|
||||
execute('buf Xxx')
|
||||
|
||||
-- Append text without autoindent to Xxx
|
||||
feed('G?this is a<Esc>')
|
||||
feed('G?this is a<CR>')
|
||||
feed('othis should be in column 1<Esc>')
|
||||
execute('wq')
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
local helpers = require('test.functional.helpers')
|
||||
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
|
||||
local execute, expect = helpers.execute, helpers.expect
|
||||
local eval = helpers.eval
|
||||
|
||||
describe('v:hlsearch', function()
|
||||
setup(clear)
|
||||
@@ -44,7 +45,7 @@ describe('v:hlsearch', function()
|
||||
execute('$put=r')
|
||||
execute('call garbagecollect(1)')
|
||||
execute('call getchar()')
|
||||
execute('1d')
|
||||
execute('1d', '1d')
|
||||
|
||||
-- Assert buffer contents.
|
||||
expect([[
|
||||
|
||||
@@ -10,6 +10,7 @@ local eq, clear, eval, feed, nvim =
|
||||
local function create_file_with_nuls(name)
|
||||
return function()
|
||||
feed('ipart1<C-V>000part2<C-V>000part3<ESC>:w '..name..'<CR>')
|
||||
eval('1') -- wait for the file to be created
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user