diff -r e59b76889f00 -r d31f4d4075dc tests/test_utils.c --- a/tests/test_utils.c Wed Dec 20 16:46:14 2023 +0100 +++ b/tests/test_utils.c Wed Dec 20 17:57:18 2023 +0100 @@ -26,11 +26,230 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "test_utils.h" +#include "cx/test.h" + +#include "cx/utils.h" +#include "cx/buffer.h" + +CX_TEST(test_stream_bncopy) { + CxBuffer source, target; + char sbuf[32], tbuf[32]; + memset(tbuf, 0, 32); + cxBufferInit(&source, sbuf, 32, NULL, 0); + cxBufferInit(&target, tbuf, 32, NULL, 0); + cxBufferPutString(&source, "This is a stream copy test."); + cxBufferSeek(&source, 0, SEEK_SET); + char tmp[4]; + + CX_TEST_DO { + size_t result = cx_stream_bncopy(&source, &target, + (cx_read_func) cxBufferRead, + (cx_write_func) cxBufferWrite, + tmp, 4, 20); + CX_TEST_ASSERT(result == 20); + CX_TEST_ASSERT(target.size == 20); + CX_TEST_ASSERT(strcmp("This is a stream cop\0", tbuf) == 0); + + result = cx_stream_bcopy(&source, &target, + (cx_read_func) cxBufferRead, + (cx_write_func) cxBufferWrite, + NULL, 16); + + CX_TEST_ASSERT(result == 7); + CX_TEST_ASSERT(target.size == 27); + CX_TEST_ASSERT(strcmp("This is a stream copy test.\0", tbuf) == 0); + } + + cxBufferDestroy(&source); + cxBufferDestroy(&target); +} + +CX_TEST(test_stream_ncopy) { + CxBuffer source, target; + char sbuf[32], tbuf[32]; + memset(tbuf, 0, 32); + cxBufferInit(&source, sbuf, 32, NULL, 0); + cxBufferInit(&target, tbuf, 32, NULL, 0); + cxBufferPutString(&source, "This is a stream copy test."); + cxBufferSeek(&source, 0, SEEK_SET); + + CX_TEST_DO { + size_t result = cx_stream_ncopy(&source, &target, + (cx_read_func) cxBufferRead, + (cx_write_func) cxBufferWrite, + 20); + CX_TEST_ASSERT(result == 20); + CX_TEST_ASSERT(target.size == 20); + CX_TEST_ASSERT(strcmp("This is a stream cop\0", tbuf) == 0); + + result = cx_stream_copy(&source, &target, + (cx_read_func) cxBufferRead, + (cx_write_func) cxBufferWrite); + + CX_TEST_ASSERT(result == 7); + CX_TEST_ASSERT(target.size == 27); + CX_TEST_ASSERT(strcmp("This is a stream copy test.\0", tbuf) == 0); + } + + cxBufferDestroy(&source); + cxBufferDestroy(&target); +} + +CX_TEST(test_forn) { + unsigned j; + j = 0; + CX_TEST_DO { + cx_for_n(i, 50) { + CX_TEST_ASSERT(i == j); + j++; + } + } +} + +CX_TEST(test_swap_ptr) { + int i = 5; + int j = 8; + int *ip = &i; + int *jp = &j; + CX_TEST_DO { + cx_swap_ptr(ip, jp); + CX_TEST_ASSERT(ip == &j); + CX_TEST_ASSERT(jp == &i); + } +} + +CX_TEST(test_szmul) { + size_t r; + int e; + + CX_TEST_DO { + e = cx_szmul(5, 7, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 35); + + size_t s = SIZE_MAX & ~3; + + e = cx_szmul(s / 4, 2, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s / 2); + + e = cx_szmul(2, s / 4, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s / 2); + + e = cx_szmul(s / 4, 4, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s); + + e = cx_szmul(4, s / 4, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s); + + e = cx_szmul(s / 4, 5, &r); + CX_TEST_ASSERT(e != 0); + + e = cx_szmul(5, s / 4, &r); + CX_TEST_ASSERT(e != 0); + + e = cx_szmul(SIZE_MAX - 4, 0, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul(0, SIZE_MAX - 1, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul(SIZE_MAX, 0, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul(0, SIZE_MAX, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul(0, 0, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + } +} + +#ifdef CX_SZMUL_BUILTIN + +// also test the custom implementation +#undef CX_SZMUL_BUILTIN + +#include "../src/szmul.c" + +#define CX_SZMUL_BUILTIN + +CX_TEST(test_szmul_impl) { + size_t r; + int e; + + CX_TEST_DO { + e = cx_szmul_impl(5, 7, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 35); + + size_t s = SIZE_MAX & ~3; + + e = cx_szmul_impl(s / 4, 2, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s / 2); + + e = cx_szmul_impl(2, s / 4, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s / 2); + + e = cx_szmul_impl(s / 4, 4, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s); + + e = cx_szmul_impl(4, s / 4, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == s); + + e = cx_szmul_impl(s / 4, 5, &r); + CX_TEST_ASSERT(e != 0); + + e = cx_szmul_impl(5, s / 4, &r); + CX_TEST_ASSERT(e != 0); + + e = cx_szmul_impl(SIZE_MAX - 4, 0, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul_impl(0, SIZE_MAX - 1, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul_impl(SIZE_MAX, 0, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul_impl(0, SIZE_MAX, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + + e = cx_szmul_impl(0, 0, &r); + CX_TEST_ASSERT(e == 0); + CX_TEST_ASSERT(r == 0); + } +} + +#endif // CX_SZMUL_BUILTIN + CxTestSuite *cx_test_suite_utils(void) { CxTestSuite *suite = cx_test_suite_new("utils"); + cx_test_register(suite, test_stream_bncopy); + cx_test_register(suite, test_stream_ncopy); + cx_test_register(suite, test_forn); + cx_test_register(suite, test_swap_ptr); + cx_test_register(suite, test_szmul); + cx_test_register(suite, test_szmul_impl); + return suite; }