160 lines
4.5 KiB
C
Raw Normal View History

2025-11-29 01:49:14 +01:00
#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();
}