diff options
| author | Gennadiy Civil <misterg@google.com> | 2018-02-27 13:51:09 -0500 | 
|---|---|---|
| committer | Gennadiy Civil <misterg@google.com> | 2018-02-27 13:51:09 -0500 | 
| commit | 2bd1750ba7bd23038a329ff80613b9a4e9b89497 (patch) | |
| tree | 6cf6d511a1d03c0f52ac35144752390ea1a5f448 /googlemock/src | |
| parent | 7d15497f7538fb531d0f025929d080743af421ee (diff) | |
| download | googletest-2bd1750ba7bd23038a329ff80613b9a4e9b89497.tar.gz googletest-2bd1750ba7bd23038a329ff80613b9a4e9b89497.tar.bz2 googletest-2bd1750ba7bd23038a329ff80613b9a4e9b89497.zip  | |
gmock merging -2
Diffstat (limited to 'googlemock/src')
| -rw-r--r-- | googlemock/src/gmock-matchers.cc | 196 | 
1 files changed, 119 insertions, 77 deletions
diff --git a/googlemock/src/gmock-matchers.cc b/googlemock/src/gmock-matchers.cc index f37d5c2d..88e40088 100644 --- a/googlemock/src/gmock-matchers.cc +++ b/googlemock/src/gmock-matchers.cc @@ -38,6 +38,7 @@  #include "gmock/gmock-generated-matchers.h"  #include <string.h> +#include <iostream>  #include <sstream>  #include <string> @@ -181,8 +182,7 @@ class MaxBipartiteMatchState {    explicit MaxBipartiteMatchState(const MatchMatrix& graph)        : graph_(&graph),          left_(graph_->LhsSize(), kUnused), -        right_(graph_->RhsSize(), kUnused) { -  } +        right_(graph_->RhsSize(), kUnused) {}    // Returns the edges of a maximal match, each in the form {left, right}.    ElementMatcherPairs Compute() { @@ -239,10 +239,8 @@ class MaxBipartiteMatchState {    //    bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {      for (size_t irhs = 0; irhs < graph_->RhsSize(); ++irhs) { -      if ((*seen)[irhs]) -        continue; -      if (!graph_->HasEdge(ilhs, irhs)) -        continue; +      if ((*seen)[irhs]) continue; +      if (!graph_->HasEdge(ilhs, irhs)) continue;        // There's an available edge from ilhs to irhs.        (*seen)[irhs] = 1;        // Next a search is performed to determine whether @@ -285,8 +283,7 @@ class MaxBipartiteMatchState {  const size_t MaxBipartiteMatchState::kUnused; -GTEST_API_ ElementMatcherPairs -FindMaxBipartiteMatching(const MatchMatrix& g) { +GTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchMatrix& g) {    return MaxBipartiteMatchState(g).Compute();  } @@ -295,7 +292,7 @@ static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,    typedef ElementMatcherPairs::const_iterator Iter;    ::std::ostream& os = *stream;    os << "{"; -  const char *sep = ""; +  const char* sep = "";    for (Iter it = pairs.begin(); it != pairs.end(); ++it) {      os << sep << "\n  ("         << "element #" << it->first << ", " @@ -305,38 +302,6 @@ static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,    os << "\n}";  } -// Tries to find a pairing, and explains the result. -GTEST_API_ bool FindPairing(const MatchMatrix& matrix, -                            MatchResultListener* listener) { -  ElementMatcherPairs matches = FindMaxBipartiteMatching(matrix); - -  size_t max_flow = matches.size(); -  bool result = (max_flow == matrix.RhsSize()); - -  if (!result) { -    if (listener->IsInterested()) { -      *listener << "where no permutation of the elements can " -                   "satisfy all matchers, and the closest match is " -                << max_flow << " of " << matrix.RhsSize() -                << " matchers with the pairings:\n"; -      LogElementMatcherPairVec(matches, listener->stream()); -    } -    return false; -  } - -  if (matches.size() > 1) { -    if (listener->IsInterested()) { -      const char *sep = "where:\n"; -      for (size_t mi = 0; mi < matches.size(); ++mi) { -        *listener << sep << " - element #" << matches[mi].first -                  << " is matched by matcher #" << matches[mi].second; -        sep = ",\n"; -      } -    } -  } -  return true; -} -  bool MatchMatrix::NextGraph() {    for (size_t ilhs = 0; ilhs < LhsSize(); ++ilhs) {      for (size_t irhs = 0; irhs < RhsSize(); ++irhs) { @@ -362,7 +327,7 @@ void MatchMatrix::Randomize() {  std::string MatchMatrix::DebugString() const {    ::std::stringstream ss; -  const char *sep = ""; +  const char* sep = "";    for (size_t i = 0; i < LhsSize(); ++i) {      ss << sep;      for (size_t j = 0; j < RhsSize(); ++j) { @@ -375,44 +340,83 @@ std::string MatchMatrix::DebugString() const {  void UnorderedElementsAreMatcherImplBase::DescribeToImpl(      ::std::ostream* os) const { -  if (matcher_describers_.empty()) { -    *os << "is empty"; -    return; -  } -  if (matcher_describers_.size() == 1) { -    *os << "has " << Elements(1) << " and that element "; -    matcher_describers_[0]->DescribeTo(os); -    return; +  switch (match_flags()) { +    case UnorderedMatcherRequire::ExactMatch: +      if (matcher_describers_.empty()) { +        *os << "is empty"; +        return; +      } +      if (matcher_describers_.size() == 1) { +        *os << "has " << Elements(1) << " and that element "; +        matcher_describers_[0]->DescribeTo(os); +        return; +      } +      *os << "has " << Elements(matcher_describers_.size()) +          << " and there exists some permutation of elements such that:\n"; +      break; +    case UnorderedMatcherRequire::Superset: +      *os << "a surjection from elements to requirements exists such that:\n"; +      break; +    case UnorderedMatcherRequire::Subset: +      *os << "an injection from elements to requirements exists such that:\n"; +      break;    } -  *os << "has " << Elements(matcher_describers_.size()) -      << " and there exists some permutation of elements such that:\n"; +    const char* sep = "";    for (size_t i = 0; i != matcher_describers_.size(); ++i) { -    *os << sep << " - element #" << i << " "; +    *os << sep; +    if (match_flags() == UnorderedMatcherRequire::ExactMatch) { +      *os << " - element #" << i << " "; +    } else { +      *os << " - an element "; +    }      matcher_describers_[i]->DescribeTo(os); -    sep = ", and\n"; +    if (match_flags() == UnorderedMatcherRequire::ExactMatch) { +      sep = ", and\n"; +    } else { +      sep = "\n"; +    }    }  }  void UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(      ::std::ostream* os) const { -  if (matcher_describers_.empty()) { -    *os << "isn't empty"; -    return; -  } -  if (matcher_describers_.size() == 1) { -    *os << "doesn't have " << Elements(1) -        << ", or has " << Elements(1) << " that "; -    matcher_describers_[0]->DescribeNegationTo(os); -    return; +  switch (match_flags()) { +    case UnorderedMatcherRequire::ExactMatch: +      if (matcher_describers_.empty()) { +        *os << "isn't empty"; +        return; +      } +      if (matcher_describers_.size() == 1) { +        *os << "doesn't have " << Elements(1) << ", or has " << Elements(1) +            << " that "; +        matcher_describers_[0]->DescribeNegationTo(os); +        return; +      } +      *os << "doesn't have " << Elements(matcher_describers_.size()) +          << ", or there exists no permutation of elements such that:\n"; +      break; +    case UnorderedMatcherRequire::Superset: +      *os << "no surjection from elements to requirements exists such that:\n"; +      break; +    case UnorderedMatcherRequire::Subset: +      *os << "no injection from elements to requirements exists such that:\n"; +      break;    } -  *os << "doesn't have " << Elements(matcher_describers_.size()) -      << ", or there exists no permutation of elements such that:\n";    const char* sep = "";    for (size_t i = 0; i != matcher_describers_.size(); ++i) { -    *os << sep << " - element #" << i << " "; +    *os << sep; +    if (match_flags() == UnorderedMatcherRequire::ExactMatch) { +      *os << " - element #" << i << " "; +    } else { +      *os << " - an element "; +    }      matcher_describers_[i]->DescribeTo(os); -    sep = ", and\n"; +    if (match_flags() == UnorderedMatcherRequire::ExactMatch) { +      sep = ", and\n"; +    } else { +      sep = "\n"; +    }    }  } @@ -421,10 +425,9 @@ void UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(  // and better error reporting.  // Returns false, writing an explanation to 'listener', if and only  // if the success criteria are not met. -bool UnorderedElementsAreMatcherImplBase:: -    VerifyAllElementsAndMatchersAreMatched( -        const ::std::vector<std::string>& element_printouts, -        const MatchMatrix& matrix, MatchResultListener* listener) const { +bool UnorderedElementsAreMatcherImplBase::VerifyMatchMatrix( +    const ::std::vector<std::string>& element_printouts, +    const MatchMatrix& matrix, MatchResultListener* listener) const {    bool result = true;    ::std::vector<char> element_matched(matrix.LhsSize(), 0);    ::std::vector<char> matcher_matched(matrix.RhsSize(), 0); @@ -437,12 +440,11 @@ bool UnorderedElementsAreMatcherImplBase::      }    } -  { +  if (match_flags() & UnorderedMatcherRequire::Superset) {      const char* sep =          "where the following matchers don't match any elements:\n";      for (size_t mi = 0; mi < matcher_matched.size(); ++mi) { -      if (matcher_matched[mi]) -        continue; +      if (matcher_matched[mi]) continue;        result = false;        if (listener->IsInterested()) {          *listener << sep << "matcher #" << mi << ": "; @@ -452,7 +454,7 @@ bool UnorderedElementsAreMatcherImplBase::      }    } -  { +  if (match_flags() & UnorderedMatcherRequire::Subset) {      const char* sep =          "where the following elements don't match any matchers:\n";      const char* outer_sep = ""; @@ -460,8 +462,7 @@ bool UnorderedElementsAreMatcherImplBase::        outer_sep = "\nand ";      }      for (size_t ei = 0; ei < element_matched.size(); ++ei) { -      if (element_matched[ei]) -        continue; +      if (element_matched[ei]) continue;        result = false;        if (listener->IsInterested()) {          *listener << outer_sep << sep << "element #" << ei << ": " @@ -474,5 +475,46 @@ bool UnorderedElementsAreMatcherImplBase::    return result;  } +bool UnorderedElementsAreMatcherImplBase::FindPairing( +    const MatchMatrix& matrix, MatchResultListener* listener) const { +  ElementMatcherPairs matches = FindMaxBipartiteMatching(matrix); + +  size_t max_flow = matches.size(); +  if ((match_flags() & UnorderedMatcherRequire::Superset) && +      max_flow < matrix.RhsSize()) { +    if (listener->IsInterested()) { +      *listener << "where no permutation of the elements can satisfy all " +                   "matchers, and the closest match is " +                << max_flow << " of " << matrix.RhsSize() +                << " matchers with the pairings:\n"; +      LogElementMatcherPairVec(matches, listener->stream()); +    } +    return false; +  } +  if ((match_flags() & UnorderedMatcherRequire::Subset) && +      max_flow < matrix.LhsSize()) { +    if (listener->IsInterested()) { +      *listener +          << "where not all elements can be matched, and the closest match is " +          << max_flow << " of " << matrix.RhsSize() +          << " matchers with the pairings:\n"; +      LogElementMatcherPairVec(matches, listener->stream()); +    } +    return false; +  } + +  if (matches.size() > 1) { +    if (listener->IsInterested()) { +      const char* sep = "where:\n"; +      for (size_t mi = 0; mi < matches.size(); ++mi) { +        *listener << sep << " - element #" << matches[mi].first +                  << " is matched by matcher #" << matches[mi].second; +        sep = ",\n"; +      } +    } +  } +  return true; +} +  }  // namespace internal  }  // namespace testing  | 
