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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							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 */
 |