diff -r 945ee9bf2dd1 -r 3ca984931e1d tests/test_buffer.c --- a/tests/test_buffer.c Tue Jan 02 23:31:00 2024 +0100 +++ b/tests/test_buffer.c Wed Jan 03 22:17:40 2024 +0100 @@ -389,6 +389,202 @@ cxBufferDestroy(&buf); } +CX_TEST(test_buffer_eof_reached) { + CxBuffer buf; + cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); + buf.size = buf.pos = 3; + CX_TEST_DO { + CX_TEST_ASSERT(cxBufferEof(&buf)); + buf.pos = buf.size - 1; + CX_TEST_ASSERT(!cxBufferEof(&buf)); + cxBufferPut(&buf, 'a'); + CX_TEST_ASSERT(cxBufferEof(&buf)); + } + cxBufferDestroy(&buf); +} + +CX_TEST(test_buffer_eof_not_reached) { + CxBuffer buf; + cxBufferInit(&buf, NULL, 16, cxDefaultAllocator, CX_BUFFER_DEFAULT); + buf.size = 6; + CX_TEST_DO { + buf.pos = buf.size - 1; + CX_TEST_ASSERT(!cxBufferEof(&buf)); + buf.pos = 0; + cxBufferWrite("test", 1, 5, &buf); + CX_TEST_ASSERT(!cxBufferEof(&buf)); + } + cxBufferDestroy(&buf); +} + +#define TEST_BUFFER_SHIFT_SETUP(buf) \ + CxTestingAllocator talloc; \ + cx_testing_allocator_init(&talloc); \ + CxAllocator *alloc = &talloc.base; \ + CxBuffer buf; \ + cxBufferInit(&buf, NULL, 16, alloc, CX_BUFFER_DEFAULT); \ + memcpy(buf.space, "test____XXXXXXXX", 16); \ + buf.capacity = 8; \ + buf.pos = 4; \ + buf.size = 4 +#define TEST_BUFFER_SHIFT_TEARDOWN(buf) \ + cxBufferDestroy(&buf); \ + CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); \ + cx_testing_allocator_destroy(&talloc); + + +CX_TEST(test_buffer_shift_left_zero) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShiftLeft(&buf, 0); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 4); + CX_TEST_ASSERT(buf.size == 4); + CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_left_zero_offset_interface) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShift(&buf, -0); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 4); + CX_TEST_ASSERT(buf.size == 4); + CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_left_standard) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShiftLeft(&buf, 2); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 2); + CX_TEST_ASSERT(buf.size == 2); + CX_TEST_ASSERT(memcmp(buf.space, "stst____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_left_overshift) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShiftLeft(&buf, 6); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 0); + CX_TEST_ASSERT(buf.size == 0); + CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_left_overshift_pos_only) { + TEST_BUFFER_SHIFT_SETUP(buf); + buf.pos = 2; + CX_TEST_DO { + int ret = cxBufferShiftLeft(&buf, 3); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 0); + CX_TEST_ASSERT(buf.size == 1); + CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_left_offset_interface) { + TEST_BUFFER_SHIFT_SETUP(buf); + buf.pos = 3; + CX_TEST_DO { + int ret = cxBufferShift(&buf, -2); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 1); + CX_TEST_ASSERT(buf.size == 2); + CX_TEST_ASSERT(memcmp(buf.space, "stst____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_right_zero) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShiftRight(&buf, 0); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 4); + CX_TEST_ASSERT(buf.size == 4); + CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_right_zero_offset_interface) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShift(&buf, +0); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 4); + CX_TEST_ASSERT(buf.size == 4); + CX_TEST_ASSERT(memcmp(buf.space, "test____XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_right_standard) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShiftRight(&buf, 3); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 7); + CX_TEST_ASSERT(buf.size == 7); + CX_TEST_ASSERT(memcmp(buf.space, "testest_XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_right_overshift_discard) { + TEST_BUFFER_SHIFT_SETUP(buf); + CX_TEST_DO { + int ret = cxBufferShiftRight(&buf, 6); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 8); + CX_TEST_ASSERT(buf.size == 8); + CX_TEST_ASSERT(buf.capacity == 8); + CX_TEST_ASSERT(memcmp(buf.space, "test__teXXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_right_overshift_extend) { + TEST_BUFFER_SHIFT_SETUP(buf); + buf.flags |= CX_BUFFER_AUTO_EXTEND; + CX_TEST_DO { + int ret = cxBufferShiftRight(&buf, 6); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 10); + CX_TEST_ASSERT(buf.size == 10); + CX_TEST_ASSERT(buf.capacity >= 10); + // cannot assert more than 10 bytes because + // the buffer was required to reallocate the space + CX_TEST_ASSERT(memcmp(buf.space, "test__test", 10) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + +CX_TEST(test_buffer_shift_right_offset_interface) { + TEST_BUFFER_SHIFT_SETUP(buf); + buf.pos = 3; + CX_TEST_DO { + int ret = cxBufferShift(&buf, 2); + CX_TEST_ASSERT(ret == 0); + CX_TEST_ASSERT(buf.pos == 5); + CX_TEST_ASSERT(buf.size == 6); + CX_TEST_ASSERT(memcmp(buf.space, "tetest__XXXXXXXX", 16) == 0); + TEST_BUFFER_SHIFT_TEARDOWN(buf); + } +} + CxTestSuite *cx_test_suite_buffer(void) { CxTestSuite *suite = cx_test_suite_new("buffer"); @@ -413,6 +609,20 @@ cx_test_register(suite, test_buffer_seek_end_valid); cx_test_register(suite, test_buffer_seek_end_invalid); cx_test_register(suite, test_buffer_seek_whence_invalid); + cx_test_register(suite, test_buffer_eof_reached); + cx_test_register(suite, test_buffer_eof_not_reached); + cx_test_register(suite, test_buffer_shift_left_zero); + cx_test_register(suite, test_buffer_shift_left_zero_offset_interface); + cx_test_register(suite, test_buffer_shift_left_standard); + cx_test_register(suite, test_buffer_shift_left_overshift); + cx_test_register(suite, test_buffer_shift_left_overshift_pos_only); + cx_test_register(suite, test_buffer_shift_left_offset_interface); + cx_test_register(suite, test_buffer_shift_right_zero); + cx_test_register(suite, test_buffer_shift_right_zero_offset_interface); + cx_test_register(suite, test_buffer_shift_right_standard); + cx_test_register(suite, test_buffer_shift_right_overshift_discard); + cx_test_register(suite, test_buffer_shift_right_overshift_extend); + cx_test_register(suite, test_buffer_shift_right_offset_interface); return suite; }