2026-08-29 11:39:28 +08:00
|
|
|
#include "c_ArrayQueue.h"
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <c_Test.h>
|
2026-08-30 01:48:03 +08:00
|
|
|
#include <c_BuddyAllocator.h>
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
#include "c_Alignment.h"
|
2026-08-29 11:39:28 +08:00
|
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
|
|
|
|
/* */
|
|
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
TEST_CASE(test_queue_basic_operations) {
|
|
|
|
|
c_ArrayQueue_t queue;
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
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);
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 初始化容量为 3 的整型队列
|
|
|
|
|
ASSERT_INT_EQ(C_SUCCESS, c_ArrayQueue_Init(&queue, sizeof(int), 3, &allocator));
|
|
|
|
|
ASSERT_TRUE(c_ArrayQueue_IsEmpty(&queue));
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 1. 入队 3 个元素
|
2026-08-29 11:39:28 +08:00
|
|
|
int v1 = 10, v2 = 20, v3 = 30;
|
2026-08-30 01:48:03 +08:00
|
|
|
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));
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 2. 检查 Peek
|
|
|
|
|
ASSERT_INT_EQ(10, *(int*)c_ArrayQueue_Peek(&queue));
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 3. 出队 1 个元素(此时 head 移动,腾出索引 0 的空间)
|
2026-08-29 11:39:28 +08:00
|
|
|
int out_val = 0;
|
2026-08-30 01:48:03 +08:00
|
|
|
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));
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 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); // 刚好填满,未触发扩容
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 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
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
// 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);
|
2026-08-29 11:39:28 +08:00
|
|
|
|
2026-08-30 01:48:03 +08:00
|
|
|
ASSERT_TRUE(c_ArrayQueue_IsEmpty(&queue));
|
|
|
|
|
c_ArrayQueue_Destroy(&queue);
|
|
|
|
|
free(backing_buffer);
|
2026-08-29 11:39:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
|
|
|
|
/* */
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv){
|
2026-08-30 01:48:03 +08:00
|
|
|
TEST_START(C_ArrayQueue_Module_Tests);
|
|
|
|
|
RUN_TEST(test_queue_basic_operations);
|
2026-08-29 11:39:28 +08:00
|
|
|
TEST_REPORT();
|
|
|
|
|
RETURN_TEST_STATUS;
|
|
|
|
|
}
|