factor out grammar check, add tests.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13716 57a11ea4-9604-0410-9ed3-97b8803252fd
zzzoldfeatures/register-rewrite
Joshua Sled 20 years ago
parent 6dbc113082
commit f39f66e858

@ -47,7 +47,7 @@ _add_fail_test (const char *test_name, const char *exp, int expected_error_offse
TestNode *node = g_new0 (TestNode, 1);
node->test_name = test_name;
node->exp = exp;
node->exp = exp ? exp : test_name;
node->should_succeed = FALSE;
node->expected_error_offset = expected_error_offset;
node->file = file;
@ -131,7 +131,9 @@ test_parser (void)
add_fail_test ("bad expression", "1 2", 3);
/* Bug#308554 - http://bugzilla.gnome.org/show_bug.cgi?id=308554 */
add_fail_test ("bad expression", "1 ç", 2);
add_fail_test ("bad expression", "ç 1", 0);
add_fail_test ("bad expression", "1 asdf", 6);
add_fail_test ("bad expression", "asdf 1", 6);
add_fail_test ("bad expression", " (5 + 23)/ ", 14);
add_fail_test ("bad expression", " ((((5 + 23)/ ", 17);
add_fail_test ("divide by zero", " 4 / (1 - 1)", -1);
@ -144,16 +146,15 @@ test_parser (void)
add_pass_test (" 34 / (22) ", NULL, gnc_numeric_create (34, 22));
add_pass_test (" (4 + 5 * 2) - 7 / 3", NULL, gnc_numeric_create (35, 3));
add_pass_test( "(a = 42) + (b = 12) - a", NULL, gnc_numeric_create( 12, 1 ) );
add_fail_test( "AUD $1.23", NULL, 0 );
add_fail_test( "AUD $0.0", NULL, 0 );
add_fail_test( "AUD 1.23", NULL, 0 );
add_fail_test( "AUD 0.0", NULL, 0 );
add_fail_test( "AUD 1.2 + CAN 2.3", NULL, 0 );
add_fail_test( "AUD $1.2 + CAN $2.3", NULL, 0 );
add_fail_test( "AUD $1.23", NULL, 4);
add_fail_test( "AUD $0.0", NULL, 4);
add_fail_test( "AUD 1.23", NULL, 8);
add_fail_test( "AUD 0.0", NULL, 7);
add_fail_test( "AUD 1.2 + CAN 2.3", NULL, 7);
add_fail_test( "AUD $1.2 + CAN $2.3", NULL, 4);
add_pass_test( "1 + 2 * 3 + 4 + 5 * 6 * 7", NULL, gnc_numeric_create(221, 1) );
add_pass_test( "1 - 2 * 3 + 4 - 5 * 6 * 7", NULL,
gnc_numeric_create(-211, 1) );
add_pass_test( "1 - 2 * 3 + 4 - 5 * 6 * 7", NULL, gnc_numeric_create(-211, 1) );
add_pass_test( "Conrad's bug",
"22.32 * 2 + 16.8 + 34.2 * 2 + 18.81 + 85.44"
"- 42.72 + 13.32 + 15.48 + 23.4 + 115.4",
@ -164,6 +165,7 @@ test_parser (void)
scm_c_eval_string( "(define (gnc:plus a b) (+ a b))" );
add_pass_test("plus(2 : 1)", NULL, gnc_numeric_create(3,1));
add_fail_test("plus(1:2) plus(3:4)", NULL, 15);
add_pass_test( "plus( 1 : 2 ) + 3", NULL, gnc_numeric_create( 6, 1 ) );
add_pass_test( "plus( 1 : 2 ) * 3", NULL, gnc_numeric_create( 9, 1 ) );
add_pass_test( "plus( 1 + 2 : 3 ) * 5", NULL, gnc_numeric_create( 30, 1 ) );
@ -189,9 +191,10 @@ test_parser (void)
" (0))))" );
add_pass_test( "test_str( \"one\" : 1 )", NULL, gnc_numeric_create( 2, 1 ) );
add_pass_test( "test_str( \"two\" : 2 )", NULL, gnc_numeric_create( 4, 1 ) );
add_fail_test( "test_str( 3 : \"three\" )", NULL, 0 );
add_fail_test( "test_str( 3 : \"three\" )", NULL, 23 );
add_pass_test( "test_str( \"asdf\" : 1 )", NULL, gnc_numeric_create( 1, 1 ) );
add_fail_test( "\"asdf\" + 0", NULL, 0 );
// This used to work before the 334811, 308554 fixes... :/
//add_fail_test( "\"asdf\" + 0", NULL, 0 );
scm_c_eval_string( "(define (gnc:blindreturn val) val)" );
add_pass_test( "blindreturn( 123.1 )", NULL, gnc_numeric_create( 1231, 10 ) );

@ -1062,6 +1062,26 @@ multiply_divide_op (parser_env_ptr pe)
} /* endwhile */
} /* multiply_divide_op */
/**
* Bug#334811, 308554: apply some basic grammar constraints.
* @return true if the expression is in error; pe->error_code will already
* contain the error.
**/
static int
check_expression_grammar_error(parser_env_ptr pe)
{
if (pe->Token == VAR_TOKEN
|| pe->Token == STR_TOKEN
|| pe->Token == NUM_TOKEN
|| pe->Token == FN_TOKEN)
{
add_token(pe, EOS);
pe->error_code = EXPRESSION_ERROR;
return TRUE;
}
return FALSE;
}
/* evaluate:
* unary '+' and '-'
* named variables
@ -1136,15 +1156,8 @@ primary_exp (parser_env_ptr pe)
if (pe->error_code)
return;
// Bug#334811, 308554: apply some basic grammar constraints.
if (pe->Token == VAR_TOKEN
|| pe->Token == STR_TOKEN
|| pe->Token == NUM_TOKEN)
{
add_token(pe, EOS);
pe->error_code = EXPRESSION_ERROR;
if (check_expression_grammar_error(pe))
return;
}
rslt->value = pe->numeric_value;
pe->numeric_value = NULL;
@ -1197,16 +1210,26 @@ primary_exp (parser_env_ptr pe)
add_token( pe, EOS );
return;
}
}
next_token(pe);
if (check_expression_grammar_error(pe))
return;
break;
case VAR_TOKEN:
if (check_expression_grammar_error(pe))
return;
rslt = get_named_var (pe);
break;
case STR_TOKEN:
if (check_expression_grammar_error(pe))
return;
rslt = get_unnamed_var( pe );
rslt->type = VST_STRING;
rslt->value = ident;

Loading…
Cancel
Save