From 7acfca905d76140f4cc0b09c9a12de237de364cd Mon Sep 17 00:00:00 2001 From: Nick Barnes Date: Wed, 31 Oct 2001 14:40:56 +0000 Subject: Branch imports for masters. Copied from Perforce Change: 23678 ServerID: perforce.ravenbrook.com --- mps/code/testlib.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 mps/code/testlib.c (limited to 'mps/code/testlib.c') diff --git a/mps/code/testlib.c b/mps/code/testlib.c new file mode 100644 index 00000000000..d7ea32271f9 --- /dev/null +++ b/mps/code/testlib.c @@ -0,0 +1,110 @@ +/* impl.c.testlib: TEST LIBRARY + * + * $HopeName: MMsrc!testlib.c(trunk.22) $ + * Copyright (C) 2000 Harlequin Limited. All rights reserved. + * + * .purpose: A library of functions that may be of use to unit tests. + */ + +#include "testlib.h" +#include "mps.h" +#include "mpm.h" +#include +#include +#ifdef MPS_OS_IA +struct itimerspec; /* stop complaints from time.h */ +#endif +#include + + +/* rnd -- a random number generator + * + * I nabbed it from "ML for the Working Programmer" + * Originally from: + * Stephen K Park & Keith W Miller (1988). Random number generators: + * good one are to find. Communications of the ACM, 31:1192-1201 + */ + +unsigned long rnd(void) +{ + static unsigned long seed = 1; + double s; + s = seed; + s *= 16807.0; + s = fmod(s, 2147483647.0); /* 2^31 - 1 */ + seed = (unsigned long)s; + return seed; +} + + +/* randomize -- randomize the generator, or initialize to replay */ + +void randomize(int argc, char **argv) +{ + int i, k, n; + + if(argc > 1) { + n = sscanf(argv[1], "%d", &k); + die((n == 1) ? MPS_RES_OK : MPS_RES_FAIL, "randomize"); + } else { + k = time(NULL) % 32000; + printf("Randomizing %d times.\n", k); + } + + /* Randomize the random number generator a bit. */ + for (i = k; i > 0; --i) + rnd(); +} + + +/* verror -- die with message */ + +void verror(const char *format, va_list args) +{ + fflush(stdout); /* synchronize */ + vfprintf(stderr, format, args); + fprintf(stderr, "\n"); + exit(1); +} + + +/* error -- die with message */ + +void error(const char *format, ...) +{ + va_list args; + + va_start(args, format); + verror(format, args); + va_end(args); +} + + +/* die -- Test a return code, and exit on error */ + +void die(mps_res_t res, const char *s) +{ + if (res != MPS_RES_OK) { + error("\n%s: %d\n", s, res); + } +} + + +/* die_expect -- Test a return code, and exit on unexpected result */ + +void die_expect(mps_res_t res, mps_res_t expected, const char *s) +{ + if (res != expected) { + error("\n%s: %d\n", s, res); + } +} + + +/* cdie -- Test a C boolean, and exit on error */ + +void cdie(int res, const char *s) +{ + if (!res) { + error("\n%s: %d\n", s, res); + } +} -- cgit v1.2.1