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
&ts += 1
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(['&ts ..= "xxx"'], 'E1019:')
call CheckDefFailure(['&path += 3'], 'E1013:')
&ts = 8
g:inc_counter += 1
assert_equal(2, g:inc_counter)
@@ -1013,7 +1023,11 @@ def Test_if_const_expr()
res = true
endif
assert_equal(false, res)
enddef
def Test_if_const_expr_fails()
call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
enddef
def Test_delfunc()

View File

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

View File

@@ -4043,6 +4043,7 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
{
typval_T argvars[2];
char_u *start_leader, *end_leader;
int has_call = FALSE;
/*
* 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;
}
if (STRNCMP("has(", *arg, 4) != 0)
return FAIL;
*arg = skipwhite(*arg + 4);
if (STRNCMP("has(", *arg, 4) == 0)
{
has_call = TRUE;
*arg = skipwhite(*arg + 4);
}
if (**arg == '"')
{
@@ -4087,23 +4090,26 @@ evaluate_const_expr7(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
else
return FAIL;
*arg = skipwhite(*arg);
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 (has_call)
{
if (*start_leader == '!')
tv->vval.v_number = !tv->vval.v_number;
++start_leader;
*arg = skipwhite(*arg);
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 == '!')
tv->vval.v_number = !tv->vval.v_number;
++start_leader;
}
}
return OK;
@@ -4129,8 +4135,33 @@ evaluate_const_expr4(char_u **arg, cctx_T *cctx UNUSED, typval_T *tv)
*/
if (type != EXPR_UNKNOWN)
{
// TODO
return FAIL;
typval_T tv2;
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;