MT Core (C++)
Core library for replacing C++ standard in project usage
Loading...
Searching...
No Matches
mttest::TestSuites Struct Reference

Test suite metadata and runner. More...

#include <mttest.hpp>

Public Member Functions

bool operator+= (const TestCase &tc)
 
SuiteStatus run_suite (bool verbose, const std::string &suite)
 
SuiteStatus run (int argc, char **argv)
 

Public Attributes

std::map< std::string, std::vector< TestCase > > cases = {}
 

Detailed Description

Test suite metadata and runner.

Definition at line 171 of file mttest.hpp.

Member Function Documentation

◆ operator+=()

bool mttest::TestSuites::operator+= ( const TestCase & tc)
inline

Definition at line 174 of file mttest.hpp.

174 {
175 cases[tc.suite].push_back(tc);
176 return true;
177 }
std::map< std::string, std::vector< TestCase > > cases
Definition mttest.hpp:172

◆ run()

SuiteStatus mttest::TestSuites::run ( int argc,
char ** argv )
inline

Definition at line 268 of file mttest.hpp.

268 {
269 std::vector<std::string> suites;
270 bool verbose = false;
271 for (int i = 1; i < argc; ++i) {
272 if (strcmp("-v", argv[i]) == 0) {
273 verbose = true;
274 } else {
275 suites.emplace_back(argv[i]);
276 }
277 }
278
279 SuiteStatus status = OK;
280 if (suites.empty()) {
281 for (const auto &[suite, cases] : cases) {
282 status = std::max(status, run_suite(verbose, suite));
283 }
284 return status;
285 }
286 for (const auto &s : suites) {
287 status = std::max(status, run_suite(verbose, s));
288 }
289 return status;
290 }
SuiteStatus
Test suite status.
Definition mttest.hpp:164
SuiteStatus run_suite(bool verbose, const std::string &suite)
Definition mttest.hpp:179
Here is the call graph for this function:

◆ run_suite()

SuiteStatus mttest::TestSuites::run_suite ( bool verbose,
const std::string & suite )
inline

Definition at line 179 of file mttest.hpp.

179 {
180 auto startTime = std::chrono::system_clock::now();
181 auto test_cases = cases[suite];
182 std::cout << suite << std::flush;
183 bool suite_nl = false;
184 auto print_suite_nl = [&] {
185 if (suite_nl)
186 return;
187 suite_nl = true;
188 std::cout << "\n";
189 };
191 for (const auto &tc : test_cases) {
192 auto tcStart = std::chrono::system_clock::now();
193 bool printed = false;
194 auto print_case = [&] {
195 print_suite_nl();
196 if (printed) return;
197 printed = true;
198 std::cout << "\tCASE " << tc.name << std::flush;
199 };
200 if (verbose) print_case();
201
202 auto context = mttest::TestContext{};
203
204#if __cpp_exceptions
205 try {
206 tc.case_impl(context);
207 } catch (const std::runtime_error &err) {
208 context.add_error("Uncaught Exception", err, tc.name, 0);
209 } catch (int err) {
210 context.add_error("Uncaught Exception", err, tc.name, 0);
211 } catch (...) {
212 context.add_error("Uncaught Exception", tc.name, 0);
213 }
214#else
215 tc.case_impl(context);
216#endif
217 if (context.errors.empty() && context.failures.empty() && verbose) {
218 std::cout << " [PASS]";
219 } else if (!context.errors.empty()) {
220 print_case();
221 std::cout << " [ERROR]";
222 status = std::max(status, mttest::ERROR);
223 } else if (!context.failures.empty()) {
224 print_case();
225 std::cout << " [FAILED]";
226 status = std::max(status, mttest::FAIL);
227 }
228
229 if (printed) {
230 std::cout << " (" <<
231 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - tcStart).count()
232 << "ms)" << std::endl;
233 }
234
235 for (const auto &err : context.errors) {
236 std::cout << "\t\t" << err.cond << " ERRED WITH " << err.err << "\n"
237 << "\t\t\tWHERE: " << err.file << ":" << err.line << "\n";
238 }
239
240 for (const auto &fail : context.failures) {
241 std::cout << "\t\t" << fail.cond << " FAILED! " << fail.message << "\n"
242 << "\t\t\tWHERE: " << fail.file << ":" << fail.line << "\n";
243 }
244 }
245
246 if (!suite_nl) {
247 std::cout << " ";
248 } else {
249 std::cout << suite << " ";
250 }
251
252 switch (status) {
253 case OK:
254 std::cout << "[PASSED]";
255 break;
256 case FAIL:
257 std::cout << "[FAILED]";
258 break;
259 case ERROR:
260 std::cout << "[ERRED]";
261 break;
262 }
263 std::cout << " (" << std::chrono::duration_cast<std::chrono::milliseconds>(
264 std::chrono::system_clock::now() - startTime).count() << "ms)" << std::endl;
265 return status;
266 }
@ ERROR
Definition mttest.hpp:167
Here is the caller graph for this function:

Member Data Documentation

◆ cases

std::map<std::string, std::vector<TestCase> > mttest::TestSuites::cases = {}

Definition at line 172 of file mttest.hpp.

172{};

The documentation for this struct was generated from the following file: