Foundations
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#include "c_PtrArrayBag.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.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_OK);
|
||||
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_OK);
|
||||
assert(bag.size == 1);
|
||||
assert(*(int*)c_PtrArrayBag_Get(&bag, 0) == 100);
|
||||
|
||||
err = c_PtrArrayBag_Add(&bag, &val2);
|
||||
assert(err == C_ERR_OK);
|
||||
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_OK);
|
||||
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_OK);
|
||||
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_OUTOFBOUND);
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user