Search / Sort

This commit is contained in:
2026-08-31 11:50:04 +08:00
parent 0cb98557da
commit 109e8af3d5
10 changed files with 818 additions and 219 deletions
+102
View File
@@ -0,0 +1,102 @@
#include "c_SeparateChainingHashST.h"
#include "c_Test.h"
#include <stdlib.h>
#include <stdio.h>
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;
}