#include "c_SeparateChainingHashST.h" #include "c_Test.h" #include #include static int hash_compare_chars(const void* a, const void* b, void* args) { (void)args; char char1 = *(const char*)a; char char2 = *(const char*)b; return char1 - char2; } TEST_CASE(test_c_SeparateChainingHashST_DestroyFlow) { c_SeparateChainingHashST_t hash_st; c_err_t err = c_SeparateChainingHashST_Init(&hash_st, 5, sizeof(char), sizeof(int), hash_compare_chars, NULL, NULL); ASSERT_INT_EQ(C_ERR_OK, err); char key_P = 'P'; int val_P = 90; char key_H = 'H'; int val_H = 80; ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Put(&hash_st, &key_P, &val_P)); ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Put(&hash_st, &key_H, &val_H)); ASSERT_INT_EQ(2, (int)hash_st.size); int get_result = 0; ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Get(&hash_st, &key_H, &get_result)); ASSERT_INT_EQ(80, get_result); // 🌟 核心重命名释放链条走查 c_SeparateChainingHashST_Destroy(&hash_st); ASSERT_TRUE(hash_st.buckets == NULL); ASSERT_INT_EQ(0, (int)hash_st.size); } TEST_CASE(test_c_SeparateChainingHashST_O1_StandardFlow) { c_SeparateChainingHashST_t hash_st; // 初始化具有 5 个拉链桶的泛型拉链法哈希表 (M=5),测试默认分配器 Fallback 降级机制 c_err_t err = c_SeparateChainingHashST_Init(&hash_st, 5, sizeof(char), sizeof(int), hash_compare_chars, NULL, NULL); ASSERT_INT_EQ(C_ERR_OK, err); char key_P = 'P'; int val_P = 90; char key_H = 'H'; int val_H = 80; char key_Q = 'Q'; int val_Q = 70; // 1. Put 基础常数级高速录入验证 ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Put(&hash_st, &key_P, &val_P)); ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Put(&hash_st, &key_H, &val_H)); ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Put(&hash_st, &key_Q, &val_Q)); ASSERT_INT_EQ(3, (int)hash_st.size); // 状态包含判定 ASSERT_TRUE(c_SeparateChainingHashST_Contains(&hash_st, &key_H)); char key_NotExit = 'X'; ASSERT_TRUE(!c_SeparateChainingHashST_Contains(&hash_st, &key_NotExit)); // 2. Get 常数级读取断言 int get_result = 0; ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Get(&hash_st, &key_H, &get_result)); ASSERT_INT_EQ(80, get_result); // 精确提取 // 3. Put 相同键覆写更新(Overwrite)特性核验 int overwrite_val_H = 9999; ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Put(&hash_st, &key_H, &overwrite_val_H)); ASSERT_INT_EQ(3, (int)hash_st.size); // 覆写后,全局哈希大小必须守恒,依旧为 3 ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Get(&hash_st, &key_H, &get_result)); ASSERT_INT_EQ(9999, get_result); // 4. Delete 常数级拉链断开删除测试 ASSERT_INT_EQ(C_ERR_OK, c_SeparateChainingHashST_Delete(&hash_st, &key_H)); ASSERT_INT_EQ(2, (int)hash_st.size); // 递减确凿 ASSERT_INT_EQ(C_ERR_NOTFOUND, c_SeparateChainingHashST_Get(&hash_st, &key_H, &get_result)); // 彻底级联反初始化释放桶空间 c_SeparateChainingHashST_Destroy(&hash_st); } TEST_CASE(test_c_SeparateChainingHashST_ToxicityDefenses) { c_SeparateChainingHashST_t local_map; c_SeparateChainingHashST_Init(&local_map, 4, sizeof(char), sizeof(int), hash_compare_chars, NULL, &c_DefaultAllocator); char k = 'K'; int v = 11; // 5. 验证关键入参异常状态码强拦截 ASSERT_INT_EQ(C_ERR_PARAM, c_SeparateChainingHashST_Init(NULL, 5, sizeof(char), sizeof(int), hash_compare_chars, NULL, NULL)); ASSERT_INT_EQ(C_ERR_PARAM, c_SeparateChainingHashST_Put(NULL, &k, &v)); ASSERT_INT_EQ(C_ERR_PARAM, c_SeparateChainingHashST_Delete(NULL, &k)); ASSERT_INT_EQ(C_ERR_EMPTY, c_SeparateChainingHashST_Delete(&local_map, &k)); // 空仓删除安全拦截抛出 C_ERR_EMPTY c_SeparateChainingHashST_Destroy(&local_map); } int main(void) { TEST_START(C_SeparateChainingHashST_DestroyRename_TestSuite); RUN_TEST(test_c_SeparateChainingHashST_O1_StandardFlow); RUN_TEST(test_c_SeparateChainingHashST_ToxicityDefenses); RUN_TEST(test_c_SeparateChainingHashST_DestroyFlow); TEST_REPORT(); RETURN_TEST_STATUS; }