/* * Created by Phil on 25/2/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_CONSOLE_COLOUR_IMPL_HPP_INCLUDED #define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED #include "catch_console_colour.hpp" #if defined( CATCH_CONFIG_USE_ANSI_COLOUR_CODES ) #include namespace Catch { // use POSIX/ ANSI console terminal codes // Implementation contributed by Adam Strzelecki (http://github.com/nanoant) // https://github.com/philsquared/Catch/pull/131 TextColour::TextColour( Colours colour ) { if( colour ) set( colour ); } TextColour::~TextColour() { set( TextColour::None ); } namespace { const char colourEscape = '\033'; } void TextColour::set( Colours colour ) { if( isatty( fileno(stdout) ) && !isDebuggerActive() ) { switch( colour ) { case TextColour::FileName: std::cout << colourEscape << "[0m"; // white/ normal break; case TextColour::ResultError: std::cout << colourEscape << "[1;31m"; // bold red break; case TextColour::ResultSuccess: std::cout << colourEscape << "[1;32m"; // bold green break; case TextColour::Error: std::cout << colourEscape << "[0;31m"; // red break; case TextColour::Success: std::cout << colourEscape << "[0;32m"; // green break; case TextColour::OriginalExpression: std::cout << colourEscape << "[0;36m"; // cyan break; case TextColour::ReconstructedExpression: std::cout << colourEscape << "[0;33m"; // yellow break; case TextColour::None: std::cout << colourEscape << "[0m"; // reset } } } } // namespace Catch #elif defined ( CATCH_PLATFORM_WINDOWS ) #include namespace Catch { namespace { WORD mapConsoleColour( TextColour::Colours colour ) { switch( colour ) { case TextColour::FileName: return FOREGROUND_INTENSITY; // greyed out case TextColour::ResultError: return FOREGROUND_RED | FOREGROUND_INTENSITY; // bright red case TextColour::ResultSuccess: return FOREGROUND_GREEN | FOREGROUND_INTENSITY; // bright green case TextColour::Error: return FOREGROUND_RED; // dark red case TextColour::Success: return FOREGROUND_GREEN; // dark green case TextColour::OriginalExpression: return FOREGROUND_BLUE | FOREGROUND_GREEN; // turquoise case TextColour::ReconstructedExpression: return FOREGROUND_RED | FOREGROUND_GREEN; // greeny-yellow default: return 0; } } } struct ConsoleColourImpl { ConsoleColourImpl() : hStdout( GetStdHandle(STD_OUTPUT_HANDLE) ), wOldColorAttrs( 0 ) { GetConsoleScreenBufferInfo( hStdout, &csbiInfo ); wOldColorAttrs = csbiInfo.wAttributes; } ~ConsoleColourImpl() { SetConsoleTextAttribute( hStdout, wOldColorAttrs ); } void set( TextColour::Colours colour ) { WORD consoleColour = mapConsoleColour( colour ); if( consoleColour > 0 ) SetConsoleTextAttribute( hStdout, consoleColour ); } HANDLE hStdout; CONSOLE_SCREEN_BUFFER_INFO csbiInfo; WORD wOldColorAttrs; }; TextColour::TextColour( Colours colour ) : m_impl( new ConsoleColourImpl() ) { if( colour ) m_impl->set( colour ); } TextColour::~TextColour() { delete m_impl; } void TextColour::set( Colours colour ) { m_impl->set( colour ); } } // end namespace Catch #else namespace Catch { TextColour::TextColour( Colours ){} TextColour::~TextColour(){} void TextColour::set( Colours ){} } // end namespace Catch #endif #endif // TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED