#include "cx/test.h"
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
#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
CxTestSuite *cx_test_suite_szmul(
void) {
CxTestSuite *suite = cx_test_suite_new(
"szmul");
cx_test_register(suite, test_szmul);
#ifdef CX_SZMUL_BUILTIN
cx_test_register(suite, test_szmul_impl);
#endif
return suite;
}