diff options
Diffstat (limited to 'scripts/run-functional-tests.py')
-rw-r--r-- | scripts/run-functional-tests.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/scripts/run-functional-tests.py b/scripts/run-functional-tests.py new file mode 100644 index 0000000000..1b8fb2ddef --- /dev/null +++ b/scripts/run-functional-tests.py @@ -0,0 +1,81 @@ +# Run functional tests using lua, busted and the python client + +import os +import sys +import textwrap + +from lupa import LuaRuntime +from neovim import Nvim, spawn_session + + +# Extract arguments +busted_script = sys.argv[1] +busted_argv = sys.argv[2:] + +# Setup a lua state for running busted +lua = LuaRuntime(unpack_returned_tuples=True) +lua_globals = lua.globals() + +# helper to transform iterables into lua tables +list_to_table = lua.eval(''' +function(l) + local t = {} + for i, item in python.enumerate(l) do t[i + 1] = item end + return t +end +''') + +dict_to_table = lua.eval(''' +function(d) + local t = {} + for k, v in python.iterex(d.items()) do t[k] = v end + return t +end +''') + +nvim_prog = os.environ.get('NVIM_PROG', 'build/bin/nvim') +nvim_argv = [nvim_prog, '-u', 'NONE', '--embed'] + +if 'VALGRIND' in os.environ: + log_file = os.environ.get('VALGRIND_LOG', 'valgrind-%p.log') + valgrind_argv = ['valgrind', '-q', '--tool=memcheck', '--leak-check=yes', + '--track-origins=yes', '--suppressions=.valgrind.supp', + '--log-file={0}'.format(log_file)] + if 'VALGRIND_GDB' in os.environ: + valgrind_argv += ['--vgdb=yes', '--vgdb-error=0'] + nvim_argv = valgrind_argv + nvim_argv + +session = spawn_session(nvim_argv) +nvim = Nvim.from_session(session) + +def nvim_command(cmd): + nvim.command(cmd) + +def nvim_feed(input, mode=''): + nvim.feedkeys(input) + +def buffer_slice(start=None, stop=None, buffer_idx=None): + rv = '\n'.join(nvim.buffers[buffer_idx or 0][start:stop]) + return rv + +def nvim_replace_termcodes(input, *opts): + return nvim.replace_termcodes(input, *opts) + +expose = [ + nvim_command, + nvim_feed, + nvim_replace_termcodes, + buffer_slice, + textwrap.dedent, +] + +for fn in expose: + lua_globals[fn.__name__] = fn + +# Set 'arg' global to let busted parse arguments +lua_globals['arg'] = list_to_table(busted_argv) + +# Read the busted script and execute in the lua state +with open(busted_script) as f: + busted_setup = f.read() +lua.execute(busted_setup) |