test/json.c

changeset 29
b8c826c720f3
parent 28
e46f9f254fcd
child 30
d33eaaec15da
--- a/test/json.c	Wed Dec 10 18:36:02 2025 +0100
+++ b/test/json.c	Thu Dec 11 22:58:02 2025 +0100
@@ -30,7 +30,7 @@
 
 #include <stdbool.h>
 #include <cx/buffer.h>
-
+#include <cx/linked_list.h>
 
 typedef struct Test1 {
     char *str;
@@ -64,11 +64,17 @@
     Test2 *test2;
 } Test4;
 
+typedef struct Test5 {
+    char *test;
+    CxList *test2List;
+} Test5;
+
 static DBUContext *ctx;
 static DBUClass *test1_class;
 static DBUClass *test2_class;
 static DBUClass *test3_class;
 static DBUClass *test4_class;
+static DBUClass *test5_class;
 
 int init_json_tests(void) {
     ctx = dbuContextCreate();
@@ -100,6 +106,10 @@
     dbuClassAdd(test4_class, Test4, id);
     dbuClassAddObj(test4_class, "test2", offsetof(Test4, test2), test2_class);
     dbuClassAddObj(test4_class, "test3", offsetof(Test4, test3), test3_class);
+    
+    test5_class = dbuRegisterClassWithoutPK(ctx, "test5", sizeof(Test5));
+    dbuClassAdd(test5_class, Test5, test);
+    dbuClassAddCxLinkedList(test5_class, "test2List", offsetof(Test5, test2List), test2_class);
 }
 
 void cleanup_json_tests(void) {
@@ -239,3 +249,69 @@
         cxJsonValueFree(value);
     }
 }
+
+CX_TEST(testObjectToJsonChildList) {
+    Test5 test5;
+    test5.test = "hello";
+    test5.test2List = cxLinkedListCreateSimple(CX_STORE_POINTERS);
+    
+    Test2 c1;
+    c1.i = 1;
+    c1.name = "c1";
+    
+    Test2 c2;
+    c2.i = 2;
+    c2.name = "c2";
+    
+    Test2 c3;
+    c3.i = 3;
+    c3.name = "c3";
+    
+    cxListAdd(test5.test2List, &c1);
+    cxListAdd(test5.test2List, &c2);
+    cxListAdd(test5.test2List, &c3);
+    
+    CX_TEST_DO {
+        CxJsonValue *value = dbuObjectToJson(test5_class, &test5, NULL);
+        CX_TEST_ASSERT(value);
+        CX_TEST_ASSERT(cxJsonIsObject(value));
+        
+        CxJsonValue *v = cxJsonObjGet(value, "test");
+        CX_TEST_ASSERT(v);
+        CX_TEST_ASSERT(cxJsonIsString(v));
+        CX_TEST_ASSERT(!cx_strcmp(v->value.string, test5.test));
+        
+        v = cxJsonObjGet(value, "test2List");
+        CX_TEST_ASSERT(v);
+        CX_TEST_ASSERT(cxJsonIsArray(v));
+        
+        CxJsonValue *x = cxJsonArrGet(v, 0);
+        CX_TEST_ASSERT(cxJsonIsObject(x));
+        CxJsonValue *z = cxJsonObjGet(x, "i");
+        CX_TEST_ASSERT(cxJsonIsInteger(z));
+        CX_TEST_ASSERT(z->value.integer == c1.i);
+        z = cxJsonObjGet(x, "name");
+        CX_TEST_ASSERT(cxJsonIsString(z));
+        CX_TEST_ASSERT(!cx_strcmp(z->value.string, c1.name));
+        
+        x = cxJsonArrGet(v, 1);
+        CX_TEST_ASSERT(cxJsonIsObject(x));
+        z = cxJsonObjGet(x, "i");
+        CX_TEST_ASSERT(cxJsonIsInteger(z));
+        CX_TEST_ASSERT(z->value.integer == c2.i);
+        z = cxJsonObjGet(x, "name");
+        CX_TEST_ASSERT(cxJsonIsString(z));
+        CX_TEST_ASSERT(!cx_strcmp(z->value.string, c2.name));
+        
+        x = cxJsonArrGet(v, 2);
+        CX_TEST_ASSERT(cxJsonIsObject(x));
+        z = cxJsonObjGet(x, "i");
+        CX_TEST_ASSERT(cxJsonIsInteger(z));
+        CX_TEST_ASSERT(z->value.integer == c3.i);
+        z = cxJsonObjGet(x, "name");
+        CX_TEST_ASSERT(cxJsonIsString(z));
+        CX_TEST_ASSERT(!cx_strcmp(z->value.string, c3.name));
+        
+        cxJsonValueFree(value);
+    }
+}

mercurial