1 /*
2 * Created by Phil on 1/10/2015.
3 * Copyright 2015 Two Blue Cubes Ltd
4 *
5 * Distributed under the Boost Software License, Version 1.0. (See accompanying
6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 */
8 #include "internal/catch_suppress_warnings.h"
9 #include "internal/catch_test_case_tracker.h"
10
11
12 namespace Catch
13 {
14 class LocalContext {
15
16 public:
operator ()() const17 TrackerContext& operator()() const {
18 return TrackerContext::instance();
19 }
20 };
21
22 } // namespace Catch
23
C_A_T_C_H_Context()24 inline Catch::TrackerContext& C_A_T_C_H_Context() {
25 return Catch::TrackerContext::instance();
26 }
27
28 // -------------------
29
30 #include "catch.hpp"
31
32 using namespace Catch;
33
34 //inline void testCase( Catch::LocalContext const& C_A_T_C_H_Context ) {
35 //
36 // REQUIRE( C_A_T_C_H_Context().i() == 42 );
37 //}
38
makeNAL(std::string const & name)39 Catch::TestCaseTracking::NameAndLocation makeNAL( std::string const& name ) {
40 return Catch::TestCaseTracking::NameAndLocation( name, Catch::SourceLineInfo("",0) );
41 }
42
43 TEST_CASE( "Tracker" ) {
44
45 TrackerContext ctx;
46 ctx.startRun();
47 ctx.startCycle();
48
49
50 ITracker& testCase = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
51 REQUIRE( testCase.isOpen() );
52
53 ITracker& s1 = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
54 REQUIRE( s1.isOpen() );
55
56 SECTION( "successfully close one section" ) {
57 s1.close();
58 REQUIRE( s1.isSuccessfullyCompleted() );
59 REQUIRE( testCase.isComplete() == false );
60
61 testCase.close();
62 REQUIRE( ctx.completedCycle() );
63 REQUIRE( testCase.isSuccessfullyCompleted() );
64 }
65
66 SECTION( "fail one section" ) {
67 s1.fail();
68 REQUIRE( s1.isComplete() );
69 REQUIRE( s1.isSuccessfullyCompleted() == false );
70 REQUIRE( testCase.isComplete() == false );
71
72 testCase.close();
73 REQUIRE( ctx.completedCycle() );
74 REQUIRE( testCase.isSuccessfullyCompleted() == false );
75
76 SECTION( "re-enter after failed section" ) {
77 ctx.startCycle();
78 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
79 REQUIRE( testCase2.isOpen() );
80
81 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
82 REQUIRE( s1b.isOpen() == false );
83
84 testCase2.close();
85 REQUIRE( ctx.completedCycle() );
86 REQUIRE( testCase.isComplete() );
87 REQUIRE( testCase.isSuccessfullyCompleted() );
88 }
89 SECTION( "re-enter after failed section and find next section" ) {
90 ctx.startCycle();
91 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
92 REQUIRE( testCase2.isOpen() );
93
94 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
95 REQUIRE( s1b.isOpen() == false );
96
97 ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
98 REQUIRE( s2.isOpen() );
99
100 s2.close();
101 REQUIRE( ctx.completedCycle() );
102
103 testCase2.close();
104 REQUIRE( testCase.isComplete() );
105 REQUIRE( testCase.isSuccessfullyCompleted() );
106 }
107 }
108
109 SECTION( "successfully close one section, then find another" ) {
110 s1.close();
111
112 ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
113 REQUIRE( s2.isOpen() == false );
114
115 testCase.close();
116 REQUIRE( testCase.isComplete() == false );
117
118 SECTION( "Re-enter - skips S1 and enters S2" ) {
119 ctx.startCycle();
120 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
121 REQUIRE( testCase2.isOpen() );
122
123 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
124 REQUIRE( s1b.isOpen() == false );
125
126 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
127 REQUIRE( s2b.isOpen() );
128
129 REQUIRE( ctx.completedCycle() == false );
130
131 SECTION ("Successfully close S2") {
132 s2b.close();
133 REQUIRE( ctx.completedCycle() );
134
135 REQUIRE( s2b.isSuccessfullyCompleted() );
136 REQUIRE( testCase2.isComplete() == false );
137
138 testCase2.close();
139 REQUIRE( testCase2.isSuccessfullyCompleted() );
140 }
141 SECTION ("fail S2") {
142 s2b.fail();
143 REQUIRE( ctx.completedCycle() );
144
145 REQUIRE( s2b.isComplete() );
146 REQUIRE( s2b.isSuccessfullyCompleted() == false );
147
148 testCase2.close();
149 REQUIRE( testCase2.isSuccessfullyCompleted() == false );
150
151 // Need a final cycle
152 ctx.startCycle();
153 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
154 REQUIRE( testCase3.isOpen() );
155
156 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
157 REQUIRE( s1c.isOpen() == false );
158
159 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
160 REQUIRE( s2c.isOpen() == false );
161
162 testCase3.close();
163 REQUIRE( testCase3.isSuccessfullyCompleted() );
164 }
165 }
166 }
167
168 SECTION( "open a nested section" ) {
169 ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
170 REQUIRE( s2.isOpen() );
171
172 s2.close();
173 REQUIRE( s2.isComplete() );
174 REQUIRE( s1.isComplete() == false );
175
176 s1.close();
177 REQUIRE( s1.isComplete() );
178 REQUIRE( testCase.isComplete() == false );
179
180 testCase.close();
181 REQUIRE( testCase.isComplete() );
182 }
183
184 SECTION( "start a generator" ) {
185 IndexTracker& g1 = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
186 REQUIRE( g1.isOpen() );
187 REQUIRE( g1.index() == 0 );
188
189 REQUIRE( g1.isComplete() == false );
190 REQUIRE( s1.isComplete() == false );
191
192 SECTION( "close outer section" )
193 {
194 s1.close();
195 REQUIRE( s1.isComplete() == false );
196 testCase.close();
197 REQUIRE( testCase.isSuccessfullyCompleted() == false );
198
199 SECTION( "Re-enter for second generation" ) {
200 ctx.startCycle();
201 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
202 REQUIRE( testCase2.isOpen() );
203
204 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
205 REQUIRE( s1b.isOpen() );
206
207
208 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
209 REQUIRE( g1b.isOpen() );
210 REQUIRE( g1b.index() == 1 );
211
212 REQUIRE( s1.isComplete() == false );
213
214 s1b.close();
215 REQUIRE( s1b.isComplete() );
216 REQUIRE( g1b.isComplete() );
217 testCase2.close();
218 REQUIRE( testCase2.isComplete() );
219 }
220 }
221 SECTION( "Start a new inner section" ) {
222 ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
223 REQUIRE( s2.isOpen() );
224
225 s2.close();
226 REQUIRE( s2.isComplete() );
227
228 s1.close();
229 REQUIRE( s1.isComplete() == false );
230
231 testCase.close();
232 REQUIRE( testCase.isComplete() == false );
233
234 SECTION( "Re-enter for second generation" ) {
235 ctx.startCycle();
236 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
237 REQUIRE( testCase2.isOpen() );
238
239 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
240 REQUIRE( s1b.isOpen() );
241
242 // generator - next value
243 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
244 REQUIRE( g1b.isOpen() );
245 REQUIRE( g1b.index() == 1 );
246
247 // inner section again
248 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
249 REQUIRE( s2b.isOpen() );
250
251 s2b.close();
252 REQUIRE( s2b.isComplete() );
253
254 s1b.close();
255 REQUIRE( g1b.isComplete() );
256 REQUIRE( s1b.isComplete() );
257
258 testCase2.close();
259 REQUIRE( testCase2.isComplete() );
260 }
261 }
262
263 SECTION( "Fail an inner section" ) {
264 ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
265 REQUIRE( s2.isOpen() );
266
267 s2.fail();
268 REQUIRE( s2.isComplete() );
269 REQUIRE( s2.isSuccessfullyCompleted() == false );
270
271 s1.close();
272 REQUIRE( s1.isComplete() == false );
273
274 testCase.close();
275 REQUIRE( testCase.isComplete() == false );
276
277 SECTION( "Re-enter for second generation" ) {
278 ctx.startCycle();
279 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
280 REQUIRE( testCase2.isOpen() );
281
282 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
283 REQUIRE( s1b.isOpen() );
284
285 // generator - still same value
286 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
287 REQUIRE( g1b.isOpen() );
288 REQUIRE( g1b.index() == 0 );
289
290 // inner section again - this time won't open
291 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
292 REQUIRE( s2b.isOpen() == false );
293
294 s1b.close();
295 REQUIRE( g1b.isComplete() == false );
296 REQUIRE( s1b.isComplete() == false );
297
298 testCase2.close();
299 REQUIRE( testCase2.isComplete() == false );
300
301 // Another cycle - now should complete
302 ctx.startCycle();
303 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
304 REQUIRE( testCase3.isOpen() );
305
306 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
307 REQUIRE( s1c.isOpen() );
308
309 // generator - now next value
310 IndexTracker& g1c = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
311 REQUIRE( g1c.isOpen() );
312 REQUIRE( g1c.index() == 1 );
313
314 // inner section - now should open again
315 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
316 REQUIRE( s2c.isOpen() );
317
318 s2c.close();
319 REQUIRE( s2c.isComplete() );
320
321 s1c.close();
322 REQUIRE( g1c.isComplete() );
323 REQUIRE( s1c.isComplete() );
324
325 testCase3.close();
326 REQUIRE( testCase3.isComplete() );
327 }
328 }
329 // !TBD"
330 // nested generator
331 // two sections within a generator
332 }
333 }
334