mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Store IStream instance owning ptrs in reporter instances
This ended up being a surprisingly large refactoring, motivated by removing a `const_cast` from `Config`'s handling of reporter streams, forced by previous commit.
This commit is contained in:
		| @@ -20,12 +20,13 @@ | ||||
| #include <catch2/reporters/catch_reporter_registrars.hpp> | ||||
|  | ||||
| #include <iostream> | ||||
| #include <utility> | ||||
|  | ||||
| class CumulativeBenchmarkReporter final : public Catch::CumulativeReporterBase { | ||||
|  | ||||
| public: | ||||
|     CumulativeBenchmarkReporter(Catch::ReporterConfig const& _config) : | ||||
|         CumulativeReporterBase(_config) { | ||||
|     CumulativeBenchmarkReporter(Catch::ReporterConfig&& _config) : | ||||
|         CumulativeReporterBase(std::move(_config)) { | ||||
|         m_preferences.shouldReportAllAssertions = true; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -19,11 +19,12 @@ | ||||
| #include <catch2/reporters/catch_reporter_registrars.hpp> | ||||
|  | ||||
| #include <iostream> | ||||
| #include <utility> | ||||
|  | ||||
| class TestReporter : public Catch::StreamingReporterBase { | ||||
| public: | ||||
|     TestReporter(Catch::ReporterConfig const& _config): | ||||
|         StreamingReporterBase(_config) { | ||||
|     TestReporter(Catch::ReporterConfig&& _config): | ||||
|         StreamingReporterBase(std::move(_config)) { | ||||
|         std::cout << "TestReporter constructed\n"; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -16,13 +16,14 @@ | ||||
| #include <catch2/reporters/catch_reporter_registrars.hpp> | ||||
|  | ||||
| #include <iostream> | ||||
| #include <utility> | ||||
|  | ||||
| namespace { | ||||
|  | ||||
|   class TestReporter : public Catch::StreamingReporterBase { | ||||
|   public: | ||||
|       TestReporter(Catch::ReporterConfig const& _config): | ||||
|           StreamingReporterBase(_config) { | ||||
|       TestReporter(Catch::ReporterConfig&& _config): | ||||
|           StreamingReporterBase(std::move(_config)) { | ||||
|           m_preferences.shouldReportAllAssertions = false; | ||||
|           std::cout << "X26 - TestReporter constructed\n"; | ||||
|       } | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
|  | ||||
| #include <iostream> | ||||
| #include <string> | ||||
| #include <utility> | ||||
|  | ||||
| class TestReporter : public Catch::StreamingReporterBase { | ||||
|     std::string stdOutString( uint64_t iter ){ | ||||
| @@ -36,8 +37,8 @@ class TestReporter : public Catch::StreamingReporterBase { | ||||
|     } | ||||
|  | ||||
| public: | ||||
|     TestReporter( Catch::ReporterConfig const& _config ): | ||||
|         StreamingReporterBase( _config ) { | ||||
|     TestReporter( Catch::ReporterConfig&& _config ): | ||||
|         StreamingReporterBase( std::move(_config) ) { | ||||
|         m_preferences.shouldRedirectStdOut = true; | ||||
|         std::cout << "X27 - TestReporter constructed\n"; | ||||
|     } | ||||
|   | ||||
| @@ -19,7 +19,9 @@ | ||||
| #include <catch2/reporters/catch_reporter_event_listener.hpp> | ||||
| #include <catch2/reporters/catch_reporter_registrars.hpp> | ||||
| #include <catch2/reporters/catch_reporter_streaming_base.hpp> | ||||
|  | ||||
| #include <iostream> | ||||
| #include <utility> | ||||
|  | ||||
| namespace { | ||||
|  | ||||
| @@ -54,8 +56,8 @@ namespace { | ||||
|  | ||||
|     class TestReporter : public Catch::StreamingReporterBase { | ||||
|     public: | ||||
|         TestReporter( Catch::ReporterConfig const& _config ): | ||||
|             StreamingReporterBase( _config ) { | ||||
|         TestReporter( Catch::ReporterConfig&& _config ): | ||||
|             StreamingReporterBase( std::move(_config) ) { | ||||
|             std::cout << "X28 - TestReporter constructed\n"; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -25,8 +25,8 @@ | ||||
|  | ||||
| class TestReporter : public Catch::StreamingReporterBase { | ||||
| public: | ||||
|     TestReporter( Catch::ReporterConfig const& _config ): | ||||
|         StreamingReporterBase( _config ) { | ||||
|     TestReporter( Catch::ReporterConfig&& _config ): | ||||
|         StreamingReporterBase( std::move(_config) ) { | ||||
|         std::cout << "X29 - TestReporter constructed\n"; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1317,7 +1317,7 @@ CmdLine.tests.cpp:<line number>: passed: config.noThrow == false for: false == f | ||||
| CmdLine.tests.cpp:<line number>: passed: config.reporterSpecifications.empty() for: true | ||||
| CmdLine.tests.cpp:<line number>: passed: !(cfg.hasTestFilters()) for: !false | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.getReporterSpecs().size() == 1 for: 1 == 1 | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } for: {?} == {?} | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } for: {?} == {?} | ||||
| CmdLine.tests.cpp:<line number>: passed: result for: {?} | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.hasTestFilters() for: true | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.testSpec().matches(*fakeTestCase("notIncluded")) == false for: false == false | ||||
|   | ||||
| @@ -1315,7 +1315,7 @@ CmdLine.tests.cpp:<line number>: passed: config.noThrow == false for: false == f | ||||
| CmdLine.tests.cpp:<line number>: passed: config.reporterSpecifications.empty() for: true | ||||
| CmdLine.tests.cpp:<line number>: passed: !(cfg.hasTestFilters()) for: !false | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.getReporterSpecs().size() == 1 for: 1 == 1 | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } for: {?} == {?} | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } for: {?} == {?} | ||||
| CmdLine.tests.cpp:<line number>: passed: result for: {?} | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.hasTestFilters() for: true | ||||
| CmdLine.tests.cpp:<line number>: passed: cfg.testSpec().matches(*fakeTestCase("notIncluded")) == false for: false == false | ||||
|   | ||||
| @@ -9438,7 +9438,7 @@ with expansion: | ||||
|   1 == 1 | ||||
|  | ||||
| CmdLine.tests.cpp:<line number>: PASSED: | ||||
|   CHECK( cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } ) | ||||
|   CHECK( cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } ) | ||||
| with expansion: | ||||
|   {?} == {?} | ||||
|  | ||||
|   | ||||
| @@ -9436,7 +9436,7 @@ with expansion: | ||||
|   1 == 1 | ||||
|  | ||||
| CmdLine.tests.cpp:<line number>: PASSED: | ||||
|   CHECK( cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } ) | ||||
|   CHECK( cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } ) | ||||
| with expansion: | ||||
|   {?} == {?} | ||||
|  | ||||
|   | ||||
| @@ -2481,7 +2481,7 @@ ok {test-number} - !(cfg.hasTestFilters()) for: !false | ||||
| # Process can be configured on command line | ||||
| ok {test-number} - cfg.getReporterSpecs().size() == 1 for: 1 == 1 | ||||
| # Process can be configured on command line | ||||
| ok {test-number} - cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } for: {?} == {?} | ||||
| ok {test-number} - cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } for: {?} == {?} | ||||
| # Process can be configured on command line | ||||
| ok {test-number} - result for: {?} | ||||
| # Process can be configured on command line | ||||
|   | ||||
| @@ -2479,7 +2479,7 @@ ok {test-number} - !(cfg.hasTestFilters()) for: !false | ||||
| # Process can be configured on command line | ||||
| ok {test-number} - cfg.getReporterSpecs().size() == 1 for: 1 == 1 | ||||
| # Process can be configured on command line | ||||
| ok {test-number} - cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } for: {?} == {?} | ||||
| ok {test-number} - cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } for: {?} == {?} | ||||
| # Process can be configured on command line | ||||
| ok {test-number} - result for: {?} | ||||
| # Process can be configured on command line | ||||
|   | ||||
| @@ -11476,7 +11476,7 @@ C | ||||
|       </Expression> | ||||
|       <Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/CmdLine.tests.cpp" > | ||||
|         <Original> | ||||
|           cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } | ||||
|           cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } | ||||
|         </Original> | ||||
|         <Expanded> | ||||
|           {?} == {?} | ||||
|   | ||||
| @@ -11476,7 +11476,7 @@ C | ||||
|       </Expression> | ||||
|       <Expression success="true" type="CHECK" filename="tests/<exe-name>/IntrospectiveTests/CmdLine.tests.cpp" > | ||||
|         <Original> | ||||
|           cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, {}, {}, {} } | ||||
|           cfg.getReporterSpecs()[0] == Catch::ReporterSpec{ expectedReporter, std::string{}, Catch::ColourMode::PlatformDefault, {} } | ||||
|         </Original> | ||||
|         <Expanded> | ||||
|           {?} == {?} | ||||
|   | ||||
| @@ -363,7 +363,10 @@ TEST_CASE( "Process can be configured on command line", "[config][command-line]" | ||||
|  | ||||
|         CHECK( cfg.getReporterSpecs().size() == 1 ); | ||||
|         CHECK( cfg.getReporterSpecs()[0] == | ||||
|                Catch::ReporterSpec{ expectedReporter, {}, {}, {} } ); | ||||
|                Catch::ReporterSpec{ expectedReporter, | ||||
|                                     std::string{}, | ||||
|                                     Catch::ColourMode::PlatformDefault, | ||||
|                                     {} } ); | ||||
|     } | ||||
|  | ||||
|     SECTION("test lists") { | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
| #include <catch2/reporters/catch_reporter_event_listener.hpp> | ||||
| #include <catch2/reporters/catch_reporter_streaming_base.hpp> | ||||
| #include <catch2/reporters/catch_reporter_multi.hpp> | ||||
| #include <catch2/internal/catch_move_and_forward.hpp> | ||||
|  | ||||
| #include <sstream> | ||||
|  | ||||
| @@ -34,6 +35,15 @@ namespace { | ||||
|     private: | ||||
|         std::stringstream sstr; | ||||
|     }; | ||||
|  | ||||
|     //! config must outlive the function | ||||
|     Catch::ReporterConfig makeDummyRepConfig( Catch::Config const& config ) { | ||||
|         return Catch::ReporterConfig{ | ||||
|             &config, | ||||
|             Catch::Detail::make_unique<StringIStream>(), | ||||
|             Catch::ColourMode::None, | ||||
|             {} }; | ||||
|     } | ||||
| } | ||||
|  | ||||
| TEST_CASE( "The default listing implementation write to provided stream", | ||||
| @@ -85,20 +95,19 @@ TEST_CASE( "Reporter's write listings to provided stream", "[reporters]" ) { | ||||
|  | ||||
|     for (auto const& factory : factories) { | ||||
|         INFO("Tested reporter: " << factory.first); | ||||
|         StringIStream sstream; | ||||
|         auto sstream = Catch::Detail::make_unique<StringIStream>(); | ||||
|         auto& sstreamRef = *sstream.get(); | ||||
|  | ||||
|         Catch::ConfigData config_data; | ||||
|         Catch::Config config( config_data ); | ||||
|         Catch::ReporterConfig rep_config( | ||||
|             &config, &sstream, Catch::ColourMode::None, {} ); | ||||
|         auto reporter = factory.second->create( rep_config ); | ||||
|         Catch::Config config( Catch::ConfigData{} ); | ||||
|         auto reporter = factory.second->create( Catch::ReporterConfig{ | ||||
|             &config, CATCH_MOVE( sstream ), Catch::ColourMode::None, {} } ); | ||||
|  | ||||
|         DYNAMIC_SECTION( factory.first << " reporter lists tags" ) { | ||||
|             std::vector<Catch::TagInfo> tags(1); | ||||
|             tags[0].add("fakeTag"_catch_sr); | ||||
|             reporter->listTags(tags); | ||||
|  | ||||
|             auto listingString = sstream.str(); | ||||
|             auto listingString = sstreamRef.str(); | ||||
|             REQUIRE_THAT(listingString, ContainsSubstring("fakeTag"s)); | ||||
|         } | ||||
|  | ||||
| @@ -107,7 +116,7 @@ TEST_CASE( "Reporter's write listings to provided stream", "[reporters]" ) { | ||||
|                 { { "fake reporter", "fake description" } } ); | ||||
|             reporter->listReporters(reporters); | ||||
|  | ||||
|             auto listingString = sstream.str(); | ||||
|             auto listingString = sstreamRef.str(); | ||||
|             REQUIRE_THAT(listingString, ContainsSubstring("fake reporter"s)); | ||||
|         } | ||||
|  | ||||
| @@ -119,7 +128,7 @@ TEST_CASE( "Reporter's write listings to provided stream", "[reporters]" ) { | ||||
|             std::vector<Catch::TestCaseHandle> tests({ {&fakeInfo, nullptr} }); | ||||
|             reporter->listTests(tests); | ||||
|  | ||||
|             auto listingString = sstream.str(); | ||||
|             auto listingString = sstreamRef.str(); | ||||
|             REQUIRE_THAT( listingString, | ||||
|                           ContainsSubstring( "fake test name"s ) && | ||||
|                               ContainsSubstring( "fakeTestTag"s ) ); | ||||
| @@ -159,8 +168,8 @@ namespace { | ||||
|     public: | ||||
|         MockReporter( std::string witness, | ||||
|                       std::vector<std::string>& recorder, | ||||
|                       Catch::ReporterConfig const& config ): | ||||
|             StreamingReporterBase( config ), | ||||
|                       Catch::ReporterConfig&& config ): | ||||
|             StreamingReporterBase( CATCH_MOVE(config) ), | ||||
|             m_witness( witness ), | ||||
|             m_recorder( recorder ) | ||||
|         {} | ||||
| @@ -173,25 +182,20 @@ namespace { | ||||
|  | ||||
| TEST_CASE("Multireporter calls reporters and listeners in correct order", | ||||
|           "[reporters][multi-reporter]") { | ||||
|  | ||||
|     Catch::ConfigData config_data; | ||||
|     Catch::Config config( config_data ); | ||||
|     StringIStream sstream; | ||||
|     Catch::ReporterConfig rep_config( | ||||
|         &config, &sstream, Catch::ColourMode::None, {} ); | ||||
|     Catch::Config config( Catch::ConfigData{} ); | ||||
|  | ||||
|     // We add reporters before listeners, to check that internally they | ||||
|     // get sorted properly, and listeners are called first anyway. | ||||
|     Catch::MultiReporter multiReporter( &config ); | ||||
|     std::vector<std::string> records; | ||||
|     multiReporter.addReporter( Catch::Detail::make_unique<MockReporter>( | ||||
|         "Goodbye", records, rep_config ) ); | ||||
|         "Goodbye", records, makeDummyRepConfig(config) ) ); | ||||
|     multiReporter.addListener( | ||||
|         Catch::Detail::make_unique<MockListener>( "Hello", records, &config ) ); | ||||
|     multiReporter.addListener( | ||||
|         Catch::Detail::make_unique<MockListener>( "world", records, &config ) ); | ||||
|     multiReporter.addReporter( Catch::Detail::make_unique<MockReporter>( | ||||
|         "world", records, rep_config ) ); | ||||
|         "world", records, makeDummyRepConfig(config) ) ); | ||||
|     multiReporter.testRunStarting( { "" } ); | ||||
|  | ||||
|     std::vector<std::string> expected( { "Hello", "world", "Goodbye", "world" } ); | ||||
| @@ -217,8 +221,8 @@ namespace { | ||||
|     public: | ||||
|         PreferenceReporter( bool redirectStdout, | ||||
|                             bool reportAllAssertions, | ||||
|                             Catch::ReporterConfig const& config ): | ||||
|             StreamingReporterBase( config ) { | ||||
|                             Catch::ReporterConfig&& config ): | ||||
|             StreamingReporterBase( CATCH_MOVE(config) ) { | ||||
|             m_preferences.shouldRedirectStdOut = redirectStdout; | ||||
|             m_preferences.shouldReportAllAssertions = reportAllAssertions; | ||||
|         } | ||||
| @@ -228,11 +232,7 @@ namespace { | ||||
| TEST_CASE("Multireporter updates ReporterPreferences properly", | ||||
|           "[reporters][multi-reporter]") { | ||||
|  | ||||
|     Catch::ConfigData config_data; | ||||
|     Catch::Config config( config_data ); | ||||
|     StringIStream sstream; | ||||
|     Catch::ReporterConfig rep_config( | ||||
|         &config, &sstream, Catch::ColourMode::None, {} ); | ||||
|     Catch::Config config( Catch::ConfigData{} ); | ||||
|     Catch::MultiReporter multiReporter( &config ); | ||||
|  | ||||
|     // Post init defaults | ||||
| @@ -261,19 +261,19 @@ TEST_CASE("Multireporter updates ReporterPreferences properly", | ||||
|     SECTION( "Adding reporters" ) { | ||||
|         multiReporter.addReporter( | ||||
|             Catch::Detail::make_unique<PreferenceReporter>( | ||||
|                 true, false, rep_config ) ); | ||||
|                 true, false, makeDummyRepConfig(config) ) ); | ||||
|         REQUIRE( multiReporter.getPreferences().shouldRedirectStdOut == true ); | ||||
|         REQUIRE( multiReporter.getPreferences().shouldReportAllAssertions == false ); | ||||
|  | ||||
|         multiReporter.addReporter( | ||||
|             Catch::Detail::make_unique<PreferenceReporter>( | ||||
|                 false, true, rep_config ) ); | ||||
|                 false, true, makeDummyRepConfig( config ) ) ); | ||||
|         REQUIRE( multiReporter.getPreferences().shouldRedirectStdOut == true ); | ||||
|         REQUIRE( multiReporter.getPreferences().shouldReportAllAssertions == true ); | ||||
|  | ||||
|         multiReporter.addReporter( | ||||
|             Catch::Detail::make_unique<PreferenceReporter>( | ||||
|                 false, false, rep_config ) ); | ||||
|                 false, false, makeDummyRepConfig( config ) ) ); | ||||
|         REQUIRE( multiReporter.getPreferences().shouldRedirectStdOut == true ); | ||||
|         REQUIRE( multiReporter.getPreferences().shouldReportAllAssertions == true ); | ||||
|     } | ||||
| @@ -281,7 +281,7 @@ TEST_CASE("Multireporter updates ReporterPreferences properly", | ||||
|  | ||||
| namespace { | ||||
|     class TestReporterFactory : public Catch::IReporterFactory { | ||||
|         Catch::IEventListenerPtr create( Catch::ReporterConfig const& ) const override { | ||||
|         Catch::IEventListenerPtr create( Catch::ReporterConfig&& ) const override { | ||||
|             CATCH_INTERNAL_ERROR( | ||||
|                 "This factory should never create a reporter" ); | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský