#ifndef UNITTEST_TESTRUNNER_H #define UNITTEST_TESTRUNNER_H #include "Test.h" #include "TestList.h" #include "CurrentTest.h" namespace UnitTest { class TestReporter; class TestResults; class Timer; UNITTEST_LINKAGE int RunAllTests(); struct True { bool operator()(const Test* const) const { return true; } }; class UNITTEST_LINKAGE TestRunner { public: explicit TestRunner(TestReporter& reporter); ~TestRunner(); template< class Predicate > int RunTestsIf(TestList const& list, char const* suiteName, const Predicate& predicate, int maxTestTimeInMs) const { Test* curTest = list.GetHead(); while (curTest != 0) { if (IsTestInSuite(curTest, suiteName) && predicate(curTest)) RunTest(m_result, curTest, maxTestTimeInMs); curTest = curTest->m_nextTest; } return Finish(); } TestResults* GetTestResults(); private: TestReporter* m_reporter; TestResults* m_result; Timer* m_timer; int Finish() const; bool IsTestInSuite(const Test* const curTest, char const* suiteName) const; void RunTest(TestResults* const result, Test* const curTest, int const maxTestTimeInMs) const; }; } #endif