Files
cKit/Foundation/c_ArrayList.t.c
T
2026-08-29 01:50:50 +08:00

66 lines
3.2 KiB
C

#include "c_ArrayList.h"
#include <stdlib.h>
#include <stdio.h>
#include <c_Test.h>
struct Vector2D {
double u, v;
};
/* ==============================================================================
* 🧪 测试全新通用 void* 缓冲区的初始化、自动扩容与随机 Remove 重排全周期行为
* ============================================================================== */
C_TEST_CASE(test_array_list_full_lifecycle_and_removal)
{
c_ArrayList_t list;
/* 1. 初始化:装载自定义 Vector2D 结构体,初始最大可容纳元素数量卡死限制为 2 */
c_err_t init_err = c_ArrayList_Init(&list, sizeof(struct Vector2D), 2);
C_ASSERT_INT_EQ(init_err, C_ERR_OK, "弹性自愈 ArrayList 初始化成功");
C_ASSERT_INT_EQ(list.size, 0, "有效初始记录必须为 0");
struct Vector2D vec1 = { 11.1, 22.2 };
struct Vector2D vec2 = { 33.3, 44.4 };
struct Vector2D vec3 = { 55.5, 66.6 };
/* 2. 连续推入数据 */
c_ArrayList_Add(&list, &vec1);
c_ArrayList_Add(&list, &vec2);
/* 🎯 扩容看点:此时满员,第三次写入将强行逼迫池子在内部启动 2 -> 4 自动翻倍重分配 */
c_err_t add_err = c_ArrayList_Add(&list, &vec3);
C_ASSERT_INT_EQ(add_err, C_ERR_OK, "耗尽时追加写入,分配器必须完成全自动无感自愈扩容");
C_ASSERT_INT_EQ(list.size, 3, "当前有效装载数递增至 3");
/* 3. 验证数据内容的物理隔离完整度 */
struct Vector2D* p_check1 = (struct Vector2D*)c_ArrayList_Get(&list, 1);
C_ASSERT(p_check1 != NULL, "随机读取索引 1 节点成功");
C_ASSERT_DOUBLE_EQ(p_check1->u, 33.3, "重分配内存迁移后,原有位置 1 的数据必须毫发无损");
/* 4. 🛠️ 高能测试点:随机抹除中间位置 1 的节点 (即删掉 vec2)
预期结果:原位置 2 的 vec3 ({55.5, 66.6}) 必须在 O(N) 速度下向前平移,填补顶替空位 1 */
c_err_t remove_err = c_ArrayList_Remove(&list, 1);
C_ASSERT_INT_EQ(remove_err, C_ERR_OK, "执行中途位置随机移除成功");
C_ASSERT_INT_EQ(list.size, 2, "移除数据后,有效数据计数平滑扣减为 2");
/* 5. 终极完整性断言:现在去 Get 原本的位置 1 */
struct Vector2D* p_relocated = (struct Vector2D*)c_ArrayList_Get(&list, 1);
C_ASSERT(p_relocated != NULL, "重新获取平移顶替后的位置 1 节点成功");
/* 核心断言:原位置 2 的数据现在必须完美出现在位置 1 线上,且精度不发生移位错乱! */
C_ASSERT_DOUBLE_EQ(p_relocated->u, 55.5, "元素向前滑动对齐后,浮点特征完好无损");
C_ASSERT_DOUBLE_EQ(p_relocated->v, 66.6, "元素向前滑动对齐后,浮点特征完好无损");
/* 6. 边界越界捕获安全防御线 */
void* invalid_ptr = c_ArrayList_Get(&list, 2); /* 此时由于删了一个,索引 2 已变为空旷越界区 */
C_ASSERT(invalid_ptr == NULL, "越界获取已经被逻辑截断删除的位置必须安全回传 NULL");
c_ArrayList_Destroy(&list);
}
int main(void) {
C_TEST_SUITE_BEGIN(BaseArrayListNewSpecificationTestSuite)
C_RUN_TEST_CASE(test_array_list_full_lifecycle_and_removal);
C_TEST_SUITE_END()
}