1 #include "TestRunner.h"
2 #include "TestResults.h"
3 #include "TestReporter.h"
4 #include "TestReporterStdout.h"
5 #include "TimeHelpers.h"
6 #include "MemoryOutStream.h"
7 
8 #include <cstring>
9 
10 
11 namespace UnitTest {
12 
RunAllTests()13    int RunAllTests()
14    {
15       TestReporterStdout reporter;
16       TestRunner runner(reporter);
17       return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0);
18    }
19 
20 
TestRunner(TestReporter & reporter)21    TestRunner::TestRunner(TestReporter& reporter)
22       : m_reporter(&reporter)
23       , m_result(new TestResults(&reporter))
24       , m_timer(new Timer)
25    {
26       m_timer->Start();
27    }
28 
~TestRunner()29    TestRunner::~TestRunner()
30    {
31       delete m_result;
32       delete m_timer;
33    }
34 
GetTestResults()35    TestResults* TestRunner::GetTestResults()
36    {
37       return m_result;
38    }
39 
Finish() const40    int TestRunner::Finish() const
41    {
42       float const secondsElapsed = static_cast<float>(m_timer->GetTimeInMs() / 1000.0);
43       m_reporter->ReportSummary(m_result->GetTotalTestCount(),
44                                 m_result->GetFailedTestCount(),
45                                 m_result->GetFailureCount(),
46                                 secondsElapsed);
47 
48       return m_result->GetFailureCount();
49    }
50 
IsTestInSuite(const Test * const curTest,char const * suiteName) const51    bool TestRunner::IsTestInSuite(const Test* const curTest, char const* suiteName) const
52    {
53       using namespace std;
54       return (suiteName == NULL) || !strcmp(curTest->m_details.suiteName, suiteName);
55    }
56 
RunTest(TestResults * const result,Test * const curTest,int const maxTestTimeInMs) const57    void TestRunner::RunTest(TestResults* const result, Test* const curTest, int const maxTestTimeInMs) const
58    {
59       if (curTest->m_isMockTest == false)
60          CurrentTest::Results() = result;
61 
62       Timer testTimer;
63       testTimer.Start();
64 
65       result->OnTestStart(curTest->m_details);
66 
67       curTest->Run();
68 
69       double const testTimeInMs = testTimer.GetTimeInMs();
70       if (maxTestTimeInMs > 0 && testTimeInMs > maxTestTimeInMs && !curTest->m_details.timeConstraintExempt)
71       {
72          MemoryOutStream stream;
73          stream << "Global time constraint failed. Expected under " << maxTestTimeInMs <<
74             "ms but took " << testTimeInMs << "ms.";
75 
76          result->OnTestFailure(curTest->m_details, stream.GetText());
77       }
78 
79       result->OnTestFinish(curTest->m_details, static_cast< float >(testTimeInMs / 1000.0));
80    }
81 
82 }
83