| 
									
										
										
										
											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>
 | 
					
						
							| 
									
										
										
										
											2012-07-18 23:43:54 +08:00
										 |  |  | #include <boost/lexical_cast.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestResult; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Test | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   Test (const std::string& testName); | 
					
						
							|  |  |  |   Test (const std::string& testName, const std::string& filename, long lineNumber, bool safeCheck); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |   virtual ~Test() {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   virtual void  run (TestResult& result) = 0; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   void      setNext(Test *test); | 
					
						
							|  |  |  |   Test      *getNext () const; | 
					
						
							|  |  |  |   std::string    getName() const {return name_;} | 
					
						
							|  |  |  |   std::string   getFilename() const {return filename_;} | 
					
						
							|  |  |  |   long      getLineNumber() const {return lineNumber_;} | 
					
						
							|  |  |  |   bool        safe() const {return safeCheck_;} | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   bool check (long expected, long actual, TestResult& result, const std::string& fileName, long lineNumber); | 
					
						
							|  |  |  |   bool check (const std::string& expected, const std::string& actual, TestResult& result, const std::string& fileName, long lineNumber); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   std::string  name_; | 
					
						
							|  |  |  |   Test      *next_; | 
					
						
							|  |  |  |   std::string   filename_; | 
					
						
							|  |  |  |   long       lineNumber_; /// This is the line line number of the test, rather than the a single check
 | 
					
						
							|  |  |  |   bool       safeCheck_; | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2012-12-07 04:08:52 +08:00
										 |  |  |  * Normal test will wrap execution in a try/catch block to catch exceptions more effectively | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-06-21 00:05:27 +08:00
										 |  |  | #define TEST(testGroup, testName)\
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |   class testGroup##testName##Test : public Test \ | 
					
						
							| 
									
										
										
										
											2012-12-07 04:08:52 +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; \ | 
					
						
							| 
									
										
										
										
											2012-12-07 04:08:52 +08:00
										 |  |  |   void testGroup##testName##Test::run (TestResult& result_)  | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2012-12-07 04:08:52 +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 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-06-21 00:05:27 +08:00
										 |  |  | #define TEST_UNSAFE(testGroup, testName)\
 | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  |   class testGroup##testName##Test : public Test \ | 
					
						
							| 
									
										
										
										
											2012-12-07 04:08:52 +08:00
										 |  |  |   { public: testGroup##testName##Test () : Test (#testName "Test", __FILE__, __LINE__, false) {} \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |             virtual ~testGroup##testName##Test () {};\ | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  |             void run (TestResult& result_);} \ | 
					
						
							|  |  |  |     testGroup##testName##Instance; \ | 
					
						
							| 
									
										
										
										
											2012-12-07 04:08:52 +08:00
										 |  |  |   void testGroup##testName##Test::run (TestResult& result_) | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-13 13:29:25 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Use this to disable unwanted tests without commenting them out. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define TEST_DISABLED(testGroup, testName)\
 | 
					
						
							|  |  |  |     void testGroup##testName##Test(TestResult& result_, const std::string& name_) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |     result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Didn't throw: ") + boost::lexical_cast<std::string>(#condition))); \ | 
					
						
							|  |  |  |     return; } \ | 
					
						
							| 
									
										
										
										
											2010-07-17 03:53:53 +08:00
										 |  |  |   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; \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |     result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Didn't throw: ") + boost::lexical_cast<std::string>(#condition))); \ | 
					
						
							|  |  |  |     return; } \ | 
					
						
							| 
									
										
										
										
											2012-07-01 03:18:27 +08:00
										 |  |  |   catch (exception_name&) {} \ | 
					
						
							| 
									
										
										
										
											2010-07-20 22:51:00 +08:00
										 |  |  |   catch (...) { \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Wrong exception: ") + boost::lexical_cast<std::string>(#condition) + boost::lexical_cast<std::string>(", expected: ") + boost::lexical_cast<std::string>(#exception_name))); \ | 
					
						
							|  |  |  |   return; } } | 
					
						
							| 
									
										
										
										
											2010-07-20 22:51:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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)\
 | 
					
						
							| 
									
										
										
										
											2012-07-18 23:43:54 +08:00
										 |  |  | { if ((expected) == (actual)) return; result_.addFailure(Failure(name_, __FILE__, __LINE__, boost::lexical_cast<std::string>(expected), boost::lexical_cast<std::string>(actual))); } | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define LONGS_EQUAL(expected,actual)\
 | 
					
						
							|  |  |  | { long actualTemp = actual; \ | 
					
						
							|  |  |  |   long expectedTemp = expected; \ | 
					
						
							|  |  |  |   if ((expectedTemp) != (actualTemp)) \ | 
					
						
							| 
									
										
										
										
											2012-07-18 23:43:54 +08:00
										 |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, boost::lexical_cast<std::string>(expectedTemp), \ | 
					
						
							|  |  |  | boost::lexical_cast<std::string>(actualTemp))); return; } } | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define DOUBLES_EQUAL(expected,actual,threshold)\
 | 
					
						
							|  |  |  | { double actualTemp = actual; \ | 
					
						
							|  |  |  |   double expectedTemp = expected; \ | 
					
						
							| 
									
										
										
										
											2013-08-03 03:04:52 +08:00
										 |  |  |   if (!std::isfinite(actualTemp) || !std::isfinite(expectedTemp) || fabs ((expectedTemp)-(actualTemp)) > threshold) \ | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, \ | 
					
						
							| 
									
										
										
										
											2012-07-18 23:43:54 +08:00
										 |  |  | boost::lexical_cast<std::string>((double)expectedTemp), boost::lexical_cast<std::string>((double)actualTemp))); return; } } | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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)) \ | 
					
						
							| 
									
										
										
										
											2012-07-18 23:43:54 +08:00
										 |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, boost::lexical_cast<std::string>(expectedTemp), \ | 
					
						
							|  |  |  | boost::lexical_cast<std::string>(actualTemp))); } } | 
					
						
							| 
									
										
										
										
											2010-08-06 22:23:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define EXPECT_DOUBLES_EQUAL(expected,actual,threshold)\
 | 
					
						
							|  |  |  | { double actualTemp = actual; \ | 
					
						
							|  |  |  |   double expectedTemp = expected; \ | 
					
						
							| 
									
										
										
										
											2013-08-03 03:04:52 +08:00
										 |  |  |   if (!std::isfinite(actualTemp) || !std::isfinite(expectedTemp) || fabs ((expectedTemp)-(actualTemp)) > threshold) \ | 
					
						
							| 
									
										
										
										
											2010-08-06 22:23:12 +08:00
										 |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, \ | 
					
						
							| 
									
										
										
										
											2012-07-18 23:43:54 +08:00
										 |  |  | boost::lexical_cast<std::string>((double)expectedTemp), boost::lexical_cast<std::string>((double)actualTemp))); } } | 
					
						
							| 
									
										
										
										
											2010-08-06 22:23:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define FAIL(text) \
 | 
					
						
							|  |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__,(text))); return; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |