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 
Finish() const35 int TestRunner::Finish() const
36 {
37     float const secondsElapsed = m_timer->GetTimeInMs() / 1000.0f;
38     m_reporter->ReportSummary(m_result->GetTotalTestCount(),
39 							  m_result->GetFailedTestCount(),
40 							  m_result->GetFailureCount(),
41 							  secondsElapsed);
42 
43 	return m_result->GetFailureCount();
44 }
45 
IsTestInSuite(const Test * const curTest,char const * suiteName) const46 bool TestRunner::IsTestInSuite(const Test* const curTest, char const* suiteName) const
47 {
48 	using namespace std;
49 	return (suiteName == NULL) || !strcmp(curTest->m_details.suiteName, suiteName);
50 }
51 
RunTest(TestResults * const result,Test * const curTest,int const maxTestTimeInMs) const52 void TestRunner::RunTest(TestResults* const result, Test* const curTest, int const maxTestTimeInMs) const
53 {
54 	CurrentTest::Results() = result;
55 
56 	Timer testTimer;
57 	testTimer.Start();
58 
59 	result->OnTestStart(curTest->m_details);
60 
61 	curTest->Run();
62 
63 	int const testTimeInMs = testTimer.GetTimeInMs();
64 	if (maxTestTimeInMs > 0 && testTimeInMs > maxTestTimeInMs && !curTest->m_timeConstraintExempt)
65 	{
66 	    MemoryOutStream stream;
67 	    stream << "Global time constraint failed. Expected under " << maxTestTimeInMs <<
68 	            "ms but took " << testTimeInMs << "ms.";
69 
70 	    result->OnTestFailure(curTest->m_details, stream.GetText());
71 	}
72 
73 	result->OnTestFinish(curTest->m_details, testTimeInMs/1000.0f);
74 }
75 
76 }
77