| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Created by Phil on 27/11/2013. | 
					
						
							|  |  |  |  *  Copyright 2013 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_COMMON_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "catch_common.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool startsWith( std::string const& s, std::string const& prefix ) { | 
					
						
							|  |  |  |         return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     bool endsWith( std::string const& s, std::string const& suffix ) { | 
					
						
							|  |  |  |         return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     bool contains( std::string const& s, std::string const& infix ) { | 
					
						
							|  |  |  |         return s.find( infix ) != std::string::npos; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-14 14:08:57 -07:00
										 |  |  |     char toLowerCh(char c) { | 
					
						
							|  |  |  |         return static_cast<char>( ::tolower( c ) ); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     void toLowerInPlace( std::string& s ) { | 
					
						
							| 
									
										
										
										
											2016-10-14 14:08:57 -07:00
										 |  |  |         std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     std::string toLower( std::string const& s ) { | 
					
						
							|  |  |  |         std::string lc = s; | 
					
						
							|  |  |  |         toLowerInPlace( lc ); | 
					
						
							|  |  |  |         return lc; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     std::string trim( std::string const& str ) { | 
					
						
							|  |  |  |         static char const* whitespaceChars = "\n\r\t "; | 
					
						
							|  |  |  |         std::string::size_type start = str.find_first_not_of( whitespaceChars ); | 
					
						
							|  |  |  |         std::string::size_type end = str.find_last_not_of( whitespaceChars ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-04 18:01:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-19 18:16:19 +00:00
										 |  |  |     bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { | 
					
						
							|  |  |  |         bool replaced = false; | 
					
						
							|  |  |  |         std::size_t i = str.find( replaceThis ); | 
					
						
							|  |  |  |         while( i != std::string::npos ) { | 
					
						
							|  |  |  |             replaced = true; | 
					
						
							|  |  |  |             str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); | 
					
						
							|  |  |  |             if( i < str.size()-withThis.size() ) | 
					
						
							|  |  |  |                 i = str.find( replaceThis, i+withThis.size() ); | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 i = std::string::npos; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return replaced; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-04 18:01:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     pluralise::pluralise( std::size_t count, std::string const& label ) | 
					
						
							|  |  |  |     :   m_count( count ), | 
					
						
							|  |  |  |         m_label( label ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { | 
					
						
							|  |  |  |         os << pluraliser.m_count << " " << pluraliser.m_label; | 
					
						
							|  |  |  |         if( pluraliser.m_count != 1 ) | 
					
						
							|  |  |  |             os << "s"; | 
					
						
							|  |  |  |         return os; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SourceLineInfo::SourceLineInfo() : line( 0 ){} | 
					
						
							| 
									
										
										
										
											2013-12-04 08:12:30 +00:00
										 |  |  |     SourceLineInfo::SourceLineInfo( char const* _file, std::size_t _line ) | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     :   file( _file ), | 
					
						
							|  |  |  |         line( _line ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  |     SourceLineInfo::SourceLineInfo( SourceLineInfo const& other ) | 
					
						
							|  |  |  |     :   file( other.file ), | 
					
						
							|  |  |  |         line( other.line ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  |     bool SourceLineInfo::empty() const { | 
					
						
							|  |  |  |         return file.empty(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const { | 
					
						
							|  |  |  |         return line == other.line && file == other.file; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-03-04 07:08:53 +00:00
										 |  |  |     bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const { | 
					
						
							|  |  |  |         return line < other.line || ( line == other.line  && file < other.file ); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-02 23:02:35 +01:00
										 |  |  |     void seedRng( IConfig const& config ) { | 
					
						
							|  |  |  |         if( config.rngSeed() != 0 ) | 
					
						
							|  |  |  |             std::srand( config.rngSeed() ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     unsigned int rngSeed() { | 
					
						
							|  |  |  |         return getCurrentContext().getConfig()->rngSeed(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |     std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { | 
					
						
							|  |  |  | #ifndef __GNUG__
 | 
					
						
							|  |  |  |         os << info.file << "(" << info.line << ")"; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |         os << info.file << ":" << info.line; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |         return os; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) { | 
					
						
							|  |  |  |         std::ostringstream oss; | 
					
						
							|  |  |  |         oss << locationInfo << ": Internal Catch error: '" << message << "'"; | 
					
						
							| 
									
										
										
										
											2014-05-28 18:53:01 +01:00
										 |  |  |         if( alwaysTrue() ) | 
					
						
							| 
									
										
										
										
											2013-12-03 18:52:41 +00:00
										 |  |  |             throw std::logic_error( oss.str() ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
 | 
					
						
							|  |  |  | 
 |