160 lines
4.5 KiB
C
160 lines
4.5 KiB
C
|
|
#include "test_framework.h"
|
||
|
|
#include "../src/types.h"
|
||
|
|
#include "../src/buffer.h"
|
||
|
|
|
||
|
|
void test_buffer_init(void) {
|
||
|
|
TEST_SUITE_BEGIN("Buffer Initialization");
|
||
|
|
|
||
|
|
buffer_t buf;
|
||
|
|
int result = buffer_init(&buf, 1024);
|
||
|
|
|
||
|
|
TEST_ASSERT_EQ(0, result, "Buffer init returns 0");
|
||
|
|
TEST_ASSERT(buf.data != NULL, "Buffer data is not NULL");
|
||
|
|
TEST_ASSERT_EQ(1024, buf.capacity, "Buffer capacity is 1024");
|
||
|
|
TEST_ASSERT_EQ(0, buf.head, "Buffer head is 0");
|
||
|
|
TEST_ASSERT_EQ(0, buf.tail, "Buffer tail is 0");
|
||
|
|
|
||
|
|
buffer_free(&buf);
|
||
|
|
TEST_ASSERT(buf.data == NULL, "Buffer data is NULL after free");
|
||
|
|
|
||
|
|
TEST_SUITE_END();
|
||
|
|
}
|
||
|
|
|
||
|
|
void test_buffer_read_write(void) {
|
||
|
|
TEST_SUITE_BEGIN("Buffer Read/Write Operations");
|
||
|
|
|
||
|
|
buffer_t buf;
|
||
|
|
buffer_init(&buf, 1024);
|
||
|
|
|
||
|
|
TEST_ASSERT_EQ(1024, buffer_available_write(&buf), "Initial write capacity is 1024");
|
||
|
|
TEST_ASSERT_EQ(0, buffer_available_read(&buf), "Initial read capacity is 0");
|
||
|
|
|
||
|
|
const char *test_data = "Hello, World!";
|
||
|
|
size_t len = strlen(test_data);
|
||
|
|
memcpy(buf.data + buf.tail, test_data, len);
|
||
|
|
buf.tail += len;
|
||
|
|
|
||
|
|
TEST_ASSERT_EQ(len, buffer_available_read(&buf), "Read capacity equals written data");
|
||
|
|
TEST_ASSERT_EQ(1024 - len, buffer_available_write(&buf), "Write capacity reduced");
|
||
|
|
|
||
|
|
buffer_free(&buf);
|
||
|
|
|
||
|
|
TEST_SUITE_END();
|
||
|
|
}
|
||
|
|
|
||
|
|
void test_buffer_consume(void) {
|
||
|
|
TEST_SUITE_BEGIN("Buffer Consume Operations");
|
||
|
|
|
||
|
|
buffer_t buf;
|
||
|
|
buffer_init(&buf, 1024);
|
||
|
|
|
||
|
|
const char *test_data = "0123456789";
|
||
|
|
size_t len = strlen(test_data);
|
||
|
|
memcpy(buf.data + buf.tail, test_data, len);
|
||
|
|
buf.tail += len;
|
||
|
|
|
||
|
|
buffer_consume(&buf, 5);
|
||
|
|
TEST_ASSERT_EQ(5, buffer_available_read(&buf), "5 bytes remaining after consume");
|
||
|
|
TEST_ASSERT(memcmp(buf.data + buf.head, "56789", 5) == 0, "Correct data after consume");
|
||
|
|
|
||
|
|
buffer_consume(&buf, 5);
|
||
|
|
TEST_ASSERT_EQ(0, buffer_available_read(&buf), "Buffer empty after full consume");
|
||
|
|
TEST_ASSERT_EQ(0, buf.head, "Head reset to 0");
|
||
|
|
TEST_ASSERT_EQ(0, buf.tail, "Tail reset to 0");
|
||
|
|
|
||
|
|
buffer_free(&buf);
|
||
|
|
|
||
|
|
TEST_SUITE_END();
|
||
|
|
}
|
||
|
|
|
||
|
|
void test_buffer_compact(void) {
|
||
|
|
TEST_SUITE_BEGIN("Buffer Compact Operations");
|
||
|
|
|
||
|
|
buffer_t buf;
|
||
|
|
buffer_init(&buf, 1024);
|
||
|
|
|
||
|
|
const char *test_data = "ABCDEFGHIJ";
|
||
|
|
size_t len = strlen(test_data);
|
||
|
|
memcpy(buf.data + buf.tail, test_data, len);
|
||
|
|
buf.tail += len;
|
||
|
|
|
||
|
|
buffer_consume(&buf, 5);
|
||
|
|
TEST_ASSERT_EQ(5, buf.head, "Head moved to 5");
|
||
|
|
|
||
|
|
buffer_compact(&buf);
|
||
|
|
TEST_ASSERT_EQ(0, buf.head, "Head is 0 after compact");
|
||
|
|
TEST_ASSERT_EQ(5, buf.tail, "Tail is 5 after compact");
|
||
|
|
TEST_ASSERT(memcmp(buf.data, "FGHIJ", 5) == 0, "Data moved to beginning");
|
||
|
|
|
||
|
|
buffer_free(&buf);
|
||
|
|
|
||
|
|
TEST_SUITE_END();
|
||
|
|
}
|
||
|
|
|
||
|
|
void test_buffer_ensure_capacity(void) {
|
||
|
|
TEST_SUITE_BEGIN("Buffer Ensure Capacity");
|
||
|
|
|
||
|
|
buffer_t buf;
|
||
|
|
buffer_init(&buf, 64);
|
||
|
|
|
||
|
|
int result = buffer_ensure_capacity(&buf, 128);
|
||
|
|
TEST_ASSERT_EQ(0, result, "Capacity increase successful");
|
||
|
|
TEST_ASSERT(buf.capacity >= 128, "Capacity at least 128");
|
||
|
|
|
||
|
|
result = buffer_ensure_capacity(&buf, 512);
|
||
|
|
TEST_ASSERT_EQ(0, result, "Second capacity increase successful");
|
||
|
|
TEST_ASSERT(buf.capacity >= 512, "Capacity at least 512");
|
||
|
|
|
||
|
|
result = buffer_ensure_capacity(&buf, 64);
|
||
|
|
TEST_ASSERT_EQ(0, result, "No change when capacity already sufficient");
|
||
|
|
|
||
|
|
buffer_free(&buf);
|
||
|
|
|
||
|
|
TEST_SUITE_END();
|
||
|
|
}
|
||
|
|
|
||
|
|
void test_buffer_multiple_operations(void) {
|
||
|
|
TEST_SUITE_BEGIN("Buffer Multiple Operations");
|
||
|
|
|
||
|
|
buffer_t buf;
|
||
|
|
buffer_init(&buf, 128);
|
||
|
|
|
||
|
|
for (int i = 0; i < 10; i++) {
|
||
|
|
char data[10];
|
||
|
|
snprintf(data, sizeof(data), "MSG%d", i);
|
||
|
|
size_t len = strlen(data);
|
||
|
|
|
||
|
|
if (buffer_available_write(&buf) < len) {
|
||
|
|
buffer_compact(&buf);
|
||
|
|
}
|
||
|
|
|
||
|
|
memcpy(buf.data + buf.tail, data, len);
|
||
|
|
buf.tail += len;
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST_ASSERT(buffer_available_read(&buf) > 0, "Buffer has data after multiple writes");
|
||
|
|
|
||
|
|
size_t total_read = 0;
|
||
|
|
while (buffer_available_read(&buf) > 0) {
|
||
|
|
size_t to_consume = buffer_available_read(&buf) > 5 ? 5 : buffer_available_read(&buf);
|
||
|
|
buffer_consume(&buf, to_consume);
|
||
|
|
total_read += to_consume;
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST_ASSERT(total_read > 0, "All data was consumed");
|
||
|
|
TEST_ASSERT_EQ(0, buffer_available_read(&buf), "Buffer is empty");
|
||
|
|
|
||
|
|
buffer_free(&buf);
|
||
|
|
|
||
|
|
TEST_SUITE_END();
|
||
|
|
}
|
||
|
|
|
||
|
|
void run_buffer_tests(void) {
|
||
|
|
test_buffer_init();
|
||
|
|
test_buffer_read_write();
|
||
|
|
test_buffer_consume();
|
||
|
|
test_buffer_compact();
|
||
|
|
test_buffer_ensure_capacity();
|
||
|
|
test_buffer_multiple_operations();
|
||
|
|
}
|