#include "pblock.h"
#include "../util/pblock.h"
#include <cx/hash_map.h>
CX_TEST(test_pblock_iterator) {
pool_handle_t *pool = pool_create();
CX_TEST_DO {
pblock *pb_empty_1 = pblock_create_pool(pool,
1);
pblock *pb_empty_2 = pblock_create_pool(pool,
2);
pblock *pb_empty_4 = pblock_create_pool(pool,
4);
pblock *pb_one_1 = pblock_create_pool(pool,
1);
pblock *pb_one_2 = pblock_create_pool(pool,
2);
pblock *pb_one_4 = pblock_create_pool(pool,
4);
pblock *pb_many_1 = pblock_create_pool(pool,
1);
pblock *pb_many_4 = pblock_create_pool(pool,
4);
pblock *pb_many_16 = pblock_create_pool(pool,
16);
pblock *pb_many_64 = pblock_create_pool(pool,
64);
pblock_nvinsert(
"mykey",
"pb_one", pb_one_1);
pblock_nvinsert(
"mykey",
"pb_one", pb_one_2);
pblock_nvinsert(
"mykey",
"pb_one", pb_one_4);
pblock *pbs[
4] = { pb_many_1, pb_many_4, pb_many_16, pb_many_64 };
for(
int n=
0;n<
4;n++) {
pblock *p = pbs[n];
pblock_nvinsert(
"key1",
"many1", p);
pblock_nvinsert(
"key2",
"many2", p);
pblock_nvinsert(
"key3",
"many3", p);
pblock_nvinsert(
"key4",
"many4", p);
pblock_nvinsert(
"b_key5__long_key_X1",
"many5", p);
pblock_nvinsert(
"c_key6__long_key_X2",
"many6", p);
pblock_nvinsert(
"d_key7__long_key_X3",
"many7", p);
pblock_nvinsert(
"e_key8__long_key_X4",
"many8", p);
pblock_nvinsert(
"01_key9__very_long_key_test_X1",
"many9", p);
pblock_nvinsert(
"12_keya__very_long_key_test_X20",
"manya", p);
pblock_nvinsert(
"34_keyb__very_long_key_test_X300",
"manyb", p);
pblock_nvinsert(
"56_keyc__very_long_key_test_X4000",
"manyc", p);
pblock_nvinsert(
"78_keyd__very_long_key_test_X50000",
"manyd", p);
}
int count;
CxIterator i;
count =
0;
i = pblock_iterator(pb_empty_1);
cx_foreach(pb_entry*, entry, i) {
count++;
}
CX_TEST_ASSERT(count ==
0);
count =
0;
i = pblock_iterator(pb_empty_2);
cx_foreach(pb_entry*, entry, i) {
count++;
}
CX_TEST_ASSERT(count ==
0);
count =
0;
i = pblock_iterator(pb_empty_4);
cx_foreach(pb_entry*, entry, i) {
count++;
}
CX_TEST_ASSERT(count ==
0);
pblock *pbs_one[
3] = { pb_one_1, pb_one_2, pb_one_4 };
for(
int n=
0;n<
3;n++) {
count =
0;
i = pblock_iterator(pbs_one[n]);
cx_foreach(pb_entry*, entry, i) {
count++;
CX_TEST_ASSERT(entry);
CX_TEST_ASSERT(entry->param);
CX_TEST_ASSERT(entry->param->name);
CX_TEST_ASSERT(entry->param->value);
CX_TEST_ASSERT(!strcmp(entry->param->name,
"mykey"));
CX_TEST_ASSERT(!strcmp(entry->param->value,
"pb_one"));
}
CX_TEST_ASSERT(count ==
1);
}
for(
int n=
0;n<
4;n++) {
CxMap *map = cxHashMapCreate(
NULL,
CX_STORE_POINTERS,
64);
i = pblock_iterator(pbs[n]);
cx_foreach(pb_entry*, entry, i) {
CX_TEST_ASSERT(entry);
CX_TEST_ASSERT(entry->param);
CX_TEST_ASSERT(entry->param->name);
CX_TEST_ASSERT(entry->param->value);
cxMapPut(map, entry->param->name, entry->param->value);
}
CX_TEST_ASSERT(cxMapSize(map) ==
13);
CxMapIterator mi = cxMapIterator(map);
cx_foreach(CxMapEntry*, entry, mi) {
cxmutstr key = cx_strdup(cx_strn(entry->key->data, entry->key->len));
char *pb_val = pblock_findval(key.ptr, pbs[n]);
free(key.ptr);
char *map_value = entry->value;
CX_TEST_ASSERT(!cx_strcmp(pb_val, map_value));
}
cxMapFree(map);
}
}
pool_destroy(pool);
}