Problem: Test failures for unreachable code.
Solution: Add a test override to ignore unreachable code.
string is detected
ui_delay time in msec to use in ui_delay(); overrules a
wait time of up to 3 seconds for messages
+ unreachable no error for code after `:throw` and `:return`
uptime overrules sysinfo.uptime
vterm_title setting the window title by a job running in a
terminal window
"starting" is to be used when a test should behave like
startup was done. Since the tests are run by sourcing a
script the "starting" variable is non-zero. This is usually a
- good thing (tests run faster), but sometimes changes behavior
- in a way that the test doesn't work properly.
+ good thing (tests run faster), but sometimes this changes
+ behavior in a way that the test doesn't work properly.
When using: >
call test_override('starting', 1)
< The value of "starting" is saved. It is restored by: >
call test_override('starting', 0)
+< To make sure the flag is reset later using `:defer` can be
+ useful: >
+ call test_override('unreachable', 1)
+ defer call test_override('unreachable', 0)
+
< Can also be used as a |method|: >
GetOverrideVal()-> test_override('starting')
EXTERN long override_sysinfo_uptime INIT(= -1);
EXTERN int override_autoload INIT(= FALSE);
EXTERN int ml_get_alloc_lines INIT(= FALSE);
+EXTERN int ignore_unreachable_code_for_testing INIT(= FALSE);
EXTERN int in_free_unref_items INIT(= FALSE);
#endif
try # comment
add(l, '1')
throw 'wrong'
- add(l, '2')
+ add(l, '2') # "unreachable code"
catch # comment
add(l, v:exception)
finally # comment
try
add(l, '1')
throw 'wrong'
- add(l, '2')
+ add(l, '2') # "unreachable code"
catch /right/
add(l, v:exception)
endtry
var ret = 5
try
throw 'getout'
- return -1
+ return -1 # "unreachable code"
catch /getout/
# ret is evaluated here
return ret
def DeletedFunc(): list<any>
return ['delete me']
enddef
-defcompile
+defcompile DeletedFunc
+
+call test_override('unreachable', 1)
+defcompile Test_try_catch_throw
+call test_override('unreachable', 0)
+
delfunc DeletedFunc
def s:ThrowFromDef()
try
l->add('1')
throw 'bad'
- l->add('x')
+ l->add('x') # "unreachable code"
catch /bad/
l->add('2')
try
assert_equal(['1', '2', '3', '4'], l)
enddef
+call test_override('unreachable', 1)
+defcompile Test_try_catch_nested
+call test_override('unreachable', 0)
+
def s:TryOne(): number
try
return 0
no_wait_return = val;
else if (STRCMP(name, (char_u *)"ui_delay") == 0)
ui_delay_for_testing = val;
+ else if (STRCMP(name, (char_u *)"unreachable") == 0)
+ ignore_unreachable_code_for_testing = val;
else if (STRCMP(name, (char_u *)"term_props") == 0)
reset_term_props_on_termresponse = val;
else if (STRCMP(name, (char_u *)"vterm_title") == 0)
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1557,
/**/
1556,
/**/
return NULL;
}
- if (scope->se_u.se_try.ts_caught_all)
+ if (scope->se_u.se_try.ts_caught_all
+ && !ignore_unreachable_code_for_testing)
{
emsg(_(e_catch_unreachable_after_catch_all));
return NULL;
&& ea.cmdidx != CMD_endwhile
&& ea.cmdidx != CMD_catch
&& ea.cmdidx != CMD_finally
- && ea.cmdidx != CMD_endtry)
+ && ea.cmdidx != CMD_endtry
+ && !ignore_unreachable_code_for_testing)
{
emsg(_(e_unreachable_code_after_return));
goto erret;