--- 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); + } +}