mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Fixed alternate stream bugs
This commit is contained in:
		| @@ -11,6 +11,7 @@ | ||||
| #include "catch_test_spec.h" | ||||
| #include "catch_context.h" | ||||
| #include "catch_interfaces_config.h" | ||||
| #include "catch_stream.hpp" | ||||
|  | ||||
| #include <memory> | ||||
| #include <vector> | ||||
| @@ -79,19 +80,17 @@ namespace Catch { | ||||
|     public: | ||||
|  | ||||
|         Config() | ||||
|         :   m_streambuf( NULL ), | ||||
|             m_os( std::cout.rdbuf() ) | ||||
|         :   m_os( std::cout.rdbuf() ) | ||||
|         {} | ||||
|          | ||||
|         Config( const ConfigData& data ) | ||||
|         :   m_data( data ), | ||||
|             m_streambuf( NULL ), | ||||
|             m_os( std::cout.rdbuf() ) | ||||
|         {} | ||||
|          | ||||
|         virtual ~Config() { | ||||
|             m_os.rdbuf( std::cout.rdbuf() ); | ||||
|             delete m_streambuf; | ||||
|             m_stream.release(); | ||||
|         } | ||||
|          | ||||
|         void setFilename( const std::string& filename ) { | ||||
| @@ -131,10 +130,10 @@ namespace Catch { | ||||
|         }         | ||||
|  | ||||
|         void useStream( const std::string& streamName ) { | ||||
|             std::streambuf* newBuf = createStreamBuf( streamName ); | ||||
|             setStreamBuf( newBuf ); | ||||
|             delete m_streambuf; | ||||
|             m_streambuf = newBuf; | ||||
|             Stream stream = createStream( streamName ); | ||||
|             setStreamBuf( stream.streamBuf ); | ||||
|             m_stream.release(); | ||||
|             m_stream = stream; | ||||
|         } | ||||
|  | ||||
|         void addTestSpec( const std::string& testSpec ) { | ||||
| @@ -166,7 +165,7 @@ namespace Catch { | ||||
|         ConfigData m_data; | ||||
|          | ||||
|         // !TBD Move these out of here | ||||
|         std::streambuf* m_streambuf; | ||||
|         Stream m_stream; | ||||
|         mutable std::ostream m_os; | ||||
|     }; | ||||
|          | ||||
|   | ||||
| @@ -17,6 +17,7 @@ | ||||
| namespace Catch { | ||||
|  | ||||
|     class TestCaseInfo; | ||||
|     class Stream; | ||||
|     struct IResultCapture; | ||||
|     struct IRunner; | ||||
|     struct IGeneratorsForTest; | ||||
| @@ -49,7 +50,7 @@ namespace Catch { | ||||
|     IContext& getCurrentContext(); | ||||
|     IMutableContext& getCurrentMutableContext(); | ||||
|     void cleanUpContext(); | ||||
|     std::streambuf* createStreamBuf( const std::string& streamName ); | ||||
|     Stream createStream( const std::string& streamName ); | ||||
|  | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -92,10 +92,10 @@ namespace Catch { | ||||
|         return getCurrentMutableContext(); | ||||
|     } | ||||
|  | ||||
|     std::streambuf* createStreamBuf( const std::string& streamName ) { | ||||
|         if( streamName == "stdout" ) return std::cout.rdbuf(); | ||||
|         if( streamName == "stderr" ) return std::cerr.rdbuf(); | ||||
|         if( streamName == "debug" ) return new StreamBufImpl<OutputDebugWriter>; | ||||
|     Stream createStream( const std::string& streamName ) { | ||||
|         if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false ); | ||||
|         if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false ); | ||||
|         if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true ); | ||||
|  | ||||
|         throw std::domain_error( "Unknown stream: " + streamName ); | ||||
|     } | ||||
|   | ||||
| @@ -58,6 +58,30 @@ namespace Catch { | ||||
|             writeToDebugConsole( str ); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     class Stream { | ||||
|     public: | ||||
|         Stream() | ||||
|         : streamBuf( NULL ), isOwned( false ) | ||||
|         {} | ||||
|          | ||||
|         Stream( std::streambuf* _streamBuf, bool _isOwned ) | ||||
|         : streamBuf( _streamBuf ), isOwned( _isOwned ) | ||||
|         {} | ||||
|  | ||||
|         void release() { | ||||
|             if( isOwned ) { | ||||
|                 delete streamBuf; | ||||
|                 streamBuf = NULL; | ||||
|                 isOwned = false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         std::streambuf* streamBuf; | ||||
|  | ||||
|     private: | ||||
|         bool isOwned; | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash