| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Created by Phil on 17/01/2011. | 
					
						
							|  |  |  |  *  Copyright 2011 Two Blue Cubes Ltd. All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  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)
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  | #include "catch_stream.h"
 | 
					
						
							|  |  |  | #include "catch_debugger.h"
 | 
					
						
							| 
									
										
										
										
											2012-09-28 19:21:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  | #include <stdexcept>
 | 
					
						
							| 
									
										
										
										
											2011-02-02 19:45:59 +00:00
										 |  |  | #include <cstdio>
 | 
					
						
							| 
									
										
										
										
											2014-10-02 19:08:19 +01:00
										 |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-15 08:02:36 +01:00
										 |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |     template<typename WriterF, size_t bufferSize=256> | 
					
						
							| 
									
										
										
										
											2012-05-15 08:02:36 +01:00
										 |  |  |     class StreamBufImpl : public StreamBufBase { | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |         char data[bufferSize]; | 
					
						
							|  |  |  |         WriterF m_writer; | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2012-05-15 08:02:36 +01:00
										 |  |  |         StreamBufImpl() { | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |             setp( data, data + sizeof(data) ); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-02-03 20:00:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-20 12:48:19 +01:00
										 |  |  |         ~StreamBufImpl() CATCH_NOEXCEPT { | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |             sync(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2013-03-08 09:26:20 +00:00
										 |  |  |         int overflow( int c ) { | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |             sync(); | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-15 08:02:36 +01:00
										 |  |  |             if( c != EOF ) { | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |                 if( pbase() == epptr() ) | 
					
						
							| 
									
										
										
										
											2011-01-31 10:10:20 +00:00
										 |  |  |                     m_writer( std::string( 1, static_cast<char>( c ) ) ); | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |                 else | 
					
						
							| 
									
										
										
										
											2011-02-16 19:02:09 +00:00
										 |  |  |                     sputc( static_cast<char>( c ) ); | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-08 09:26:20 +00:00
										 |  |  |         int sync() { | 
					
						
							| 
									
										
										
										
											2012-05-15 08:02:36 +01:00
										 |  |  |             if( pbase() != pptr() ) { | 
					
						
							| 
									
										
										
										
											2012-05-09 08:17:51 +01:00
										 |  |  |                 m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) ); | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |                 setp( pbase(), epptr() ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 20:00:46 +00:00
										 |  |  |     ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-03 19:14:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 19:21:08 +01:00
										 |  |  |     FileStream::FileStream( std::string const& filename ) { | 
					
						
							|  |  |  |         m_ofs.open( filename.c_str() ); | 
					
						
							|  |  |  |         if( m_ofs.fail() ) { | 
					
						
							|  |  |  |             std::ostringstream oss; | 
					
						
							|  |  |  |             oss << "Unable to open file: '" << filename << "'"; | 
					
						
							|  |  |  |             throw std::domain_error( oss.str() ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     std::ostream& FileStream::stream() const { | 
					
						
							|  |  |  |         return m_ofs; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     struct OutputDebugWriter { | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2013-04-23 18:58:56 +01:00
										 |  |  |         void operator()( std::string const&str ) { | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  |             writeToDebugConsole( str ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-09-29 19:21:08 +01:00
										 |  |  |      | 
					
						
							|  |  |  |     DebugOutStream::DebugOutStream() | 
					
						
							|  |  |  |     :   m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ), | 
					
						
							|  |  |  |         m_os( m_streamBuf.get() ) | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     {} | 
					
						
							| 
									
										
										
										
											2015-09-29 19:21:08 +01:00
										 |  |  |      | 
					
						
							|  |  |  |     std::ostream& DebugOutStream::stream() const { | 
					
						
							|  |  |  |         return m_os; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // Store the streambuf from cout up-front because
 | 
					
						
							|  |  |  |     // cout may get redirected when running tests
 | 
					
						
							|  |  |  |     CoutStream::CoutStream() | 
					
						
							|  |  |  |     :   m_os( Catch::cout().rdbuf() ) | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     {} | 
					
						
							| 
									
										
										
										
											2012-09-26 18:36:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 19:21:08 +01:00
										 |  |  |     std::ostream& CoutStream::stream() const { | 
					
						
							|  |  |  |         return m_os; | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-29 19:21:08 +01:00
										 |  |  |      | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2014-10-02 19:08:19 +01:00
										 |  |  | #ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement this functions
 | 
					
						
							|  |  |  |     std::ostream& cout() { | 
					
						
							|  |  |  |         return std::cout; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     std::ostream& cerr() { | 
					
						
							|  |  |  |         return std::cerr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-01-18 09:20:06 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-16 19:02:09 +00:00
										 |  |  | #endif // TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
 |