Mercurial > lbo > hg > ylisp
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; }