#include "c_Array.h" #include "c_Test.h" // 用于测试的密集结构体 typedef struct { uint8_t r; uint8_t g; uint8_t b; } PixelRGB_t; TEST_CASE(test_fixed_generic_array_flow) { c_Array_t img_line; // 初始化一个长度固定为 3 的 RGB 像素扁平大数组 ASSERT_INT_EQ(C_ERR_OK, c_Array_Init(&img_line, sizeof(PixelRGB_t), 3, NULL)); ASSERT_INT_EQ(3, c_Array_Size(&img_line)); ASSERT_PTR_NOT_NULL(img_line.array); PixelRGB_t red = { .r = 255, .g = 0, .b = 0 }; PixelRGB_t green = { .r = 0, .g = 255, .b = 0 }; PixelRGB_t white = { .r = 255, .g = 255, .b = 255 }; // 1. 验证定点写入 (Write) ASSERT_INT_EQ(C_ERR_OK, c_Array_Write(&img_line, 0, &red)); ASSERT_INT_EQ(C_ERR_OK, c_Array_Write(&img_line, 1, &green)); // 防御越界写入,应当报错拒绝 ASSERT_INT_EQ(C_ERR_PARAM, c_Array_Write(&img_line, 3, &white)); // 2. 验证定点读取与值复制强屏障 (Read) PixelRGB_t read_res; ASSERT_INT_EQ(C_ERR_OK, c_Array_Read(&img_line, 0, &read_res)); ASSERT_INT_EQ(255, read_res.r); ASSERT_INT_EQ(0, read_res.g); // 修改局部临时变量,验证内部数据不受二次污染 red.r = 123; ASSERT_INT_EQ(C_ERR_OK, c_Array_Read(&img_line, 0, &read_res)); ASSERT_INT_EQ(255, read_res.r); // 内部依旧是 255,证明完美值隔离 // 3. 验证原位窥探能力 (Get) PixelRGB_t* direct_ptr = (PixelRGB_t*)c_Array_Get(&img_line, 1); ASSERT_PTR_NOT_NULL(direct_ptr); ASSERT_INT_EQ(255, direct_ptr->g); // 严苛验证固定物理内存布局: // 索引 1 的地址必须与数组首地址精准偏移 1 个 item_size 字节,完全不存在任何链式空隙 ASSERT_TRUE((void*)((char*)img_line.array + sizeof(PixelRGB_t)) == (void*)direct_ptr); // 4. 验证全局批量刷值功能 (Fill) ASSERT_INT_EQ(C_ERR_OK, c_Array_Fill(&img_line, &white)); // 抽样验证填充后的每一项是否全变成了白色 PixelRGB_t* check_p2 = (PixelRGB_t*)c_Array_Get(&img_line, 2); ASSERT_INT_EQ(255, check_p2->r); ASSERT_INT_EQ(255, check_p2->g); ASSERT_INT_EQ(255, check_p2->b); c_Array_Destroy(&img_line); } int main(void) { printf("\n"); TEST_START(C_Fixed_Array_Core_Layout_Tests); RUN_TEST(test_fixed_generic_array_flow); TEST_REPORT(); RETURN_TEST_STATUS; }