aboutsummaryrefslogtreecommitdiff
path: root/test/functional/testnvim.lua
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2024-09-12 03:04:33 +0200
committerJustin M. Keyes <justinkz@gmail.com>2025-01-03 19:24:04 +0100
commita1ba655dee0f89230ea09712e4df981cc3b15bea (patch)
tree190940a08a1886cd3eab005ed409f56897f1201f /test/functional/testnvim.lua
parentfe87656f29e933b63f5d4dd03b3c0be3ed4ecf5f (diff)
downloadrneovim-a1ba655dee0f89230ea09712e4df981cc3b15bea.tar.gz
rneovim-a1ba655dee0f89230ea09712e4df981cc3b15bea.tar.bz2
rneovim-a1ba655dee0f89230ea09712e4df981cc3b15bea.zip
test: spawn_wait() starts a non-RPC Nvim process
Problem: Can't use `n.clear()` to test non-RPC `nvim` invocations. So tests end up creating ad-hoc wrappers around `system()` or `jobstart()`. Solution: - Introduce `n.spawn_wait()` - TODO (followup PR): Rename `n.spawn()` and `n.spawn_wait()`. It's misleading that `n.spawn()` returns a RPC session...
Diffstat (limited to 'test/functional/testnvim.lua')
-rw-r--r--test/functional/testnvim.lua71
1 files changed, 50 insertions, 21 deletions
diff --git a/test/functional/testnvim.lua b/test/functional/testnvim.lua
index 675ad9e3d7..d65cbf685e 100644
--- a/test/functional/testnvim.lua
+++ b/test/functional/testnvim.lua
@@ -4,7 +4,7 @@ local t = require('test.testutil')
local Session = require('test.client.session')
local uv_stream = require('test.client.uv_stream')
local SocketStream = uv_stream.SocketStream
-local ChildProcessStream = uv_stream.ChildProcessStream
+local ProcStream = uv_stream.ProcStream
local check_cores = t.check_cores
local check_logs = t.check_logs
@@ -465,10 +465,12 @@ function M.check_close()
session = nil
end
+--- Starts `argv` process as a Nvim msgpack-RPC session.
+---
--- @param argv string[]
--- @param merge boolean?
--- @param env string[]?
---- @param keep boolean?
+--- @param keep boolean? Don't close the current global session.
--- @param io_extra uv.uv_pipe_t? used for stdin_fd, see :help ui-option
--- @return test.Session
function M.spawn(argv, merge, env, keep, io_extra)
@@ -476,9 +478,8 @@ function M.spawn(argv, merge, env, keep, io_extra)
M.check_close()
end
- local child_stream =
- ChildProcessStream.spawn(merge and M.merge_args(prepend_argv, argv) or argv, env, io_extra)
- return Session.new(child_stream)
+ local proc = ProcStream.spawn(merge and M.merge_args(prepend_argv, argv) or argv, env, io_extra)
+ return Session.new(proc)
end
-- Creates a new Session connected by domain socket (named pipe) or TCP.
@@ -489,31 +490,59 @@ function M.connect(file_or_address)
return Session.new(stream)
end
--- Starts (and returns) a new global Nvim session.
---
--- Parameters are interpreted as startup args, OR a map with these keys:
--- args: List: Args appended to the default `nvim_argv` set.
--- args_rm: List: Args removed from the default set. All cases are
--- removed, e.g. args_rm={'--cmd'} removes all cases of "--cmd"
--- (and its value) from the default set.
--- env: Map: Defines the environment of the new session.
---
--- Example:
--- clear('-e')
--- clear{args={'-e'}, args_rm={'-i'}, env={TERM=term}}
+--- Starts (and returns) a new global Nvim session.
+---
+--- Use `spawn_argv()` to get a new session without replacing the current global session.
+---
+--- Parameters are interpreted as startup args, OR a map with these keys:
+--- - args: List: Args appended to the default `nvim_argv` set.
+--- - args_rm: List: Args removed from the default set. All cases are
+--- removed, e.g. args_rm={'--cmd'} removes all cases of "--cmd"
+--- (and its value) from the default set.
+--- - env: Map: Defines the environment of the new session.
+---
+--- Example:
+--- ```
+--- clear('-e')
+--- clear{args={'-e'}, args_rm={'-i'}, env={TERM=term}}
+--- ```
+---
+--- @param ... string Nvim CLI args
+--- @return test.Session
+--- @overload fun(opts: test.new_argv.Opts): test.Session
function M.clear(...)
M.set_session(M.spawn_argv(false, ...))
return M.get_session()
end
---- same params as clear, but does returns the session instead
---- of replacing the default session
+--- Same as clear(), but doesn't replace the current global session.
+---
+--- @param keep boolean Don't close the current global session.
+--- @param ... string Nvim CLI args
--- @return test.Session
+--- @overload fun(opts: test.new_argv.Opts): test.Session
function M.spawn_argv(keep, ...)
local argv, env, io_extra = M.new_argv(...)
return M.spawn(argv, nil, env, keep, io_extra)
end
+--- Starts a (`--headless`, non-RPC) Nvim process, waits for exit, and returns output + info.
+---
+--- @param ... string Nvim CLI args
+--- @return test.ProcStream
+--- @overload fun(opts: test.new_argv.Opts): test.ProcStream
+function M.spawn_wait(...)
+ local opts = type(...) == 'string' and { args = { ... } } or ...
+ opts.args_rm = opts.args_rm and opts.args_rm or {}
+ table.insert(opts.args_rm, '--embed')
+ local argv, env, io_extra = M.new_argv(opts)
+ local proc = ProcStream.spawn(argv, env, io_extra)
+ proc:read_start()
+ proc:wait()
+ proc:close()
+ return proc
+end
+
--- @class test.new_argv.Opts
--- @field args? string[]
--- @field args_rm? string[]
@@ -522,11 +551,11 @@ end
--- Builds an argument list for use in clear().
---
---- @see clear() for parameters.
---- @param ... string
+--- @param ... string See clear().
--- @return string[]
--- @return string[]?
--- @return uv.uv_pipe_t?
+--- @overload fun(opts: test.new_argv.Opts): string[], string[]?, uv.uv_pipe_t?
function M.new_argv(...)
local args = { unpack(M.nvim_argv) }
table.insert(args, '--headless')