1 /* 2 * Copyright (c) 2003, 2004 3 * Zdenek Nemec 4 * 5 * This material is provided "as is", with absolutely no warranty expressed 6 * or implied. Any use is at your own risk. 7 * 8 * Permission to use or copy this software for any purpose is hereby granted 9 * without fee, provided the above notices are retained on all copies. 10 * Permission to modify the code and to distribute modified code is granted, 11 * provided the above notices are retained, and a notice that the code was 12 * modified is included with the above copyright notice. 13 * 14 */ 15 16 /* $Id$ */ 17 18 #ifndef _CPPUNITMINIFILEREPORTERINTERFACE_H_ 19 #define _CPPUNITMINIFILEREPORTERINTERFACE_H_ 20 21 #include <stdio.h> 22 23 #include "cppunit_timer.h" 24 25 // 26 // CppUnit mini file(stream) reporter 27 // 28 class FileReporter : public CPPUNIT_NS::Reporter { 29 private: 30 FileReporter(const FileReporter&); 31 FileReporter& operator=(const FileReporter&); 32 public: 33 // reporting to stderr 34 explicit FileReporter(bool doMonitor = false): 35 m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(false), 36 m_failed(false), m_doMonitor(doMonitor) 37 { _file = stderr; } 38 39 // reporting to the file with the given name 40 explicit FileReporter(const char* file, bool doMonitor = false): 41 m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(true), 42 m_failed(false), m_doMonitor(doMonitor) 43 { 44 #ifndef _STLP_USE_SAFE_STRING_FUNCTIONS 45 _file = fopen(file, "w"); 46 #else 47 fopen_s(&_file, file, "w"); 48 #endif 49 } 50 51 // reporting to the given file 52 explicit FileReporter(FILE* stream, bool doMonitor = false): 53 m_numErrors(0), m_numIgnored(0), m_numExplicit(0), m_numTests(0), _myStream(false), 54 m_failed(false), m_doMonitor(doMonitor) 55 { _file = stream; } 56 ~FileReporter()57 virtual ~FileReporter() { 58 if (_myStream) 59 fclose(_file); 60 else 61 fflush(_file); 62 } 63 error(const char * in_macroName,const char * in_macro,const char * in_file,int in_line)64 virtual void error(const char *in_macroName, const char *in_macro, const char *in_file, int in_line) { 65 // Error might be called several times between 2 progress calls, we shouldn't however consider 66 // that a test failed twice so we simply keep the info that test failed, number of failed tests 67 // is computed later in end method. 68 m_failed = true; 69 fprintf(_file, "\n\n%s(%d) : %s(%s);", in_file, in_line, in_macroName, in_macro); 70 } 71 message(const char * msg)72 virtual void message( const char *msg ) 73 { fprintf(_file, "\n\t%s", msg ); } 74 progress(const char * in_className,const char * in_shortTestName,bool ignored,bool explicitTest)75 virtual void progress(const char *in_className, const char *in_shortTestName, bool ignored, bool explicitTest) { 76 if (m_doMonitor) { 77 m_globalTimer.restart(); 78 m_testTimer.start(); 79 } 80 ++m_numTests; 81 m_failed = false; 82 if (ignored) 83 ++m_numIgnored; 84 fprintf(_file, "%s::%s", in_className, in_shortTestName); 85 if (ignored) { 86 const char *ignoredReason; 87 if (explicitTest) { 88 ++m_numExplicit; 89 ignoredReason = " EXPLICIT"; 90 } 91 else 92 ignoredReason = " IGNORED"; 93 94 fprintf(_file, "%s", ignoredReason); 95 } 96 } 97 end()98 virtual void end() { 99 if (m_doMonitor) { 100 m_globalTimer.stop(); 101 m_testTimer.stop(); 102 fprintf(_file, " %f msec", m_testTimer.elapsedMilliseconds()); 103 } 104 if (m_failed) { 105 ++m_numErrors; 106 } 107 fprintf(_file, "\n"); 108 } 109 printSummary()110 virtual void printSummary() { 111 if (m_numErrors > 0) { 112 fprintf(_file, "\nThere were errors! %d of %d tests", m_numErrors, m_numTests); 113 } 114 else { 115 fprintf(_file, "\nOK %d tests", m_numTests); 116 } 117 118 if (m_numIgnored > 0) { 119 fprintf(_file, ", %d ignored", m_numIgnored); 120 } 121 122 if (m_numExplicit > 0) { 123 fprintf(_file, " (%d explicit)", m_numExplicit); 124 } 125 126 if (m_doMonitor) { 127 fprintf(_file, " %f msec", m_globalTimer.elapsedMilliseconds()); 128 } 129 130 fprintf(_file, "\n\n"); 131 } 132 private: 133 int m_numErrors; 134 int m_numIgnored; 135 int m_numExplicit; 136 int m_numTests; 137 // flag whether we own '_file' and are thus responsible for releasing it in the destructor 138 bool _myStream; 139 bool m_failed; 140 bool m_doMonitor; 141 Timer m_globalTimer, m_testTimer; 142 FILE* _file; 143 }; 144 145 #endif /*_CPPUNITMINIFILEREPORTERINTERFACE_H_*/ 146