| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-11 22:39:48 +08:00
										 |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | 
					
						
							| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  |  * 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
 | 
					
						
							| 
									
										
										
										
											2019-02-11 22:39:48 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | // This file contains the Test class along with the macros which make effective
 | 
					
						
							|  |  |  | // in the harness.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef TEST_H
 | 
					
						
							|  |  |  | #define TEST_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <cmath>
 | 
					
						
							| 
									
										
										
										
											2023-02-06 15:06:06 +08:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2023-02-12 04:32:50 +08:00
										 |  |  |   virtual ~Test() {} | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) {} \ | 
					
						
							| 
									
										
										
										
											2020-07-26 15:57:54 +08:00
										 |  |  |             void run (TestResult& result_) override;} \ | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  |     testGroup##testName##Instance; \ | 
					
						
							| 
									
										
										
										
											2019-02-11 22:39:48 +08:00
										 |  |  |   void testGroup##testName##Test::run (TestResult& result_) | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-15 20:44:15 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Declare friend in a class to test its private methods | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define FRIEND_TEST(testGroup, testName) \
 | 
					
						
							|  |  |  |     friend class testGroup##testName##Test; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) {} \ | 
					
						
							| 
									
										
										
										
											2023-03-11 04:36:46 +08:00
										 |  |  |             virtual ~testGroup##testName##Test () {} \ | 
					
						
							| 
									
										
										
										
											2020-07-26 15:57:54 +08:00
										 |  |  |             void run (TestResult& result_) override;} \ | 
					
						
							| 
									
										
										
										
											2010-08-31 04:54:12 +08:00
										 |  |  |     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; \ | 
					
						
							| 
									
										
										
										
											2023-02-06 15:06:06 +08:00
										 |  |  |     result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Didn't throw: ") + std::string(#condition))); \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |     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; \ | 
					
						
							| 
									
										
										
										
											2023-02-06 15:06:06 +08:00
										 |  |  |     result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Didn't throw: ") + std::string(#condition))); \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |     return; } \ | 
					
						
							| 
									
										
										
										
											2012-07-01 03:18:27 +08:00
										 |  |  |   catch (exception_name&) {} \ | 
					
						
							| 
									
										
										
										
											2010-07-20 22:51:00 +08:00
										 |  |  |   catch (...) { \ | 
					
						
							| 
									
										
										
										
											2023-02-06 15:06:06 +08:00
										 |  |  |   result_.addFailure (Failure (name_, __FILE__,__LINE__, std::string("Wrong exception: ") + std::string(#condition) + std::string(", expected: ") + std::string(#exception_name))); \ | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   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)\
 | 
					
						
							| 
									
										
										
										
											2024-12-09 22:57:35 +08:00
										 |  |  | { if (!((expected) == (actual))) { result_.addFailure(Failure(name_, __FILE__, __LINE__, std::to_string(expected), std::to_string(actual))); return; } } | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define LONGS_EQUAL(expected,actual)\
 | 
					
						
							|  |  |  | { long actualTemp = actual; \ | 
					
						
							|  |  |  |   long expectedTemp = expected; \ | 
					
						
							|  |  |  |   if ((expectedTemp) != (actualTemp)) \ | 
					
						
							| 
									
										
										
										
											2023-02-06 15:06:06 +08:00
										 |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, std::to_string(expectedTemp), \ | 
					
						
							|  |  |  | std::to_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__, \ | 
					
						
							| 
									
										
										
										
											2023-02-06 23:48:10 +08:00
										 |  |  | std::to_string((double)expectedTemp), std::to_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)) \ | 
					
						
							| 
									
										
										
										
											2023-02-06 15:06:06 +08:00
										 |  |  | { result_.addFailure (Failure (name_, __FILE__, __LINE__, std::to_string(expectedTemp), \ | 
					
						
							|  |  |  | std::to_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__, \ | 
					
						
							| 
									
										
										
										
											2023-02-06 23:48:10 +08:00
										 |  |  | std::to_string((double)expectedTemp), std::to_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
 |