开始设计
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user