diff --git a/CMakeLists.txt b/CMakeLists.txt index 000817d..d1e3d44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,8 @@ set(SOURCES src/ctype/charprops.c src/ctype/classes.c src/ctype/convert.c + # stdlib + src/stdlib/arith.c # string src/string/memarray.c src/string/core.c diff --git a/include/ft/all-tests.h b/include/ft/all-tests.h index 5540ad3..05a210e 100644 --- a/include/ft/all-tests.h +++ b/include/ft/all-tests.h @@ -13,6 +13,9 @@ extern ft_test ft_ctype_functions; extern ft_test ft_ctype_convert_macros; extern ft_test ft_ctype_convert_functions; +/* stdlib */ +extern ft_test ft_stdlib_arith; + /* string */ extern ft_test ft_string_memset; extern ft_test ft_string_memcpy; diff --git a/src/main.c b/src/main.c index 260d64b..5e1a990 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,10 @@ ft_list headers_libc[] = { { "Format types and options", NULL, NULL }, { NULL }, }}, */ - { "", NULL }, + { "", (ft_test*[]){ + &ft_stdlib_arith, + NULL, + }}, { "", (ft_test*[]){ &ft_string_memset, &ft_string_memcpy, diff --git a/src/stdlib/arith.c b/src/stdlib/arith.c new file mode 100644 index 0000000..1b32222 --- /dev/null +++ b/src/stdlib/arith.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include + +static void _ft_stdlib_arith(ft_test *t) +{ + div_t d; + ldiv_t ld; + lldiv_t lld; + + ft_log(t, "abs with functions:\n"); + ft_assert_eval(t, abs(73), 73, "%d"); + ft_assert_eval(t, abs(-73), 73, "%d"); + ft_assert_eval(t, labs(73l), 73l, "%ld"); + ft_assert_eval(t, labs(-73l), 73l, "%ld"); + ft_assert_eval(t, llabs(73ll), 73ll, "%lld"); + ft_assert_eval(t, llabs(-73ll), 73ll, "%lld"); + + #undef abs + #undef labs + #undef llabs + + ft_log(t, "\nabs with macros:\n"); + ft_assert_eval(t, abs(73), 73, "%d"); + ft_assert_eval(t, abs(-73), 73, "%d"); + ft_assert_eval(t, labs(73l), 73l, "%ld"); + ft_assert_eval(t, labs(-73l), 73l, "%ld"); + ft_assert_eval(t, llabs(73ll), 73ll, "%lld"); + ft_assert_eval(t, llabs(-73ll), 73ll, "%lld"); + + ft_log(t, "\ndiv: by asserts (not shown)\n"); + d = div(73, 8); + ft_assert(t, d.quot == 9 && d.rem == 1); + d = div(-73, 8); + ft_assert(t, d.quot == -9 && d.rem == -1); + d = div(73, -8); + ft_assert(t, d.quot == -9 && d.rem == 1); + d = div(-73, -8); + ft_assert(t, d.quot == 9 && d.rem == -1); + + ld = ldiv(73l, 8l); + ft_assert(t, ld.quot == 9l && ld.rem == 1l); + ld = ldiv(-73l, 8l); + ft_assert(t, ld.quot == -9l && ld.rem == -1l); + ld = ldiv(73l, -8l); + ft_assert(t, ld.quot == -9l && ld.rem == 1l); + ld = ldiv(-73l, -8l); + ft_assert(t, ld.quot == 9l && ld.rem == -1l); + + lld = lldiv(73ll, 8ll); + ft_assert(t, lld.quot == 9ll && lld.rem == 1ll); + lld = lldiv(-73ll, 8ll); + ft_assert(t, lld.quot == -9ll && lld.rem == -1ll); + lld = lldiv(73ll, -8ll); + ft_assert(t, lld.quot == -9ll && lld.rem == 1ll); + lld = lldiv(-73ll, -8ll); + ft_assert(t, lld.quot == 9ll && lld.rem == -1ll); +} + +ft_test ft_stdlib_arith = { + .name = "Integer arithmetic functions", + .function = _ft_stdlib_arith, +};