mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 05:59:32 +01:00 
			
		
		
		
	Fix assertionStarting events being sent after the expr is evaluated
Closes #2678
This commit is contained in:
		@@ -468,6 +468,17 @@ set_tests_properties(
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
add_executable(AssertionStartingEventGoesBeforeAssertionIsEvaluated
 | 
			
		||||
  X20-AssertionStartingEventGoesBeforeAssertionIsEvaluated.cpp
 | 
			
		||||
)
 | 
			
		||||
target_link_libraries(AssertionStartingEventGoesBeforeAssertionIsEvaluated
 | 
			
		||||
  PRIVATE Catch2::Catch2WithMain
 | 
			
		||||
)
 | 
			
		||||
add_test(
 | 
			
		||||
  NAME ReporterEvents::AssertionStartingHappensBeforeAssertionIsEvaluated
 | 
			
		||||
  COMMAND $<TARGET_FILE:AssertionStartingEventGoesBeforeAssertionIsEvaluated>
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
#add_executable(DebugBreakMacros ${TESTS_DIR}/X12-CustomDebugBreakMacro.cpp)
 | 
			
		||||
#target_link_libraries(DebugBreakMacros Catch2)
 | 
			
		||||
#add_test(NAME DebugBreakMacros COMMAND DebugBreakMacros --break)
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,81 @@
 | 
			
		||||
 | 
			
		||||
//              Copyright Catch2 Authors
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//   (See accompanying file LICENSE.txt or copy at
 | 
			
		||||
//        https://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
// SPDX-License-Identifier: BSL-1.0
 | 
			
		||||
 | 
			
		||||
/**\file
 | 
			
		||||
 * TODO: FIXES Registers custom reporter that reports testCase* events
 | 
			
		||||
 *
 | 
			
		||||
 * The resulting executable can then be used by an external Python script
 | 
			
		||||
 * to verify that testCase{Starting,Ended} and testCasePartial{Starting,Ended}
 | 
			
		||||
 * events are properly nested.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <catch2/catch_test_macros.hpp>
 | 
			
		||||
#include <catch2/reporters/catch_reporter_event_listener.hpp>
 | 
			
		||||
#include <catch2/reporters/catch_reporter_registrars.hpp>
 | 
			
		||||
#include <catch2/matchers/catch_matchers_predicate.hpp>
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
    static size_t assertion_starting_events_seen = 0;
 | 
			
		||||
 | 
			
		||||
    // TODO: custom matcher to check that "assertion_starting_events_seen" has
 | 
			
		||||
    // the right number of checks
 | 
			
		||||
 | 
			
		||||
    class AssertionStartingListener : public Catch::EventListenerBase {
 | 
			
		||||
    public:
 | 
			
		||||
        AssertionStartingListener( Catch::IConfig const* config ):
 | 
			
		||||
            EventListenerBase( config ) {}
 | 
			
		||||
 | 
			
		||||
        void assertionStarting( Catch::AssertionInfo const& ) override {
 | 
			
		||||
            ++assertion_starting_events_seen;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    static bool f1() {
 | 
			
		||||
        return assertion_starting_events_seen == 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void f2() {
 | 
			
		||||
        if ( assertion_starting_events_seen != 2 ) { throw 1; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void f3() {
 | 
			
		||||
        if ( assertion_starting_events_seen == 3 ) { throw 1; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static bool f4() { return assertion_starting_events_seen == 4; }
 | 
			
		||||
 | 
			
		||||
    static void f5() { throw assertion_starting_events_seen; }
 | 
			
		||||
 | 
			
		||||
} // anonymous namespace
 | 
			
		||||
 | 
			
		||||
CATCH_REGISTER_LISTENER( AssertionStartingListener )
 | 
			
		||||
 | 
			
		||||
TEST_CASE() {
 | 
			
		||||
    // **IMPORTANT**
 | 
			
		||||
    // The order of assertions below matters.
 | 
			
		||||
    REQUIRE( f1() );
 | 
			
		||||
    REQUIRE_NOTHROW( f2() );
 | 
			
		||||
    REQUIRE_THROWS( f3() );
 | 
			
		||||
    REQUIRE_THAT( f4(),
 | 
			
		||||
                  Catch::Matchers::Predicate<bool>( []( bool b ) { return b; } ) );
 | 
			
		||||
    REQUIRE_THROWS_MATCHES(
 | 
			
		||||
        f5(), size_t, Catch::Matchers::Predicate<size_t>( []( size_t i ) {
 | 
			
		||||
            return i == 5;
 | 
			
		||||
        } ) );
 | 
			
		||||
 | 
			
		||||
    CAPTURE( assertion_starting_events_seen ); // **not** an assertion
 | 
			
		||||
    INFO( "some info msg" );                   // **not** an assertion
 | 
			
		||||
    WARN( "warning! warning!" );               // assertion-like message
 | 
			
		||||
    SUCCEED();                                 // assertion-like message
 | 
			
		||||
 | 
			
		||||
    // We skip FAIL/SKIP and so on, which fail the test.
 | 
			
		||||
 | 
			
		||||
    // This require will also increment the count once
 | 
			
		||||
    REQUIRE( assertion_starting_events_seen == 8 );
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user