You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

119 lines
3.3 KiB

#ifndef _EXAM_H
#define _EXAM_H
#include <cl_number.h>
#include <cl_io.h>
// Michael Stoll 23. 3. 1993
// C++ version: Bruno Haible 1.11.1995
struct plus_test {
const char * arg1;
const char * arg2;
const char * result;
};
struct minus_test {
const char * arg1;
const char * arg2;
const char * result;
};
struct mul_test {
const char * arg1;
const char * arg2;
const char * result;
};
struct floor_test {
const char * arg1;
const char * arg2;
const char * result1;
const char * result2;
};
struct div_test {
const char * arg1;
const char * arg2;
const char * result;
};
#define num_elements(array) (sizeof(array)/sizeof(array[0]))
#define DO_BINOP_TEST(typename,type,rtype,opname,op) \
static int test_##typename##_##opname (void) \
{ \
int error = 0; \
for (unsigned int i = 0; i < num_elements(typename##_##opname##_tests); i++) { \
opname##_test& test = typename##_##opname##_tests[i]; \
type arg1 = type(test.arg1); \
type arg2 = type(test.arg2); \
rtype computed_result = arg1 op arg2; \
rtype result = rtype(test.result); \
if (computed_result != result) { \
fprint(cl_stderr, "Error in " #typename "_" #opname "_tests["); \
fprintdecimal(cl_stderr, i); \
fprint(cl_stderr, "] !\n"); \
fprint(cl_stderr, "Result should be: "); \
fprint(cl_stderr, result); \
fprint(cl_stderr, "\n"); \
fprint(cl_stderr, "Result computed : "); \
fprint(cl_stderr, computed_result); \
fprint(cl_stderr, "\n"); \
fprint(cl_stderr, "\n"); \
error = 1; \
} \
} \
return error; \
}
#define DO_FLOOR_TEST(typename,type) \
static int test_##typename##_floor (void) \
{ \
int error = 0; \
for (unsigned int i = 0; i < num_elements(typename##_floor_tests); i++) { \
floor_test& test = typename##_floor_tests[i]; \
type arg1 = type(test.arg1); \
type arg2 = type(test.arg2); \
type##_div_t computed_result = floor2(arg1,arg2); \
cl_I result1 = cl_I(test.result1); \
type result2 = type(test.result2); \
if ((computed_result.quotient != result1) || (computed_result.remainder != result2)) { \
fprint(cl_stderr, "Error in " #typename "_floor_tests["); \
fprintdecimal(cl_stderr, i); \
fprint(cl_stderr, "] !\n"); \
fprint(cl_stderr, "Results should be: "); \
fprint(cl_stderr, result1); \
fprint(cl_stderr, ", "); \
fprint(cl_stderr, result2); \
fprint(cl_stderr, "\n"); \
fprint(cl_stderr, "Results computed : "); \
fprint(cl_stderr, computed_result.quotient); \
fprint(cl_stderr, ", "); \
fprint(cl_stderr, computed_result.remainder); \
fprint(cl_stderr, "\n"); \
fprint(cl_stderr, "\n"); \
error = 1; \
} \
} \
return error; \
}
#define DO_TESTS(typename,type,qtype) \
DO_BINOP_TEST(typename,type,type,plus,+) \
DO_BINOP_TEST(typename,type,type,minus,-) \
DO_BINOP_TEST(typename,type,type,mul,*) \
DO_FLOOR_TEST(typename,type) \
DO_BINOP_TEST(typename,type,qtype,div,/) \
int test_##typename (void) \
{ \
int error = 0; \
error |= test_##typename##_plus(); \
error |= test_##typename##_minus(); \
error |= test_##typename##_mul(); \
error |= test_##typename##_floor(); \
error |= test_##typename##_div(); \
return error; \
}
#endif /* _EXAM_H */