1 /* 2 * Created by Phil Nash on 08/02/2017. 3 * Copyright (c) 2017 Two Blue Cubes Ltd. All rights reserved. 4 * 5 * Distributed under the Boost Software License, Version 1.0. (See accompanying 6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 9 #include "catch_matchers.hpp" 10 11 namespace Catch { 12 namespace Matchers { 13 14 namespace StdString { 15 CasedString(std::string const & str,CaseSensitive::Choice caseSensitivity)16 CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) 17 : m_caseSensitivity( caseSensitivity ), 18 m_str( adjustString( str ) ) 19 {} adjustString(std::string const & str) const20 std::string CasedString::adjustString( std::string const& str ) const { 21 return m_caseSensitivity == CaseSensitive::No 22 ? toLower( str ) 23 : str; 24 } caseSensitivitySuffix() const25 std::string CasedString::caseSensitivitySuffix() const { 26 return m_caseSensitivity == CaseSensitive::No 27 ? " (case insensitive)" 28 : std::string(); 29 } 30 31 StringMatcherBase(std::string const & operation,CasedString const & comparator)32 StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) 33 : m_comparator( comparator ), 34 m_operation( operation ) { 35 } 36 describe() const37 std::string StringMatcherBase::describe() const { 38 std::string description; 39 description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + 40 m_comparator.caseSensitivitySuffix().size()); 41 description += m_operation; 42 description += ": \""; 43 description += m_comparator.m_str; 44 description += "\""; 45 description += m_comparator.caseSensitivitySuffix(); 46 return description; 47 } 48 EqualsMatcher(CasedString const & comparator)49 EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} 50 match(std::string const & source) const51 bool EqualsMatcher::match( std::string const& source ) const { 52 return m_comparator.adjustString( source ) == m_comparator.m_str; 53 } 54 55 ContainsMatcher(CasedString const & comparator)56 ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} 57 match(std::string const & source) const58 bool ContainsMatcher::match( std::string const& source ) const { 59 return contains( m_comparator.adjustString( source ), m_comparator.m_str ); 60 } 61 62 StartsWithMatcher(CasedString const & comparator)63 StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} 64 match(std::string const & source) const65 bool StartsWithMatcher::match( std::string const& source ) const { 66 return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); 67 } 68 69 EndsWithMatcher(CasedString const & comparator)70 EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} 71 match(std::string const & source) const72 bool EndsWithMatcher::match( std::string const& source ) const { 73 return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); 74 } 75 76 } // namespace StdString 77 78 Equals(std::string const & str,CaseSensitive::Choice caseSensitivity)79 StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { 80 return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); 81 } Contains(std::string const & str,CaseSensitive::Choice caseSensitivity)82 StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { 83 return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); 84 } EndsWith(std::string const & str,CaseSensitive::Choice caseSensitivity)85 StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { 86 return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); 87 } StartsWith(std::string const & str,CaseSensitive::Choice caseSensitivity)88 StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { 89 return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); 90 } 91 92 } // namespace Matchers 93 } // namespace Catch 94