Mercurial > lbo > hg > ylisp
changeset 131:0af2b62f49d2
preprocess: Add test
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sun, 01 Sep 2019 19:24:03 +0200 |
parents | 75ed83d94261 |
children | bad34d9a4443 |
files | src/preprocess_test.c |
diffstat | 1 files changed, 57 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/preprocess_test.c Sun Sep 01 19:24:03 2019 +0200 @@ -0,0 +1,57 @@ +#include "preprocess.h" + +#include "eval.h" +#include "expr.h" +#include "parse.h" +#include "value.h" + +#include <stdio.h> + +// The very first successfully executable program! +void test_preprocess_defn(void) { + fprintf(stderr, "test_preprocess_defn ===========\n"); + + // my-func adds the two arguments plus 42. + ystr_t input = ystr_new( + "(defn my-func (arg1 arg2) (+ arg1 arg2) (undef) (+ arg1 arg2 41))" + "(my-func 42 (my-func 43 (my-func 44 0)))"); // (((44 + 0 + 41) + 43 + + // 41) + 42 + 41) == 252 + yexpr_t program = yexpr_new(); + ystr_t error = ystr_new(NULL); + assert(yparse_str(&input, &program, &error)); + + ypreprocess_resolve_builtins(&program); + yexpr_debug(&program); + ypreprocess_defn(&program); + yexpr_debug(&program); + + yvalue_t* func = yvalue_get(yref_new_c("my-func")); + assert(func != NULL); + fprintf(stderr, "arg ref 0: %lu\n", + YVEC_AT(&func->value.func.args, 0, yarg_desc_t)->argref.ref.id); + fprintf(stderr, "arg ref 1: %lu\n", + YVEC_AT(&func->value.func.args, 1, yarg_desc_t)->argref.ref.id); + fprintf( + stderr, "arg name 0: %s\n", + ystr_str(&YVEC_AT(&func->value.func.args, 0, yarg_desc_t)->argname)); + fprintf( + stderr, "arg name 1: %s\n", + ystr_str(&YVEC_AT(&func->value.func.args, 1, yarg_desc_t)->argname)); + + yeval_state_t state; + state.call_stack = YVEC_NEW(NULL, 0, yexpr_t); + yexpr_t result = yeval_list_return_last(&state, &program.value.list, 0); + assert(result.typ == YEXPR_NUMBER); + yexpr_debug(&result); + + ystr_destroy(&input); + yexpr_destroy(&program); + yvec_destroy(&state.call_stack); + yexpr_destroy(&result); +} + +int main(void) { + test_preprocess_defn(); + yvalue_free_all(); + return 0; +}