mirror of https://github.com/procxx/kepka.git
				
				
				
			
		
			
				
	
	
		
			334 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			334 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  Created by Phil on 1/10/2015.
 | |
|  *  Copyright 2015 Two Blue Cubes Ltd
 | |
|  *
 | |
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 | |
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | |
|  */
 | |
| #include "internal/catch_suppress_warnings.h"
 | |
| #include "internal/catch_test_case_tracker.h"
 | |
| 
 | |
| 
 | |
| namespace Catch
 | |
| {
 | |
|     class LocalContext {
 | |
| 
 | |
|     public:
 | |
|         TrackerContext& operator()() const {
 | |
|             return TrackerContext::instance();
 | |
|         }
 | |
|     };
 | |
| 
 | |
| } // namespace Catch
 | |
| 
 | |
| inline Catch::TrackerContext& C_A_T_C_H_Context() {
 | |
|     return Catch::TrackerContext::instance();
 | |
| }
 | |
| 
 | |
| // -------------------
 | |
| 
 | |
| #include "catch.hpp"
 | |
| 
 | |
| using namespace Catch;
 | |
| 
 | |
| //inline void testCase( Catch::LocalContext const& C_A_T_C_H_Context ) {
 | |
| //
 | |
| //    REQUIRE( C_A_T_C_H_Context().i() == 42 );
 | |
| //}
 | |
| 
 | |
| Catch::TestCaseTracking::NameAndLocation makeNAL( std::string const& name ) {
 | |
|     return Catch::TestCaseTracking::NameAndLocation( name, Catch::SourceLineInfo("",0) );
 | |
| }
 | |
| 
 | |
