C++ Utilities  5.3.0
Useful C++ classes and routines such as argument parser, IO and conversion utilities
cppunit.h
Go to the documentation of this file.
1 #ifndef TESTUTILS_CPPUNIT_H
2 #define TESTUTILS_CPPUNIT_H
3 
4 #include "./testutils.h"
5 
6 #include "../application/commandlineutils.h"
7 
8 #include <cppunit/TestPath.h>
9 #include <cppunit/extensions/TestFactoryRegistry.h>
10 #include <cppunit/ui/text/TestRunner.h>
11 
12 #include <iostream>
13 
14 using namespace std;
15 using namespace CppUtilities;
16 using namespace CPPUNIT_NS;
17 
21 void printTestNames(Test *test, Indentation indentation)
22 {
23  for (int index = 0, count = test->getChildTestCount(); index != count; ++index) {
24  const auto childTest = test->getChildTestAt(index);
25  cerr << '\n' << indentation << " - " << childTest->getName();
26  printTestNames(childTest, indentation + 4);
27  }
28 }
29 
33 int main(int argc, char **argv)
34 {
35  TestApplication testApp(argc, argv);
36  if (!testApp) {
37  return -1;
38  }
39 
40  // list tests
41  TestFactoryRegistry &registry = TestFactoryRegistry::getRegistry();
42  if (testApp.onlyListUnits()) {
43  cerr << "Available tests:";
44  printTestNames(registry.makeTest(), Indentation(0));
45  cerr << '\n';
46  return 0;
47  }
48 
49  // run tests
50  TextUi::TestRunner runner;
51  if (!testApp.unitsSpecified() || testApp.units().empty()) {
52  // no units specified -> test all
53  runner.addTest(registry.makeTest());
54  } else {
55  // pick specified units from overall test
56  Test *overallTest = registry.makeTest();
57  vector<const char *> unavailableUnits;
58  for (const char *unit : testApp.units()) {
59  try {
60  runner.addTest(overallTest->findTest(unit));
61  } catch (const invalid_argument &) {
62  unavailableUnits.emplace_back(unit);
63  }
64  }
65  if (!unavailableUnits.empty()) {
66  cerr << "The following tests specified via --unit are not available:";
67  for (const char *unitName : unavailableUnits) {
68  cerr << "\n - " << unitName;
69  }
70  cerr << "\nAvailable tests:";
71  printTestNames(overallTest, Indentation(0));
72  cerr << '\n';
73  return -1;
74  }
75  }
76  const auto ok = runner.run(string(), false);
77  cerr << (ok ? "Tests successful\n" : "Tests failed\n");
78  return !ok;
79 }
80 
81 #endif // TESTUTILS_CPPUNIT_H
printTestNames
void printTestNames(Test *test, Indentation indentation)
Prints the names of all child tests of the specified test.
Definition: cppunit.h:21
CppUtilities::Indentation
The Indentation class allows printing indentation conveniently, eg.
Definition: commandlineutils.h:66
CppUtilities::TestApplication::unitsSpecified
bool unitsSpecified() const
Returns whether particular units have been specified.
Definition: testutils.h:121
CppUtilities::TestApplication::units
const std::vector< const char * > & units() const
Returns the specified test units.
Definition: testutils.h:130
CppUtilities::TestApplication
The TestApplication class simplifies writing test applications that require opening test files.
Definition: testutils.h:21
CppUtilities
Contains all utilities provides by the c++utilities library.
Definition: argumentparser.h:17
CppUtilities::TestApplication::onlyListUnits
bool onlyListUnits() const
Returns whether the test application should only list available units and not actually run any tests.
Definition: testutils.h:138
main
int main(int argc, char **argv)
Performs unit tests using cppunit.
Definition: cppunit.h:33
testutils.h