#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