mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +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
	 Martin Hořeňovský
					Martin Hořeňovský