| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation,  | 
					
						
							|  |  |  |  * Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  |  * All Rights Reserved | 
					
						
							|  |  |  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * See LICENSE for the license information | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 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); | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | 	Test (const SimpleString& testName, const SimpleString& filename, long lineNumber, bool safeCheck); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |   virtual ~Test() {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void	run (TestResult& result) = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void			setNext(Test *test); | 
					
						
							|  |  |  | 	Test			*getNext () const; | 
					
						
							| 
									
										
										
										
											2010-07-17 03:30:38 +08:00
										 |  |  | 	SimpleString    getName() const {return name_;} | 
					
						
							|  |  |  | 	SimpleString 	getFilename() const {return filename_;} | 
					
						
							|  |  |  | 	long			getLineNumber() const {return lineNumber_;} | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | 	bool  			safe() const {return safeCheck_;} | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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_; | 
					
						
							| 
									
										
										
										
											2010-07-17 03:30:38 +08:00
										 |  |  | 	SimpleString 	filename_; | 
					
						
							|  |  |  | 	long 			lineNumber_; /// This is the line line number of the test, rather than the a single check
 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | 	bool 			safeCheck_; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Normal test will wrap execution in a try/catch block to catch exceptions more effectively | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #define TEST(testName, testGroup)\
 | 
					
						
							|  |  |  |   class testGroup##testName##Test : public Test \ | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | 	{ public: testGroup##testName##Test () : Test (#testName "Test", __FILE__, __LINE__, true) {} \ | 
					
						
							| 
									
										
										
										
											2011-09-03 23:36:44 +08:00
										 |  |  |             virtual ~testGroup##testName##Test () {};\ | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |             void run (TestResult& result_);} \ | 
					
						
							|  |  |  |     testGroup##testName##Instance; \ | 
					
						
							|  |  |  | 	void testGroup##testName##Test::run (TestResult& result_)  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * For debugging only: use TEST_UNSAFE to allow debuggers to have access to exceptions, as this | 
					
						
							|  |  |  |  * will not wrap execution with a try/catch block | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define TEST_UNSAFE(testName, testGroup)\
 | 
					
						
							|  |  |  |   class testGroup##testName##Test : public Test \ | 
					
						
							|  |  |  | 	{ public: testGroup##testName##Test () : Test (#testName "Test", __FILE__, __LINE__, false) {} \ | 
					
						
							|  |  |  |             void run (TestResult& result_);} \ | 
					
						
							|  |  |  |     testGroup##testName##Instance; \ | 
					
						
							|  |  |  | 	void testGroup##testName##Test::run (TestResult& result_) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-06 22:23:12 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Convention for tests: | 
					
						
							|  |  |  |  *  - "EXPECT" is a test that will not end execution of the series of tests | 
					
						
							|  |  |  |  *  - Otherwise, upon a failure, the test will end | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Usage: | 
					
						
							|  |  |  |  *  EXPECT is useful when checking several different parts of an condition so | 
					
						
							|  |  |  |  *  that a failure of one check won't hide another failure. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Note: Exception tests are not available in a EXPECT form, as exceptions rarely | 
					
						
							|  |  |  |  * fit the criteria of an assertion that does not need to be true to continue | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* True ASSERTs: tests end at first failure */ | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #define CHECK(condition)\
 | 
					
						
							|  |  |  | { if (!(condition)) \ | 
					
						
							|  |  |  | { result_.addFailure (Failure (name_, __FILE__,__LINE__, #condition)); return; } } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-17 03:53:53 +08:00
										 |  |  | #define THROWS_EXCEPTION(condition)\
 | 
					
						
							|  |  |  | { try { condition; \ | 
					
						
							|  |  |  | 		result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Didn't throw: ") + StringFrom(#condition))); \ | 
					
						
							|  |  |  | 		return; } \ | 
					
						
							|  |  |  |   catch (...) {} } | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-20 22:51:00 +08:00
										 |  |  | #define CHECK_EXCEPTION(condition, exception_name)\
 | 
					
						
							|  |  |  | { try { condition; \ | 
					
						
							|  |  |  | 		result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Didn't throw: ") + StringFrom(#condition))); \ | 
					
						
							|  |  |  | 		return; } \ | 
					
						
							|  |  |  |   catch (exception_name& e) {} \ | 
					
						
							|  |  |  |   catch (...) { \ | 
					
						
							|  |  |  | 	result_.addFailure (Failure (name_, __FILE__,__LINE__, SimpleString("Wrong exception: ") + StringFrom(#condition) + StringFrom(", expected: ") + StringFrom(#exception_name))); \ | 
					
						
							|  |  |  | 	return; } } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-14 04:01:58 +08:00
										 |  |  | #define EQUALITY(expected,actual)\
 | 
					
						
							|  |  |  |   { if (!assert_equal(expected,actual)) \ | 
					
						
							|  |  |  |     result_.addFailure(Failure(name_, __FILE__, __LINE__, #expected, #actual)); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #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; } } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-06 22:23:12 +08:00
										 |  |  | /* EXPECTs: tests will continue running after a failure */ | 
					
						
							|  |  |  | #define EXPECT(condition)\
 | 
					
						
							|  |  |  | { if (!(condition)) \ | 
					
						
							|  |  |  | { result_.addFailure (Failure (name_, __FILE__,__LINE__, #condition)); } } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define EXPECT_LONGS_EQUAL(expected,actual)\
 | 
					
						
							|  |  |  | { long actualTemp = actual; \ | 
					
						
							|  |  |  |   long expectedTemp = expected; \ | 
					
						
							|  |  |  |   if ((expectedTemp) != (actualTemp)) \ | 
					
						
							|  |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, StringFrom(expectedTemp), \ | 
					
						
							|  |  |  | StringFrom(actualTemp))); } } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define EXPECT_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))); } } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define FAIL(text) \
 | 
					
						
							|  |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__,(text))); return; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |