103 lines
4.2 KiB
C
103 lines
4.2 KiB
C
#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;
|
|
}
|