/*
* 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_*/