cleanup cmd node
[protos/libecoli.git] / lib / ecoli_node_expr_test.c
index ac3e5ba..ee67cbf 100644 (file)
 #include <ecoli_malloc.h>
 #include <ecoli_strvec.h>
 #include <ecoli_test.h>
+#include <ecoli_node.h>
+#include <ecoli_parsed.h>
 #include <ecoli_node_int.h>
 #include <ecoli_node_str.h>
 #include <ecoli_node_re_lex.h>
 #include <ecoli_node_expr.h>
 
+EC_LOG_TYPE_REGISTER(node_expr);
+
 struct my_eval_result {
        int val;
 };
@@ -47,7 +51,9 @@ ec_node_expr_test_eval_var(void **result, void *userctx,
        const struct ec_parsed *var)
 {
        const struct ec_strvec *vec;
-       struct my_eval_result *eval;
+       const struct ec_node *node;
+       struct my_eval_result *eval = NULL;
+       int64_t val;
 
        (void)userctx;
 
@@ -56,11 +62,15 @@ ec_node_expr_test_eval_var(void **result, void *userctx,
        if (ec_strvec_len(vec) != 1)
                return -EINVAL;
 
+       node = ec_parsed_get_node(var);
+       if (ec_node_int_getval(node, ec_strvec_val(vec, 0), &val) < 0)
+               return -EINVAL;
+
        eval = ec_malloc(sizeof(*eval));
        if (eval == NULL)
                return -ENOMEM;
 
-       eval->val = atoi(ec_strvec_val(vec, 0)); // XXX use strtol
+       eval->val = val;
        printf("eval var %d\n", eval->val);
        *result = eval;
 
@@ -188,8 +198,6 @@ static int ec_node_expr_test_eval(struct ec_node *lex_node,
        struct my_eval_result *eval;
        int ret;
 
-       /* XXX check node type (again and again) */
-
        p = ec_node_parse(lex_node, str);
        if (p == NULL)
                return -1;
@@ -214,22 +222,23 @@ static int ec_node_expr_test_eval(struct ec_node *lex_node,
        return ret;
 }
 
+/* LCOV_EXCL_START */
 static int ec_node_expr_testcase(void)
 {
        struct ec_node *node = NULL, *lex_node = NULL;
        int ret = 0;
 
-       node = ec_node_new("expr", "my_expr");
+       node = ec_node("expr", "my_expr");
        if (node == NULL)
                return -1;
 
-       ec_node_expr_set_val_node(node, ec_node_int(NULL, 0, UCHAR_MAX, 0));
-       ec_node_expr_add_bin_op(node, ec_node_str(NULL, "+"));
-       ec_node_expr_add_bin_op(node, ec_node_str(NULL, "*"));
-       ec_node_expr_add_pre_op(node, ec_node_str(NULL, "!"));  /* not */
-       ec_node_expr_add_post_op(node, ec_node_str(NULL, "^")); /* square */
-       ec_node_expr_add_parenthesis(node, ec_node_str(NULL, "("),
-               ec_node_str(NULL, ")"));
+       ec_node_expr_set_val_node(node, ec_node_int(EC_NO_ID, 0, UCHAR_MAX, 0));
+       ec_node_expr_add_bin_op(node, ec_node_str(EC_NO_ID, "+"));
+       ec_node_expr_add_bin_op(node, ec_node_str(EC_NO_ID, "*"));
+       ec_node_expr_add_pre_op(node, ec_node_str(EC_NO_ID, "!"));  /* not */
+       ec_node_expr_add_post_op(node, ec_node_str(EC_NO_ID, "^")); /* square */
+       ec_node_expr_add_parenthesis(node, ec_node_str(EC_NO_ID, "("),
+               ec_node_str(EC_NO_ID, ")"));
        ret |= EC_TEST_CHECK_PARSE(node, 1, "1");
        ret |= EC_TEST_CHECK_PARSE(node, 1, "1", "1");
        ret |= EC_TEST_CHECK_PARSE(node, 1, "1", "*");
@@ -245,7 +254,7 @@ static int ec_node_expr_testcase(void)
        ret |= EC_TEST_CHECK_PARSE(node, 5, "1", "+", "!", "1", "^");
 
        /* prepend a lexer to the expression node */
-       lex_node = ec_node_re_lex(NULL, ec_node_clone(node));
+       lex_node = ec_node_re_lex(EC_NO_ID, ec_node_clone(node));
        if (lex_node == NULL)
                goto fail;
 
@@ -280,6 +289,7 @@ static int ec_node_expr_testcase(void)
        ret |= ec_node_expr_test_eval(lex_node, node, "!0", 1);
 
        ret |= ec_node_expr_test_eval(lex_node, node, "1+1", 2);
+       ret |= ec_node_expr_test_eval(lex_node, node, "1+2+3", 6);
        ret |= ec_node_expr_test_eval(lex_node, node, "1+1*2", 4);
        ret |= ec_node_expr_test_eval(lex_node, node, "2 * 2^", 8);
        ret |= ec_node_expr_test_eval(lex_node, node, "(1 + !0)^ * !0^", 4);
@@ -295,6 +305,7 @@ fail:
        ec_node_free(node);
        return -1;
 }
+/* LCOV_EXCL_STOP */
 
 static struct ec_test ec_node_expr_test = {
        .name = "expr",