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(&copy.value.ref.ref.sym, 0));
+
+    yexpr_destroy(&expr);
+    yexpr_destroy(&copy);
+
+    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(&copy.value.list, 0, yexpr_t)->value.n);
+
+    yexpr_destroy(&expr);
+    yexpr_destroy(&copy);
+}
+
 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;
 }