1 #ifndef __cxxtest__RealDescriptions_h__
2 #define __cxxtest__RealDescriptions_h__
4 //
5 // The "real" description classes
6 //
8 #include <cxxtest/Descriptions.h>
9 #include <cxxtest/TestSuite.h>
10 #include <cxxtest/GlobalFixture.h>
12 namespace CxxTest
13 {
14 class RealTestDescription : public TestDescription
15 {
16 public:
17 RealTestDescription();
18 RealTestDescription( List &argList, SuiteDescription &argSuite, unsigned argLine, const char *argTestName );
19 void initialize( List &argList, SuiteDescription &argSuite, unsigned argLine, const char *argTestName );
21 const char *file() const;
22 unsigned line() const;
23 const char *testName() const;
24 const char *suiteName() const;
26 TestDescription *next();
27 const TestDescription *next() const;
29 TestSuite *suite() const;
31 bool setUp();
32 void run();
33 bool tearDown();
35 private:
36 RealTestDescription( const RealTestDescription & );
37 RealTestDescription &operator=( const RealTestDescription & );
39 virtual void runTest() = 0;
41 SuiteDescription *_suite;
42 unsigned _line;
43 const char *_testName;
44 };
46 class RealSuiteDescription : public SuiteDescription
47 {
48 public:
49 RealSuiteDescription();
50 RealSuiteDescription( const char *argFile, unsigned argLine, const char *argSuiteName, List &argTests );
52 void initialize( const char *argFile, unsigned argLine, const char *argSuiteName, List &argTests );
54 const char *file() const;
55 unsigned line() const;
56 const char *suiteName() const;
58 TestDescription *firstTest();
59 const TestDescription *firstTest() const;
60 SuiteDescription *next();
61 const SuiteDescription *next() const;
63 unsigned numTests() const;
64 const TestDescription &testDescription( unsigned i ) const;
66 void activateAllTests();
67 bool leaveOnly( const char *testName );
69 private:
70 RealSuiteDescription( const RealSuiteDescription & );
71 RealSuiteDescription &operator=( const RealSuiteDescription & );
73 const char *_file;
74 unsigned _line;
75 const char *_suiteName;
76 List *_tests;
78 static List _suites;
79 friend class RealWorldDescription;
80 };
82 class StaticSuiteDescription : public RealSuiteDescription
83 {
84 public:
85 StaticSuiteDescription();
86 StaticSuiteDescription( const char *argFile, unsigned argLine,
87 const char *argSuiteName, TestSuite &argSuite,
88 List &argTests );
90 void initialize( const char *argFile, unsigned argLine,
91 const char *argSuiteName, TestSuite &argSuite,
92 List &argTests );
93 TestSuite *suite() const;
95 bool setUp();
96 bool tearDown();
98 private:
99 StaticSuiteDescription( const StaticSuiteDescription & );
100 StaticSuiteDescription &operator=( const StaticSuiteDescription & );
102 void doInitialize( TestSuite &argSuite );
104 TestSuite *_suite;
105 };
107 class CommonDynamicSuiteDescription : public RealSuiteDescription
108 {
109 public:
110 CommonDynamicSuiteDescription();
111 CommonDynamicSuiteDescription( const char *argFile, unsigned argLine,
112 const char *argSuiteName, List &argTests,
113 unsigned argCreateLine, unsigned argDestroyLine );
115 void initialize( const char *argFile, unsigned argLine,
116 const char *argSuiteName, List &argTests,
117 unsigned argCreateLine, unsigned argDestroyLine );
119 protected:
120 unsigned _createLine, _destroyLine;
122 private:
123 void doInitialize( unsigned argCreateLine, unsigned argDestroyLine );
124 };
126 template<class S>
127 class DynamicSuiteDescription : public CommonDynamicSuiteDescription
128 {
129 public:
130 DynamicSuiteDescription() {}
131 DynamicSuiteDescription( const char *argFile, unsigned argLine,
132 const char *argSuiteName, List &argTests,
133 S *&argSuite, unsigned argCreateLine,
134 unsigned argDestroyLine ) :
135 CommonDynamicSuiteDescription( argFile, argLine, argSuiteName, argTests, argCreateLine, argDestroyLine )
136 {
137 _suite = &argSuite;
138 }
140 void initialize( const char *argFile, unsigned argLine,
141 const char *argSuiteName, List &argTests,
142 S *&argSuite, unsigned argCreateLine,
143 unsigned argDestroyLine )
144 {
145 CommonDynamicSuiteDescription::initialize( argFile, argLine,
146 argSuiteName, argTests,
147 argCreateLine, argDestroyLine );
148 _suite = &argSuite;
149 }
151 TestSuite *suite() const { return realSuite(); }
153 bool setUp();
154 bool tearDown();
156 private:
157 S *realSuite() const { return *_suite; }
158 void setSuite( S *s ) { *_suite = s; }
160 void createSuite()
161 {
162 setSuite( S::createSuite() );
163 }
165 void destroySuite()
166 {
167 S *s = realSuite();
168 setSuite( 0 );
169 S::destroySuite( s );
170 }
172 S **_suite;
173 };
175 template<class S>
176 bool DynamicSuiteDescription<S>::setUp()
177 {
178 _TS_TRY {
179 _TSM_ASSERT_THROWS_NOTHING( file(), _createLine, "Exception thrown from createSuite()", createSuite() );
180 _TSM_ASSERT( file(), _createLine, "createSuite() failed", suite() != 0 );
181 }
182 _TS_CATCH_ABORT( { return false; } );
184 return (suite() != 0);
185 }
187 template<class S>
188 bool DynamicSuiteDescription<S>::tearDown()
189 {
190 if ( !_suite )
191 return true;
193 _TS_TRY {
194 _TSM_ASSERT_THROWS_NOTHING( file(), _destroyLine, "destroySuite() failed", destroySuite() );
195 }
196 _TS_CATCH_ABORT( { return false; } );
198 return true;
199 }
201 class RealWorldDescription : public WorldDescription
202 {
203 public:
204 static List &suites();
205 unsigned numSuites( void ) const;
206 unsigned numTotalTests( void ) const;
207 SuiteDescription *firstSuite();
208 const SuiteDescription *firstSuite() const;
209 const SuiteDescription &suiteDescription( unsigned i ) const;
210 void activateAllTests();
211 bool leaveOnly( const char *suiteName, const char *testName = 0 );
213 bool setUp();
214 bool tearDown();
215 static void reportError( const char *message );
216 };
218 void activateAllTests();
219 bool leaveOnly( const char *suiteName, const char *testName = 0 );
220 }
222 #endif // __cxxtest__RealDescriptions_h__