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.
 
 
 
 
 

103 lines
2.9 KiB

#ifndef _EXAM_H
#define _EXAM_H
#include <cln/number.h>
#include <cln/io.h>
using namespace std;
using namespace cln;
// 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) { \
std::cerr << "Error in " #typename "_" #opname "_tests[" << i << "] !" << endl; \
std::cerr << "Result should be: " << result << endl; \
std::cerr << "Result computed : " << computed_result << endl << endl; \
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)) { \
std::cerr << "Error in " #typename "_floor_tests[" << i << endl; \
std::cerr << "Results should be: " << result1 << ", " << result2 << endl; \
std::cerr << "Results computed : " << computed_result.quotient << ", " << computed_result.remainder << endl << endl; \
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 */