diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-12-10 15:50:08 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-12-11 01:14:22 +0100 |
commit | d32888073f07326550b32ed6b497260aef19ec1e (patch) | |
tree | e5189bc3a7b4540d34cba8aa14641f46e6ac6d54 | |
parent | c8d5e9230ee3ddc530ddb251fbe11e3b02293c80 (diff) | |
download | rneovim-d32888073f07326550b32ed6b497260aef19ec1e.tar.gz rneovim-d32888073f07326550b32ed6b497260aef19ec1e.tar.bz2 rneovim-d32888073f07326550b32ed6b497260aef19ec1e.zip |
test: jobstart()
-rw-r--r-- | src/nvim/eval.c | 22 | ||||
-rw-r--r-- | test/functional/core/job_spec.lua | 23 |
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() |