98 lines
3.3 KiB
C
98 lines
3.3 KiB
C
#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;
|
|||
|
|
}
|