diff options
-rw-r--r-- | src/template.c | 27 | ||||
-rw-r--r-- | tests/test_template.c | 32 |
2 files changed, 53 insertions, 6 deletions
diff --git a/src/template.c b/src/template.c index 9e739bc..a1439c4 100644 --- a/src/template.c +++ b/src/template.c @@ -100,7 +100,7 @@ mpc_parser_t *parser_init() { " | <lexp> <spaces> \"!=\" <spaces> <lexp> " " | <lexp> <spaces> \"==\" <spaces> <lexp> " " | <lexp> ;" - " print : /{{2}-? */ <lexp> / *-?}}/ ;" + " print : /{{2}-? */ <expression> / *-?}}/ ;" " comment : \"{#\" /[^#][^#}]*/ \"#}\" ;" " statement_open: /{\%-? */;" " statement_close: / *-?\%}/;" @@ -366,13 +366,28 @@ struct unja_object *eval_expression_value(mpc_ast_t* node, struct context *ctx) return &null_object; } +struct unja_object *eval_string_infix_expression(struct unja_object *left, char *op, struct unja_object *right) { + struct unja_object *result; + + if (strcmp(op, "+") == 0) { + result = make_string_object(left->string, right->string); + } else if (strcmp(op, "==") == 0) { + result = make_int_object(strcmp(left->string, right->string) == 0); + } else if(strcmp(op, "!=") == 0) { + result = make_int_object(strcmp(left->string, right->string) != 0); + } else { + errx(EXIT_FAILURE, "invalid string operator: %s", op); + } + + object_free(left); + object_free(right); + return result; +} + struct unja_object *eval_infix_expression(struct unja_object *left, char *op, struct unja_object *right) { /* if operator is + and either left or right node is of type string: concat */ - if (op[0] == '+' && (left->type == OBJ_STRING && right->type == OBJ_STRING)) { - struct unja_object *result = make_string_object(left->string, right->string); - object_free(left); - object_free(right); - return result; + if (left->type == OBJ_STRING && right->type == OBJ_STRING) { + return eval_string_infix_expression(left, op, right); } int result; diff --git a/tests/test_template.c b/tests/test_template.c index 039e993..d94ddd6 100644 --- a/tests/test_template.c +++ b/tests/test_template.c @@ -309,6 +309,22 @@ TEST(expr_eq) { } } +TEST(expr_string_eq) { + struct { + char *input; + char *expected_output; + } tests[] = { + {"{% if \"foo\" == \"bar\" %}1{% endif %}", ""}, + {"{% if \"foo\" == \"foo\" %}1{% endif %}", "1"}, + }; + + for (int i=0; i < ARRAY_SIZE(tests); i++) { + char *output = template_string(tests[i].input, NULL); + assert_str(output, tests[i].expected_output); + free(output); + } +} + TEST(expr_not_eq) { struct { char *input; @@ -325,6 +341,22 @@ TEST(expr_not_eq) { } } +TEST(expr_string_not_eq) { + struct { + char *input; + char *expected_output; + } tests[] = { + {"{% if \"foo\" != \"bar\" %}1{% endif %}", "1"}, + {"{% if \"foo\" != \"foo\" %}1{% endif %}", ""}, + }; + + for (int i=0; i < ARRAY_SIZE(tests); i++) { + char *output = template_string(tests[i].input, NULL); + assert_str(output, tests[i].expected_output); + free(output); + } +} + TEST(if_block_whitespace) { char *input = "\n{%- if 10 > 5 -%}\nOK\n{%- endif -%}\n"; char *output = template_string(input, NULL); |