Files
cAI/cKit/Foundation/c_PtrArrayBag.t.c
T

98 lines
3.3 KiB
C
Raw Normal View History

2026-08-10 01:21:15 +08:00
#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;
}