Files

92 lines
3.1 KiB
C
Raw Permalink Normal View History

2026-08-10 01:21:15 +08:00
#include "c_HashMap.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct {
char name[32];
} StringKey_t;
typedef struct {
int price;
} IntValue_t;
// 簡單字串雜湊回呼 (DJB2)
uint32_t test_hash(const void* key, int key_size) {
const char* str = ((StringKey_t*)key)->name;
uint32_t hash = 5381;
int c;
while ((c = (unsigned char)*str++)) hash = ((hash << 5) + hash) + c;
return hash;
}
int test_compare(const void* a, const void* b, int key_size) {
return strcmp(((StringKey_t*)a)->name, ((StringKey_t*)b)->name);
}
void test_log(const char* name) {
printf("[PASS] %s\n", name);
}
int main() {
printf("==================================================\n");
printf(" 開始執行 c_HashMapKeyIter_t 鍵值迭代器單元測試\n");
printf("==================================================\n\n");
c_HashMap_t map;
c_HashMap_Init(&map, sizeof(StringKey_t), sizeof(IntValue_t), 4, test_hash, test_compare);
StringKey_t k1 = {"Apple"}; IntValue_t v1 = {100};
StringKey_t k2 = {"Banana"}; IntValue_t v2 = {200}; // 預計在走訪時刪除此項
StringKey_t k3 = {"Cherry"}; IntValue_t v3 = {300};
c_HashMap_Put(&map, &k1, &v1);
c_HashMap_Put(&map, &k2, &v2);
c_HashMap_Put(&map, &k3, &v3);
assert(map.size == 3);
// ==========================================
// 1. 測試迭代器基本走訪
// ==========================================
c_HashMapKeyIter_t iter;
c_HashMapKeyIter_Init(&iter, &map);
printf("當前雜湊表包含的鍵值:\n");
int visit_count = 0;
while (c_HashMapKeyIter_HasNext(&iter)) {
StringKey_t* key = (StringKey_t*)c_HashMapKeyIter_Next(&iter);
printf(" - 鍵名稱: %s\n", key->name);
visit_count++;
}
assert(visit_count == 3);
test_log("1. 迭代器成功走訪所有雜湊桶中的元素");
// ==========================================
// 2. 測試走訪中安全刪除 (Remove "Banana")
// ==========================================
c_HashMapKeyIter_Init(&iter, &map);
while (c_HashMapKeyIter_HasNext(&iter)) {
StringKey_t* key = (StringKey_t*)c_HashMapKeyIter_Get(&iter);
if (strcmp(key->name, "Banana") == 0) {
printf(" [Log] 找到目標 '%s',執行迭代器刪除...\n", key->name);
c_HashMapKeyIter_Remove(&iter);
// 呼叫 Remove 後,迭代器已自動處理好指標轉移,此處不可呼叫 Next()
} else {
c_HashMapKeyIter_Next(&iter); // 沒刪除時才手動前進
}
}
assert(map.size == 2);
test_log("2. 迭代器中序安全刪除指定元素成功");
// ==========================================
// 3. 驗證刪除後的雜湊表狀態
// ==========================================
assert(c_HashMap_Contains(&map, &k1) == C_TRUE);
assert(c_HashMap_Contains(&map, &k2) == C_FALSE); // Banana 應不見
assert(c_HashMap_Contains(&map, &k3) == C_TRUE);
test_log("3. 最終雜湊表結構完好度驗證成功");
c_HashMap_Destroy(&map);
return 0;
}