diff options
Diffstat (limited to 'googlemock/include')
| -rw-r--r-- | googlemock/include/gmock/gmock-actions.h | 59 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-matchers.h | 7 | 
2 files changed, 59 insertions, 7 deletions
| diff --git a/googlemock/include/gmock/gmock-actions.h b/googlemock/include/gmock/gmock-actions.h index f12d39be..b040004a 100644 --- a/googlemock/include/gmock/gmock-actions.h +++ b/googlemock/include/gmock/gmock-actions.h @@ -716,6 +716,36 @@ class ReturnRefOfCopyAction {    GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction);  }; +// Implements the polymorphic ReturnRoundRobin(v) action, which can be +// used in any function that returns the element_type of v. +template <typename T> +class ReturnRoundRobinAction { + public: +  explicit ReturnRoundRobinAction(std::vector<T> values) { +    GTEST_CHECK_(!values.empty()) +        << "ReturnRoundRobin requires at least one element."; +    state_->values = std::move(values); +  } + +  template <typename... Args> +  T operator()(Args&&...) const { +     return state_->Next(); +  } + + private: +  struct State { +    T Next() { +      T ret_val = values[i++]; +      if (i == values.size()) i = 0; +      return ret_val; +    } + +    std::vector<T> values; +    size_t i = 0; +  }; +  std::shared_ptr<State> state_ = std::make_shared<State>(); +}; +  // Implements the polymorphic DoDefault() action.  class DoDefaultAction {   public: @@ -1022,6 +1052,10 @@ inline internal::ReturnRefAction<R> ReturnRef(R& x) {  // NOLINT    return internal::ReturnRefAction<R>(x);  } +// Prevent using ReturnRef on reference to temporary. +template <typename R, R* = nullptr> +internal::ReturnRefAction<R> ReturnRef(R&&) = delete; +  // Creates an action that returns the reference to a copy of the  // argument.  The copy is created when the action is constructed and  // lives as long as the action. @@ -1039,6 +1073,23 @@ internal::ByMoveWrapper<R> ByMove(R x) {    return internal::ByMoveWrapper<R>(std::move(x));  } +// Creates an action that returns an element of `vals`. Calling this action will +// repeatedly return the next value from `vals` until it reaches the end and +// will restart from the beginning. +template <typename T> +internal::ReturnRoundRobinAction<T> ReturnRoundRobin(std::vector<T> vals) { +  return internal::ReturnRoundRobinAction<T>(std::move(vals)); +} + +// Creates an action that returns an element of `vals`. Calling this action will +// repeatedly return the next value from `vals` until it reaches the end and +// will restart from the beginning. +template <typename T> +internal::ReturnRoundRobinAction<T> ReturnRoundRobin( +    std::initializer_list<T> vals) { +  return internal::ReturnRoundRobinAction<T>(std::vector<T>(vals)); +} +  // Creates an action that does the default action for the give mock function.  inline internal::DoDefaultAction DoDefault() {    return internal::DoDefaultAction(); @@ -1047,14 +1098,14 @@ inline internal::DoDefaultAction DoDefault() {  // Creates an action that sets the variable pointed by the N-th  // (0-based) function argument to 'value'.  template <size_t N, typename T> -internal::SetArgumentPointeeAction<N, T> SetArgPointee(T x) { -  return {std::move(x)}; +internal::SetArgumentPointeeAction<N, T> SetArgPointee(T value) { +  return {std::move(value)};  }  // The following version is DEPRECATED.  template <size_t N, typename T> -internal::SetArgumentPointeeAction<N, T> SetArgumentPointee(T x) { -  return {std::move(x)}; +internal::SetArgumentPointeeAction<N, T> SetArgumentPointee(T value) { +  return {std::move(value)};  }  // Creates an action that sets a pointer referent to a given value. diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index bb047da9..b8ec24dd 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -758,8 +758,7 @@ class HasSubstrMatcher {    template <typename MatcheeStringType>    bool MatchAndExplain(const MatcheeStringType& s,                         MatchResultListener* /* listener */) const { -    const StringType& s2(s); -    return s2.find(substring_) != StringType::npos; +    return StringType(s).find(substring_) != StringType::npos;    }    // Describes what this matcher matches. @@ -3028,12 +3027,14 @@ class UnorderedElementsAreMatcherImpl      element_printouts->clear();      ::std::vector<char> did_match;      size_t num_elements = 0; +    DummyMatchResultListener dummy;      for (; elem_first != elem_last; ++num_elements, ++elem_first) {        if (listener->IsInterested()) {          element_printouts->push_back(PrintToString(*elem_first));        }        for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) { -        did_match.push_back(Matches(matchers_[irhs])(*elem_first)); +        did_match.push_back( +            matchers_[irhs].MatchAndExplain(*elem_first, &dummy));        }      } | 
