• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
24 // -------------------
25 
26 #include "catch.hpp"
27 
28 using namespace Catch;
29 
30 namespace {
makeNAL(std::string const & name)31 Catch::TestCaseTracking::NameAndLocation makeNAL( std::string const& name ) {
32     return Catch::TestCaseTracking::NameAndLocation( name, Catch::SourceLineInfo("",0) );
33 }
34 }
35 
36 TEST_CASE( "Tracker" ) {
37 
38     TrackerContext ctx;
39     ctx.startRun();
40     ctx.startCycle();
41 
42 
43     ITracker& testCase = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
44     REQUIRE( testCase.isOpen() );
45 
46     ITracker& s1 = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
47     REQUIRE( s1.isOpen() );
48 
49     SECTION( "successfully close one section" ) {
50         s1.close();
51         REQUIRE( s1.isSuccessfullyCompleted() );
52         REQUIRE( testCase.isComplete() == false );
53 
54         testCase.close();
55         REQUIRE( ctx.completedCycle() );
56         REQUIRE( testCase.isSuccessfullyCompleted() );
57     }
58 
59     SECTION( "fail one section" ) {
60         s1.fail();
61         REQUIRE( s1.isComplete() );
62         REQUIRE( s1.isSuccessfullyCompleted() == false );
63         REQUIRE( testCase.isComplete() == false );
64 
65         testCase.close();
66         REQUIRE( ctx.completedCycle() );
67         REQUIRE( testCase.isSuccessfullyCompleted() == false );
68 
69         SECTION( "re-enter after failed section" ) {
70             ctx.startCycle();
71             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
72             REQUIRE( testCase2.isOpen() );
73 
74             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
75             REQUIRE( s1b.isOpen() == false );
76 
77             testCase2.close();
78             REQUIRE( ctx.completedCycle() );
79             REQUIRE( testCase.isComplete() );
80             REQUIRE( testCase.isSuccessfullyCompleted() );
81         }
82         SECTION( "re-enter after failed section and find next section" ) {
83             ctx.startCycle();
84             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
85             REQUIRE( testCase2.isOpen() );
86 
87             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
88             REQUIRE( s1b.isOpen() == false );
89 
90             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
91             REQUIRE( s2.isOpen() );
92 
93             s2.close();
94             REQUIRE( ctx.completedCycle() );
95 
96             testCase2.close();
97             REQUIRE( testCase.isComplete() );
98             REQUIRE( testCase.isSuccessfullyCompleted() );
99         }
100     }
101 
102     SECTION( "successfully close one section, then find another" ) {
103         s1.close();
104 
105         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
106         REQUIRE( s2.isOpen() == false );
107 
108         testCase.close();
109         REQUIRE( testCase.isComplete() == false );
110 
111         SECTION( "Re-enter - skips S1 and enters S2" ) {
112             ctx.startCycle();
113             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
114             REQUIRE( testCase2.isOpen() );
115 
116             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
117             REQUIRE( s1b.isOpen() == false );
118 
119             ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
120             REQUIRE( s2b.isOpen() );
121 
122             REQUIRE( ctx.completedCycle() == false );
123 
124             SECTION ("Successfully close S2") {
125                 s2b.close();
126                 REQUIRE( ctx.completedCycle() );
127 
128                 REQUIRE( s2b.isSuccessfullyCompleted() );
129                 REQUIRE( testCase2.isComplete() == false );
130 
131                 testCase2.close();
132                 REQUIRE( testCase2.isSuccessfullyCompleted() );
133             }
134             SECTION ("fail S2") {
135                 s2b.fail();
136                 REQUIRE( ctx.completedCycle() );
137 
138                 REQUIRE( s2b.isComplete() );
139                 REQUIRE( s2b.isSuccessfullyCompleted() == false );
140 
141                 testCase2.close();
142                 REQUIRE( testCase2.isSuccessfullyCompleted() == false );
143 
144                 // Need a final cycle
145                 ctx.startCycle();
146                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
147                 REQUIRE( testCase3.isOpen() );
148 
149                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
150                 REQUIRE( s1c.isOpen() == false );
151 
152                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
153                 REQUIRE( s2c.isOpen() == false );
154 
155                 testCase3.close();
156                 REQUIRE( testCase3.isSuccessfullyCompleted() );
157             }
158         }
159     }
160 
161     SECTION( "open a nested section" ) {
162         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
163         REQUIRE( s2.isOpen() );
164 
165         s2.close();
166         REQUIRE( s2.isComplete() );
167         REQUIRE( s1.isComplete() == false );
168 
169         s1.close();
170         REQUIRE( s1.isComplete() );
171         REQUIRE( testCase.isComplete() == false );
172 
173         testCase.close();
174         REQUIRE( testCase.isComplete() );
175     }
176 }
177 
178 static bool previouslyRun = false;
179 static bool previouslyRunNested = false;
180 
181 TEST_CASE( "#1394", "[.][approvals][tracker]" ) {
182     // -- Don't re-run after specified section is done
183     REQUIRE(previouslyRun == false);
184 
185     SECTION( "RunSection" ) {
186         previouslyRun = true;
187     }
188     SECTION( "SkipSection" ) {
189         // cause an error if this section is called because it shouldn't be
190         REQUIRE(1 == 0);
191     }
192 }
193 
194 TEST_CASE( "#1394 nested", "[.][approvals][tracker]" ) {
195     REQUIRE(previouslyRunNested == false);
196 
197     SECTION( "NestedRunSection" ) {
198         SECTION( "s1" ) {
199             previouslyRunNested = true;
200         }
201     }
202     SECTION( "NestedSkipSection" ) {
203         // cause an error if this section is called because it shouldn't be
204         REQUIRE(1 == 0);
205     }
206 }
207