| 31 #include "cx/hash_key.h" |
31 #include "cx/hash_key.h" |
| 32 #include "cx/string.h" |
32 #include "cx/string.h" |
| 33 |
33 |
| 34 CX_TEST(test_hash_key_functions) { |
34 CX_TEST(test_hash_key_functions) { |
| 35 const char *str = "my key"; |
35 const char *str = "my key"; |
| |
36 const unsigned char *ustr = (const unsigned char *) str; |
| 36 size_t len = strlen(str); |
37 size_t len = strlen(str); |
| 37 |
38 |
| 38 CxHashKey str_key = cx_hash_key_str(str); |
39 CxHashKey str_key = cx_hash_key_str(str); |
| 39 CxHashKey bytes_key = cx_hash_key_bytes((const unsigned char*)str, len); |
40 CxHashKey ustr_key = cx_hash_key_ustr(ustr); |
| |
41 CxHashKey bytes_key = cx_hash_key_bytes(ustr, len); |
| 40 CxHashKey obj_key = cx_hash_key(str, len); |
42 CxHashKey obj_key = cx_hash_key(str, len); |
| 41 CxHashKey cxstr_key = cx_hash_key_cxstr(cx_str(str)); |
43 CxHashKey cxstr_key = cx_hash_key_cxstr(cx_str(str)); |
| 42 |
44 |
| 43 CX_TEST_DO { |
45 CX_TEST_DO { |
| 44 CX_TEST_ASSERT(bytes_key.hash == 1269566022); |
46 CX_TEST_ASSERT(bytes_key.hash == 1269566022); |
| 45 CX_TEST_ASSERT(str_key.hash == bytes_key.hash); |
47 CX_TEST_ASSERT(str_key.hash == bytes_key.hash); |
| |
48 CX_TEST_ASSERT(ustr_key.hash == bytes_key.hash); |
| 46 CX_TEST_ASSERT(obj_key.hash == bytes_key.hash); |
49 CX_TEST_ASSERT(obj_key.hash == bytes_key.hash); |
| 47 CX_TEST_ASSERT(cxstr_key.hash == bytes_key.hash); |
50 CX_TEST_ASSERT(cxstr_key.hash == bytes_key.hash); |
| 48 CX_TEST_ASSERT(str_key.len == len); |
51 CX_TEST_ASSERT(str_key.len == len); |
| 49 CX_TEST_ASSERT(str_key.data == str); |
52 CX_TEST_ASSERT(str_key.data == str); |
| |
53 CX_TEST_ASSERT(ustr_key.len == len); |
| |
54 CX_TEST_ASSERT(ustr_key.data == ustr); |
| 50 CX_TEST_ASSERT(cxstr_key.len == len); |
55 CX_TEST_ASSERT(cxstr_key.len == len); |
| 51 CX_TEST_ASSERT(cxstr_key.data == str); |
56 CX_TEST_ASSERT(cxstr_key.data == str); |
| 52 CX_TEST_ASSERT(obj_key.len == len); |
57 CX_TEST_ASSERT(obj_key.len == len); |
| 53 CX_TEST_ASSERT(obj_key.data == str); |
58 CX_TEST_ASSERT(obj_key.data == str); |
| 54 CX_TEST_ASSERT(bytes_key.len == len); |
59 CX_TEST_ASSERT(bytes_key.len == len); |
| 104 CX_TEST_ASSERT(bk.len == 0); |
109 CX_TEST_ASSERT(bk.len == 0); |
| 105 CX_TEST_ASSERT(bk.hash == 17452435587688253422ull); |
110 CX_TEST_ASSERT(bk.hash == 17452435587688253422ull); |
| 106 } |
111 } |
| 107 } |
112 } |
| 108 |
113 |
| |
114 CX_TEST(test_hash_key_cmp) { |
| |
115 CxHashKey k1 = CX_HASH_KEY("one key"); |
| |
116 CxHashKey k2 = CX_HASH_KEY("another key"); |
| |
117 CxHashKey k = CX_HASH_KEY("one key"); |
| |
118 CX_TEST_DO { |
| |
119 CX_TEST_ASSERT(0 == cx_hash_key_cmp(&k1, &k)); |
| |
120 CX_TEST_ASSERT(0 == cx_hash_key_cmp(&k1, &k1)); |
| |
121 CX_TEST_ASSERT(0 == cx_hash_key_cmp(&k2, &k2)); |
| |
122 CX_TEST_ASSERT(0 != cx_hash_key_cmp(&k2, &k)); |
| |
123 CX_TEST_ASSERT(0 != cx_hash_key_cmp(&k, &k2)); |
| |
124 CX_TEST_ASSERT(0 != cx_hash_key_cmp(&k1, &k2)); |
| |
125 |
| |
126 // fake a hash collision |
| |
127 k1.hash = k2.hash = 4711; |
| |
128 // still not equal |
| |
129 CX_TEST_ASSERT(0 != cx_hash_key_cmp(&k1, &k2)); |
| |
130 } |
| |
131 } |
| |
132 |
| 109 CX_TEST(test_hash_key_empty_string) { |
133 CX_TEST(test_hash_key_empty_string) { |
| 110 const char *str = ""; |
134 const char *str = ""; |
| |
135 const unsigned char *ustr = (const unsigned char*)""; |
| 111 |
136 |
| 112 CxHashKey str_key = cx_hash_key_str(str); |
137 CxHashKey str_key = cx_hash_key_str(str); |
| |
138 CxHashKey ustr_key = cx_hash_key_ustr(ustr); |
| 113 CxHashKey bytes_key = cx_hash_key_bytes((const unsigned char*) str, 0); |
139 CxHashKey bytes_key = cx_hash_key_bytes((const unsigned char*) str, 0); |
| 114 CxHashKey obj_key = cx_hash_key(str, 0); |
140 CxHashKey obj_key = cx_hash_key(str, 0); |
| 115 |
141 |
| 116 CX_TEST_DO { |
142 CX_TEST_DO { |
| 117 CX_TEST_ASSERT(bytes_key.hash == 4152238450u); |
143 CX_TEST_ASSERT(bytes_key.hash == 4152238450u); |
| 118 CX_TEST_ASSERT(str_key.hash == 4152238450u); |
144 CX_TEST_ASSERT(str_key.hash == 4152238450u); |
| |
145 CX_TEST_ASSERT(ustr_key.hash == 4152238450u); |
| 119 CX_TEST_ASSERT(obj_key.hash == 4152238450u); |
146 CX_TEST_ASSERT(obj_key.hash == 4152238450u); |
| 120 CX_TEST_ASSERT(str_key.len == 0); |
147 CX_TEST_ASSERT(str_key.len == 0); |
| |
148 CX_TEST_ASSERT(ustr_key.len == 0); |
| 121 CX_TEST_ASSERT(bytes_key.len == 0); |
149 CX_TEST_ASSERT(bytes_key.len == 0); |
| 122 CX_TEST_ASSERT(bytes_key.len == 0); |
150 CX_TEST_ASSERT(bytes_key.len == 0); |
| 123 CX_TEST_ASSERT(str_key.data == str); |
151 CX_TEST_ASSERT(str_key.data == str); |
| |
152 CX_TEST_ASSERT(ustr_key.data == ustr); |
| 124 } |
153 } |
| 125 } |
154 } |
| 126 |
155 |
| 127 CX_TEST(test_hash_key_null) { |
156 CX_TEST(test_hash_key_null) { |
| 128 CxHashKey str_key = cx_hash_key_str(NULL); |
157 CxHashKey str_key = cx_hash_key_str(NULL); |
| |
158 CxHashKey ustr_key = cx_hash_key_ustr(NULL); |
| 129 CxHashKey bytes_key = cx_hash_key_bytes(NULL, 0); |
159 CxHashKey bytes_key = cx_hash_key_bytes(NULL, 0); |
| 130 CxHashKey obj_key = cx_hash_key(NULL, 0); |
160 CxHashKey obj_key = cx_hash_key(NULL, 0); |
| 131 |
161 |
| 132 CX_TEST_DO { |
162 CX_TEST_DO { |
| 133 CX_TEST_ASSERT(bytes_key.hash == 1574210520u); |
163 CX_TEST_ASSERT(bytes_key.hash == 1574210520u); |
| 134 CX_TEST_ASSERT(str_key.hash == 1574210520u); |
164 CX_TEST_ASSERT(str_key.hash == 1574210520u); |
| |
165 CX_TEST_ASSERT(ustr_key.hash == 1574210520u); |
| 135 CX_TEST_ASSERT(obj_key.hash == 1574210520u); |
166 CX_TEST_ASSERT(obj_key.hash == 1574210520u); |
| 136 CX_TEST_ASSERT(str_key.len == 0); |
167 CX_TEST_ASSERT(str_key.len == 0); |
| |
168 CX_TEST_ASSERT(ustr_key.len == 0); |
| 137 CX_TEST_ASSERT(bytes_key.len == 0); |
169 CX_TEST_ASSERT(bytes_key.len == 0); |
| 138 CX_TEST_ASSERT(bytes_key.len == 0); |
170 CX_TEST_ASSERT(bytes_key.len == 0); |
| 139 CX_TEST_ASSERT(str_key.data == NULL); |
171 CX_TEST_ASSERT(str_key.data == NULL); |
| |
172 CX_TEST_ASSERT(ustr_key.data == NULL); |
| 140 } |
173 } |
| 141 } |
174 } |
| 142 |
175 |
| 143 CxTestSuite *cx_test_suite_hash_key(void) { |
176 CxTestSuite *cx_test_suite_hash_key(void) { |
| 144 CxTestSuite *suite = cx_test_suite_new("hash_key"); |
177 CxTestSuite *suite = cx_test_suite_new("hash_key"); |
| 145 |
178 |
| 146 cx_test_register(suite, test_hash_key_functions); |
179 cx_test_register(suite, test_hash_key_functions); |
| 147 cx_test_register(suite, test_hash_key_int_functions); |
180 cx_test_register(suite, test_hash_key_int_functions); |
| |
181 cx_test_register(suite, test_hash_key_macro); |
| |
182 cx_test_register(suite, test_hash_key_cmp); |
| 148 cx_test_register(suite, test_hash_key_empty_string); |
183 cx_test_register(suite, test_hash_key_empty_string); |
| 149 cx_test_register(suite, test_hash_key_null); |
184 cx_test_register(suite, test_hash_key_null); |
| 150 |
185 |
| 151 return suite; |
186 return suite; |
| 152 } |
187 } |