| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | /* *  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"#include "catch.hpp"using namespace Catch;namespace {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() );    }}static bool previouslyRun = false;static bool previouslyRunNested = false;TEST_CASE( "#1394", "[.][approvals][tracker]" ) {    // -- Don't re-run after specified section is done    REQUIRE(previouslyRun == false);    SECTION( "RunSection" ) {        previouslyRun = true;    }    SECTION( "SkipSection" ) {        // cause an error if this section is called because it shouldn't be        REQUIRE(1 == 0);    }}TEST_CASE( "#1394 nested", "[.][approvals][tracker]" ) {    REQUIRE(previouslyRunNested == false);    SECTION( "NestedRunSection" ) {        SECTION( "s1" ) {            previouslyRunNested = true;        }    }    SECTION( "NestedSkipSection" ) {        // cause an error if this section is called because it shouldn't be        REQUIRE(1 == 0);    }}// Selecting a "not last" section inside a test case via -c "section" would// previously only run the first subsection, instead of running all of them.// This allows us to check that `"#1670 regression check" -c A` leads to// 2 successful assertions.TEST_CASE("#1670 regression check", "[.approvals][tracker]") {    SECTION("A") {        SECTION("1") SUCCEED();        SECTION("2") SUCCEED();    }    SECTION("B") {        SECTION("1") SUCCEED();        SECTION("2") SUCCEED();    }}// #1938 required a rework on how generator tracking works, so that `GENERATE`// supports being sandwiched between two `SECTION`s. The following tests check// various other scenarios through checking output in approval tests.TEST_CASE("#1938 - GENERATE after a section", "[.][regression][generators]") {    SECTION("A") {        SUCCEED("A");    }    auto m = GENERATE(1, 2, 3);    SECTION("B") {        REQUIRE(m);    }}TEST_CASE("#1938 - flat generate", "[.][regression][generators]") {    auto m = GENERATE(1, 2, 3);    REQUIRE(m);}TEST_CASE("#1938 - nested generate", "[.][regression][generators]") {    auto m = GENERATE(1, 2, 3);    auto n = GENERATE(1, 2, 3);    REQUIRE(m);    REQUIRE(n);}TEST_CASE("#1938 - mixed sections and generates", "[.][regression][generators]") {    auto i = GENERATE(1, 2);    SECTION("A") {        SUCCEED("A");    }    auto j = GENERATE(3, 4);    SECTION("B") {        SUCCEED("B");    }    auto k = GENERATE(5, 6);    CAPTURE(i, j, k);    SUCCEED();}TEST_CASE("#1938 - Section followed by flat generate", "[.][regression][generators]") {    SECTION("A") {        REQUIRE(1);    }    auto m = GENERATE(2, 3);    REQUIRE(m);}
 |