test: jobstart()

This commit is contained in:
Justin M. Keyes
2016-12-10 15:50:08 +01:00
parent c8d5e9230e
commit d32888073f
2 changed files with 26 additions and 15 deletions

View File

@@ -11581,7 +11581,7 @@ static void f_jobresize(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = 1; 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) { if (cmd_tv->v_type == VAR_STRING) {
char *cmd_str = (char *)get_tv_string(cmd_tv); 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; list_T *argl = cmd_tv->vval.v_list;
int argc = argl->lv_len; int argc = argl->lv_len;
if (!argc) { if (!argc) {
EMSG(_("Argument vector must have at least one item")); EMSG(_(e_invarg)); // List must have at least one item.
return NULL; 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); const char_u *exe = get_tv_string_chk(&argl->lv_first->li_tv);
if (!exe || !os_can_exe(exe, NULL, true)) { if (!exe || !os_can_exe(exe, NULL, true)) {
// String is not executable if (exe && executable) {
*executable = false;
}
return NULL; return NULL;
} }
if (cmd) { if (cmd) {
*cmd = (char *)exe; *cmd = (char *)exe;
} }
// Build the argument vector // Build the argument vector
int i = 0; int i = 0;
char **argv = xcalloc(argc + 1, sizeof(char *)); char **argv = xcalloc(argc + 1, sizeof(char *));
@@ -11641,9 +11643,10 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr)
return; return;
} }
char **argv = tv_to_argv(&argvars[0], NULL); bool executable = true;
char **argv = tv_to_argv(&argvars[0], NULL, &executable);
if (!argv) { 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. 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 // get shell command to execute
char **argv = tv_to_argv(&argvars[0], NULL); char **argv = tv_to_argv(&argvars[0], NULL, NULL);
if (!argv) { if (!argv) {
xfree(input); xfree(input);
return; // Already did emsg. return; // Already did emsg.
@@ -16466,9 +16469,10 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr)
} }
char *cmd; char *cmd;
char **argv = tv_to_argv(&argvars[0], &cmd); bool executable = true;
char **argv = tv_to_argv(&argvars[0], &cmd, &executable);
if (!argv) { 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. return; // Did error message in tv_to_argv.
} }

View File

@@ -65,15 +65,22 @@ describe('jobs', function()
end) end)
it('returns 0 when it fails to start', function() it('returns 0 when it fails to start', function()
local status, rv = pcall(eval, "jobstart([])") eq("", eval("v:errmsg"))
eq(false, status) execute("let g:test_jobid = jobstart([])")
ok(rv ~= nil) eq(0, eval("g:test_jobid"))
eq("E474:", string.match(eval("v:errmsg"), "E%d*:"))
end) end)
it('returns -1 when target is not executable', function() it('returns -1 when target is not executable #5465', function()
local rv = eval("jobstart(['./test/functional/fixtures/non_executable.txt'])") local function new_job() return eval([[jobstart(['echo', 'foo'])]]) end
eq(-1, rv) 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")) eq("", eval("v:errmsg"))
-- Non-executable job should not increment the job ids. #5465
eq(executable_jobid + 1, new_job())
end) end)
it('invokes callbacks when the job writes and exits', function() it('invokes callbacks when the job writes and exits', function()