| 46 bool bt; |
46 bool bt; |
| 47 bool bf; |
47 bool bf; |
| 48 double d; |
48 double d; |
| 49 } Test1; |
49 } Test1; |
| 50 |
50 |
| |
51 typedef struct Test2 { |
| |
52 char *name; |
| |
53 int i; |
| |
54 } Test2; |
| |
55 |
| |
56 typedef struct Test3 { |
| |
57 char *test3; |
| |
58 Test2 *test2; |
| |
59 } Test3; |
| |
60 |
| |
61 typedef struct Test4 { |
| |
62 int id; |
| |
63 Test3 *test3; |
| |
64 Test2 *test2; |
| |
65 } Test4; |
| |
66 |
| 51 static DBUContext *ctx; |
67 static DBUContext *ctx; |
| 52 static DBUClass *test1_class; |
68 static DBUClass *test1_class; |
| |
69 static DBUClass *test2_class; |
| |
70 static DBUClass *test3_class; |
| |
71 static DBUClass *test4_class; |
| 53 |
72 |
| 54 int init_json_tests(void) { |
73 int init_json_tests(void) { |
| 55 ctx = dbuContextCreate(); |
74 ctx = dbuContextCreate(); |
| 56 |
75 |
| 57 test1_class = dbuRegisterClassWithoutPK(ctx, "test1", sizeof(Test1)); |
76 test1_class = dbuRegisterClassWithoutPK(ctx, "test1", sizeof(Test1)); |
| 66 dbuClassAdd(test1_class, Test1, i64); |
85 dbuClassAdd(test1_class, Test1, i64); |
| 67 dbuClassAdd(test1_class, Test1, u64); |
86 dbuClassAdd(test1_class, Test1, u64); |
| 68 dbuClassAdd(test1_class, Test1, bt); |
87 dbuClassAdd(test1_class, Test1, bt); |
| 69 dbuClassAdd(test1_class, Test1, bf); |
88 dbuClassAdd(test1_class, Test1, bf); |
| 70 dbuClassAdd(test1_class, Test1, d); |
89 dbuClassAdd(test1_class, Test1, d); |
| |
90 |
| |
91 test2_class = dbuRegisterClassWithoutPK(ctx, "test2", sizeof(Test2)); |
| |
92 dbuClassAdd(test2_class, Test2, name); |
| |
93 dbuClassAdd(test2_class, Test2, i); |
| |
94 |
| |
95 test3_class = dbuRegisterClassWithoutPK(ctx, "test3", sizeof(Test3)); |
| |
96 dbuClassAdd(test3_class, Test3, test3); |
| |
97 dbuClassAddObj(test3_class, "test2", offsetof(Test3, test2), test2_class); |
| |
98 |
| |
99 test4_class = dbuRegisterClassWithoutPK(ctx, "test4", sizeof(Test4)); |
| |
100 dbuClassAdd(test4_class, Test4, id); |
| |
101 dbuClassAddObj(test4_class, "test2", offsetof(Test4, test2), test2_class); |
| |
102 dbuClassAddObj(test4_class, "test3", offsetof(Test4, test3), test3_class); |
| 71 } |
103 } |
| 72 |
104 |
| 73 void cleanup_json_tests(void) { |
105 void cleanup_json_tests(void) { |
| 74 dbuContextFree(ctx); |
106 dbuContextFree(ctx); |
| 75 } |
107 } |
| 92 |
124 |
| 93 CX_TEST_DO { |
125 CX_TEST_DO { |
| 94 CxJsonValue *value = dbuObjectToJson(test1_class, &test, NULL); |
126 CxJsonValue *value = dbuObjectToJson(test1_class, &test, NULL); |
| 95 |
127 |
| 96 CX_TEST_ASSERT(value); |
128 CX_TEST_ASSERT(value); |
| 97 CX_TEST_ASSERT(value->type == CX_JSON_OBJECT); |
129 CX_TEST_ASSERT(cxJsonIsObject(value)); |
| 98 |
130 |
| 99 CxJsonValue *str = cxJsonObjGet(value, "str"); |
131 CxJsonValue *str = cxJsonObjGet(value, "str"); |
| 100 CxJsonValue *str2 = cxJsonObjGet(value, "str2"); |
132 CxJsonValue *str2 = cxJsonObjGet(value, "str2"); |
| 101 CxJsonValue *i8 = cxJsonObjGet(value, "i8"); |
133 CxJsonValue *i8 = cxJsonObjGet(value, "i8"); |
| 102 CxJsonValue *u8 = cxJsonObjGet(value, "u8"); |
134 CxJsonValue *u8 = cxJsonObjGet(value, "u8"); |
| 131 CX_TEST_ASSERT(i32->value.integer == test.i32); |
163 CX_TEST_ASSERT(i32->value.integer == test.i32); |
| 132 CX_TEST_ASSERT(u32->value.integer == test.u32); |
164 CX_TEST_ASSERT(u32->value.integer == test.u32); |
| 133 CX_TEST_ASSERT(i64->value.integer == test.i64); |
165 CX_TEST_ASSERT(i64->value.integer == test.i64); |
| 134 CX_TEST_ASSERT(u64->value.integer == test.u64); |
166 CX_TEST_ASSERT(u64->value.integer == test.u64); |
| 135 CX_TEST_ASSERT(d->value.number < test.d + 0.1 && d->value.number > test.d - 0.1); |
167 CX_TEST_ASSERT(d->value.number < test.d + 0.1 && d->value.number > test.d - 0.1); |
| |
168 |
| |
169 cxJsonValueFree(value); |
| 136 } |
170 } |
| 137 } |
171 } |
| 138 |
172 |
| |
173 CX_TEST(testObjectToJsonChildObj) { |
| |
174 Test2 t2_1; |
| |
175 t2_1.i = 12; |
| |
176 t2_1.name = "t2_1"; |
| |
177 |
| |
178 Test2 t2_2; |
| |
179 t2_2.i = 45; |
| |
180 t2_2.name = "t2_2"; |
| |
181 |
| |
182 Test3 t3; |
| |
183 t3.test3 = "t3"; |
| |
184 t3.test2 = &t2_1; |
| |
185 |
| |
186 Test4 t4; |
| |
187 t4.id = 15; |
| |
188 t4.test2 = &t2_2; |
| |
189 t4.test3 = &t3; |
| |
190 |
| |
191 CX_TEST_DO { |
| |
192 CxJsonValue *value = dbuObjectToJson(test4_class, &t4, NULL); |
| |
193 |
| |
194 CX_TEST_ASSERT(value); |
| |
195 CX_TEST_ASSERT(cxJsonIsObject(value)); |
| |
196 |
| |
197 CxJsonValue *v = cxJsonObjGet(value, "id"); |
| |
198 CX_TEST_ASSERT(v); |
| |
199 CX_TEST_ASSERT(cxJsonIsInteger(v)); |
| |
200 CX_TEST_ASSERT(v->value.integer == t4.id); |
| |
201 |
| |
202 v = cxJsonObjGet(value, "test2"); |
| |
203 CX_TEST_ASSERT(v); |
| |
204 CX_TEST_ASSERT(cxJsonIsObject(v)); |
| |
205 |
| |
206 CxJsonValue *s = cxJsonObjGet(v, "i"); |
| |
207 CX_TEST_ASSERT(s); |
| |
208 CX_TEST_ASSERT(cxJsonIsInteger(s)); |
| |
209 CX_TEST_ASSERT(s->value.integer == t2_2.i); |
| |
210 |
| |
211 s = cxJsonObjGet(v, "name"); |
| |
212 CX_TEST_ASSERT(s); |
| |
213 CX_TEST_ASSERT(cxJsonIsString(s)); |
| |
214 CX_TEST_ASSERT(!cx_strcmp(s->value.string, t2_2.name)); |
| |
215 |
| |
216 v = cxJsonObjGet(value, "test3"); |
| |
217 CX_TEST_ASSERT(v); |
| |
218 CX_TEST_ASSERT(cxJsonIsObject(v)); |
| |
219 |
| |
220 s = cxJsonObjGet(v, "test3"); |
| |
221 CX_TEST_ASSERT(s); |
| |
222 CX_TEST_ASSERT(cxJsonIsString(s)); |
| |
223 CX_TEST_ASSERT(!cx_strcmp(s->value.string, t3.test3)); |
| |
224 |
| |
225 s = cxJsonObjGet(v, "test2"); |
| |
226 CX_TEST_ASSERT(s); |
| |
227 CX_TEST_ASSERT(cxJsonIsObject(s)); |
| |
228 |
| |
229 CxJsonValue *x = cxJsonObjGet(s, "i"); |
| |
230 CX_TEST_ASSERT(x); |
| |
231 CX_TEST_ASSERT(cxJsonIsInteger(x)); |
| |
232 CX_TEST_ASSERT(x->value.integer == t2_1.i); |
| |
233 |
| |
234 x = cxJsonObjGet(s, "name"); |
| |
235 CX_TEST_ASSERT(x); |
| |
236 CX_TEST_ASSERT(cxJsonIsString(x)); |
| |
237 CX_TEST_ASSERT(!cx_strcmp(x->value.string, t2_1.name)); |
| |
238 |
| |
239 cxJsonValueFree(value); |
| |
240 } |
| |
241 } |