#include "c_ArrayList.h" #include #include #include 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() }