patch 7.4.1096 v7.4.1096
authorBram Moolenaar <Bram@vim.org>
Fri, 15 Jan 2016 19:48:22 +0000 (20:48 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 15 Jan 2016 19:48:22 +0000 (20:48 +0100)
Problem:    Need several lines to verify a command produces an error.
Solution:   Add assert_fails(). (suggested by Nikolay Pavlov)
            Make the quickfix alloc test actually work.

runtime/doc/eval.txt
src/alloc.h
src/eval.c
src/misc2.c
src/testdir/test_quickfix.vim
src/version.c

index 906a8691e2661828ec890be8cf6dcbd2d3147e41..8340bf2feee6db6cf3af88a645650629aea53f5d 100644 (file)
@@ -1752,6 +1752,7 @@ argv( {nr})                       String  {nr} entry of the argument list
 argv( )                                List    the argument list
 assert_equal( {exp}, {act} [, {msg}]) none  assert {exp} equals {act}
 assert_exception({error} [, {msg}])   none  assert {error} is in v:exception
+assert_fails( {cmd} [, {error}])      none  assert {cmd} fails
 assert_false( {actual} [, {msg}])     none  assert {actual} is false
 assert_true( {actual} [, {msg}])      none  assert {actual} is true
 asin( {expr})                  Float   arc sine of {expr}
@@ -2207,6 +2208,11 @@ assert_exception({error} [, {msg}])                      *assert_exception()*
                          call assert_exception('E492:')
                        endtry
 
+assert_fails({cmd} [, {error}])                                        *assert_fails()*
+               Run {cmd} and add an error message to |v:errors| if it does
+               NOT produce an error.
+               When {error} is given it must match |v:errmsg|.
+
 assert_false({actual} [, {msg}])                               *assert_false()*
                When {actual} is not false an error message is added to
                |v:errors|, like with |assert_equal()|.
index c237ef348cd75521501d6d0bb0c64d74b32b65dc..7a992c689fdbf3ce3ef0eb246692d2f335851b2a 100644 (file)
@@ -17,4 +17,5 @@ typedef enum {
        aid_qf_namebuf,
        aid_qf_errmsg,
        aid_qf_pattern,
+       aid_last,
 } alloc_id_T;
index 5eddf2368e7ec84c37a1a67c69c826cf675da682..ac1058cf0cfb77c5c5c4b89cb3765ed2c189fdfd 100644 (file)
@@ -476,6 +476,7 @@ static void f_arglistid __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_argv __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_assert_equal __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_assert_exception __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_assert_fails __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_assert_false __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_assert_true __ARGS((typval_T *argvars, typval_T *rettv));
 #ifdef FEAT_FLOAT
@@ -8090,6 +8091,7 @@ static struct fst
 #endif
     {"assert_equal",   2, 3, f_assert_equal},
     {"assert_exception", 1, 2, f_assert_exception},
+    {"assert_fails",   1, 2, f_assert_fails},
     {"assert_false",   1, 2, f_assert_false},
     {"assert_true",    1, 2, f_assert_true},
 #ifdef FEAT_FLOAT
@@ -9009,8 +9011,11 @@ f_alloc_fail(argvars, rettv)
     else
     {
        alloc_fail_id = argvars[0].vval.v_number;
+       if (alloc_fail_id >= aid_last)
+           EMSG(_(e_invarg));
        alloc_fail_countdown = argvars[1].vval.v_number;
        alloc_fail_repeat = argvars[2].vval.v_number;
+       did_outofmem_msg = FALSE;
     }
 }
 
@@ -9300,6 +9305,51 @@ f_assert_exception(argvars, rettv)
     }
 }
 
