#include "cx/test.h"
#include "cx/hash_key.h"
#include "cx/string.h"
CX_TEST(test_hash_key_functions) {
const char *str =
"my key";
const unsigned char *ustr = (
const unsigned char *) str;
size_t len = strlen(str);
CxHashKey str_key = cx_hash_key_str(str);
CxHashKey ustr_key = cx_hash_key_ustr(ustr);
CxHashKey bytes_key = cx_hash_key_bytes(ustr, len);
CxHashKey obj_key = cx_hash_key(str, len);
CxHashKey cxstr_key = cx_hash_key_cxstr(cx_str(str));
CX_TEST_DO {
CX_TEST_ASSERT(bytes_key.hash ==
1269566022);
CX_TEST_ASSERT(str_key.hash == bytes_key.hash);
CX_TEST_ASSERT(ustr_key.hash == bytes_key.hash);
CX_TEST_ASSERT(obj_key.hash == bytes_key.hash);
CX_TEST_ASSERT(cxstr_key.hash == bytes_key.hash);
CX_TEST_ASSERT(str_key.len == len);
CX_TEST_ASSERT(str_key.data == str);
CX_TEST_ASSERT(ustr_key.len == len);
CX_TEST_ASSERT(ustr_key.data == ustr);
CX_TEST_ASSERT(cxstr_key.len == len);
CX_TEST_ASSERT(cxstr_key.data == str);
CX_TEST_ASSERT(obj_key.len == len);
CX_TEST_ASSERT(obj_key.data == str);
CX_TEST_ASSERT(bytes_key.len == len);
CX_TEST_ASSERT(bytes_key.data == str);
}
}
CX_TEST(test_hash_key_int_functions) {
uint32_t a =
0xabc01337u;
uint64_t b =
0xabc0133747110815ull;
CxHashKey ak = cx_hash_key_u32(a);
CxHashKey bk = cx_hash_key_u64(b);
CX_TEST_DO {
CX_TEST_ASSERT(ak.data ==
NULL);
CX_TEST_ASSERT(ak.len ==
0);
CX_TEST_ASSERT(ak.hash ==
3897006249);
CX_TEST_ASSERT(bk.data ==
NULL);
CX_TEST_ASSERT(bk.len ==
0);
CX_TEST_ASSERT(bk.hash ==
17452435587688253422ull);
}
}
CX_TEST(test_hash_key_macro) {
const char *str =
"my key";
size_t len = strlen(str);
uint32_t a =
0xabc01337u;
uint64_t b =
0xabc0133747110815ull;
CxHashKey str_key =
CX_HASH_KEY(str);
CxHashKey bytes_key =
CX_HASH_KEY((
const unsigned char*)str);
CxHashKey mutstr_key =
CX_HASH_KEY(cx_mutstr((
char*)str));
CxHashKey cxstr_key =
CX_HASH_KEY(cx_str(str));
CxHashKey ak =
CX_HASH_KEY(a);
CxHashKey bk =
CX_HASH_KEY(b);
CX_TEST_DO {
CX_TEST_ASSERT(bytes_key.hash ==
1269566022);
CX_TEST_ASSERT(str_key.hash == bytes_key.hash);
CX_TEST_ASSERT(cxstr_key.hash == bytes_key.hash);
CX_TEST_ASSERT(mutstr_key.hash == bytes_key.hash);
CX_TEST_ASSERT(str_key.len == len);
CX_TEST_ASSERT(str_key.data == str);
CX_TEST_ASSERT(cxstr_key.len == len);
CX_TEST_ASSERT(cxstr_key.data == str);
CX_TEST_ASSERT(bytes_key.len == len);
CX_TEST_ASSERT(bytes_key.data == str);
CX_TEST_ASSERT(ak.data ==
NULL);
CX_TEST_ASSERT(ak.len ==
0);
CX_TEST_ASSERT(ak.hash ==
3897006249);
CX_TEST_ASSERT(bk.data ==
NULL);
CX_TEST_ASSERT(bk.len ==
0);
CX_TEST_ASSERT(bk.hash ==
17452435587688253422ull);
}
}
CX_TEST(test_hash_key_cmp) {
CxHashKey k1 =
CX_HASH_KEY(
"one key");
CxHashKey k2 =
CX_HASH_KEY(
"another key");
CxHashKey k =
CX_HASH_KEY(
"one key");
CX_TEST_DO {
CX_TEST_ASSERT(
0 == cx_hash_key_cmp(&k1, &k));
CX_TEST_ASSERT(
0 == cx_hash_key_cmp(&k1, &k1));
CX_TEST_ASSERT(
0 == cx_hash_key_cmp(&k2, &k2));
CX_TEST_ASSERT(
0 != cx_hash_key_cmp(&k2, &k));
CX_TEST_ASSERT(
0 != cx_hash_key_cmp(&k, &k2));
CX_TEST_ASSERT(
0 != cx_hash_key_cmp(&k1, &k2));
k1.hash = k2.hash =
4711;
CX_TEST_ASSERT(
0 != cx_hash_key_cmp(&k1, &k2));
}
}
CX_TEST(test_hash_key_empty_string) {
const char *str =
"";
const unsigned char *ustr = (
const unsigned char*)
"";
CxHashKey str_key = cx_hash_key_str(str);
CxHashKey ustr_key = cx_hash_key_ustr(ustr);
CxHashKey bytes_key = cx_hash_key_bytes((
const unsigned char*) str,
0);
CxHashKey obj_key = cx_hash_key(str,
0);
CX_TEST_DO {
CX_TEST_ASSERT(bytes_key.hash ==
4152238450u);
CX_TEST_ASSERT(str_key.hash ==
4152238450u);
CX_TEST_ASSERT(ustr_key.hash ==
4152238450u);
CX_TEST_ASSERT(obj_key.hash ==
4152238450u);
CX_TEST_ASSERT(str_key.len ==
0);
CX_TEST_ASSERT(ustr_key.len ==
0);
CX_TEST_ASSERT(bytes_key.len ==
0);
CX_TEST_ASSERT(bytes_key.len ==
0);
CX_TEST_ASSERT(str_key.data == str);
CX_TEST_ASSERT(ustr_key.data == ustr);
}
}
CX_TEST(test_hash_key_null) {
CxHashKey str_key = cx_hash_key_str(
NULL);
CxHashKey ustr_key = cx_hash_key_ustr(
NULL);
CxHashKey bytes_key = cx_hash_key_bytes(
NULL,
0);
CxHashKey obj_key = cx_hash_key(
NULL,
0);
CX_TEST_DO {
CX_TEST_ASSERT(bytes_key.hash ==
1574210520u);
CX_TEST_ASSERT(str_key.hash ==
1574210520u);
CX_TEST_ASSERT(ustr_key.hash ==
1574210520u);
CX_TEST_ASSERT(obj_key.hash ==
1574210520u);
CX_TEST_ASSERT(str_key.len ==
0);
CX_TEST_ASSERT(ustr_key.len ==
0);
CX_TEST_ASSERT(bytes_key.len ==
0);
CX_TEST_ASSERT(bytes_key.len ==
0);
CX_TEST_ASSERT(str_key.data ==
NULL);
CX_TEST_ASSERT(ustr_key.data ==
NULL);
}
}
CxTestSuite *cx_test_suite_hash_key(
void) {
CxTestSuite *suite = cx_test_suite_new(
"hash_key");
cx_test_register(suite, test_hash_key_functions);
cx_test_register(suite, test_hash_key_int_functions);
cx_test_register(suite, test_hash_key_macro);
cx_test_register(suite, test_hash_key_cmp);
cx_test_register(suite, test_hash_key_empty_string);
cx_test_register(suite, test_hash_key_null);
return suite;
}