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