aboutsummaryrefslogtreecommitdiff
path: root/test/functional/helpers.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/helpers.lua')
-rw-r--r--test/functional/helpers.lua174
1 files changed, 172 insertions, 2 deletions
diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua
index 671e34e592..324af6a232 100644
--- a/test/functional/helpers.lua
+++ b/test/functional/helpers.lua
@@ -1,3 +1,110 @@
+local Loop = require('nvim.loop')
+local MsgpackStream = require('nvim.msgpack_stream')
+local AsyncSession = require('nvim.async_session')
+local Session = require('nvim.session')
+
+local nvim_prog = os.getenv('NVIM_PROG') or 'build/bin/nvim'
+local nvim_argv = {nvim_prog, '-u', 'NONE', '-N', '--embed'}
+
+if os.getenv('VALGRIND') then
+ local log_file = os.getenv('VALGRIND_LOG') or 'valgrind-%p.log'
+ local valgrind_argv = {'valgrind', '-q', '--tool=memcheck',
+ '--leak-check=yes', '--track-origins=yes',
+ '--suppressions=.valgrind.supp',
+ '--log-file='..log_file}
+ if os.getenv('VALGRIND_GDB') then
+ table.insert(valgrind_argv, '--vgdb=yes')
+ table.insert(valgrind_argv, '--vgdb-error=0')
+ end
+ local len = #valgrind_argv
+ for i = 1, #nvim_argv do
+ valgrind_argv[i + len] = nvim_argv[i]
+ end
+ nvim_argv = valgrind_argv
+end
+
+local session
+
+local function restart()
+ local loop = Loop.new()
+ local msgpack_stream = MsgpackStream.new(loop)
+ local async_session = AsyncSession.new(msgpack_stream)
+ session = Session.new(async_session)
+ loop:spawn(nvim_argv)
+end
+restart()
+
+local function request(method, ...)
+ local status, rv = session:request(method, ...)
+ if not status then
+ error(rv[2])
+ end
+ return rv
+end
+
+local function next_message()
+ return session:next_message()
+end
+
+local function run(request_cb, notification_cb, setup_cb)
+ session:run(request_cb, notification_cb, setup_cb)
+end
+
+local function stop()
+ session:stop()
+end
+
+local function nvim_command(cmd)
+ request('vim_command', cmd)
+end
+
+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
+ 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 )
+end
+
+local function dedent(str)
+ -- find minimum common indent across lines
+ local indent = nil
+ for line in str:gmatch('[^\n]+') do
+ local line_indent = line:match('^%s+') or ''
+ if indent == nil or #line_indent < #indent then
+ indent = line_indent
+ end
+ end
+ if #indent == 0 then
+ -- no minimum common indent
+ return str
+ end
+ -- create a pattern for the indent
+ indent = indent:gsub('%s', '%%s')
+ -- strip it from the first line
+ str = str:gsub('^'..indent, '')
+ -- strip it from the remaining lines
+ str = str:gsub('[\n]'..indent, '\n')
+ return str
+end
+
local function clear()
nvim_command('call BeforeEachTest()')
end
@@ -48,7 +155,7 @@ local function neq(expected, actual)
end
local function expect(contents, first, last, buffer_index)
- return eq(dedent(contents), buffer_slice(first, last, buffer_idx))
+ return eq(dedent(contents), buffer_slice(first, last, buffer_index))
end
rawfeed([[:function BeforeEachTest()
@@ -89,14 +196,77 @@ rawfeed([[:function BeforeEachTest()
endfunction
]])
+
+local function ok(expr)
+ assert.is_true(expr)
+end
+
+local function nvim(method, ...)
+ return request('vim_'..method, ...)
+end
+
+local function buffer(method, ...)
+ return request('buffer_'..method, ...)
+end
+
+local function window(method, ...)
+ return request('window_'..method, ...)
+end
+
+local function tabpage(method, ...)
+ return request('tabpage_'..method, ...)
+end
+
+local function curbuf(method, ...)
+ local buf = nvim('get_current_buffer')
+ if not method then
+ return buf
+ end
+ return buffer(method, buf, ...)
+end
+
+local function curbuf_contents()
+ return table.concat(curbuf('get_line_slice', 0, -1, true, true), '\n')
+end
+
+local function curwin(method, ...)
+ local win = nvim('get_current_window')
+ if not method then
+ return win
+ end
+ return window(method, win, ...)
+end
+
+local function curtab(method, ...)
+ local tab = nvim('get_current_tabpage')
+ if not method then
+ return tab
+ end
+ return tabpage(method, tab, ...)
+end
+
return {
clear = clear,
+ restart = restart,
rawfeed = rawfeed,
insert = insert,
feed = feed,
execute = execute,
eval = eval,
+ request = request,
+ next_message = next_message,
+ run = run,
+ stop = stop,
eq = eq,
neq = neq,
- expect = expect
+ expect = expect,
+ ok = ok,
+ nvim = nvim,
+ buffer = buffer,
+ window = window,
+ tabpage = tabpage,
+ curbuf = curbuf,
+ curwin = curwin,
+ curtab = curtab,
+ curbuf_contents = curbuf_contents
}