87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// TEST.H
							 | 
						||
| 
								 | 
							
								// 
							 | 
						||
| 
								 | 
							
								// This file contains the Test class along with the macros which make effective
							 | 
						||
| 
								 | 
							
								// in the harness.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef TEST_H
							 | 
						||
| 
								 | 
							
								#define TEST_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <cmath>
							 | 
						||
| 
								 | 
							
								#include "SimpleString.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestResult;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Test
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									Test (const SimpleString& testName);
							 | 
						||
| 
								 | 
							
								  virtual ~Test() {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									virtual void	run (TestResult& result) = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void			setNext(Test *test);
							 | 
						||
| 
								 | 
							
									Test			*getNext () const;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool check (long expected, long actual, TestResult& result, const SimpleString& fileName, long lineNumber);
							 | 
						||
| 
								 | 
							
									bool check (const SimpleString& expected, const SimpleString& actual, TestResult& result, const SimpleString& fileName, long lineNumber);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									SimpleString	name_;
							 | 
						||
| 
								 | 
							
									Test			*next_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define TEST(testName, testGroup)\
							 | 
						||
| 
								 | 
							
								  class testGroup##testName##Test : public Test \
							 | 
						||
| 
								 | 
							
									{ public: testGroup##testName##Test () : Test (#testName "Test") {} \
							 | 
						||
| 
								 | 
							
								            void run (TestResult& result_);} \
							 | 
						||
| 
								 | 
							
								    testGroup##testName##Instance; \
							 | 
						||
| 
								 | 
							
									void testGroup##testName##Test::run (TestResult& result_) 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CHECK(condition)\
							 | 
						||
| 
								 | 
							
								{ if (!(condition)) \
							 | 
						||
| 
								 | 
							
								{ result_.addFailure (Failure (name_, __FILE__,__LINE__, #condition)); return; } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CHECK_EQUAL(expected,actual)\
							 | 
						||
| 
								 | 
							
								{ if ((expected) == (actual)) return; result_.addFailure(Failure(name_, __FILE__, __LINE__, StringFrom(expected), StringFrom(actual))); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define LONGS_EQUAL(expected,actual)\
							 | 
						||
| 
								 | 
							
								{ long actualTemp = actual; \
							 | 
						||
| 
								 | 
							
								  long expectedTemp = expected; \
							 | 
						||
| 
								 | 
							
								  if ((expectedTemp) != (actualTemp)) \
							 | 
						||
| 
								 | 
							
								{ result_.addFailure (Failure (name_, __FILE__, __LINE__, StringFrom(expectedTemp), \
							 | 
						||
| 
								 | 
							
								StringFrom(actualTemp))); return; } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DOUBLES_EQUAL(expected,actual,threshold)\
							 | 
						||
| 
								 | 
							
								{ double actualTemp = actual; \
							 | 
						||
| 
								 | 
							
								  double expectedTemp = expected; \
							 | 
						||
| 
								 | 
							
								  if (fabs ((expectedTemp)-(actualTemp)) > threshold) \
							 | 
						||
| 
								 | 
							
								{ result_.addFailure (Failure (name_, __FILE__, __LINE__, \
							 | 
						||
| 
								 | 
							
								StringFrom((double)expectedTemp), StringFrom((double)actualTemp))); return; } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define FAIL(text) \
							 | 
						||
| 
								 | 
							
								{ result_.addFailure (Failure (name_, __FILE__, __LINE__,(text))); return; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |