From e0c31f6a304496b597a51ce98af419ec815bec74 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 1 Mar 2017 15:07:05 +0100 Subject: [PATCH] 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. --- runtime/doc/eval.txt | 10 ++++++++++ src/evalfunc.c | 11 +++++++++++ src/message.c | 31 +++++++++++++++++++++++++++++++ src/proto/message.pro | 1 + src/testdir/test_gui.vim | 3 +++ src/version.c | 2 ++ 6 files changed, 58 insertions(+) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 30e71345a67bd..f2ec3063dd7f0 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2358,6 +2358,7 @@ test_alloc_fail({id}, {countdown}, {repeat}) 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_garbagecollect_now()* 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} diff --git a/src/evalfunc.c b/src/evalfunc.c index 52527bc897f5c..a470ff996f504 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -389,6 +389,7 @@ static void f_test_alloc_fail(typval_T *argvars, typval_T *rettv); 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 *argvars UNUSED, typval_T *rettv UNUSED) 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) diff --git a/src/message.c b/src/message.c index 2982a4051ed24..985e1ebbf2fc2 100644 --- 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; /* diff --git a/src/proto/message.pro b/src/proto/message.pro index c9d62c66e0fad..9a79f14a6061b 100644 --- a/src/proto/message.pro +++ b/src/proto/message.pro @@ -8,6 +8,7 @@ void trunc_string(char_u *s, char_u *buf, int room_in, int buflen); 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); diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim index 77e4f2e9a6cc1..6c9722dacf814 100644 --- 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')) diff --git a/src/version.c b/src/version.c index d4d27ecfc5627..e0ec0cec68262 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 392, /**/ 391, /**/