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