Files
src_old/test/testframe.h
T

182 lines
5.9 KiB
C

/* Test framework borrowed from HDF5 1.8.3:
* test/h5test.h
* test/testhdf5.h
*/
#ifndef _H5HUT_TESTFRAME_H_
#define _H5HUT_TESTFRAME_H_
#include <H5hut.h>
#ifndef PARALLEL_IO
#define MPI_COMM_WORLD 0
#endif
/*
* Predefined test verbosity levels.
*
* Convention:
*
* The higher the verbosity value, the more information printed.
* So, output for higher verbosity also include output of all lower
* verbosity.
*
* Value Description
* 0 None: No informational message.
* 1 "All tests passed"
* 2 Header of overall test
* 3 Default: header and results of individual test
* 4
* 5 Low: Major category of tests.
* 6
* 7 Medium: Minor category of tests such as functions called.
* 8
* 9 High: Highest level. All information.
*/
#define VERBO_DEF 0 /* Default */
#define VERBO_LO 2 /* Low */
#define VERBO_MED 3 /* Medium */
#define VERBO_HI 4 /* High */
/*
* Verbose queries
* Only None needs an exact match. The rest are at least as much.
*/
#define VERBOSE_DEF (GetTestVerbosity()>=VERBO_DEF)
#define VERBOSE_LO (GetTestVerbosity()>=VERBO_LO)
#define VERBOSE_MED (GetTestVerbosity()>=VERBO_MED)
#define VERBOSE_HI (GetTestVerbosity()>=VERBO_HI)
#define SKIPTEST 1
#define ONLYTEST 2
#define BEGINTEST 3
/*
* Print the current location on the standard output stream.
*/
#define AT() TestPrintf (" at %s:%d in %s()...\n", \
__FILE__, __LINE__, __FUNCTION__);
/*
* The name of the test is printed by saying TESTING("something") which will
* result in the string `Testing something' being flushed to standard output.
* If a test passes, fails, or is skipped then the PASSED(), H5_FAILED(), or
* SKIPPED() macro should be called. After H5_FAILED() or SKIPPED() the caller
* should print additional information to stdout indented by at least four
* spaces. If the h5_errors() is used for automatic error handling then
* the H5_FAILED() macro is invoked automatically when an API function fails.
*/
#define TESTING(WHAT) {TestPrintf("Testing %-62s",WHAT); fflush(stdout);}
#define TESTING_2(WHAT) {TestPrintf(" Testing %-62s",WHAT); fflush(stdout);}
#define PASSED() {TestPrintf(" PASSED");fflush(stdout);}
#define H5_FAILED() {TestPrintf("*FAILED*");fflush(stdout);}
#define H5_WARNING() {TestPrintf("*WARNING*");fflush(stdout);}
#define SKIPPED() {TestPrintf(" -SKIP-");fflush(stdout);}
#define TEST_ERROR {H5_FAILED(); AT(); goto error;}
#define FAIL_PUTS_ERROR(s) {H5_FAILED(); AT(); TestPrintf(s); goto error;}
/* Use %ld to print the value because long should cover most cases. */
/* Used to make certain a return value _is_not_ a value */
#define RETURN(ret, val, where) do { \
if (VERBOSE_HI) TestPrintf( " Call to routine %15s at line %4d " \
"in %s returned %ld \n", \
where, (int)__LINE__, __FILE__, \
(long)(ret)); \
if ((ret) != (val)) { \
TestErrPrintf("*** UNEXPECTED RETURN from %s is %ld at line %4d " \
"in %s\n", where, (long)(ret), (int)__LINE__, __FILE__); \
} \
} while(0)
#define VALUE(val, expected, what) do { \
if ((val) != (expected)) { \
TestErrPrintf( "*** INCORRECT VALUE of %s at line " \
"%d in %s\n", what, (int)__LINE__, \
__FILE__); \
} \
} while(0)
#define IVALUE(val, expected, what) do { \
if (VERBOSE_HI) TestPrintf( " Value of int %15s at line %4d " \
"in %s is %ld =? %ld\n", what, \
(int)__LINE__, __FILE__, \
(long)(val), (long)(expected)); \
VALUE(val, expected, what); \
} while(0)
#define FVALUE(val, expected, what) do { \
if (VERBOSE_HI) TestPrintf( " Value of float %15s at line %4d " \
"in %s is %g =? %g\n", what, \
(int)__LINE__, __FILE__, \
(val), (expected)); \
VALUE(val, expected, what); \
} while(0)
#define CVALUE(val, expected, what) do { \
if (VERBOSE_HI) TestPrintf( " Value of char %15s at line %4d " \
"in %s is %c =? %c\n", what, \
(int)__LINE__, __FILE__, \
(val), (expected)); \
VALUE(val, expected, what); \
} while(0)
#define SVALUE(val, expected, what) do { \
if (VERBOSE_HI) TestPrintf( " Value of string %15s at line %4d " \
"in %s is %s =? %s\n", what, \
(int)__LINE__, __FILE__, \
(val), (expected)); \
if (strcmp(val,expected) != 0) { \
TestErrPrintf( "*** INCORRECT VALUE of %d at line " \
"%4d in %s\n", what, (int)__LINE__, \
__FILE__); \
} \
} while(0)
/* Used to document process through a test */
#define MESSAGE(V,A) do { \
if (V) TestPrintf A; \
} while(0)
#define TEST(WHAT) MESSAGE(VERBOSE_DEF,(WHAT "\n"))
/* definitions for command strings */
#define VERBOSITY_STR "Verbosity"
#define SKIP_STR "Skip"
#define TEST_STR "Test"
#define CLEAN_STR "Cleanup"
void TestUsage(void);
void AddTest(const char *TheName, void (*TheCall) (void),
void (*Cleanup) (void), const char *TheDescr,
const void *Parameters);
void TestInfo(const char *ProgName);
void TestParseCmdLine(int argc, char *argv[]);
void PerformTests(void);
void TestSummary(void);
void TestCleanup(void);
void TestInit(const char *ProgName, void (*private_usage)(void), int (*private_parser)(int ac, char *av[]));
int GetTestVerbosity(void);
int SetTestVerbosity(int newval);
int GetTestSummary(void);
int GetTestCleanup(void);
int SetTestNoCleanup(void);
int GetTestExpress(void);
int SetTestExpress(int newval);
void ParseTestVerbosity(char *argv);
int GetTestNumErrs(void);
void IncTestNumErrs(void);
const void *GetTestParameters(void);
int TestPrintf(const char *format, ...);
int TestErrPrintf(const char *format, ...);
void SetTest(const char *testname, int action);
void
get_attr_name(char *name, char *tag, int id);
void
test_open_objects(h5_file_t *file, int max_objects);
#endif