| TEST_CASE( "Tracker" ) {
 | |
| 
 | |
|     TrackerContext ctx;
 | |
|     ctx.startRun();
 | |
|     ctx.startCycle();
 | |
| 
 | |
| 
 | |
|     ITracker& testCase = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|     REQUIRE( testCase.isOpen() );
 | |
| 
 | |
|     ITracker& s1 = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|     REQUIRE( s1.isOpen() );
 | |
| 
 | |
|     SECTION( "successfully close one section" ) {
 | |
|         s1.close();
 | |
|         REQUIRE( s1.isSuccessfullyCompleted() );
 | |
|         REQUIRE( testCase.isComplete() == false );
 | |
| 
 | |
|         testCase.close();
 | |
|         REQUIRE( ctx.completedCycle() );
 | |
|         REQUIRE( testCase.isSuccessfullyCompleted() );
 | |
|     }
 | |
| 
 | |
|     SECTION( "fail one section" ) {
 | |
|         s1.fail();
 | |
|         REQUIRE( s1.isComplete() );
 | |
|         REQUIRE( s1.isSuccessfullyCompleted() == false );
 | |
|         REQUIRE( testCase.isComplete() == false );
 | |
| 
 | |
|         testCase.close();
 | |
|         REQUIRE( ctx.completedCycle() );
 | |
|         REQUIRE( testCase.isSuccessfullyCompleted() == false );
 | |
| 
 | |
|         SECTION( "re-enter after failed section" ) {
 | |
|             ctx.startCycle();
 | |
|             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|             REQUIRE( testCase2.isOpen() );
 | |
| 
 | |
|             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|             REQUIRE( s1b.isOpen() == false );
 | |
| 
 | |
|             testCase2.close();
 | |
|             REQUIRE( ctx.completedCycle() );
 | |
|             REQUIRE( testCase.isComplete() );
 | |
|             REQUIRE( testCase.isSuccessfullyCompleted() );
 | |
|         }
 | |
|         SECTION( "re-enter after failed section and find next section" ) {
 | |
|             ctx.startCycle();
 | |
|             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|             REQUIRE( testCase2.isOpen() );
 | |
| 
 | |
|             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|             REQUIRE( s1b.isOpen() == false );
 | |
| 
 | |
|             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|             REQUIRE( s2.isOpen() );
 | |
| 
 | |
|             s2.close();
 | |
|             REQUIRE( ctx.completedCycle() );
 | |
| 
 | |
|             testCase2.close();
 | |
|             REQUIRE( testCase.isComplete() );
 | |
|             REQUIRE( testCase.isSuccessfullyCompleted() );
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     SECTION( "successfully close one section, then find another" ) {
 | |
|         s1.close();
 | |
| 
 | |
|         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|         REQUIRE( s2.isOpen() == false );
 | |
| 
 | |
|         testCase.close();
 | |
|         REQUIRE( testCase.isComplete() == false );
 | |
| 
 | |
|         SECTION( "Re-enter - skips S1 and enters S2" ) {
 | |
|             ctx.startCycle();
 | |
|             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|             REQUIRE( testCase2.isOpen() );
 | |
| 
 | |
|             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|             REQUIRE( s1b.isOpen() == false );
 | |
| 
 | |
|             ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|             REQUIRE( s2b.isOpen() );
 | |
| 
 | |
|             REQUIRE( ctx.completedCycle() == false );
 | |
| 
 | |
|             SECTION ("Successfully close S2") {
 | |
|                 s2b.close();
 | |
|                 REQUIRE( ctx.completedCycle() );
 | |
| 
 | |
|                 REQUIRE( s2b.isSuccessfullyCompleted() );
 | |
|                 REQUIRE( testCase2.isComplete() == false );
 | |
| 
 | |
|                 testCase2.close();
 | |
|                 REQUIRE( testCase2.isSuccessfullyCompleted() );
 | |
|             }
 | |
|             SECTION ("fail S2") {
 | |
|                 s2b.fail();
 | |
|                 REQUIRE( ctx.completedCycle() );
 | |
| 
 | |
|                 REQUIRE( s2b.isComplete() );
 | |
|                 REQUIRE( s2b.isSuccessfullyCompleted() == false );
 | |
| 
 | |
|                 testCase2.close();
 | |
|                 REQUIRE( testCase2.isSuccessfullyCompleted() == false );
 | |
| 
 | |
|                 // Need a final cycle
 | |
|                 ctx.startCycle();
 | |
|                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|                 REQUIRE( testCase3.isOpen() );
 | |
| 
 | |
|                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|                 REQUIRE( s1c.isOpen() == false );
 | |
| 
 | |
|                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|                 REQUIRE( s2c.isOpen() == false );
 | |
| 
 | |
|                 testCase3.close();
 | |
|                 REQUIRE( testCase3.isSuccessfullyCompleted() );
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     SECTION( "open a nested section" ) {
 | |
|         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|         REQUIRE( s2.isOpen() );
 | |
| 
 | |
|         s2.close();
 | |
|         REQUIRE( s2.isComplete() );
 | |
|         REQUIRE( s1.isComplete() == false );
 | |
| 
 | |
|         s1.close();
 | |
|         REQUIRE( s1.isComplete() );
 | |
|         REQUIRE( testCase.isComplete() == false );
 | |
| 
 | |
|         testCase.close();
 | |
|         REQUIRE( testCase.isComplete() );
 | |
|     }
 | |
| 
 | |
|     SECTION( "start a generator" ) {
 | |
|         IndexTracker& g1 = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
 | |
|         REQUIRE( g1.isOpen() );
 | |
|         REQUIRE( g1.index() == 0 );
 | |
| 
 | |
|         REQUIRE( g1.isComplete() == false );
 | |
|         REQUIRE( s1.isComplete() == false );
 | |
| 
 | |
|         SECTION( "close outer section" )
 | |
|         {
 | |
|             s1.close();
 | |
|             REQUIRE( s1.isComplete() == false );
 | |
|             testCase.close();
 | |
|             REQUIRE( testCase.isSuccessfullyCompleted() == false );
 | |
| 
 | |
|             SECTION( "Re-enter for second generation" ) {
 | |
|                 ctx.startCycle();
 | |
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|                 REQUIRE( testCase2.isOpen() );
 | |
| 
 | |
|                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|                 REQUIRE( s1b.isOpen() );
 | |
| 
 | |
| 
 | |
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
 | |
|                 REQUIRE( g1b.isOpen() );
 | |
|                 REQUIRE( g1b.index() == 1 );
 | |
| 
 | |
|                 REQUIRE( s1.isComplete() == false );
 | |
| 
 | |
|                 s1b.close();
 | |
|                 REQUIRE( s1b.isComplete() );
 | |
|                 REQUIRE( g1b.isComplete() );
 | |
|                 testCase2.close();
 | |
|                 REQUIRE( testCase2.isComplete() );
 | |
|             }
 | |
|         }
 | |
|         SECTION( "Start a new inner section" ) {
 | |
|             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|             REQUIRE( s2.isOpen() );
 | |
| 
 | |
|             s2.close();
 | |
|             REQUIRE( s2.isComplete() );
 | |
| 
 | |
|             s1.close();
 | |
|             REQUIRE( s1.isComplete() == false );
 | |
| 
 | |
|             testCase.close();
 | |
|             REQUIRE( testCase.isComplete() == false );
 | |
| 
 | |
|             SECTION( "Re-enter for second generation" ) {
 | |
|                 ctx.startCycle();
 | |
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|                 REQUIRE( testCase2.isOpen() );
 | |
| 
 | |
|                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|                 REQUIRE( s1b.isOpen() );
 | |
| 
 | |
|                 // generator - next value
 | |
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
 | |
|                 REQUIRE( g1b.isOpen() );
 | |
|                 REQUIRE( g1b.index() == 1 );
 | |
| 
 | |
|                 // inner section again
 | |
|                 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|                 REQUIRE( s2b.isOpen() );
 | |
| 
 | |
|                 s2b.close();
 | |
|                 REQUIRE( s2b.isComplete() );
 | |
| 
 | |
|                 s1b.close();
 | |
|                 REQUIRE( g1b.isComplete() );
 | |
|                 REQUIRE( s1b.isComplete() );
 | |
| 
 | |
|                 testCase2.close();
 | |
|                 REQUIRE( testCase2.isComplete() );
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         SECTION( "Fail an inner section" ) {
 | |
|             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|             REQUIRE( s2.isOpen() );
 | |
| 
 | |
|             s2.fail();
 | |
|             REQUIRE( s2.isComplete() );
 | |
|             REQUIRE( s2.isSuccessfullyCompleted() == false );
 | |
| 
 | |
|             s1.close();
 | |
|             REQUIRE( s1.isComplete() == false );
 | |
| 
 | |
|             testCase.close();
 | |
|             REQUIRE( testCase.isComplete() == false );
 | |
| 
 | |
|             SECTION( "Re-enter for second generation" ) {
 | |
|                 ctx.startCycle();
 | |
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|                 REQUIRE( testCase2.isOpen() );
 | |
| 
 | |
|                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|                 REQUIRE( s1b.isOpen() );
 | |
| 
 | |
|                 // generator - still same value
 | |
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
 | |
|                 REQUIRE( g1b.isOpen() );
 | |
|                 REQUIRE( g1b.index() == 0 );
 | |
| 
 | |
|                 // inner section again - this time won't open
 | |
|                 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|                 REQUIRE( s2b.isOpen() == false );
 | |
| 
 | |
|                 s1b.close();
 | |
|                 REQUIRE( g1b.isComplete() == false );
 | |
|                 REQUIRE( s1b.isComplete() == false );
 | |
| 
 | |
|                 testCase2.close();
 | |
|                 REQUIRE( testCase2.isComplete() == false );
 | |
| 
 | |
|                 // Another cycle - now should complete
 | |
|                 ctx.startCycle();
 | |
|                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) );
 | |
|                 REQUIRE( testCase3.isOpen() );
 | |
| 
 | |
|                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) );
 | |
|                 REQUIRE( s1c.isOpen() );
 | |
| 
 | |
|                 // generator - now next value
 | |
|                 IndexTracker& g1c = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 );
 | |
|                 REQUIRE( g1c.isOpen() );
 | |
|                 REQUIRE( g1c.index() == 1 );
 | |
| 
 | |
|                 // inner section - now should open again
 | |
|                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) );
 | |
|                 REQUIRE( s2c.isOpen() );
 | |
| 
 | |
|                 s2c.close();
 | |
|                 REQUIRE( s2c.isComplete() );
 | |
| 
 | |
|                 s1c.close();
 | |
|                 REQUIRE( g1c.isComplete() );
 | |
|                 REQUIRE( s1c.isComplete() );
 | |
| 
 | |
|                 testCase3.close();
 | |
|                 REQUIRE( testCase3.isComplete() );
 | |
|             }
 | |
|         }
 | |
|         // !TBD"
 | |
|         //   nested generator
 | |
|         //   two sections within a generator
 | |
|     }
 | |
| }
 |