1 #ifndef __CXXTEST__GUI_H
2 #define __CXXTEST__GUI_H
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 //
9 #include <cxxtest/TeeListener.h>
11 namespace CxxTest
12 {
13 class GuiListener : public TestListener
14 {
15 public:
16 GuiListener() : _state( GREEN_BAR ) {}
17 virtual ~GuiListener() {}
19 virtual void runGui( int &argc, char **argv, TestListener &listener )
20 {
21 enterGui( argc, argv );
22 TestRunner::runAllTests( listener );
23 leaveGui();
24 }
26 virtual void enterGui( int & /*argc*/, char ** /*argv*/ ) {}
27 virtual void leaveGui() {}
29 //
30 // The easy way is to implement these functions:
31 //
32 virtual void guiEnterWorld( unsigned /*numTotalTests*/ ) {}
33 virtual void guiEnterSuite( const char * /*suiteName*/ ) {}
34 virtual void guiEnterTest( const char * /*suiteName*/, const char * /*testName*/ ) {}
35 virtual void yellowBar() {}
36 virtual void redBar() {}
38 //
39 // The hard way is this:
40 //
41 void enterWorld( const WorldDescription &d ) { guiEnterWorld( d.numTotalTests() ); }
42 void enterSuite( const SuiteDescription &d ) { guiEnterSuite( d.suiteName() ); }
43 void enterTest( const TestDescription &d ) { guiEnterTest( d.suiteName(), d.testName() ); }
44 void leaveTest( const TestDescription & ) {}
45 void leaveSuite( const SuiteDescription & ) {}
46 void leaveWorld( const WorldDescription & ) {}
48 void warning( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ )
49 {
50 yellowBarSafe();
51 }
53 void failedTest( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ )
54 {
55 redBarSafe();
56 }
58 void failedAssert( const char * /*file*/, unsigned /*line*/, const char * /*expression*/ )
59 {
60 redBarSafe();
61 }
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 }
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 }
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 }
85 void failedAssertDiffers( const char * /*file*/, unsigned /*line*/,
86 const char * /*xStr*/, const char * /*yStr*/,
87 const char * /*value*/ )
88 {
89 redBarSafe();
90 }
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 }
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 }
106 void failedAssertPredicate( const char * /*file*/, unsigned /*line*/,
107 const char * /*predicate*/, const char * /*xStr*/, const char * /*x*/ )
108 {
109 redBarSafe();
110 }
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 }
119 void failedAssertThrows( const char * /*file*/, unsigned /*line*/,
120 const char * /*expression*/, const char * /*type*/,
121 bool /*otherThrown*/ )
122 {
123 redBarSafe();
124 }
126 void failedAssertThrowsNot( const char * /*file*/, unsigned /*line*/,
127 const char * /*expression*/ )
128 {
129 redBarSafe();
130 }
132 protected:
133 void yellowBarSafe()
134 {
135 if ( _state < YELLOW_BAR ) {
136 yellowBar();
137 _state = YELLOW_BAR;
138 }
139 }
141 void redBarSafe()
142 {
143 if ( _state < RED_BAR ) {
144 redBar();
145 _state = RED_BAR;
146 }
147 }
149 private:
150 enum { GREEN_BAR, YELLOW_BAR, RED_BAR } _state;
151 };
153 template<class GuiT, class TuiT>
154 class GuiTuiRunner : public TeeListener
155 {
156 int &_argc;
157 char **_argv;
158 GuiT _gui;
159 TuiT _tui;
161 public:
162 GuiTuiRunner( int &argc, char **argv ) :
163 _argc( argc ),
164 _argv( argv )
165 {
166 setFirst( _gui );
167 setSecond( _tui );
168 }
170 int run()
171 {
172 _gui.runGui( _argc, _argv, *this );
173 return tracker().failedTests();
174 }
175 };
176 };
178 #endif //__CXXTEST__GUI_H