changeset 11006:b3601a8eb679 v8.0.0392

patch 8.0.0392: GUI test fails with Athena and Motif commit https://github.com/vim/vim/commit/e0c31f6a304496b597a51ce98af419ec815bec74 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Mar 1 15:07:05 2017 +0100 patch 8.0.0392: GUI test fails with Athena and Motif Problem: GUI test fails with Athena and Motif. Solution: Add test_ignore_error(). Use it to ignore the "failed to create input context" error.
author Christian Brabandt <cb@256bit.org>
date Wed, 01 Mar 2017 15:15:05 +0100
parents 5bc16b2b8c46
children 14a0d274348d
files runtime/doc/eval.txt src/evalfunc.c src/message.c src/proto/message.pro src/testdir/test_gui.vim src/version.c
diffstat 6 files changed, 58 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2358,6 +2358,7 @@ test_alloc_fail({id}, {countdown}, {repe
 test_autochdir()		none	enable 'autochdir' during startup
 test_disable_char_avail({expr}) none	test without typeahead
 test_garbagecollect_now()	none	free memory right now for testing
+test_ignore_error({expr})	none	ignore a specific error
 test_null_channel()		Channel	null value for testing
 test_null_dict()		Dict	null value for testing
 test_null_job()			Job	null value for testing
@@ -7784,6 +7785,15 @@ test_garbagecollect_now()			 *test_garba
 		internally, and |v:testing| must have been set before calling
 		any function.
 
+test_ignore_error({expr})			 *test_ignore_error()*
+		Ignore any error containing {expr}.  A normal message is given
+		instead.
+		This is only meant to be used in tests, where catching the
+		error with try/catch cannot be used (because it skips over
+		following code).
+		{expr} is used literally, not as a pattern.
+		There is currently no way to revert this.
+
 test_null_channel()					*test_null_channel()*
 		Return a Channel that is null. Only useful for testing.
 		{only available when compiled with the +channel feature}
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -389,6 +389,7 @@ static void f_test_alloc_fail(typval_T *
 static void f_test_autochdir(typval_T *argvars, typval_T *rettv);
 static void f_test_disable_char_avail(typval_T *argvars, typval_T *rettv);
 static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv);
+static void f_test_ignore_error(typval_T *argvars, typval_T *rettv);
 #ifdef FEAT_JOB_CHANNEL
 static void f_test_null_channel(typval_T *argvars, typval_T *rettv);
 #endif
@@ -823,6 +824,7 @@ static struct fst
     {"test_autochdir",	0, 0, f_test_autochdir},
     {"test_disable_char_avail", 1, 1, f_test_disable_char_avail},
     {"test_garbagecollect_now",	0, 0, f_test_garbagecollect_now},
+    {"test_ignore_error",	1, 1, f_test_ignore_error},
 #ifdef FEAT_JOB_CHANNEL
     {"test_null_channel", 0, 0, f_test_null_channel},
 #endif
@@ -12325,6 +12327,15 @@ f_test_garbagecollect_now(typval_T *argv
     garbage_collect(TRUE);
 }
 
+/*
+ * "test_ignore_error()" function
+ */
+    static void
+f_test_ignore_error(typval_T *argvars, typval_T *rettv UNUSED)
+{
+     ignore_error_for_testing(get_tv_string(&argvars[0]));
+}
+
 #ifdef FEAT_JOB_CHANNEL
     static void
 f_test_null_channel(typval_T *argvars UNUSED, typval_T *rettv)
--- a/src/message.c
+++ b/src/message.c
@@ -539,6 +539,31 @@ emsg_not_now(void)
     return FALSE;
 }
 
+#ifdef FEAT_EVAL
+static garray_T ignore_error_list = GA_EMPTY;
+
+    void
+ignore_error_for_testing(char_u *error)
+{
+    if (ignore_error_list.ga_itemsize == 0)
+	ga_init2(&ignore_error_list, sizeof(char_u *), 1);
+
+    ga_add_string(&ignore_error_list, error);
+}
+
+    static int
+ignore_error(char_u *msg)
+{
+    int i;
+
+    for (i = 0; i < ignore_error_list.ga_len; ++i)
+	if (strstr((char *)msg,
+		  (char *)((char_u **)(ignore_error_list.ga_data))[i]) != NULL)
+	    return TRUE;
+    return FALSE;
+}
+#endif
+
 #if !defined(HAVE_STRERROR) || defined(PROTO)
 /*
  * Replacement for perror() that behaves more or less like emsg() was called.
@@ -577,6 +602,12 @@ emsg(char_u *s)
     if (emsg_not_now())
 	return TRUE;
 
+#ifdef FEAT_EVAL
+    /* When testing some errors are turned into a normal message. */
+    if (ignore_error(s))
+	return msg(s);
+#endif
+
     called_emsg = TRUE;
 
     /*
--- a/src/proto/message.pro
+++ b/src/proto/message.pro
@@ -8,6 +8,7 @@ void trunc_string(char_u *s, char_u *buf
 void reset_last_sourcing(void);
 void msg_source(int attr);
 int emsg_not_now(void);
+void ignore_error_for_testing(char_u *error);
 void do_perror(char *msg);
 int emsg(char_u *s);
 int emsg2(char_u *s, char_u *a1);
--- a/src/testdir/test_gui.vim
+++ b/src/testdir/test_gui.vim
@@ -17,6 +17,9 @@ endfunc
 " Test for resetting "secure" flag after GUI has started.
 " Must be run first.
 func Test_1_set_secure()
+  " Ignore the "failed to create input context" error.
+  call test_ignore_error('E285')
+
   set exrc secure
   gui -f
   call assert_equal(1, has('gui_running'))
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    392,
+/**/
     391,
 /**/
     390,