#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