#include "c_ArrayQueue.h" #include #include #include #include #include "c_Alignment.h" /* ------------------------------------------------------------------------------------------------------------------ */ /* */ TEST_CASE(test_queue_basic_operations) { c_ArrayQueue_t queue; c_Buddy_t buddy; uint8_t* backing_buffer = (uint8_t*)malloc(1024); // 初始化一個 1024 總大小的區塊 c_Buddy_Init(&buddy, backing_buffer, 1024, C_ALIGN_SIZE); c_BuddyAllocator_t buddyAllocator; c_Allocator_t allocator = c_BuddyAllocator_Build(&buddyAllocator, &buddy); // 初始化容量为 3 的整型队列 ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Init(&queue, sizeof(int), 3, &allocator)); ASSERT_TRUE(c_ArrayQueue_IsEmpty(&queue)); // 1. 入队 3 个元素 int v1 = 10, v2 = 20, v3 = 30; ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Enqueue(&queue, &v1)); ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Enqueue(&queue, &v2)); ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Enqueue(&queue, &v3)); ASSERT_INT_EQ(3, c_ArrayQueue_Size(&queue)); // 2. 检查 Peek ASSERT_INT_EQ(10, *(int*)c_ArrayQueue_Peek(&queue)); // 3. 出队 1 个元素(此时 head 移动,腾出索引 0 的空间) int out_val = 0; ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Dequeue(&queue, &out_val)); ASSERT_INT_EQ(10, out_val); ASSERT_INT_EQ(2, c_ArrayQueue_Size(&queue)); // 4. 再次入队,触发环形回绕(tail 绕回到索引 0 处插入) int v4 = 40; ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Enqueue(&queue, &v4)); ASSERT_INT_EQ(3, c_ArrayQueue_Size(&queue)); ASSERT_INT_EQ(3, queue.capacity); // 刚好填满,未触发扩容 // 5. 核心:在“回绕状态下”强行插入第 5 个元素,迫使其触发 EnsureCapacity 扩容与平整化 int v5 = 50; ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Enqueue(&queue, &v5)); ASSERT_INT_EQ(4, c_ArrayQueue_Size(&queue)); ASSERT_INT_EQ(6, queue.capacity); // 翻倍扩容到了 6 // 6. 严苛校验扩容理顺后的出队顺序是否依然正确 (FIFO) ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Dequeue(&queue, &out_val)); ASSERT_INT_EQ(20, out_val); ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Dequeue(&queue, &out_val)); ASSERT_INT_EQ(30, out_val); ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Dequeue(&queue, &out_val)); ASSERT_INT_EQ(40, out_val); ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Dequeue(&queue, &out_val)); ASSERT_INT_EQ(50, out_val); ASSERT_TRUE(c_ArrayQueue_IsEmpty(&queue)); c_ArrayQueue_Destroy(&queue); free(backing_buffer); } /* ------------------------------------------------------------------------------------------------------------------ */ /* */ int main(int argc, char** argv){ TEST_START(C_ArrayQueue_Module_Tests); RUN_TEST(test_queue_basic_operations); TEST_REPORT(); RETURN_TEST_STATUS; }