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:
@@ -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(['¬ex += 3'], 'E113:')
|
call CheckDefFailure(['¬ex += 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()
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user