@@ -476,6 +476,7 @@ static void f_arglistid __ARGS((typval_T *argvars, typval_T *rettv));
476476static void f_argv __ARGS((typval_T *argvars, typval_T *rettv));
477477static void f_assert_equal __ARGS((typval_T *argvars, typval_T *rettv));
478478static void f_assert_exception __ARGS((typval_T *argvars, typval_T *rettv));
479+ static void f_assert_fails __ARGS((typval_T *argvars, typval_T *rettv));
479480static void f_assert_false __ARGS((typval_T *argvars, typval_T *rettv));
480481static void f_assert_true __ARGS((typval_T *argvars, typval_T *rettv));
481482#ifdef FEAT_FLOAT
@@ -8090,6 +8091,7 @@ static struct fst
80908091#endif
80918092 {"assert_equal", 2, 3, f_assert_equal},
80928093 {"assert_exception", 1, 2, f_assert_exception},
8094+ {"assert_fails", 1, 2, f_assert_fails},
80938095 {"assert_false", 1, 2, f_assert_false},
80948096 {"assert_true", 1, 2, f_assert_true},
80958097#ifdef FEAT_FLOAT
@@ -9009,8 +9011,11 @@ f_alloc_fail(argvars, rettv)
90099011 else
90109012 {
90119013 alloc_fail_id = argvars[0].vval.v_number;
9014+ if (alloc_fail_id >= aid_last)
9015+ EMSG(_(e_invarg));
90129016 alloc_fail_countdown = argvars[1].vval.v_number;
90139017 alloc_fail_repeat = argvars[2].vval.v_number;
9018+ did_outofmem_msg = FALSE;
90149019 }
90159020}
90169021
@@ -9300,6 +9305,51 @@ f_assert_exception(argvars, rettv)
93009305 }
93019306}
93029307
9308+ /*
9309+ * "assert_fails(cmd [, error])" function
9310+ */
9311+ static void
9312+ f_assert_fails(argvars, rettv)
9313+ typval_T *argvars;
9314+ typval_T *rettv UNUSED;
9315+ {
9316+ char_u *cmd = get_tv_string_chk(&argvars[0]);
9317+ garray_T ga;
9318+
9319+ called_emsg = FALSE;
9320+ suppress_errthrow = TRUE;
9321+ emsg_silent = TRUE;
9322+ do_cmdline_cmd(cmd);
9323+ if (!called_emsg)
9324+ {
9325+ prepare_assert_error(&ga);
9326+ ga_concat(&ga, (char_u *)"command did not fail: ");
9327+ ga_concat(&ga, cmd);
9328+ assert_error(&ga);
9329+ ga_clear(&ga);
9330+ }
9331+ else if (argvars[1].v_type != VAR_UNKNOWN)
9332+ {
9333+ char_u buf[NUMBUFLEN];
9334+ char *error = (char *)get_tv_string_buf_chk(&argvars[1], buf);
9335+
9336+ if (strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL)
9337+ {
9338+ prepare_assert_error(&ga);
9339+ fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
9340+ &vimvars[VV_ERRMSG].vv_tv);
9341+ assert_error(&ga);
9342+ ga_clear(&ga);
9343+ }
9344+ }
9345+
9346+ called_emsg = FALSE;
9347+ suppress_errthrow = FALSE;
9348+ emsg_silent = FALSE;
9349+ emsg_on_display = FALSE;
9350+ set_vim_var_string(VV_ERRMSG, NULL, 0);
9351+ }
9352+
93039353/*
93049354 * Common for assert_true() and assert_false().
93059355 */
0 commit comments