+/*
+ * "assert_fails(cmd [, error])" function
+ */
+    static void
+f_assert_fails(argvars, rettv)
+    typval_T   *argvars;
+    typval_T   *rettv UNUSED;
+{
+    char_u     *cmd = get_tv_string_chk(&argvars[0]);
+    garray_T   ga;
+
+    called_emsg = FALSE;
+    suppress_errthrow = TRUE;
+    emsg_silent = TRUE;
+    do_cmdline_cmd(cmd);
+    if (!called_emsg)
+    {
+       prepare_assert_error(&ga);
+       ga_concat(&ga, (char_u *)"command did not fail: ");
+       ga_concat(&ga, cmd);
+       assert_error(&ga);
+       ga_clear(&ga);
+    }
+    else if (argvars[1].v_type != VAR_UNKNOWN)
+    {
+       char_u  buf[NUMBUFLEN];
+       char    *error = (char *)get_tv_string_buf_chk(&argvars[1], buf);
+
+       if (strstr((char *)vimvars[VV_ERRMSG].vv_str, error) == NULL)
+       {
+           prepare_assert_error(&ga);
+           fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
+                                               &vimvars[VV_ERRMSG].vv_tv);
+           assert_error(&ga);
+           ga_clear(&ga);
+       }
+    }
+
+    called_emsg = FALSE;
+    suppress_errthrow = FALSE;
+    emsg_silent = FALSE;
+    emsg_on_display = FALSE;
+    set_vim_var_string(VV_ERRMSG, NULL, 0);
+}
+
 /*
  * Common for assert_true() and assert_false().
  */
index 854021255467f726a5aa625811974c6899d054cf..0ee57fc4a69a8c2f2aafaf55889c88d936f312d0 100644 (file)
@@ -798,13 +798,17 @@ vim_mem_profile_dump()
 #endif /* MEM_PROFILE */
 
 #ifdef FEAT_EVAL
+static int alloc_does_fail __ARGS((long_u size));
+
     static int
-alloc_does_fail()
+alloc_does_fail(size)
+    long_u size;
 {
     if (alloc_fail_countdown == 0)
     {
        if (--alloc_fail_repeat <= 0)
            alloc_fail_id = 0;
+       do_outofmem_msg(size);
        return TRUE;
     }
     --alloc_fail_countdown;
@@ -844,7 +848,7 @@ alloc_id(size, id)
     alloc_id_T id UNUSED;
 {
 #ifdef FEAT_EVAL
-    if (alloc_fail_id == id && alloc_does_fail())
+    if (alloc_fail_id == id && alloc_does_fail((long_u)size))
        return NULL;
 #endif
     return (lalloc((long_u)size, TRUE));
@@ -1008,7 +1012,7 @@ lalloc_id(size, message, id)
     alloc_id_T id UNUSED;
 {
 #ifdef FEAT_EVAL
-    if (alloc_fail_id == id && alloc_does_fail())
+    if (alloc_fail_id == id && alloc_does_fail(size))
        return NULL;
 #endif
     return (lalloc((long_u)size, message));
index b9f3f7bbbea37c57f0143c5eefe292bd04eb6529..b2fc9683a066c682a3d11fc5acb37dfbac57033e 100644 (file)
@@ -279,39 +279,19 @@ endfunction
 
 function Test_nomem()
   call alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
-  try
-    vimgrep vim runtest.vim
-  catch
-    call assert_true(v:exception =~ 'E342')
-  endtry
+  call assert_fails('vimgrep vim runtest.vim', 'E342:')
 
   call alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
-  try
-    vimgrep vim runtest.vim
-  catch
-    call assert_true(v:exception =~ 'E342')
-  endtry
+  call assert_fails('vimgrep vim runtest.vim', 'E342:')
 
   call alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
-  try
-    cfile runtest.vim
-  catch
-    call assert_true(v:exception =~ 'E342')
-  endtry
+  call assert_fails('cfile runtest.vim', 'E342:')
 
   call alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
-  try
-    cfile runtest.vim
-  catch
-    call assert_true(v:exception =~ 'E342')
-  endtry
+  call assert_fails('cfile runtest.vim', 'E342:')
 
   call alloc_fail(GetAllocId('qf_pattern'), 0, 0)
-  try
-    cfile runtest.vim
-  catch
-    call assert_true(v:exception =~ 'E342')
-  endtry
+  call assert_fails('cfile runtest.vim', 'E342:')
 
 endfunc
 
index 2c92c175fcb551f741785e5e58043f7fc37d322e..b84211680880445bb15a2bfae678048d4d1b3106 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1096,
 /**/
     1095,
 /**/