/* Copyright (C) 2005-2006 Feeling Software Inc. MIT License: http://www.opensource.org/licenses/mit-license.php */ #ifndef _FU_TESTBED_H_ #define _FU_TESTBED_H_ #include "FUtils/FULogFile.h" class FUTestSuite; /////////////////////////////////////////////////////////////////////////////// // QTestBed class // class FUTestBed { private: size_t testPassed, testFailed; FULogFile fileOut; string filename; bool isVerbose; public: FUTestBed(const char* filename, bool isVerbose); inline bool IsVerbose() const { return isVerbose; } bool RunTestbed(FUTestSuite* headTestSuite); void RunTestSuite(FUTestSuite* testSuite); }; /////////////////////////////////////////////////////////////////////////////// // QTestSuite class // class FUTestSuite { public: virtual size_t GetTestCount() = 0; virtual bool RunTest(FUTestBed& testBed, FULogFile& fileOut, size_t testIndex) = 0; }; /////////////////////////////////////////////////////////////////////////////// // Helpful Macros // #if defined(_FU_ASSERT_H_) && defined(_DEBUG) #define FailIf(a) \ if ((a)) { \ fileOut.WriteLine(__FILE__, __LINE__, " Test('%s') failed: %s.", szTestName, #a); \ extern bool skipAsserts; \ if (!skipAsserts) { \ __DEBUGGER_BREAK; \ skipAsserts = ignoreAssert; } \ return false; } #else // _FU_ASSERT_H_ && _DEBUG #define FailIf(a) \ if ((a)) { \ fileOut.WriteLine(__FILE__, __LINE__, " Test('%s') failed: %s.", szTestName, #a); \ return false; } #endif // _FU_ASSERT_H_ #define PassIf(a) FailIf(!(a)) #define Fail { bool b = true; FailIf(b); } #define TESTSUITE_START(suiteName) \ FUTestSuite* _test##suiteName; \ class FUTestSuite##suiteName : public FUTestSuite \ { \ public: \ FUTestSuite##suiteName() : FUTestSuite() { _test##suiteName = this; } \ bool RunTest(FUTestBed& testBed, FULogFile& fileOut, size_t testIndex) \ { \ switch (testIndex) { \ case ~0u : { \ if (testBed.IsVerbose()) { \ fileOut.WriteLine("Running %s...", #suiteName); \ } #define TESTSUITE_TEST(test_name) \ } return true; \ case (__COUNTER__): { \ static const char* szTestName = #test_name; #define TESTSUITE_END \ } return true; \ } \ fileOut.WriteLine(__FILE__, __LINE__, " Test suite implementation error."); \ return false; \ } \ size_t GetTestCount() { return __COUNTER__; } \ } __testSuite; #define RUN_TESTSUITE(suiteName) \ extern FUTestSuite* _test##suiteName; \ testBed.RunTestSuite(_test##suiteName); #define RUN_TESTBED(szTestSuiteHead, testPassed) { \ FUTestBed testBed; \ extern FUTestSuite* _test##szTestSuiteHead; \ testPassed = testBed.RunTestbed(_test##szTestSuiteHead); } #endif // _FU_TESTBED_H_