changeset 112:1af6d03bdc82

built-ins: Test evaluation of "data list", references, let
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 29 Aug 2019 22:27:46 +0200
parents 20559e59878f
children 41dea7ad4ff7
files src/built-ins_test.c
diffstat 1 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/built-ins_test.c	Thu Aug 29 22:27:24 2019 +0200
+++ b/src/built-ins_test.c	Thu Aug 29 22:27:46 2019 +0200
@@ -212,6 +212,38 @@
     ystr_destroy(&error);
 }
 
+void test_builtin_let_recall(void) {
+    fprintf(stderr, "test_builtin_let_recall ============\n");
+
+    ystr_t input = ystr_new(
+            "(let my-var (1 2 3))"
+            "(my-var)");
+    ystr_t error = ystr_new(NULL);
+    yexpr_t program = yexpr_new(), *let_expr;
+    assert(yparse_str(&input, &program, &error));
+    assert(YEXPR_LIST == program.typ && 2 == program.value.list.len);
+
+    let_expr = YVEC_AT(&program.value.list, 0, yexpr_t);
+    // Replace id:<"let"> with builtin.
+    yexpr_set_builtin(YVEC_AT(&let_expr->value.list, 0, yexpr_t), YBUILTIN_LET);
+
+    yeval_state_t state = { .call_stack = YVEC_NEW(NULL, 0, yexpr_t) };
+    // Evaluate whole program
+    yexpr_t result = yeval_list_return_last(&state, &program.value.list, 0);
+
+    // Check that result is ((1 2 3))
+    assert(YEXPR_LIST == result.typ && 1 == result.value.list.len);
+    yexpr_t* inner = YVEC_AT(&result.value.list, 0, yexpr_t);
+    assert(YEXPR_LIST == inner->typ);
+    assert(3 == YVEC_AT(&inner->value.list, 2, yexpr_t)->value.n);
+
+    yvec_destroy(&state.call_stack);
+    yexpr_destroy(&result);
+    ystr_destroy(&error);
+    ystr_destroy(&input);
+    yexpr_destroy(&program);
+}
+
 int main(void) {
     test_builtin_translate();
     test_builtin_for();
@@ -219,6 +251,7 @@
     test_builtin_for_noresult();
     test_builtin_let();
     test_builtin_let_parsed();
+    test_builtin_let_recall();
     yvalue_free_all();
     return 0;
 }