test/database.c

changeset 39
cefc18b7a9d1
parent 37
81dfb9a43a38
equal deleted inserted replaced
38:27fadadaae31 39:cefc18b7a9d1
141 dbuClassAdd(address, Address, zip); 141 dbuClassAdd(address, Address, zip);
142 dbuClassAdd(address, Address, city); 142 dbuClassAdd(address, Address, city);
143 dbuClassAddObj(address, "country_id", offsetof(Address, country), country); 143 dbuClassAddObj(address, "country_id", offsetof(Address, country), country);
144 144
145 role = dbuRegisterClass(ctx, "role", Role, role_id); 145 role = dbuRegisterClass(ctx, "role", Role, role_id);
146 dbuClassAdd(role, Role, person_id);
147 dbuClassAdd(role, Role, name);
146 148
147 person = dbuRegisterClass(ctx, "person", Person, person_id); 149 person = dbuRegisterClass(ctx, "person", Person, person_id);
148 dbuClassAdd(person, Person, name); 150 dbuClassAdd(person, Person, name);
149 dbuClassAdd(person, Person, email); 151 dbuClassAdd(person, Person, email);
150 dbuClassAdd(person, Person, age); 152 dbuClassAdd(person, Person, age);
270 } 272 }
271 273
272 cxMempoolFree(mp); 274 cxMempoolFree(mp);
273 } 275 }
274 276
275 CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons) { 277 CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons, bool verify_address) {
276 CX_TEST_ASSERT(persons); 278 CX_TEST_ASSERT(persons);
277 CX_TEST_ASSERT(cxListSize(persons) == 2); 279 CX_TEST_ASSERT(cxListSize(persons) == 2);
278 280
279 Person *p0 = cxListAt(persons, 0); 281 Person *p0 = cxListAt(persons, 0);
280 Person *p1 = cxListAt(persons, 1); 282 Person *p1 = cxListAt(persons, 1);
289 CX_TEST_ASSERT(p1->age == 25); 291 CX_TEST_ASSERT(p1->age == 25);
290 CX_TEST_ASSERT(p0->iscustomer == 0); 292 CX_TEST_ASSERT(p0->iscustomer == 0);
291 CX_TEST_ASSERT(p1->iscustomer == 1); 293 CX_TEST_ASSERT(p1->iscustomer == 1);
292 CX_TEST_ASSERT(p0->hash == 123456789); 294 CX_TEST_ASSERT(p0->hash == 123456789);
293 CX_TEST_ASSERT(p1->hash == 987654321); 295 CX_TEST_ASSERT(p1->hash == 987654321);
294 296
295 CX_TEST_ASSERT(p0->address != NULL); 297 if(verify_address) {
296 CX_TEST_ASSERT(p1->address != NULL); 298 CX_TEST_ASSERT(p0->address != NULL);
297 299 CX_TEST_ASSERT(p1->address != NULL);
298 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); 300
299 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); 301 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
300 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); 302 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
301 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); 303 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
302 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); 304 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
303 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); 305 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
306 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
307 }
304 } 308 }
305 309
306 CX_TEST(testMultiTableQuery) { 310 CX_TEST(testMultiTableQuery) {
307 CxMempool *mp = cxMempoolCreateSimple(64); 311 CxMempool *mp = cxMempoolCreateSimple(64);
308 312
310 const char *sql1 = "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;"; 314 const char *sql1 = "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;";
311 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); 315 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
312 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 316 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
313 CxList *persons = dbuObjectBuilderGetList(builder); 317 CxList *persons = dbuObjectBuilderGetList(builder);
314 318
315 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); 319 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true);
316 320
317 dbuObjectBuilderDestroy(builder); 321 dbuObjectBuilderDestroy(builder);
318 } 322 }
319 323
320 cxMempoolFree(mp); 324 cxMempoolFree(mp);
327 const char *sql1 = "select p.*, NULL as [__address], a.* from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;"; 331 const char *sql1 = "select p.*, NULL as [__address], a.* from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;";
328 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); 332 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
329 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 333 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
330 CxList *persons = dbuObjectBuilderGetList(builder); 334 CxList *persons = dbuObjectBuilderGetList(builder);
331 335
332 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); 336 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true);
333 337
334 dbuObjectBuilderDestroy(builder); 338 dbuObjectBuilderDestroy(builder);
335 } 339 }
336 340
337 cxMempoolFree(mp); 341 cxMempoolFree(mp);
359 "order by p.person_id;"; 363 "order by p.person_id;";
360 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); 364 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2);
361 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 365 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
362 CxList *persons = dbuObjectBuilderGetList(builder); 366 CxList *persons = dbuObjectBuilderGetList(builder);
363 367
364 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); 368 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true);
365 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); 369 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons);
366 370
367 dbuObjectBuilderDestroy(builder); 371 dbuObjectBuilderDestroy(builder);
368 } 372 }
369 373
382 "order by p.person_id;"; 386 "order by p.person_id;";
383 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); 387 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2);
384 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 388 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
385 CxList *persons = dbuObjectBuilderGetList(builder); 389 CxList *persons = dbuObjectBuilderGetList(builder);
386 390
387 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); 391 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true);
388 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); 392 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons);
389 393
390 dbuObjectBuilderDestroy(builder); 394 dbuObjectBuilderDestroy(builder);
391 } 395 }
392 396
393 cxMempoolFree(mp); 397 cxMempoolFree(mp);
394 } 398 }
399
400 CX_TEST_SUBROUTINE(verifyPersonRoles, CxList *persons) {
401 Person *p0 = cxListAt(persons, 0);
402 Person *p1 = cxListAt(persons, 1);
403 CX_TEST_ASSERT(p0 && p1);
404
405 CX_TEST_ASSERT(cxListSize(p0->roles) == 3);
406 CX_TEST_ASSERT(cxListSize(p1->roles) == 1);
407
408 Role *r0 = cxListAt(p0->roles, 0);
409 Role *r1 = cxListAt(p0->roles, 1);
410 Role *r2 = cxListAt(p0->roles, 2);
411
412 Role *p1_r0 = cxListAt(p1->roles, 0);
413
414 CX_TEST_ASSERT(!cx_strcmp(r0->name, "finance"));
415 CX_TEST_ASSERT(!cx_strcmp(r1->name, "dev"));
416 CX_TEST_ASSERT(!cx_strcmp(r2->name, "manager"));
417
418 CX_TEST_ASSERT(!cx_strcmp(p1_r0->name, "extern"));
419 }
420
421 CX_TEST(testQuerySubListDense1) {
422 CxMempool *mp = cxMempoolCreateSimple(64);
423
424 CX_TEST_DO {
425 const char *sql1 =
426 "select p.*, r.role_id as [__role__role_id], r.person_id, r.name from Person p inner join Role r on p.person_id = r.person_id order by p.person_id;";
427 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
428 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
429 dbuObjectBuilderSetDenseResult(builder, true);
430 CxList *persons = dbuObjectBuilderGetList(builder);
431
432 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, false);
433 CX_TEST_CALL_SUBROUTINE(verifyPersonRoles, persons);
434
435 dbuObjectBuilderDestroy(builder);
436 }
437
438 cxMempoolFree(mp);
439 }

mercurial