X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/b084087ede50ac90d2493b6192fec9b7342e30bf..3156083fd0c328d46be22536720ae33e1ab48090:/tests/tut/tut_cppunit_reporter.hpp diff --git a/tests/tut/tut_cppunit_reporter.hpp b/tests/tut/tut_cppunit_reporter.hpp new file mode 100644 index 00000000..3b9f38c1 --- /dev/null +++ b/tests/tut/tut_cppunit_reporter.hpp @@ -0,0 +1,201 @@ + +#ifndef TUT_CPPUNIT_REPORTER +#define TUT_CPPUNIT_REPORTER + +#include +#include +#include +#include +#include + +namespace tut +{ + +/** + * CppUnit TUT reporter + */ +class cppunit_reporter : public tut::callback +{ + private: + std::vector failed_tests; + std::vector passed_tests; + std::string filename; + + std::string encode(const std::string & text) + { + std::string out; + + for (unsigned int i=0; i': + out += ">"; + break; + case '&': + out += "&"; + break; + case '\'': + out += "'"; + break; + case '"': + out += """; + break; + default: + out += c; + } + } + + return out; + } + +public: + + cppunit_reporter(const std::string & _filename = "") + { + setFilename(_filename); + } + + void setFilename(const std::string & _filename) + { + if (_filename == "") + { + filename = "testResult.xml"; + } + else + { + filename = _filename; + } + } + + void run_started() + { + failed_tests.clear(); + passed_tests.clear(); + } + + void test_completed(const tut::test_result& tr) + { + if (tr.result == test_result::ok) { + passed_tests.push_back(tr); + } else { + failed_tests.push_back(tr); + } + } + + void run_completed() + { + int errors = 0; + int failures = 0; + std::string failure_type; + std::string failure_msg; + std::ofstream xmlfile; + + xmlfile.open(filename.c_str(), std::ios::in | std::ios::trunc); + if (!xmlfile.is_open()) { + throw (std::runtime_error("Cannot open file for output")); + } + + /* *********************** header ***************************** */ + xmlfile << "" << std::endl + << "" << std::endl; + + /* *********************** failed tests ***************************** */ + if (failed_tests.size() > 0) { + xmlfile << " " << std::endl; + + for (unsigned int i=0; i" << std::endl + << " " << encode(failed_tests[i].group) + "::" + encode(failed_tests[i].name) << "" << std::endl + << " " << failure_type << "" << std::endl + << " " << std::endl + << " Unknown" << std::endl + << " Unknown" << std::endl + << " " << std::endl + << " " << encode(failure_msg + failed_tests[i].message) << "" << std::endl + << " " << std::endl; + } + + xmlfile << " " << std::endl; + } + + /* *********************** passed tests ***************************** */ + if (passed_tests.size() > 0) { + xmlfile << " " << std::endl; + + for (unsigned int i=0; i" << std::endl + << " " << encode(passed_tests[i].group) + "::" + encode(passed_tests[i].name) << "" << std::endl + << " " << std::endl; + } + + xmlfile << " " << std::endl; + } + + /* *********************** statistics ***************************** */ + xmlfile << " " << std::endl + << " " << (failed_tests.size() + passed_tests.size()) << "" << std::endl + << " " << failed_tests.size() << "" << std::endl + << " " << errors << "" << std::endl + << " " << failures << "" << std::endl + << " " << std::endl; + + /* *********************** footer ***************************** */ + xmlfile << "" << std::endl; + + xmlfile.close(); + } + + bool all_ok() const + { + return failed_tests.empty(); + }; + + +}; + +} + +#endif +