diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 13ebf3c..da63852 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories(../include ../src) set(TEST_SOURCES ordered-set.c + asprintf.c redirect.cc ) diff --git a/test/asprintf.c b/test/asprintf.c new file mode 100644 index 0000000..2640337 --- /dev/null +++ b/test/asprintf.c @@ -0,0 +1,65 @@ +#include "criterion/criterion.h" +#include "criterion/theories.h" +#include "criterion/asprintf-compat.h" + +#include + +union anyval { + int c; + int hd; + int d; + long ld; + long long lld; + unsigned int hu; + unsigned int u; + unsigned long lu; + unsigned long long llu; + double f; + const char *s; + void *p; +}; + +struct format_test { + const char *format; + union anyval *val; +}; + +# define VALUE(Fmt, Val) &(struct format_test) { .format = "%" #Fmt, .val = &(union anyval) { . Fmt = Val } } + +TheoryDataPoints(asprintf, valid) = { + DataPoints(struct format_test *, + VALUE(c, 'a'), + VALUE(hd, 42), + VALUE(d, 42), + VALUE(ld, 42), + VALUE(lld, 42), + VALUE(hu, 42), + VALUE(u, 42), + VALUE(lu, 42), + VALUE(llu, 42), + VALUE(f, 3.14), + VALUE(s, "foo"), + VALUE(p, NULL), + ), +}; + +Theory((struct format_test *fmt), asprintf, valid) { + char expected[32]; + snprintf(expected, sizeof (expected), fmt->format, *fmt->val); + + char *actual; + cr_asprintf(&actual, fmt->format, *fmt->val); + + cr_expect_str_eq(actual, expected); + + free(actual); +} + +#ifdef __GNUC__ +# pragma GCC diagnostic ignored "-Wformat" +#endif + +Test(asprintf, invalid) { + char *actual; + cr_expect_eq(cr_asprintf(&actual, "%"), -1); +}