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