Search / Sort

This commit is contained in:
2026-08-30 22:24:45 +08:00
parent 3a4717a9d8
commit 0cb98557da
75 changed files with 7570 additions and 7 deletions
+80
View File
@@ -0,0 +1,80 @@
#include "c_HashMap.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_HashMap_O1_StandardFlow) {
c_HashMap_t map;
// 初始化具有 5 个拉链桶的泛型哈希映射表 (M=5),测试默认分配器 Fallback 降级机制
c_err_t err = c_HashMap_Init(&map, 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_HashMap_Put(&map, &key_P, &val_P));
ASSERT_INT_EQ(C_ERR_OK, c_HashMap_Put(&map, &key_H, &val_H));
ASSERT_INT_EQ(C_ERR_OK, c_HashMap_Put(&map, &key_Q, &val_Q));
ASSERT_INT_EQ(3, (int)map.size);
// 状态包含判定
ASSERT_TRUE(c_HashMap_Contains(&map, &key_H));
char key_NotExit = 'X';
ASSERT_TRUE(!c_HashMap_Contains(&map, &key_NotExit));
// 2. Get 常数级读取断言
int get_result = 0;
ASSERT_INT_EQ(C_ERR_OK, c_HashMap_Get(&map, &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_HashMap_Put(&map, &key_H, &overwrite_val_H));
ASSERT_INT_EQ(3, (int)map.size); // 覆写后,全局哈希大小必须守恒,依旧为 3
ASSERT_INT_EQ(C_ERR_OK, c_HashMap_Get(&map, &key_H, &get_result));
ASSERT_INT_EQ(9999, get_result);
// 4. Delete 常数级拉链断开删除测试
ASSERT_INT_EQ(C_ERR_OK, c_HashMap_Delete(&map, &key_H));
ASSERT_INT_EQ(2, (int)map.size); // 递减确凿
ASSERT_INT_EQ(C_ERR_NOTFOUND, c_HashMap_Get(&map, &key_H, &get_result));
// 彻底级联反初始化释放桶空间
c_HashMap_Destroy(&map);
}
TEST_CASE(test_c_HashMap_ToxicityDefenses) {
c_HashMap_t local_map;
c_HashMap_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_HashMap_Init(NULL, 5, sizeof(char), sizeof(int), hash_compare_chars, NULL, NULL));
ASSERT_INT_EQ(C_ERR_PARAM, c_HashMap_Put(NULL, &k, &v));
ASSERT_INT_EQ(C_ERR_PARAM, c_HashMap_Delete(NULL, &k));
ASSERT_INT_EQ(C_ERR_EMPTY, c_HashMap_Delete(&local_map, &k)); // 空仓删除安全拦截抛出 C_ERR_EMPTY
c_HashMap_Destroy(&local_map);
}
// ==========================================
// 5. 主集成入口
// ==========================================
int main(void) {
TEST_START(C_HashMap_Isolated_TestSuite);
RUN_TEST(test_c_HashMap_O1_StandardFlow);
RUN_TEST(test_c_HashMap_ToxicityDefenses);
TEST_REPORT();
return (g_test_registry.failed_count > 0 ? 1 : 0);
}