1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2007, Google Inc.
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved.
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan)
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Mock - a framework for writing C++ mock classes.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file implements Matcher<const string&>, Matcher<string>, and
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// utilities for defining matchers.
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock-matchers.h"
3846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock-generated-matchers.h"
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string.h>
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <sstream>
42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string>
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Constructs a matcher that matches a const string& whose value is
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// equal to s.
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterMatcher<const internal::string&>::Matcher(const internal::string& s) {
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  *this = Eq(s);
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Constructs a matcher that matches a const string& whose value is
53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// equal to s.
54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterMatcher<const internal::string&>::Matcher(const char* s) {
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  *this = Eq(internal::string(s));
56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Constructs a matcher that matches a string whose value is equal to s.
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterMatcher<internal::string>::Matcher(const internal::string& s) { *this = Eq(s); }
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Constructs a matcher that matches a string whose value is equal to s.
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterMatcher<internal::string>::Matcher(const char* s) {
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  *this = Eq(internal::string(s));
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Joins a vector of strings as if they are fields of a tuple; returns
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the joined string.
7046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ string JoinAsTuple(const Strings& fields) {
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  switch (fields.size()) {
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    case 0:
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return "";
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    case 1:
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return fields[0];
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    default:
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      string result = "(" + fields[0];
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      for (size_t i = 1; i < fields.size(); i++) {
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        result += ", ";
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        result += fields[i];
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      result += ")";
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return result;
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
8746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Returns the description for a matcher defined using the MATCHER*()
8846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// macro where the user-supplied description string is "", if
8946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// 'negation' is false; otherwise returns the description of the
9046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// negation of the matcher.  'param_values' contains a list of strings
9146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// that are the print-out of the matcher's parameters.
9246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanGTEST_API_ string FormatMatcherDescription(bool negation,
9346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                           const char* matcher_name,
9446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                           const Strings& param_values) {
9546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  string result = ConvertIdentifierNameToWords(matcher_name);
9646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  if (param_values.size() >= 1)
9746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    result += " " + JoinAsTuple(param_values);
9846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return negation ? "not (" + result + ")" : result;
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
103