test/database.c

changeset 37
81dfb9a43a38
parent 36
93753b036d9f
equal deleted inserted replaced
36:93753b036d9f 37:81dfb9a43a38
270 } 270 }
271 271
272 cxMempoolFree(mp); 272 cxMempoolFree(mp);
273 } 273 }
274 274
275 CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons) {
276 CX_TEST_ASSERT(persons);
277 CX_TEST_ASSERT(cxListSize(persons) == 2);
278
279 Person *p0 = cxListAt(persons, 0);
280 Person *p1 = cxListAt(persons, 1);
281
282 CX_TEST_ASSERT(p0);
283 CX_TEST_ASSERT(p1);
284 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice"));
285 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob"));
286 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com"));
287 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com"));
288 CX_TEST_ASSERT(p0->age == 30);
289 CX_TEST_ASSERT(p1->age == 25);
290 CX_TEST_ASSERT(p0->iscustomer == 0);
291 CX_TEST_ASSERT(p1->iscustomer == 1);
292 CX_TEST_ASSERT(p0->hash == 123456789);
293 CX_TEST_ASSERT(p1->hash == 987654321);
294
295 CX_TEST_ASSERT(p0->address != NULL);
296 CX_TEST_ASSERT(p1->address != NULL);
297
298 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
299 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
300 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
301 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
302 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
303 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
304 }
305
275 CX_TEST(testMultiTableQuery) { 306 CX_TEST(testMultiTableQuery) {
276 CxMempool *mp = cxMempoolCreateSimple(64); 307 CxMempool *mp = cxMempoolCreateSimple(64);
277 308
278 CX_TEST_DO { 309 CX_TEST_DO {
279 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;"; 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;";
280 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); 311 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
281 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 312 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
282 CxList *persons = dbuObjectBuilderGetList(builder); 313 CxList *persons = dbuObjectBuilderGetList(builder);
283 314
284 CX_TEST_ASSERT(persons); 315 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
285 CX_TEST_ASSERT(cxListSize(persons) == 2);
286
287 Person *p0 = cxListAt(persons, 0);
288 Person *p1 = cxListAt(persons, 1);
289 CX_TEST_ASSERT(p0);
290 CX_TEST_ASSERT(p1);
291 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice"));
292 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob"));
293 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com"));
294 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com"));
295 CX_TEST_ASSERT(p0->age == 30);
296 CX_TEST_ASSERT(p1->age == 25);
297 CX_TEST_ASSERT(p0->iscustomer == 0);
298 CX_TEST_ASSERT(p1->iscustomer == 1);
299 CX_TEST_ASSERT(p0->hash == 123456789);
300 CX_TEST_ASSERT(p1->hash == 987654321);
301
302 CX_TEST_ASSERT(p0->address != NULL);
303 CX_TEST_ASSERT(p1->address != NULL);
304
305 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
306 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
307 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
308 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
309 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
310 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
311 316
312 dbuObjectBuilderDestroy(builder); 317 dbuObjectBuilderDestroy(builder);
313 } 318 }
314 319
315 cxMempoolFree(mp); 320 cxMempoolFree(mp);
322 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;"; 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;";
323 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); 328 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
324 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 329 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
325 CxList *persons = dbuObjectBuilderGetList(builder); 330 CxList *persons = dbuObjectBuilderGetList(builder);
326 331
327 CX_TEST_ASSERT(persons); 332 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
328 CX_TEST_ASSERT(cxListSize(persons) == 2); 333
329 334 dbuObjectBuilderDestroy(builder);
330 Person *p0 = cxListAt(persons, 0); 335 }
331 Person *p1 = cxListAt(persons, 1); 336
332 CX_TEST_ASSERT(p0); 337 cxMempoolFree(mp);
333 CX_TEST_ASSERT(p1); 338 }
334 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice")); 339
335 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob")); 340 CX_TEST_SUBROUTINE(verifyMultiTableResultCountry, CxList *persons) {
336 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com")); 341 Person *p0 = cxListAt(persons, 0);
337 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com")); 342 Person *p1 = cxListAt(persons, 1);
338 CX_TEST_ASSERT(p0->age == 30); 343 CX_TEST_ASSERT(p0 && p1);
339 CX_TEST_ASSERT(p1->age == 25); 344
340 CX_TEST_ASSERT(p0->iscustomer == 0); 345 CX_TEST_ASSERT(p0->address->country);
341 CX_TEST_ASSERT(p1->iscustomer == 1); 346 CX_TEST_ASSERT(p1->address->country);
342 CX_TEST_ASSERT(p0->hash == 123456789); 347 CX_TEST_ASSERT(!cx_strcmp(p0->address->country->name, "Germany"));
343 CX_TEST_ASSERT(p1->hash == 987654321); 348 CX_TEST_ASSERT(!cx_strcmp(p1->address->country->name, "Germany"));
344
345 CX_TEST_ASSERT(p0->address != NULL);
346 CX_TEST_ASSERT(p1->address != NULL);
347
348 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
349 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
350 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
351 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
352 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
353 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
354
355 dbuObjectBuilderDestroy(builder);
356 }
357
358 cxMempoolFree(mp);
359 } 349 }
360 350
361 CX_TEST(testMultiTableQuery2) { 351 CX_TEST(testMultiTableQuery2) {
362 CxMempool *mp = cxMempoolCreateSimple(64); 352 CxMempool *mp = cxMempoolCreateSimple(64);
363 353
369 "order by p.person_id;"; 359 "order by p.person_id;";
370 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); 360 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2);
371 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); 361 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
372 CxList *persons = dbuObjectBuilderGetList(builder); 362 CxList *persons = dbuObjectBuilderGetList(builder);
373 363
374 CX_TEST_ASSERT(persons); 364 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
375 CX_TEST_ASSERT(cxListSize(persons) == 2); 365 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons);
376 366
377 Person *p0 = cxListAt(persons, 0); 367 dbuObjectBuilderDestroy(builder);
378 Person *p1 = cxListAt(persons, 1); 368 }
379 CX_TEST_ASSERT(p0); 369
380 CX_TEST_ASSERT(p1); 370 cxMempoolFree(mp);
381 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice")); 371 }
382 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob")); 372
383 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com")); 373 CX_TEST(testMultiTableQueryUnknownResult1) {
384 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com")); 374 CxMempool *mp = cxMempoolCreateSimple(64);
385 CX_TEST_ASSERT(p0->age == 30); 375
386 CX_TEST_ASSERT(p1->age == 25); 376 CX_TEST_DO {
387 CX_TEST_ASSERT(p0->iscustomer == 0); 377 const char *sql2 = "select p.*, 'unknown1' as unknown1, "
388 CX_TEST_ASSERT(p1->iscustomer == 1); 378 "a.address_id as [__address__address_id], a.street, 'unknown2' as unknown2, a.zip, 123 as unknown3, a.city, "
389 CX_TEST_ASSERT(p0->hash == 123456789); 379 "NULL as [__unknowntab], 456 as unknown_4, "
390 CX_TEST_ASSERT(p1->hash == 987654321); 380 "c.country_id as [__country__country_id], c.name "
391 381 "from Person p inner join Address a on p.address_id = a.address_id inner join Country c on a.country_id = c.country_id "
392 CX_TEST_ASSERT(p0->address != NULL); 382 "order by p.person_id;";
393 CX_TEST_ASSERT(p1->address != NULL); 383 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2);
394 384 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
395 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); 385 CxList *persons = dbuObjectBuilderGetList(builder);
396 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); 386
397 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); 387 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
398 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); 388 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons);
399 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); 389
400 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); 390 dbuObjectBuilderDestroy(builder);
401 391 }
402 CX_TEST_ASSERT(p0->address->country); 392
403 CX_TEST_ASSERT(p1->address->country); 393 cxMempoolFree(mp);
404 CX_TEST_ASSERT(!cx_strcmp(p0->address->country->name, "Germany")); 394 }
405 CX_TEST_ASSERT(!cx_strcmp(p1->address->country->name, "Germany"));
406
407 dbuObjectBuilderDestroy(builder);
408 }
409
410 cxMempoolFree(mp);
411 }

mercurial