Mercurial > lbo > hg > ylisp
changeset 93:aadc11bdfdc4
expr: Add test for yexpr_copy and clone references, not underlying values
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 26 Aug 2019 16:59:28 +0200 |
parents | 7e376bff2e91 |
children | d6afe40a6784 |
files | src/expr.c src/expr_test.c |
diffstat | 2 files changed, 34 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/expr.c Mon Aug 26 16:58:20 2019 +0200 +++ b/src/expr.c Mon Aug 26 16:59:28 2019 +0200 @@ -72,7 +72,7 @@ case YEXPR_REF: // TODO: maybe reference-count the references? copy = *orig; - copy.value.ref = yvalue_clone(&orig->value.ref); + copy.value.ref = yref_clone(&orig->value.ref); break; case YEXPR_LIST: // Recursively copy list...
--- a/src/expr_test.c Mon Aug 26 16:58:20 2019 +0200 +++ b/src/expr_test.c Mon Aug 26 16:59:28 2019 +0200 @@ -11,7 +11,12 @@ ref = yref_new_str(&str); assert(YREF_SYM == yref_type(&ref)); - yref_destroy(&ref); + + yexpr_t exprref = yexpr_new(); + yexpr_set_ref(&exprref, ref); + assert(YEXPR_REF == exprref.typ); + + yexpr_destroy(&exprref); ystr_t str2 = ystr_new("abc"); ref = yref_new_id(yvalue_resolve_or_create_symbol(&str2)); @@ -24,6 +29,32 @@ assert(ref.ref.id == ref0.ref.id+1); } +void test_expr_copy(void) { + yexpr_t expr = yexpr_new(); + yref_t ref = yref_new_c("a long external reference name"); + + yexpr_set_ref(&expr, ref); + yexpr_t copy = yexpr_copy(&expr); + assert(ystr_at(&expr.value.ref.ref.sym, 0) != ystr_at(©.value.ref.ref.sym, 0)); + + yexpr_destroy(&expr); + yexpr_destroy(©); + + yexpr_t ilist[] = {yexpr_new(), yexpr_new(), yexpr_new()}; + yexpr_set_number(&ilist[0], 22); + yexpr_set_number(&ilist[1], 23); + yexpr_set_number(&ilist[2], 24); + yvec_t vec = YVEC_NEW(ilist, 4, yexpr_t); + yexpr_set_list(&expr, vec); + copy = yexpr_copy(&expr); + (*YVEC_AT(&vec, 0, int))++; + assert(23 == YVEC_AT(&expr.value.list, 0, yexpr_t)->value.n); + assert(22 == YVEC_AT(©.value.list, 0, yexpr_t)->value.n); + + yexpr_destroy(&expr); + yexpr_destroy(©); +} + void test_expr_set(void) { yexpr_t expr = yexpr_new(); @@ -129,6 +160,7 @@ int main(void) { test_expr_ref_type(); + test_expr_copy(); test_expr_set(); return 0; }