Jon Test
C++ Unit Test Tool. Not for production -- sample code only
Loading...
Searching...
No Matches
TestSuiteTyped.h
Go to the documentation of this file.
1#ifndef JON_TEST_TEST_SUITE_TYPED_H
2#define JON_TEST_TEST_SUITE_TYPED_H
3
4#include "JonTest/Count.h"
5#include "JonTest/Logger.h"
6#include "JonTest/TestCase.h"
9
10#include <algorithm>
11#include <map>
12#include <string>
13#include <vector>
14
15namespace JonTest
16{
17
27template <typename TestSuiteDerived>
29{
30public:
32 typedef TestSuiteDerived TestSuite;
33
35 typedef void (TestSuite::*TestCaseMethod)();
36
37private:
39 const std::string suiteName;
40
42 std::map<std::string, TestCase<TestSuite>> cases;
43
44protected:
50 const char * const suiteName
51 )
53 {
55 }
56
57 virtual ~TestSuiteTyped() { }
58
59public:
62 const std::string&
63 getName() const {
64 return suiteName;
65 }
66
67 virtual bool
69 const std::string& caseName
70 ) const
71 {
72 return cases.end() != cases.find(caseName);
73 }
74
77 void add(
78 const char* const testCaseName,
79 TestCaseMethod const testCaseMethod
80 )
81 {
82 // \todo Error check for overwrite
83 cases[testCaseName] = TestCase<TestSuite>(testCaseName, testCaseMethod);
84 }
85
88 virtual int
90 std::ostream& out
91 ) const
92 {
93 std::vector<std::string> names;
94 for(const auto& testCase : cases)
95 {
96 names.push_back(testCase.first);
97 }
98 std::sort(names.begin(), names.end());
99
100 for(const auto& name : names)
101 {
102 out << "\t" << suiteName << ":" << name << "\n";
103 }
104
105 return cases.size();
106 }
107
110 virtual Count
112 Logger& logger
113 )
114 {
115 logger.startSuite(suiteName);
116
117 Count count;
118 for(auto& nameCase : cases)
119 {
120 ++count.count;
121 const bool passed = nameCase.second.run(static_cast<TestSuite&>(*this), logger);
122 if(! passed)
123 {
124 ++count.fails;
125 }
126 }
127
128 logger.endSuite(suiteName, count);
129 return count;
130 }
131
137 virtual Count
139 Logger& logger,
140 const std::string& testCase
141 )
142 {
143 // Skip reporting the suite on individual tests
144 Count count;
145 ++count.count;
146
147 const auto nameCase = cases.find(testCase);
148 if(cases.end() == nameCase)
149 {
150 ++count.fails;
151 return count;
152 }
153
154 const bool passed = nameCase->second.run(static_cast<TestSuite&>(*this), logger);
155 if(! passed)
156 {
157 ++count.fails;
158 }
159
160 return count;
161 }
162
163};
164
165}
166
167#endif
Count of tests run, and fails.
Definition Count.h:10
int fails
Number of tests that have failed.
Definition Count.h:18
int count
Number of tests that have been run.
Definition Count.h:14
Interface for logging events while running tests.
Definition Logger.h:18
Defines and runs a single Test Case within a Test Suite.
Definition TestCase.h:18
bool run(TestSuite &suite, Logger &logger) const
Run this Test Case as part of suite, logging events to logger.
Definition TestCase.h:74
void add(const char *const name, TestSuiteInterface *const suite)
Add the suite by name.
static TestRunner & get()
Get the singleton.
Interface for Test Suites.
Holds and runs Test Cases as a single Test Suite.
void(TestSuite::* TestCaseMethod)()
The actual Test Suite Method type for test cases.
const std::string & getName() const
Returns the name of this Test Suit.
void add(const char *const testCaseName, TestCaseMethod const testCaseMethod)
Add TestCaseMethod by name to this Test Suite.
TestSuiteDerived TestSuite
The actual Test Suite class.
virtual int listTestCases(std::ostream &out) const
List available Test Cases to out.
virtual Count run(Logger &logger)
Run all Test Cases in the Test Suite giving events to logger.
virtual bool isValid(const std::string &caseName) const
TestSuiteTyped(const char *const suiteName)
Create the Test Suite by name and add it to the TestRunner singleton.
std::map< std::string, TestCase< TestSuite > > cases
Map of Test Case name to TestCase<TestSuite> cases.
virtual Count run(Logger &logger, const std::string &testCase)
Runs the given testCase in this Test Suite.
const std::string suiteName
Name of this Test Suite.
Definition Count.h:5