Files
2026-08-10 01:21:15 +08:00

98 lines
3.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "c_PtrArrayBag.h"
#include <stdlib.h>
#include <stdio.h>
// 輔助測試函數:印出測試進度
void test_log(const char* test_name) {
printf("[PASS] %s\n", test_name);
}
int main(int argc, char** argv){
printf("開始執行 c_PtrArrayBag 測試用例...\n\n");
// 模擬一些測試資料
int val1 = 100;
int val2 = 200;
int val3 = 300;
int val4 = 400;
// ==========================================
// 1. 測試初始化 (Init)
// ==========================================
c_PtrArrayBag_t bag;
c_err_t err = c_PtrArrayBag_Init(&bag, 2); // 故意設小容量測試動態擴容
assert(err == C_ERR_SUCCESS);
assert(bag.capacity == 2);
assert(bag.size == 0);
assert(bag.array != NULL);
test_log("初始化測試");
// ==========================================
// 2. 測試新增元素與基本讀取 (Add & Get)
// ==========================================
err = c_PtrArrayBag_Add(&bag, &val1);
assert(err == C_ERR_SUCCESS);
assert(bag.size == 1);
assert(*(int*)c_PtrArrayBag_Get(&bag, 0) == 100);
err = c_PtrArrayBag_Add(&bag, &val2);
assert(err == C_ERR_SUCCESS);
assert(bag.size == 2);
assert(*(int*)c_PtrArrayBag_Get(&bag, 1) == 200);
test_log("基本新增與讀取測試");
// ==========================================
// 3. 測試動態擴容 (Dynamic Resizing)
// ==========================================
// 目前 size = 2, capacity = 2。再加第 3 個元素應該要觸發容量翻倍
err = c_PtrArrayBag_Add(&bag, &val3);
assert(err == C_ERR_SUCCESS);
assert(bag.size == 3);
assert(bag.capacity == 4); // 2 * 2 = 4
assert(*(int*)c_PtrArrayBag_Get(&bag, 2) == 300);
test_log("自動擴容測試");
// ==========================================
// 4. 測試邊界與無效引數 (Edge Cases)
// ==========================================
// 讀取超出範圍的索引應該回傳 NULL
assert(c_PtrArrayBag_Get(&bag, 99) == NULL);
// 傳入 NULL 結構指標應該要防呆
assert(c_PtrArrayBag_Init(NULL, 10) == C_ERR_PARAM);
assert(c_PtrArrayBag_Add(NULL, &val4) == C_ERR_PARAM);
assert(c_PtrArrayBag_Remove(NULL, 0) == C_ERR_PARAM);
test_log("邊界防呆測試");
// ==========================================
// 5. 測試刪除元素與平移 (Remove)
// ==========================================
// 目前狀態: [100, 200, 300],刪除索引 1 (200)
// 預期結果: [100, 300],後方元素向前平移,保持順序
err = c_PtrArrayBag_Remove(&bag, 1);
assert(err == C_ERR_SUCCESS);
assert(bag.size == 2);
// 驗證原本索引 2 的 300 是否變成索引 1
assert(*(int*)c_PtrArrayBag_Get(&bag, 0) == 100);
assert(*(int*)c_PtrArrayBag_Get(&bag, 1) == 300);
// 嘗試刪除不存在的索引
err = c_PtrArrayBag_Remove(&bag, 5);
assert(err == C_ERR_INDEX);
test_log("刪除與元素平移測試");
// ==========================================
// 6. 測試銷毀與記憶體釋放 (Destroy)
// ==========================================
c_PtrArrayBag_Destroy(&bag);
assert(bag.array == NULL);
assert(bag.size == 0);
assert(bag.capacity == 0);
test_log("銷毀測試");
printf("\n恭喜!所有測試用例皆順利通過 (All Tests Passed)\n");
return 0;
}