#include "c_PtrArrayBag.h" #include #include // 輔助測試函數:印出測試進度 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; }