diff --git a/CMakeLists.txt b/CMakeLists.txt index a0751b18..e3ea7ca1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,7 +159,6 @@ set(INTERNAL_HEADERS ${HEADER_DIR}/internal/catch_session.h ${HEADER_DIR}/internal/catch_startup_exception_registry.h ${HEADER_DIR}/internal/catch_stream.h - ${HEADER_DIR}/internal/catch_streambuf.h ${HEADER_DIR}/internal/catch_stringref.h ${HEADER_DIR}/internal/catch_string_manip.h ${HEADER_DIR}/internal/catch_suppress_warnings.h @@ -220,7 +219,6 @@ set(IMPL_SOURCES ${HEADER_DIR}/internal/catch_session.cpp ${HEADER_DIR}/internal/catch_startup_exception_registry.cpp ${HEADER_DIR}/internal/catch_stream.cpp - ${HEADER_DIR}/internal/catch_streambuf.cpp ${HEADER_DIR}/internal/catch_stringref.cpp ${HEADER_DIR}/internal/catch_string_manip.cpp ${HEADER_DIR}/internal/catch_tag_alias.cpp diff --git a/include/internal/catch_config.cpp b/include/internal/catch_config.cpp index 0f79a9ad..67d2b270 100644 --- a/include/internal/catch_config.cpp +++ b/include/internal/catch_config.cpp @@ -7,7 +7,7 @@ #include "catch_config.hpp" #include "catch_enforce.h" -#include "catch_stream.h" +#include "catch_stringref.h" namespace Catch { @@ -58,16 +58,7 @@ namespace Catch { Verbosity Config::verbosity() const { return m_data.verbosity; } IStream const* Config::openStream() { - if( m_data.outputFilename.empty() ) - return new CoutStream(); - else if( m_data.outputFilename[0] == '%' ) { - if( m_data.outputFilename == "%debug" ) - return new DebugOutStream(); - else - CATCH_ERROR( "Unrecognised stream: '" << m_data.outputFilename << "'" ); - } - else - return new FileStream( m_data.outputFilename ); + return Catch::makeStream(m_data.outputFilename); } } // end namespace Catch diff --git a/include/internal/catch_debugger.cpp b/include/internal/catch_debugger.cpp index c1ef340c..71dc6506 100644 --- a/include/internal/catch_debugger.cpp +++ b/include/internal/catch_debugger.cpp @@ -14,13 +14,15 @@ #ifdef CATCH_PLATFORM_MAC - #include - #include - #include - #include - #include +# include +# include +# include +# include +# include +# include +# include - namespace Catch { +namespace Catch { // The following function is taken directly from the following technical note: // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html diff --git a/include/internal/catch_decomposer.h b/include/internal/catch_decomposer.h index 38b62f45..25824c78 100644 --- a/include/internal/catch_decomposer.h +++ b/include/internal/catch_decomposer.h @@ -11,7 +11,7 @@ #include "catch_tostring.h" #include "catch_stringref.h" -#include +#include #ifdef _MSC_VER #pragma warning(push) diff --git a/include/internal/catch_stream.cpp b/include/internal/catch_stream.cpp index 73889ce8..9d4a3de2 100644 --- a/include/internal/catch_stream.cpp +++ b/include/internal/catch_stream.cpp @@ -11,88 +11,129 @@ #include "catch_enforce.h" #include "catch_stream.h" #include "catch_debug_console.h" +#include "catch_stringref.h" #include #include #include +#include namespace Catch { - template - class StreamBufImpl : public StreamBufBase { - char data[bufferSize]; - WriterF m_writer; + Catch::IStream::~IStream() = default; - public: - StreamBufImpl() { - setp( data, data + sizeof(data) ); - } + namespace detail { namespace { + template + class StreamBufImpl : public std::streambuf { + char data[bufferSize]; + WriterF m_writer; - ~StreamBufImpl() noexcept { - StreamBufImpl::sync(); - } - - private: - int overflow( int c ) override { - sync(); - - if( c != EOF ) { - if( pbase() == epptr() ) - m_writer( std::string( 1, static_cast( c ) ) ); - else - sputc( static_cast( c ) ); + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); } - return 0; - } - int sync() override { - if( pbase() != pptr() ) { - m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); - setp( pbase(), epptr() ); + ~StreamBufImpl() noexcept { + StreamBufImpl::sync(); } - return 0; - } - }; + + private: + int overflow( int c ) override { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast( c ) ) ); + else + sputc( static_cast( c ) ); + } + return 0; + } + + int sync() override { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + struct OutputDebugWriter { + + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; + + /////////////////////////////////////////////////////////////////////////// + + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( StringRef filename ) { + m_ofs.open( filename.c_str() ); + CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); + } + ~FileStream() override = default; + public: // IStream + std::ostream& stream() const override { + return m_ofs; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream() : m_os( Catch::cout().rdbuf() ) {} + ~CoutStream() override = default; + + public: // IStream + std::ostream& stream() const override { return m_os; } + }; + + /////////////////////////////////////////////////////////////////////////// + + class DebugOutStream : public IStream { + std::unique_ptr> m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream() + : m_streamBuf( new StreamBufImpl() ), + m_os( m_streamBuf.get() ) + {} + + ~DebugOutStream() override = default; + + public: // IStream + std::ostream& stream() const override { return m_os; } + }; + + }} // namespace anon::detail /////////////////////////////////////////////////////////////////////////// - - Catch::IStream::~IStream() = default; - - FileStream::FileStream( std::string const& filename ) { - m_ofs.open( filename.c_str() ); - CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); - } - - std::ostream& FileStream::stream() const { - return m_ofs; - } - - struct OutputDebugWriter { - - void operator()( std::string const&str ) { - writeToDebugConsole( str ); + auto makeStream( StringRef const &filename ) -> IStream const* { + if( filename.empty() ) + return new detail::CoutStream(); + else if( filename[0] == '%' ) { + if( filename == "%debug" ) + return new detail::DebugOutStream(); + else + CATCH_ERROR( "Unrecognised stream: '" << filename << "'" ); } - }; - - DebugOutStream::DebugOutStream() - : m_streamBuf( new StreamBufImpl() ), - m_os( m_streamBuf.get() ) - {} - - std::ostream& DebugOutStream::stream() const { - return m_os; + else + return new detail::FileStream( filename ); } - // Store the streambuf from cout up-front because - // cout may get redirected when running tests - CoutStream::CoutStream() - : m_os( Catch::cout().rdbuf() ) - {} + /////////////////////////////////////////////////////////////////////////// - std::ostream& CoutStream::stream() const { - return m_os; - } #ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions std::ostream& cout() { diff --git a/include/internal/catch_stream.h b/include/internal/catch_stream.h index 41780b98..92136199 100644 --- a/include/internal/catch_stream.h +++ b/include/internal/catch_stream.h @@ -9,12 +9,7 @@ #ifndef TWOBLUECUBES_CATCH_STREAM_H_INCLUDED #define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED -#include "catch_streambuf.h" - -#include -#include -#include -#include +#include namespace Catch { @@ -22,43 +17,14 @@ namespace Catch { std::ostream& cerr(); std::ostream& clog(); + class StringRef; struct IStream { virtual ~IStream(); virtual std::ostream& stream() const = 0; }; - class FileStream : public IStream { - mutable std::ofstream m_ofs; - public: - FileStream( std::string const& filename ); - ~FileStream() override = default; - public: // IStream - std::ostream& stream() const override; - }; - - - class CoutStream : public IStream { - mutable std::ostream m_os; - public: - CoutStream(); - ~CoutStream() override = default; - - public: // IStream - std::ostream& stream() const override; - }; - - - class DebugOutStream : public IStream { - std::unique_ptr m_streamBuf; - mutable std::ostream m_os; - public: - DebugOutStream(); - ~DebugOutStream() override = default; - - public: // IStream - std::ostream& stream() const override; - }; + auto makeStream( StringRef const &filename ) -> IStream const*; } #endif // TWOBLUECUBES_CATCH_STREAM_H_INCLUDED diff --git a/include/internal/catch_streambuf.cpp b/include/internal/catch_streambuf.cpp deleted file mode 100644 index 608917fb..00000000 --- a/include/internal/catch_streambuf.cpp +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Created by Martin on 31/08/2017. - * - * 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) - */ - -#include "catch_streambuf.h" - -namespace Catch { - StreamBufBase::~StreamBufBase() = default; -} diff --git a/include/internal/catch_streambuf.h b/include/internal/catch_streambuf.h deleted file mode 100644 index 18b94ccb..00000000 --- a/include/internal/catch_streambuf.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Created by Phil on 27/11/2012. - * Copyright 2012 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_STREAMBUF_H_INCLUDED -#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED - -#include - -namespace Catch { - - class StreamBufBase : public std::streambuf { - public: - virtual ~StreamBufBase(); - }; -} - -#endif // TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED diff --git a/projects/XCode/OCTest/catch_objc_impl.mm b/projects/XCode/OCTest/catch_objc_impl.mm index 5b081ad7..01443cc9 100644 --- a/projects/XCode/OCTest/catch_objc_impl.mm +++ b/projects/XCode/OCTest/catch_objc_impl.mm @@ -39,7 +39,6 @@ #include "../../../include/internal/catch_session.cpp" #include "../../../include/internal/catch_startup_exception_registry.cpp" #include "../../../include/internal/catch_stream.cpp" -#include "../../../include/internal/catch_streambuf.cpp" #include "../../../include/internal/catch_string_manip.cpp" #include "../../../include/internal/catch_stringref.cpp" #include "../../../include/internal/catch_tag_alias.cpp"