changeset 106:81aabf072d16

built-ins: Test `for` and `plus`
author Lewin Bormann <lbo@spheniscida.de>
date Wed, 28 Aug 2019 12:39:39 +0200
parents c8984769f2ac
children 1b3e8cf29e1e
files src/built-ins_test.c
diffstat 1 files changed, 52 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/built-ins_test.c	Wed Aug 28 12:39:23 2019 +0200
+++ b/src/built-ins_test.c	Wed Aug 28 12:39:39 2019 +0200
@@ -5,6 +5,8 @@
 #include <src/value.h>
 
 void test_builtin_translate(void) {
+    fprintf(stderr, "test_builtin_translate ============\n");
+
     yexpr_t expr = yexpr_new();
 
     yexpr_set_atom(&expr, yatom_get_or_add("atom"));
@@ -27,7 +29,10 @@
 }
 
 void test_builtin_for(void) {
-    ystr_t input = ystr_new("(for loopvar (1 2 3) loopvar)"), error = ystr_new(NULL);
+    fprintf(stderr, "test_builtin_for ============\n");
+
+    ystr_t input = ystr_new("(for loopvar (1 2 3) loopvar)"),
+           error = ystr_new(NULL);
     yexpr_t program = yexpr_new();
     assert(yparse_str(&input, &program, &error));
     yexpr_t* for_expr = YVEC_AT(&program.value.list, 0, yexpr_t);
@@ -35,36 +40,75 @@
 
     assert(ybuiltin_translate(YVEC_AT(&for_expr->value.list, 0, yexpr_t)));
 
-    yeval_state_t state = { .call_stack = YVEC_NEW(NULL, 0, yexpr_t) };
+    yeval_state_t state = {.call_stack = YVEC_NEW(NULL, 0, yexpr_t)};
     YVEC_PUSH(&state.call_stack, for_expr);
 
     yexpr_t result = ybuiltin_run(YBUILTIN_FOR, &state);
     assert(result.typ == YEXPR_LIST);
 
+    yexpr_debug(&result);
+
     yvec_destroy(&state.call_stack);
     yexpr_destroy(&program);
+    yexpr_destroy(&result);
     ystr_destroy(&input);
 }
 
 void test_builtin_for_complex(void) {
-    ystr_t input = ystr_new("(for loopvar (1 2 3) (+ loopvar 1))"), error = ystr_new(NULL);
+    fprintf(stderr, "test_builtin_for_complex ============\n");
+
+    ystr_t input = ystr_new("(for loopvar (1 2 3) (+ loopvar 1 2))"),
+           error = ystr_new(NULL);
     yexpr_t program = yexpr_new();
     assert(yparse_str(&input, &program, &error));
     yexpr_t* for_expr = YVEC_AT(&program.value.list, 0, yexpr_t);
     assert(for_expr->typ == YEXPR_LIST);
 
     assert(ybuiltin_translate(YVEC_AT(&for_expr->value.list, 0, yexpr_t)));
-    assert(ybuiltin_translate(YVEC_AT(&YVEC_AT(&for_expr->value.list, 3, yexpr_t)->value.list, 0, yexpr_t)));
+    assert(ybuiltin_translate(YVEC_AT(
+        &YVEC_AT(&for_expr->value.list, 3, yexpr_t)->value.list, 0, yexpr_t)));
     yexpr_debug(for_expr);
 
-    yeval_state_t state = { .call_stack = YVEC_NEW(NULL, 0, yexpr_t) };
+    yeval_state_t state = {.call_stack = YVEC_NEW(NULL, 0, yexpr_t)};
     YVEC_PUSH(&state.call_stack, for_expr);
 
     yexpr_t result = ybuiltin_run(YBUILTIN_FOR, &state);
     assert(result.typ == YEXPR_LIST);
 
+    // (1 2 3) should each be increased by 3.
     yexpr_debug(&result);
-    fputs("\n", stderr);
+    assert(4 == YVEC_AT(&result.value.list, 0, yexpr_t)->value.n);
+
+    yvec_destroy(&state.call_stack);
+    yexpr_destroy(&program);
+    yexpr_destroy(&result);
+    ystr_destroy(&input);
+}
+
+void test_builtin_for_noresult(void) {
+    fprintf(stderr, "test_builtin_for_complex ============\n");
+
+    ystr_t input = ystr_new("(for loopvar (1 2 3) (+ loopvar 1 2))"),
+           error = ystr_new(NULL);
+    yexpr_t program = yexpr_new();
+    assert(yparse_str(&input, &program, &error));
+    yexpr_t* for_expr = YVEC_AT(&program.value.list, 0, yexpr_t);
+    assert(for_expr->typ == YEXPR_LIST);
+
+    assert(ybuiltin_translate(YVEC_AT(&for_expr->value.list, 0, yexpr_t)));
+    assert(ybuiltin_translate(YVEC_AT(
+        &YVEC_AT(&for_expr->value.list, 3, yexpr_t)->value.list, 0, yexpr_t)));
+    yexpr_debug(for_expr);
+
+    yeval_state_t state = {.call_stack = YVEC_NEW(NULL, 0, yexpr_t)};
+    YVEC_PUSH(&state.call_stack, for_expr);
+
+    yexpr_t result = ybuiltin_run(YBUILTIN_FOR, &state);
+    assert(result.typ == YEXPR_LIST);
+
+    // (1 2 3) should each be increased by 3.
+    yexpr_debug(&result);
+    assert(4 == YVEC_AT(&result.value.list, 0, yexpr_t)->value.n);
 
     yvec_destroy(&state.call_stack);
     yexpr_destroy(&program);
@@ -72,6 +116,8 @@
 }
 
 void test_builtin_let(void) {
+    fprintf(stderr, "test_builtin_let ============\n");
+
     yexpr_t ref_expr = yexpr_new();
     yexpr_t let_expr = yexpr_new();
     yref_t ref = yref_new();
@@ -100,7 +146,6 @@
 
     yexpr_t result = ybuiltin_run(YBUILTIN_LET, &state);
     yexpr_debug(&result);
-    fputs("\n", stderr);
     assert(result.typ == YEXPR_UNDEF);
     assert(stack->len == 0);
 
@@ -114,7 +159,6 @@
     YVEC_PUSH(stack, &let_call);
     result = ybuiltin_run(YBUILTIN_LET, &state);
     yexpr_debug(&result);
-    fputs("\n", stderr);
     assert(result.typ == YEXPR_EXCEPTION);
     assert(stack->len == 0);
     yexpr_destroy(&result);