/* * Copyright (c) 2003, 2004 * Zdenek Nemec * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */ /* $Id$ */ #ifndef _CPPUNITMINIFILEREPORTERINTERFACE_H_ #define _CPPUNITMINIFILEREPORTERINTERFACE_H_ #include <stdio.h> #include "cppunit_timer.h" // // CppUnit mini file(stream) reporter // class FileReporter : public CPPUNIT_NS::Reporter { private: FileReporter(const FileReporter&); FileReporter& operator=(const FileReporter&); public: // reporting to stderr explicit FileReporter(bool doMonitor = false): m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(false), m_failed(false), m_doMonitor(doMonitor) { _file = stderr; } // reporting to the file with the given name explicit FileReporter(const char* file, bool doMonitor = false): m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(true), m_failed(false), m_doMonitor(doMonitor) { #ifndef _STLP_USE_SAFE_STRING_FUNCTIONS _file = fopen(file, "w"); #else fopen_s(&_file, file, "w"); #endif } // reporting to the given file explicit FileReporter(FILE* stream, bool doMonitor = false): m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(false), m_failed(false), m_doMonitor(doMonitor) { _file = stream; } virtual ~FileReporter() { if (_myStream) fclose(_file); else fflush(_file); } virtual void error(const char *in_macroName, const char *in_macro, const char *in_file, int in_line) { // Error might be called several times between 2 progress calls, we shouldn't however consider // that a test failed twice so we simply keep the info that test failed, number of failed tests // is computed later in end method. m_failed = true; fprintf(_file, "\n\n%s(%d) : %s(%s);", in_file, in_line, in_macroName, in_macro); } virtual void message( const char *msg ) { fprintf(_file, "\n\t%s", msg ); } virtual void progress(const char *in_className, const char *in_shortTestName, bool ignored, bool explicitTest) { if (m_doMonitor) { m_globalTimer.restart(); m_testTimer.start(); } ++m_numTests; m_failed = false; if (ignored) ++m_numIgnored; fprintf(_file, "%s::%s", in_className, in_shortTestName); if (ignored) { const char *ignoredReason; if (explicitTest) { ++m_numExplicit; ignoredReason = " EXPLICIT"; } else ignoredReason = " IGNORED"; fprintf(_file, "%s", ignoredReason); } } virtual void end() { if (m_doMonitor) { m_globalTimer.stop(); m_testTimer.stop(); fprintf(_file, " %f msec", m_testTimer.elapsedMilliseconds()); } if (m_failed) { ++m_numErrors; } fprintf(_file, "\n"); } virtual void printSummary() { if (m_numErrors > 0) { fprintf(_file, "\nThere were errors! %d of %d tests", m_numErrors, m_numTests); } else { fprintf(_file, "\nOK %d tests", m_numTests); } if (m_numIgnored > 0) { fprintf(_file, ", %d ignored", m_numIgnored); } if (m_numExplicit > 0) { fprintf(_file, " (%d explicit)", m_numExplicit); } if (m_doMonitor) { fprintf(_file, " %f msec", m_globalTimer.elapsedMilliseconds()); } fprintf(_file, "\n\n"); } private: int m_numErrors; int m_numIgnored; int m_numExplicit; int m_numTests; // flag whether we own '_file' and are thus responsible for releasing it in the destructor bool _myStream; bool m_failed; bool m_doMonitor; Timer m_globalTimer, m_testTimer; FILE* _file; }; #endif /*_CPPUNITMINIFILEREPORTERINTERFACE_H_*/