aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-12-10 15:50:08 +0100
committerJustin M. Keyes <justinkz@gmail.com>2016-12-11 01:14:22 +0100
commitd32888073f07326550b32ed6b497260aef19ec1e (patch)
treee5189bc3a7b4540d34cba8aa14641f46e6ac6d54
parentc8d5e9230ee3ddc530ddb251fbe11e3b02293c80 (diff)
downloadrneovim-d32888073f07326550b32ed6b497260aef19ec1e.tar.gz
rneovim-d32888073f07326550b32ed6b497260aef19ec1e.tar.bz2
rneovim-d32888073f07326550b32ed6b497260aef19ec1e.zip
test: jobstart()
-rw-r--r--src/nvim/eval.c22
-rw-r--r--test/functional/core/job_spec.lua23
2 files changed, 28 insertions, 17 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index a791fea663..a02ca40173 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -11581,7 +11581,7 @@ static void f_jobresize(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = 1;
}
-static char **tv_to_argv(typval_T *cmd_tv, char **cmd)
+static char **tv_to_argv(typval_T *cmd_tv, char **cmd, bool *executable)
{
if (cmd_tv->v_type == VAR_STRING) {
char *cmd_str = (char *)get_tv_string(cmd_tv);
@@ -11599,7 +11599,7 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd)
list_T *argl = cmd_tv->vval.v_list;
int argc = argl->lv_len;
if (!argc) {
- EMSG(_("Argument vector must have at least one item"));
+ EMSG(_(e_invarg)); // List must have at least one item.
return NULL;
}
@@ -11607,14 +11607,16 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd)
const char_u *exe = get_tv_string_chk(&argl->lv_first->li_tv);
if (!exe || !os_can_exe(exe, NULL, true)) {
- // String is not executable
+ if (exe && executable) {
+ *executable = false;
+ }
return NULL;
}
if (cmd) {
*cmd = (char *)exe;
}
-
+
// Build the argument vector
int i = 0;
char **argv = xcalloc(argc + 1, sizeof(char *));
@@ -11641,9 +11643,10 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
return;
}
- char **argv = tv_to_argv(&argvars[0], NULL);
+ bool executable = true;
+ char **argv = tv_to_argv(&argvars[0], NULL, &executable);
if (!argv) {
- rettv->vval.v_number = -1; // Return -1 on error.
+ rettv->vval.v_number = executable ? 0 : -1;
return; // Did error message in tv_to_argv.
}
@@ -16233,7 +16236,7 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
}
// get shell command to execute
- char **argv = tv_to_argv(&argvars[0], NULL);
+ char **argv = tv_to_argv(&argvars[0], NULL, NULL);
if (!argv) {
xfree(input);
return; // Already did emsg.
@@ -16466,9 +16469,10 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
char *cmd;
- char **argv = tv_to_argv(&argvars[0], &cmd);
+ bool executable = true;
+ char **argv = tv_to_argv(&argvars[0], &cmd, &executable);
if (!argv) {
- rettv->vval.v_number = -1; // Return -1 on error.
+ rettv->vval.v_number = executable ? 0 : -1;
return; // Did error message in tv_to_argv.
}
diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua
index 61bd4f8b44..79cc877cac 100644
--- a/test/functional/core/job_spec.lua
+++ b/test/functional/core/job_spec.lua
@@ -65,15 +65,22 @@ describe('jobs', function()
end)
it('returns 0 when it fails to start', function()
- local status, rv = pcall(eval, "jobstart([])")
- eq(false, status)
- ok(rv ~= nil)
- end)
-
- it('returns -1 when target is not executable', function()
- local rv = eval("jobstart(['./test/functional/fixtures/non_executable.txt'])")
- eq(-1, rv)
eq("", eval("v:errmsg"))
+ execute("let g:test_jobid = jobstart([])")
+ eq(0, eval("g:test_jobid"))
+ eq("E474:", string.match(eval("v:errmsg"), "E%d*:"))
+ end)
+
+ it('returns -1 when target is not executable #5465', function()
+ local function new_job() return eval([[jobstart(['echo', 'foo'])]]) end
+ local executable_jobid = new_job()
+ local nonexecutable_jobid = eval(
+ "jobstart(['./test/functional/fixtures/non_executable.txt'])")
+ eq(-1, nonexecutable_jobid)
+ -- Should _not_ throw an error.
+ eq("", eval("v:errmsg"))
+ -- Non-executable job should not increment the job ids. #5465
+ eq(executable_jobid + 1, new_job())
end)
it('invokes callbacks when the job writes and exits', function()