/* * 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.hpp" 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() ); } 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 } }