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