0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.0495: Vim9: some code not tested

Problem:    Vim9: some code not tested.
Solution:   Add more tests.  Support more const expressions.
This commit is contained in:
Bram Moolenaar
2020-04-01 23:05:18 +02:00
parent ea94fbe83b
commit 80c34ca312
3 changed files with 68 additions and 21 deletions

View File

@@ -100,9 +100,19 @@ def Test_assignment()
set ts=7 set ts=7
&ts += 1 &ts += 1
assert_equal(8, &ts) assert_equal(8, &ts)
&ts -= 3
assert_equal(5, &ts)
&ts *= 2
assert_equal(10, &ts)
&ts /= 3
assert_equal(3, &ts)
set ts=10
&ts %= 4
assert_equal(2, &ts)
call CheckDefFailure(['&notex += 3'], 'E113:') call CheckDefFailure(['&notex += 3'], 'E113:')
call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:') call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
call CheckDefFailure(['&path += 3'], 'E1013:') call CheckDefFailure(['&path += 3'], 'E1013:')
&ts = 8
g:inc_counter += 1 g:inc_counter += 1
assert_equal(2, g:inc_counter) assert_equal(2, g:inc_counter)
@@ -1013,7 +1023,11 @@ def Test_if_const_expr()
res = true res = true
endif endif
assert_equal(false, res) assert_equal(false, res)
enddef
def Test_if_const_expr_fails()
call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
enddef enddef
def Test_delfunc() def Test_delfunc()

View File

@@ -738,6 +738,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
495,
/**/ /**/
494, 494,
/**/ /**/

View File

@@ -4043,6 +4043,7 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
{ {
typval_T argvars[2]; typval_T argvars[2];
char_u *start_leader, *end_leader; char_u *start_leader, *end_leader;
int has_call = FALSE;
/* /*
* Skip '!' characters. They are handled later. * Skip '!' characters. They are handled later.
@@ -4070,9 +4071,11 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
return OK; return OK;
} }
if (STRNCMP("has(", *arg, 4) != 0) if (STRNCMP("has(", *arg, 4) == 0)
return FAIL; {
*arg = skipwhite(*arg + 4); has_call = TRUE;
*arg = skipwhite(*arg + 4);
}
if (**arg == '"') if (**arg == '"')
{ {
@@ -4087,23 +4090,26 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
else else
return FAIL; return FAIL;
*arg = skipwhite(*arg); if (has_call)
if (**arg != ')')
return FAIL;
*arg = skipwhite(*arg + 1);
argvars[0] = *tv;
argvars[1].v_type = VAR_UNKNOWN;
tv->v_type = VAR_NUMBER;
tv->vval.v_number = 0;
f_has(argvars, tv);
clear_tv(&argvars[0]);
while (start_leader < end_leader)
{ {
if (*start_leader == '!') *arg = skipwhite(*arg);
tv->vval.v_number = !tv->vval.v_number; if (**arg != ')')
++start_leader; return FAIL;
*arg = skipwhite(*arg + 1);
argvars[0] = *tv;
argvars[1].v_type = VAR_UNKNOWN;
tv->v_type = VAR_NUMBER;
tv->vval.v_number = 0;
f_has(argvars, tv);
clear_tv(&argvars[0]);
while (start_leader < end_leader)
{
if (*start_leader == '!')
tv->vval.v_number = !tv->vval.v_number;
++start_leader;
}
} }
return OK; return OK;
@@ -4129,8 +4135,33 @@ evaluate_const_expr4(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
*/ */
if (type != EXPR_UNKNOWN) if (type != EXPR_UNKNOWN)
{ {
// TODO typval_T tv2;
return FAIL; char_u *s1, *s2;
char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
int n;
// TODO: Only string == string is supported now
if (tv->v_type != VAR_STRING)
return FAIL;
if (type != EXPR_EQUAL)
return FAIL;
// get the second variable
tv2.v_type = VAR_UNKNOWN;
*arg = skipwhite(p + len);
if (evaluate_const_expr7(arg, cctx, &tv2) == FAIL
|| tv2.v_type != VAR_STRING)
{
clear_tv(&tv2);
return FAIL;
}
s1 = tv_get_string_buf(tv, buf1);
s2 = tv_get_string_buf(&tv2, buf2);
n = STRCMP(s1, s2);
clear_tv(tv);
clear_tv(&tv2);
tv->v_type = VAR_BOOL;
tv->vval.v_number = n == 0 ? VVAL_TRUE : VVAL_FALSE;
} }
return OK; return OK;