changeset 90:340408c24a6e

built-ins: Test let built-in by parsing program instead of manually constructing it
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 26 Aug 2019 14:57:02 +0200
parents 50cbad7d31da
children 046d0c66e3bb
files src/CMakeLists.txt src/built-ins_test.c
diffstat 2 files changed, 35 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/CMakeLists.txt	Mon Aug 26 14:56:17 2019 +0200
+++ b/src/CMakeLists.txt	Mon Aug 26 14:57:02 2019 +0200
@@ -34,7 +34,7 @@
 
 # Built-in test.
 ADD_EXECUTABLE(builtin_test built-ins_test.c)
-TARGET_LINK_LIBRARIES(builtin_test core)
+TARGET_LINK_LIBRARIES(builtin_test core frontend)
 YADD_TEST(builtin_test)
 
 # Expr test.
--- a/src/built-ins_test.c	Mon Aug 26 14:56:17 2019 +0200
+++ b/src/built-ins_test.c	Mon Aug 26 14:57:02 2019 +0200
@@ -1,6 +1,7 @@
 #include "built-ins.h"
 
 #include <src/atom.h>
+#include <src/parse.h>
 #include <src/value.h>
 
 void test_builtin_let(void) {
@@ -55,6 +56,7 @@
     result = ybuiltin_run(YBUILTIN_LET, &state);
     assert(result.typ == YEXPR_EXCEPTION);
     fputs(ystr_str(&result.value.str), stderr);
+    fputs("\n", stderr);
     assert(0 ==
            ystr_cmp_str(
                &result.value.str,
@@ -67,7 +69,39 @@
     yvec_destroy(stack);
 };
 
+void test_builtin_let_parsed(void) {
+    ystr_t input = ystr_new("(let my-var (1 2 3))"), error = ystr_new(NULL);
+    yexpr_t program, *let_expr;
+    assert(yparse_str(&input, &program, &error));
+    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;
+    YVEC_INIT(&state.call_stack, 4, yexpr_t);
+    YVEC_PUSH(&state.call_stack, let_expr);
+    yexpr_t result = ybuiltin_run(YBUILTIN_LET, &state);
+    assert(result.typ == YEXPR_UNDEF);
+    assert(state.call_stack.len == 0);
+
+    // Retrieve stored value.
+    yref_t my_var_ref = yref_new_c("my-var");
+    yvalue_t* stored = yvalue_get(my_var_ref);
+    assert(stored->typ == YVALUE_EXPR);
+    assert(stored->value.expr.typ == YEXPR_LIST);
+    assert(stored->value.expr.value.list.len == 3);
+    assert(YVEC_AT(&stored->value.expr.value.list, 1, yexpr_t)->value.n == 2);
+
+    yexpr_destroy(&result);
+    yref_destroy(&my_var_ref);
+    yvec_destroy(&state.call_stack);
+    ystr_destroy(&input);
+    ystr_destroy(&error);
+}
+
 int main(void) {
     test_builtin_let();
+    test_builtin_let_parsed();
     return 0;
 }