X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/1c3b0c0e6f9339e76e42f6393e554c7dfc58e205..e858f29097fa175c861339a15c5e1f04ac511036:/t/test.h diff --git a/t/test.h b/t/test.h index 5ffe291..2a872f7 100644 --- a/t/test.h +++ b/t/test.h @@ -1,5 +1,5 @@ /* - * Copyright © 2012, 2020 Nick Bowler + * Copyright © 2012, 2020, 2022-2024 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,6 +28,19 @@ #endif #define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +/* + * The test_uintmax typedef is interchangeable with cdecl_uintmax defined in + * , but we may want to avoid including that header for some tests. + */ +#if HAVE_UNSIGNED_LONG_LONG_INT +typedef unsigned long long test_uintmax; +#elif HAVE_UNSIGNED___INT64 +typedef unsigned __int64 test_uintmax; +#else +typedef unsigned long test_uintmax; +#endif struct cdecl_declspec; struct option; @@ -35,15 +48,23 @@ struct cdecl; struct test_rng; +void print_error(const char *fmt, ...); + void *malloc_nofail(size_t size); void *realloc_nofail(void *ptr, size_t size); -void test_print_specifiers(struct cdecl_declspec *spec); -void test_print_decl(struct cdecl *decl); -void test_explain_decl(struct cdecl *decl); -bool strict_strtoul(unsigned long *val, const char *str, int base); +bool test_strtoumax(test_uintmax *out, const char *s, test_uintmax limit); + +static inline bool test_strtoul(unsigned long *val, const char *str) +{ + test_uintmax v; + bool rc; + + rc = test_strtoumax(&v, str, (unsigned long)-1); + *val = v; + return rc; +} -void test_print_version(const char *program); void test_print_options(const struct option *lopts); /* @@ -59,13 +80,26 @@ struct test_rng *test_rng_alloc(const char *seed); void test_rng_free(struct test_rng *rng); /* - * Return a random value uniformly on the half-open interval [0,1) + * Return a random integer uniformly on the closed interval [0, limit-1] */ -double test_rng_uniform(struct test_rng *rng); +unsigned test_rng_uniform_int(struct test_rng *rng, unsigned limit); /* - * Return a random integer uniformly on the closed interval [0, limit-1] + * Return false or true with 50% probablility either way. */ -unsigned test_rng_uniform_int(struct test_rng *rng, unsigned limit); +static inline int test_rng_50_50(struct test_rng *rng) +{ + return test_rng_uniform_int(rng, 2) == 0; +} + +#define VERSION_NO_COPYRIGHT_SYMBOL 1 +#include "version.h" + +#ifdef PROGNAME +const char *progname = PROGNAME; +#endif + +#define test_print_version(s) \ + do_print_version(s " (" PACKAGE_NAME ") " PACKAGE_VERSION) #endif