• Home
  • History
  • Annotate
  • 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