1 #ifndef __CXXTEST__GUI_H 2 #define __CXXTEST__GUI_H 3 4 // 5 // GuiListener is a simple base class for the differes GUIs 6 // GuiTuiRunner<GuiT, TuiT> combines a GUI with a text-mode error formatter 7 // 8 9 #include <cxxtest/TeeListener.h> 10 11 namespace CxxTest 12 { 13 class GuiListener : public TestListener 14 { 15 public: GuiListener()16 GuiListener() : _state( GREEN_BAR ) {} ~GuiListener()17 virtual ~GuiListener() {} 18 runGui(int & argc,char ** argv,TestListener & listener)19 virtual void runGui( int &argc, char **argv, TestListener &listener ) 20 { 21 enterGui( argc, argv ); 22 TestRunner::runAllTests( listener ); 23 leaveGui(); 24 } 25 enterGui(int &,char **)26 virtual void enterGui( int & /*argc*/, char ** /*argv*/ ) {} leaveGui()27 virtual void leaveGui() {} 28 29 // 30 // The easy way is to implement these functions: 31 // guiEnterWorld(unsigned)32 virtual void guiEnterWorld( unsigned /*numTotalTests*/ ) {} guiEnterSuite(const char *)33 virtual void guiEnterSuite( const char * /*suiteName*/ ) {} guiEnterTest(const char *,const char *)34 virtual void guiEnterTest( const char * /*suiteName*/, const char * /*testName*/ ) {} yellowBar()35 virtual void yellowBar() {} redBar()36 virtual void redBar() {} 37 38 // 39 // The hard way is this: 40 // enterWorld(const WorldDescription & d)41 void enterWorld( const WorldDescription &d ) { guiEnterWorld( d.numTotalTests() ); } enterSuite(const SuiteDescription & d)42 void enterSuite( const SuiteDescription &d ) { guiEnterSuite( d.suiteName() ); } enterTest(const TestDescription & d)43 void enterTest( const TestDescription &d ) { guiEnterTest( d.suiteName(), d.testName() ); } leaveTest(const TestDescription &)44 void leaveTest( const TestDescription & ) {} leaveSuite(const SuiteDescription &)45 void leaveSuite( const SuiteDescription & ) {} leaveWorld(const WorldDescription &)46 void leaveWorld( const WorldDescription & ) {} 47 warning(const char *,unsigned,const char *)48 void warning( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ ) 49 { 50 yellowBarSafe(); 51 } 52 failedTest(const char *,unsigned,const char *)53 void failedTest( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ ) 54 { 55 redBarSafe(); 56 } 57 failedAssert(const char *,unsigned,const char *)58 void failedAssert( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ ) 59 { 60 redBarSafe(); 61 } 62 failedAssertEquals(const char *,unsigned,const char *,const char *,const char *,const char *)63 void failedAssertEquals( const char * /*file*/, unsigned /*line*/, 64 const char * /*xStr*/, const char * /*yStr*/, 65 const char * /*x*/, const char * /*y*/ ) 66 { 67 redBarSafe(); 68 } 69 failedAssertSameData(const char *,unsigned,const char *,const char *,const char *,const void *,const void *,unsigned)70 void failedAssertSameData( const char * /*file*/, unsigned /*line*/, 71 const char * /*xStr*/, const char * /*yStr*/, 72 const char * /*sizeStr*/, const void * /*x*/, 73 const void * /*y*/, unsigned /*size*/ ) 74 { 75 redBarSafe(); 76 } 77 failedAssertDelta(const char *,unsigned,const char *,const char *,const char *,const char *,const char *,const char *)78 void failedAssertDelta( const char * /*file*/, unsigned /*line*/, 79 const char * /*xStr*/, const char * /*yStr*/, const char * /*dStr*/, 80 const char * /*x*/, const char * /*y*/, const char * /*d*/ ) 81 { 82 redBarSafe(); 83 } 84 failedAssertDiffers(const char *,unsigned,const char *,const char *,const char *)85 void failedAssertDiffers( const char * /*file*/, unsigned /*line*/, 86 const char * /*xStr*/, const char * /*yStr*/, 87 const char * /*value*/ ) 88 { 89 redBarSafe(); 90 } 91 failedAssertLessThan(const char *,unsigned,const char *,const char *,const char *,const char *)92 void failedAssertLessThan( const char * /*file*/, unsigned /*line*/, 93 const char * /*xStr*/, const char * /*yStr*/, 94 const char * /*x*/, const char * /*y*/ ) 95 { 96 redBarSafe(); 97 } 98 failedAssertLessThanEquals(const char *,unsigned,const char *,const char *,const char *,const char *)99 void failedAssertLessThanEquals( const char * /*file*/, unsigned /*line*/, 100 const char * /*xStr*/, const char * /*yStr*/, 101 const char * /*x*/, const char * /*y*/ ) 102 { 103 redBarSafe(); 104 } 105 failedAssertPredicate(const char *,unsigned,const char *,const char *,const char *)106 void failedAssertPredicate( const char * /*file*/, unsigned /*line*/, 107 const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ ) 108 { 109 redBarSafe(); 110 } 111 failedAssertRelation(const char *,unsigned,const char *,const char *,const char *,const char *,const char *)112 void failedAssertRelation( const char * /*file*/, unsigned /*line*/, 113 const char * /*relation*/, const char * /*xStr*/, const char * /*yStr*/, 114 const char * /*x*/, const char * /*y*/ ) 115 { 116 redBarSafe(); 117 } 118 failedAssertThrows(const char *,unsigned,const char *,const char *,bool)119 void failedAssertThrows( const char * /*file*/, unsigned /*line*/, 120 const char * /*expression*/, const char * /*type*/, 121 bool /*otherThrown*/ ) 122 { 123 redBarSafe(); 124 } 125 failedAssertThrowsNot(const char *,unsigned,const char *)126 void failedAssertThrowsNot( const char * /*file*/, unsigned /*line*/, 127 const char * /*expression*/ ) 128 { 129 redBarSafe(); 130 } 131 132 protected: yellowBarSafe()133 void yellowBarSafe() 134 { 135 if ( _state < YELLOW_BAR ) { 136 yellowBar(); 137 _state = YELLOW_BAR; 138 } 139 } 140 redBarSafe()141 void redBarSafe() 142 { 143 if ( _state < RED_BAR ) { 144 redBar(); 145 _state = RED_BAR; 146 } 147 } 148 149 private: 150 enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state; 151 }; 152 153 template<class GuiT, class TuiT> 154 class GuiTuiRunner : public TeeListener 155 { 156 int &_argc; 157 char **_argv; 158 GuiT _gui; 159 TuiT _tui; 160 161 public: GuiTuiRunner(int & argc,char ** argv)162 GuiTuiRunner( int &argc, char **argv ) : 163 _argc( argc ), 164 _argv( argv ) 165 { 166 setFirst( _gui ); 167 setSecond( _tui ); 168 } 169 run()170 int run() 171 { 172 _gui.runGui( _argc, _argv, *this ); 173 return tracker().failedTests(); 174 } 175 }; 176 } 177 178 #endif //__CXXTEST__GUI_H 179