diff options
Diffstat (limited to 'googlemock/include')
| -rw-r--r-- | googlemock/include/gmock/gmock-actions.h | 203 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-actions.h | 91 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-actions.h.pump | 28 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-function-mockers.h | 5 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-function-mockers.h.pump | 5 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-nice-strict.h | 459 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-matchers.h | 180 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-nice-strict.h (renamed from googlemock/include/gmock/gmock-generated-nice-strict.h.pump) | 120 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-spec-builders.h | 17 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock.h | 2 | ||||
| -rw-r--r-- | googlemock/include/gmock/internal/gmock-generated-internal-utils.h | 14 | ||||
| -rw-r--r-- | googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump | 14 | ||||
| -rw-r--r-- | googlemock/include/gmock/internal/gmock-internal-utils.h | 33 | 
13 files changed, 198 insertions, 973 deletions
diff --git a/googlemock/include/gmock/gmock-actions.h b/googlemock/include/gmock/gmock-actions.h index 7105830d..28141257 100644 --- a/googlemock/include/gmock/gmock-actions.h +++ b/googlemock/include/gmock/gmock-actions.h @@ -42,18 +42,15 @@  #endif  #include <algorithm> +#include <functional>  #include <memory>  #include <string> +#include <type_traits>  #include <utility>  #include "gmock/internal/gmock-internal-utils.h"  #include "gmock/internal/gmock-port.h" -#if GTEST_LANG_CXX11  // Defined by gtest-port.h via gmock-port.h. -#include <functional> -#include <type_traits> -#endif  // GTEST_LANG_CXX11 -  #ifdef _MSC_VER  # pragma warning(push)  # pragma warning(disable:4100) @@ -72,9 +69,6 @@ namespace testing {  namespace internal { -template <typename F1, typename F2> -class ActionAdaptor; -  // BuiltInDefaultValueGetter<T, true>::Get() returns a  // default-constructed T value.  BuiltInDefaultValueGetter<T,  // false>::Get() crashes with an error. @@ -105,7 +99,6 @@ struct BuiltInDefaultValueGetter<T, false> {  template <typename T>  class BuiltInDefaultValue {   public: -#if GTEST_LANG_CXX11    // This function returns true iff type T has a built-in default value.    static bool Exists() {      return ::std::is_default_constructible<T>::value; @@ -115,18 +108,6 @@ class BuiltInDefaultValue {      return BuiltInDefaultValueGetter<          T, ::std::is_default_constructible<T>::value>::Get();    } - -#else  // GTEST_LANG_CXX11 -  // This function returns true iff type T has a built-in default value. -  static bool Exists() { -    return false; -  } - -  static T Get() { -    return BuiltInDefaultValueGetter<T, false>::Get(); -  } - -#endif  // GTEST_LANG_CXX11  };  // This partial specialization says that we use the same built-in @@ -358,6 +339,19 @@ class ActionInterface {  // object as a handle to it.  template <typename F>  class Action { +  // Adapter class to allow constructing Action from a legacy ActionInterface. +  // New code should create Actions from functors instead. +  struct ActionAdapter { +    // Adapter must be copyable to satisfy std::function requirements. +    ::std::shared_ptr<ActionInterface<F>> impl_; + +    template <typename... Args> +    typename internal::Function<F>::Result operator()(Args&&... args) { +      return impl_->Perform( +          ::std::forward_as_tuple(::std::forward<Args>(args)...)); +    } +  }; +   public:    typedef typename internal::Function<F>::Result Result;    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; @@ -366,7 +360,6 @@ class Action {    // STL containers.    Action() {} -#if GTEST_LANG_CXX11    // Construct an Action from a specified callable.    // This cannot take std::function directly, because then Action would not be    // directly constructible from lambda (it would require two conversions). @@ -374,26 +367,19 @@ class Action {              typename = typename ::std::enable_if<                  ::std::is_constructible<::std::function<F>, G>::value>::type>    Action(G&& fun) : fun_(::std::forward<G>(fun)) {}  // NOLINT -#endif    // Constructs an Action from its implementation. -  explicit Action(ActionInterface<F>* impl) : impl_(impl) {} +  explicit Action(ActionInterface<F>* impl) +      : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {}    // This constructor allows us to turn an Action<Func> object into an    // Action<F>, as long as F's arguments can be implicitly converted -  // to Func's and Func's return type can be implicitly converted to -  // F's. +  // to Func's and Func's return type can be implicitly converted to F's.    template <typename Func> -  explicit Action(const Action<Func>& action); +  explicit Action(const Action<Func>& action) : fun_(action.fun_) {}    // Returns true iff this is the DoDefault() action. -  bool IsDoDefault() const { -#if GTEST_LANG_CXX11 -    return impl_ == nullptr && fun_ == nullptr; -#else -    return impl_ == NULL; -#endif -  } +  bool IsDoDefault() const { return fun_ == nullptr; }    // Performs the action.  Note that this method is const even though    // the corresponding method in ActionInterface is not.  The reason @@ -405,31 +391,15 @@ class Action {      if (IsDoDefault()) {        internal::IllegalDoDefault(__FILE__, __LINE__);      } -#if GTEST_LANG_CXX11 -    if (fun_ != nullptr) { -      return internal::Apply(fun_, ::std::move(args)); -    } -#endif -    return impl_->Perform(args); +    return internal::Apply(fun_, ::std::move(args));    }   private: -  template <typename F1, typename F2> -  friend class internal::ActionAdaptor; -    template <typename G>    friend class Action; -  // In C++11, Action can be implemented either as a generic functor (through -  // std::function), or legacy ActionInterface. In C++98, only ActionInterface -  // is available. The invariants are as follows: -  // * in C++98, impl_ is null iff this is the default action -  // * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff -  //   this is the default action -#if GTEST_LANG_CXX11 +  // fun_ is an empty function iff this is the DoDefault() action.    ::std::function<F> fun_; -#endif -  std::shared_ptr<ActionInterface<F>> impl_;  };  // The PolymorphicAction class template makes it easy to implement a @@ -508,26 +478,6 @@ inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {  namespace internal { -// Allows an Action<F2> object to pose as an Action<F1>, as long as F2 -// and F1 are compatible. -template <typename F1, typename F2> -class ActionAdaptor : public ActionInterface<F1> { - public: -  typedef typename internal::Function<F1>::Result Result; -  typedef typename internal::Function<F1>::ArgumentTuple ArgumentTuple; - -  explicit ActionAdaptor(const Action<F2>& from) : impl_(from.impl_) {} - -  Result Perform(const ArgumentTuple& args) override { -    return impl_->Perform(args); -  } - - private: -  const std::shared_ptr<ActionInterface<F2>> impl_; - -  GTEST_DISALLOW_ASSIGN_(ActionAdaptor); -}; -  // Helper struct to specialize ReturnAction to execute a move instead of a copy  // on return. Useful for move-only types, but could be used on any type.  template <typename T> @@ -574,7 +524,7 @@ class ReturnAction {    // This template type conversion operator allows Return(x) to be    // used in ANY function that returns x's type.    template <typename F> -  operator Action<F>() const { +  operator Action<F>() const {  // NOLINT      // Assert statement belongs here because this is the best place to verify      // conditions on F. It produces the clearest error messages      // in most compilers. @@ -587,6 +537,8 @@ class ReturnAction {      GTEST_COMPILE_ASSERT_(          !is_reference<Result>::value,          use_ReturnRef_instead_of_Return_to_return_a_reference); +    static_assert(!std::is_void<Result>::value, +                  "Can't use Return() on an action expected to return `void`.");      return Action<F>(new Impl<R, F>(value_));    } @@ -660,13 +612,7 @@ class ReturnNullAction {    // pointer type on compile time.    template <typename Result, typename ArgumentTuple>    static Result Perform(const ArgumentTuple&) { -#if GTEST_LANG_CXX11      return nullptr; -#else -    GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value, -                          ReturnNull_can_be_used_to_return_a_pointer_only); -    return NULL; -#endif  // GTEST_LANG_CXX11    }  }; @@ -1017,51 +963,6 @@ void PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) {    UniversalPrinter<T&>::Print(value, os);  } -// Does two actions sequentially.  Used for implementing the DoAll(a1, -// a2, ...) action. -template <typename Action1, typename Action2> -class DoBothAction { - public: -  DoBothAction(Action1 action1, Action2 action2) -      : action1_(action1), action2_(action2) {} - -  // This template type conversion operator allows DoAll(a1, ..., a_n) -  // to be used in ANY function of compatible type. -  template <typename F> -  operator Action<F>() const { -    return Action<F>(new Impl<F>(action1_, action2_)); -  } - - private: -  // Implements the DoAll(...) action for a particular function type F. -  template <typename F> -  class Impl : public ActionInterface<F> { -   public: -    typedef typename Function<F>::Result Result; -    typedef typename Function<F>::ArgumentTuple ArgumentTuple; -    typedef typename Function<F>::MakeResultVoid VoidResult; - -    Impl(const Action<VoidResult>& action1, const Action<F>& action2) -        : action1_(action1), action2_(action2) {} - -    Result Perform(const ArgumentTuple& args) override { -      action1_.Perform(args); -      return action2_.Perform(args); -    } - -   private: -    const Action<VoidResult> action1_; -    const Action<F> action2_; - -    GTEST_DISALLOW_ASSIGN_(Impl); -  }; - -  Action1 action1_; -  Action2 action2_; - -  GTEST_DISALLOW_ASSIGN_(DoBothAction); -}; -  template <typename InnerAction, size_t... I>  struct WithArgsAction {    InnerAction action; @@ -1080,6 +981,35 @@ struct WithArgsAction {    }  }; +template <typename... Actions> +struct DoAllAction { + private: +  template <typename... Args, size_t... I> +  std::vector<Action<void(Args...)>> Convert(IndexSequence<I...>) const { +    return {std::get<I>(actions)...}; +  } + + public: +  std::tuple<Actions...> actions; + +  template <typename R, typename... Args> +  operator Action<R(Args...)>() const {  // NOLINT +    struct Op { +      std::vector<Action<void(Args...)>> converted; +      Action<R(Args...)> last; +      R operator()(Args... args) const { +        auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...); +        for (auto& a : converted) { +          a.Perform(tuple_args); +        } +        return last.Perform(tuple_args); +      } +    }; +    return Op{Convert<Args...>(MakeIndexSequence<sizeof...(Actions) - 1>()), +              std::get<sizeof...(Actions) - 1>(actions)}; +  } +}; +  }  // namespace internal  // An Unused object can be implicitly constructed from ANY value. @@ -1114,20 +1044,12 @@ struct WithArgsAction {  //   EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));  typedef internal::IgnoredValue Unused; -// This constructor allows us to turn an Action<From> object into an -// Action<To>, as long as To's arguments can be implicitly converted -// to From's and From's return type cann be implicitly converted to -// To's. -template <typename To> -template <typename From> -Action<To>::Action(const Action<From>& from) -    : -#if GTEST_LANG_CXX11 -      fun_(from.fun_), -#endif -      impl_(from.impl_ == nullptr -                ? nullptr -                : new internal::ActionAdaptor<To, From>(from)) { +// Creates an action that does actions a1, a2, ..., sequentially in +// each invocation. +template <typename... Action> +internal::DoAllAction<typename std::decay<Action>::type...> DoAll( +    Action&&... action) { +  return {std::forward_as_tuple(std::forward<Action>(action)...)};  }  // WithArg<k>(an_action) creates an action that passes the k-th @@ -1218,10 +1140,6 @@ SetArgPointee(const T& x) {        N, T, internal::IsAProtocolMessage<T>::value>(x));  } -#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN) -// This overload allows SetArgPointee() to accept a string literal. -// GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish -// this overload from the templated version and emit a compile error.  template <size_t N>  PolymorphicAction<    internal::SetArgumentPointeeAction<N, const char*, false> > @@ -1237,7 +1155,6 @@ SetArgPointee(const wchar_t* p) {    return MakePolymorphicAction(internal::SetArgumentPointeeAction<        N, const wchar_t*, false>(p));  } -#endif  // The following version is DEPRECATED.  template <size_t N, typename T> diff --git a/googlemock/include/gmock/gmock-generated-actions.h b/googlemock/include/gmock/gmock-generated-actions.h index fac491b7..910436e0 100644 --- a/googlemock/include/gmock/gmock-generated-actions.h +++ b/googlemock/include/gmock/gmock-generated-actions.h @@ -474,97 +474,6 @@ class ActionHelper {  };  }  // namespace internal - -// Creates an action that does actions a1, a2, ..., sequentially in -// each invocation. -template <typename Action1, typename Action2> -inline internal::DoBothAction<Action1, Action2> -DoAll(Action1 a1, Action2 a2) { -  return internal::DoBothAction<Action1, Action2>(a1, a2); -} - -template <typename Action1, typename Action2, typename Action3> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    Action3> > -DoAll(Action1 a1, Action2 a2, Action3 a3) { -  return DoAll(a1, DoAll(a2, a3)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, Action4> > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) { -  return DoAll(a1, DoAll(a2, a3, a4)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4, typename Action5> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, internal::DoBothAction<Action4, -    Action5> > > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) { -  return DoAll(a1, DoAll(a2, a3, a4, a5)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4, typename Action5, typename Action6> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, internal::DoBothAction<Action4, -    internal::DoBothAction<Action5, Action6> > > > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) { -  return DoAll(a1, DoAll(a2, a3, a4, a5, a6)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4, typename Action5, typename Action6, typename Action7> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, internal::DoBothAction<Action4, -    internal::DoBothAction<Action5, internal::DoBothAction<Action6, -    Action7> > > > > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, -    Action7 a7) { -  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4, typename Action5, typename Action6, typename Action7, -    typename Action8> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, internal::DoBothAction<Action4, -    internal::DoBothAction<Action5, internal::DoBothAction<Action6, -    internal::DoBothAction<Action7, Action8> > > > > > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, -    Action7 a7, Action8 a8) { -  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4, typename Action5, typename Action6, typename Action7, -    typename Action8, typename Action9> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, internal::DoBothAction<Action4, -    internal::DoBothAction<Action5, internal::DoBothAction<Action6, -    internal::DoBothAction<Action7, internal::DoBothAction<Action8, -    Action9> > > > > > > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, -    Action7 a7, Action8 a8, Action9 a9) { -  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9)); -} - -template <typename Action1, typename Action2, typename Action3, -    typename Action4, typename Action5, typename Action6, typename Action7, -    typename Action8, typename Action9, typename Action10> -inline internal::DoBothAction<Action1, internal::DoBothAction<Action2, -    internal::DoBothAction<Action3, internal::DoBothAction<Action4, -    internal::DoBothAction<Action5, internal::DoBothAction<Action6, -    internal::DoBothAction<Action7, internal::DoBothAction<Action8, -    internal::DoBothAction<Action9, Action10> > > > > > > > > -DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6, -    Action7 a7, Action8 a8, Action9 a9, Action10 a10) { -  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10)); -} -  }  // namespace testing  // The ACTION* family of macros can be used in a namespace scope to diff --git a/googlemock/include/gmock/gmock-generated-actions.h.pump b/googlemock/include/gmock/gmock-generated-actions.h.pump index d38b1f92..27c96efc 100644 --- a/googlemock/include/gmock/gmock-generated-actions.h.pump +++ b/googlemock/include/gmock/gmock-generated-actions.h.pump @@ -165,34 +165,6 @@ $template  };  }  // namespace internal - -// Creates an action that does actions a1, a2, ..., sequentially in -// each invocation. -$range i 2..n -$for i [[ -$range j 2..i -$var types = [[$for j, [[typename Action$j]]]] -$var Aas = [[$for j [[, Action$j a$j]]]] - -template <typename Action1, $types> -$range k 1..i-1 - -inline $for k [[internal::DoBothAction<Action$k, ]]Action$i$for k  [[>]] - -DoAll(Action1 a1$Aas) { -$if i==2 [[ - -  return internal::DoBothAction<Action1, Action2>(a1, a2); -]] $else [[ -$range j2 2..i - -  return DoAll(a1, DoAll($for j2, [[a$j2]])); -]] - -} - -]] -  }  // namespace testing  // The ACTION* family of macros can be used in a namespace scope to diff --git a/googlemock/include/gmock/gmock-generated-function-mockers.h b/googlemock/include/gmock/gmock-generated-function-mockers.h index cbd7b59d..5229cc1e 100644 --- a/googlemock/include/gmock/gmock-generated-function-mockers.h +++ b/googlemock/include/gmock/gmock-generated-function-mockers.h @@ -41,15 +41,12 @@  #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_  #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ +#include <functional>  #include <utility>  #include "gmock/gmock-spec-builders.h"  #include "gmock/internal/gmock-internal-utils.h" -#if GTEST_HAS_STD_FUNCTION_ -# include <functional> -#endif -  namespace testing {  namespace internal {  // Removes the given pointer; this is a helper for the expectation setter method diff --git a/googlemock/include/gmock/gmock-generated-function-mockers.h.pump b/googlemock/include/gmock/gmock-generated-function-mockers.h.pump index 73b68b9d..a5ec7387 100644 --- a/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +++ b/googlemock/include/gmock/gmock-generated-function-mockers.h.pump @@ -42,15 +42,12 @@ $var n = 10  $$ The maximum arity we support.  #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_  #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ +#include <functional>  #include <utility>  #include "gmock/gmock-spec-builders.h"  #include "gmock/internal/gmock-internal-utils.h" -#if GTEST_HAS_STD_FUNCTION_ -# include <functional> -#endif -  namespace testing {  namespace internal { diff --git a/googlemock/include/gmock/gmock-generated-nice-strict.h b/googlemock/include/gmock/gmock-generated-nice-strict.h deleted file mode 100644 index a2e8b9ad..00000000 --- a/googlemock/include/gmock/gmock-generated-nice-strict.h +++ /dev/null @@ -1,459 +0,0 @@ -// This file was GENERATED by command: -//     pump.py gmock-generated-nice-strict.h.pump -// DO NOT EDIT BY HAND!!! - -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -//     * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -//     * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -//     * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -// Implements class templates NiceMock, NaggyMock, and StrictMock. -// -// Given a mock class MockFoo that is created using Google Mock, -// NiceMock<MockFoo> is a subclass of MockFoo that allows -// uninteresting calls (i.e. calls to mock methods that have no -// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo -// that prints a warning when an uninteresting call occurs, and -// StrictMock<MockFoo> is a subclass of MockFoo that treats all -// uninteresting calls as errors. -// -// Currently a mock is naggy by default, so MockFoo and -// NaggyMock<MockFoo> behave like the same.  However, we will soon -// switch the default behavior of mocks to be nice, as that in general -// leads to more maintainable tests.  When that happens, MockFoo will -// stop behaving like NaggyMock<MockFoo> and start behaving like -// NiceMock<MockFoo>. -// -// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of -// their respective base class.  Therefore you can write -// NiceMock<MockFoo>(5, "a") to construct a nice mock where MockFoo -// has a constructor that accepts (int, const char*), for example. -// -// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>, -// and StrictMock<MockFoo> only works for mock methods defined using -// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. -// If a mock method is defined in a base class of MockFoo, the "nice" -// or "strict" modifier may not affect it, depending on the compiler. -// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT -// supported. - -// GOOGLETEST_CM0002 DO NOT DELETE - -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ - -#include "gmock/gmock-spec-builders.h" -#include "gmock/internal/gmock-port.h" - -namespace testing { - -template <class MockClass> -class NiceMock : public MockClass { - public: -  NiceMock() : MockClass() { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -#if GTEST_LANG_CXX11 -  // Ideally, we would inherit base class's constructors through a using -  // declaration, which would preserve their visibility. However, many existing -  // tests rely on the fact that current implementation reexports protected -  // constructors as public. These tests would need to be cleaned up first. - -  // Single argument constructor is special-cased so that it can be -  // made explicit. -  template <typename A> -  explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename... An> -  NiceMock(A1&& arg1, A2&& arg2, An&&... args) -      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2), -                  std::forward<An>(args)...) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } -#else -  // C++98 doesn't have variadic templates, so we have to define one -  // for each arity. -  template <typename A1> -  explicit NiceMock(const A1& a1) : MockClass(a1) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } -  template <typename A1, typename A2> -  NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3> -  NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, -      const A4& a4) : MockClass(a1, a2, a3, a4) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5) : MockClass(a1, a2, a3, a4, a5) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, -      a6, a7) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, -      a2, a3, a4, a5, a6, a7, a8) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8, typename A9> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8, -      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8, typename A9, typename A10> -  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, -      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -#endif  // GTEST_LANG_CXX11 - -  ~NiceMock() {  // NOLINT -    ::testing::Mock::UnregisterCallReaction( -        internal::ImplicitCast_<MockClass*>(this)); -  } - - private: -  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock); -}; - -template <class MockClass> -class NaggyMock : public MockClass { - public: -  NaggyMock() : MockClass() { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -#if GTEST_LANG_CXX11 -  // Ideally, we would inherit base class's constructors through a using -  // declaration, which would preserve their visibility. However, many existing -  // tests rely on the fact that current implementation reexports protected -  // constructors as public. These tests would need to be cleaned up first. - -  // Single argument constructor is special-cased so that it can be -  // made explicit. -  template <typename A> -  explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename... An> -  NaggyMock(A1&& arg1, A2&& arg2, An&&... args) -      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2), -                  std::forward<An>(args)...) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } -#else -  // C++98 doesn't have variadic templates, so we have to define one -  // for each arity. -  template <typename A1> -  explicit NaggyMock(const A1& a1) : MockClass(a1) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } -  template <typename A1, typename A2> -  NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, -      const A4& a4) : MockClass(a1, a2, a3, a4) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5) : MockClass(a1, a2, a3, a4, a5) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, -      a6, a7) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, -      a2, a3, a4, a5, a6, a7, a8) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8, typename A9> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8, -      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8, typename A9, typename A10> -  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, -      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -#endif  // GTEST_LANG_CXX11 - -  ~NaggyMock() {  // NOLINT -    ::testing::Mock::UnregisterCallReaction( -        internal::ImplicitCast_<MockClass*>(this)); -  } - - private: -  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock); -}; - -template <class MockClass> -class StrictMock : public MockClass { - public: -  StrictMock() : MockClass() { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -#if GTEST_LANG_CXX11 -  // Ideally, we would inherit base class's constructors through a using -  // declaration, which would preserve their visibility. However, many existing -  // tests rely on the fact that current implementation reexports protected -  // constructors as public. These tests would need to be cleaned up first. - -  // Single argument constructor is special-cased so that it can be -  // made explicit. -  template <typename A> -  explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename... An> -  StrictMock(A1&& arg1, A2&& arg2, An&&... args) -      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2), -                  std::forward<An>(args)...) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } -#else -  // C++98 doesn't have variadic templates, so we have to define one -  // for each arity. -  template <typename A1> -  explicit StrictMock(const A1& a1) : MockClass(a1) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } -  template <typename A1, typename A2> -  StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3> -  StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, -      const A4& a4) : MockClass(a1, a2, a3, a4) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5) : MockClass(a1, a2, a3, a4, a5) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5, -      a6, a7) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1, -      a2, a3, a4, a5, a6, a7, a8) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8, typename A9> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8, -      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  template <typename A1, typename A2, typename A3, typename A4, typename A5, -      typename A6, typename A7, typename A8, typename A9, typename A10> -  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4, -      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, -      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -#endif  // GTEST_LANG_CXX11 - -  ~StrictMock() {  // NOLINT -    ::testing::Mock::UnregisterCallReaction( -        internal::ImplicitCast_<MockClass*>(this)); -  } - - private: -  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock); -}; - -// The following specializations catch some (relatively more common) -// user errors of nesting nice and strict mocks.  They do NOT catch -// all possible errors. - -// These specializations are declared but not defined, as NiceMock, -// NaggyMock, and StrictMock cannot be nested. - -template <typename MockClass> -class NiceMock<NiceMock<MockClass> >; -template <typename MockClass> -class NiceMock<NaggyMock<MockClass> >; -template <typename MockClass> -class NiceMock<StrictMock<MockClass> >; - -template <typename MockClass> -class NaggyMock<NiceMock<MockClass> >; -template <typename MockClass> -class NaggyMock<NaggyMock<MockClass> >; -template <typename MockClass> -class NaggyMock<StrictMock<MockClass> >; - -template <typename MockClass> -class StrictMock<NiceMock<MockClass> >; -template <typename MockClass> -class StrictMock<NaggyMock<MockClass> >; -template <typename MockClass> -class StrictMock<StrictMock<MockClass> >; - -}  // namespace testing - -#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index 68278bea..b99fdc36 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -44,6 +44,7 @@  #include <math.h>  #include <algorithm> +#include <initializer_list>  #include <iterator>  #include <limits>  #include <memory> @@ -57,10 +58,6 @@  #include "gmock/internal/gmock-port.h"  #include "gtest/gtest.h" -#if GTEST_HAS_STD_INITIALIZER_LIST_ -# include <initializer_list>  // NOLINT -- must be after gtest.h -#endif -  GTEST_DISABLE_MSC_WARNINGS_PUSH_(      4251 5046 /* class A needs to have dll-interface to be used by clients of                   class B */ @@ -194,7 +191,6 @@ class MatcherCastImpl<T, Matcher<U> > {      // We delegate the matching logic to the source matcher.      bool MatchAndExplain(T x, MatchResultListener* listener) const override { -#if GTEST_LANG_CXX11        using FromType = typename std::remove_cv<typename std::remove_pointer<            typename std::remove_reference<T>::type>::type>::type;        using ToType = typename std::remove_cv<typename std::remove_pointer< @@ -208,7 +204,6 @@ class MatcherCastImpl<T, Matcher<U> > {                std::is_same<FromType, ToType>::value ||                !std::is_base_of<FromType, ToType>::value,            "Can't implicitly convert from <base> to <derived>"); -#endif  // GTEST_LANG_CXX11        return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);      } @@ -249,11 +244,8 @@ inline Matcher<T> MatcherCast(const M& matcher) {  // Implements SafeMatcherCast().  // -// We use an intermediate class to do the actual safe casting as Nokia's -// Symbian compiler cannot decide between -// template <T, M> ... (M) and -// template <T, U> ... (const Matcher<U>&) -// for function templates but can for member function templates. +// FIXME: The intermediate SafeMatcherCastImpl class was introduced as a +// workaround for a compiler bug, and can now be removed.  template <typename T>  class SafeMatcherCastImpl {   public: @@ -387,11 +379,9 @@ class TuplePrefix {      typename std::tuple_element<N - 1, MatcherTuple>::type matcher =          std::get<N - 1>(matchers);      typedef typename std::tuple_element<N - 1, ValueTuple>::type Value; -    GTEST_REFERENCE_TO_CONST_(Value) value = std::get<N - 1>(values); +    const Value& value = std::get<N - 1>(values);      StringMatchResultListener listener;      if (!matcher.MatchAndExplain(value, &listener)) { -      // FIXME: include in the message the name of the parameter -      // as used in MOCK_METHOD*() when possible.        *os << "  Expected arg #" << N - 1 << ": ";        std::get<N - 1>(matchers).DescribeTo(os);        *os << "\n           Actual: "; @@ -492,9 +482,9 @@ OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {  // Implements A<T>().  template <typename T> -class AnyMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> { +class AnyMatcherImpl : public MatcherInterface<const T&> {   public: -  bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) /* x */, +  bool MatchAndExplain(const T& /* x */,                         MatchResultListener* /* listener */) const override {      return true;    } @@ -524,11 +514,7 @@ class IsNullMatcher {    template <typename Pointer>    bool MatchAndExplain(const Pointer& p,                         MatchResultListener* /* listener */) const { -#if GTEST_LANG_CXX11      return p == nullptr; -#else  // GTEST_LANG_CXX11 -    return GetRawPointer(p) == NULL; -#endif  // GTEST_LANG_CXX11    }    void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } @@ -544,11 +530,7 @@ class NotNullMatcher {    template <typename Pointer>    bool MatchAndExplain(const Pointer& p,                         MatchResultListener* /* listener */) const { -#if GTEST_LANG_CXX11      return p != nullptr; -#else  // GTEST_LANG_CXX11 -    return GetRawPointer(p) != NULL; -#endif  // GTEST_LANG_CXX11    }    void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } @@ -976,12 +958,12 @@ class Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {  // will prevent different instantiations of NotMatcher from sharing  // the same NotMatcherImpl<T> class.  template <typename T> -class NotMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> { +class NotMatcherImpl : public MatcherInterface<const T&> {   public:    explicit NotMatcherImpl(const Matcher<T>& matcher)        : matcher_(matcher) {} -  bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x, +  bool MatchAndExplain(const T& x,                         MatchResultListener* listener) const override {      return !matcher_.MatchAndExplain(x, listener);    } @@ -1025,8 +1007,7 @@ class NotMatcher {  // that will prevent different instantiations of BothOfMatcher from  // sharing the same BothOfMatcherImpl<T> class.  template <typename T> -class AllOfMatcherImpl -    : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> { +class AllOfMatcherImpl : public MatcherInterface<const T&> {   public:    explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)        : matchers_(std::move(matchers)) {} @@ -1049,7 +1030,7 @@ class AllOfMatcherImpl      *os << ")";    } -  bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x, +  bool MatchAndExplain(const T& x,                         MatchResultListener* listener) const override {      // If either matcher1_ or matcher2_ doesn't match x, we only need      // to explain why one of them fails. @@ -1132,8 +1113,7 @@ using AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;  // that will prevent different instantiations of AnyOfMatcher from  // sharing the same EitherOfMatcherImpl<T> class.  template <typename T> -class AnyOfMatcherImpl -    : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> { +class AnyOfMatcherImpl : public MatcherInterface<const T&> {   public:    explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)        : matchers_(std::move(matchers)) {} @@ -1156,7 +1136,7 @@ class AnyOfMatcherImpl      *os << ")";    } -  bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x, +  bool MatchAndExplain(const T& x,                         MatchResultListener* listener) const override {      std::string no_match_result; @@ -1584,8 +1564,7 @@ class PointeeMatcher {    // enough for implementing the DescribeTo() method of Pointee().    template <typename Pointer>    operator Matcher<Pointer>() const { -    return Matcher<Pointer>( -        new Impl<GTEST_REFERENCE_TO_CONST_(Pointer)>(matcher_)); +    return Matcher<Pointer>(new Impl<const Pointer&>(matcher_));    }   private: @@ -1676,7 +1655,6 @@ class WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {    template <typename From>    bool MatchAndExplain(From from, MatchResultListener* listener) const { -    // FIXME: Add more detail on failures. ie did the dyn_cast fail?      To to = dynamic_cast<To>(from);      return MatchPrintAndExplain(to, this->matcher_, listener);    } @@ -1730,23 +1708,22 @@ class FieldMatcher {    template <typename T>    bool MatchAndExplain(const T& value, MatchResultListener* listener) const { +    // FIXME: The dispatch on std::is_pointer was introduced as a workaround for +    // a compiler bug, and can now be removed.      return MatchAndExplainImpl( -        typename ::testing::internal:: -            is_pointer<GTEST_REMOVE_CONST_(T)>::type(), -        value, listener); +        typename std::is_pointer<GTEST_REMOVE_CONST_(T)>::type(), value, +        listener);    }   private: -  // The first argument of MatchAndExplainImpl() is needed to help -  // Symbian's C++ compiler choose which overload to use.  Its type is -  // true_type iff the Field() matcher is used to match a pointer. -  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, +  bool MatchAndExplainImpl(std::false_type /* is_not_pointer */, +                           const Class& obj,                             MatchResultListener* listener) const {      *listener << whose_field_ << "is ";      return MatchPrintAndExplain(obj.*field_, matcher_, listener);    } -  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, +  bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,                             MatchResultListener* listener) const {      if (p == nullptr) return false; @@ -1754,7 +1731,7 @@ class FieldMatcher {      // Since *p has a field, it must be a class/struct/union type and      // thus cannot be a pointer.  Therefore we pass false_type() as      // the first argument. -    return MatchAndExplainImpl(false_type(), *p, listener); +    return MatchAndExplainImpl(std::false_type(), *p, listener);    }    const FieldType Class::*field_; @@ -1775,11 +1752,7 @@ class FieldMatcher {  template <typename Class, typename PropertyType, typename Property>  class PropertyMatcher {   public: -  // The property may have a reference type, so 'const PropertyType&' -  // may cause double references and fail to compile.  That's why we -  // need GTEST_REFERENCE_TO_CONST, which works regardless of -  // PropertyType being a reference or not. -  typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty; +  typedef const PropertyType& RefToConstProperty;    PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)        : property_(property), @@ -1805,16 +1778,13 @@ class PropertyMatcher {    template <typename T>    bool MatchAndExplain(const T&value, MatchResultListener* listener) const {      return MatchAndExplainImpl( -        typename ::testing::internal:: -            is_pointer<GTEST_REMOVE_CONST_(T)>::type(), -        value, listener); +        typename std::is_pointer<GTEST_REMOVE_CONST_(T)>::type(), value, +        listener);    }   private: -  // The first argument of MatchAndExplainImpl() is needed to help -  // Symbian's C++ compiler choose which overload to use.  Its type is -  // true_type iff the Property() matcher is used to match a pointer. -  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj, +  bool MatchAndExplainImpl(std::false_type /* is_not_pointer */, +                           const Class& obj,                             MatchResultListener* listener) const {      *listener << whose_property_ << "is ";      // Cannot pass the return value (for example, int) to MatchPrintAndExplain, @@ -1823,7 +1793,7 @@ class PropertyMatcher {      return MatchPrintAndExplain(result, matcher_, listener);    } -  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p, +  bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,                             MatchResultListener* listener) const {      if (p == nullptr) return false; @@ -1831,7 +1801,7 @@ class PropertyMatcher {      // Since *p has a property method, it must be a class/struct/union      // type and thus cannot be a pointer.  Therefore we pass      // false_type() as the first argument. -    return MatchAndExplainImpl(false_type(), *p, listener); +    return MatchAndExplainImpl(std::false_type(), *p, listener);    }    Property property_; @@ -1852,14 +1822,8 @@ struct CallableTraits {    static void CheckIsValid(Functor /* functor */) {} -#if GTEST_LANG_CXX11    template <typename T>    static auto Invoke(Functor f, T arg) -> decltype(f(arg)) { return f(arg); } -#else -  typedef typename Functor::result_type ResultType; -  template <typename T> -  static ResultType Invoke(Functor f, T arg) { return f(arg); } -#endif  };  // Specialization for function pointers. @@ -1898,12 +1862,8 @@ class ResultOfMatcher {    template <typename T>    class Impl : public MatcherInterface<T> { -#if GTEST_LANG_CXX11      using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(          std::declval<CallableStorageType>(), std::declval<T>())); -#else -    typedef typename CallableTraits<Callable>::ResultType ResultType; -#endif     public:      template <typename M> @@ -1959,7 +1919,7 @@ class SizeIsMatcher {    template <typename Container>    operator Matcher<Container>() const { -    return MakeMatcher(new Impl<Container>(size_matcher_)); +    return Matcher<Container>(new Impl<const Container&>(size_matcher_));    }    template <typename Container> @@ -2009,7 +1969,7 @@ class BeginEndDistanceIsMatcher {    template <typename Container>    operator Matcher<Container>() const { -    return MakeMatcher(new Impl<Container>(distance_matcher_)); +    return Matcher<Container>(new Impl<const Container&>(distance_matcher_));    }    template <typename Container> @@ -2034,13 +1994,9 @@ class BeginEndDistanceIsMatcher {      bool MatchAndExplain(Container container,                           MatchResultListener* listener) const override { -#if GTEST_HAS_STD_BEGIN_AND_END_        using std::begin;        using std::end;        DistanceType distance = std::distance(begin(container), end(container)); -#else -      DistanceType distance = std::distance(container.begin(), container.end()); -#endif        StringMatchResultListener distance_listener;        const bool result =            distance_matcher_.MatchAndExplain(distance, &distance_listener); @@ -2269,7 +2225,8 @@ class PointwiseMatcher {          !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,          use_UnorderedPointwise_with_hash_tables); -    return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_)); +    return Matcher<LhsContainer>( +        new Impl<const LhsContainer&>(tuple_matcher_, rhs_));    }    template <typename LhsContainer> @@ -2471,7 +2428,8 @@ class ContainsMatcher {    template <typename Container>    operator Matcher<Container>() const { -    return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_)); +    return Matcher<Container>( +        new ContainsMatcherImpl<const Container&>(inner_matcher_));    }   private: @@ -2488,7 +2446,8 @@ class EachMatcher {    template <typename Container>    operator Matcher<Container>() const { -    return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_)); +    return Matcher<Container>( +        new EachMatcherImpl<const Container&>(inner_matcher_));    }   private: @@ -2501,7 +2460,6 @@ struct Rank1 {};  struct Rank0 : Rank1 {};  namespace pair_getters { -#if GTEST_LANG_CXX11  using std::get;  template <typename T>  auto First(T& x, Rank1) -> decltype(get<0>(x)) {  // NOLINT @@ -2520,25 +2478,6 @@ template <typename T>  auto Second(T& x, Rank0) -> decltype((x.second)) {  // NOLINT    return x.second;  } -#else -template <typename T> -typename T::first_type& First(T& x, Rank0) {  // NOLINT -  return x.first; -} -template <typename T> -const typename T::first_type& First(const T& x, Rank0) { -  return x.first; -} - -template <typename T> -typename T::second_type& Second(T& x, Rank0) {  // NOLINT -  return x.second; -} -template <typename T> -const typename T::second_type& Second(const T& x, Rank0) { -  return x.second; -} -#endif  // GTEST_LANG_CXX11  }  // namespace pair_getters  // Implements Key(inner_matcher) for the given argument pair type. @@ -3086,8 +3025,10 @@ class UnorderedElementsAreMatcher {      matchers.reserve(::std::tuple_size<MatcherTuple>::value);      TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,                           ::std::back_inserter(matchers)); -    return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>( -        UnorderedMatcherRequire::ExactMatch, matchers.begin(), matchers.end())); +    return Matcher<Container>( +        new UnorderedElementsAreMatcherImpl<const Container&>( +            UnorderedMatcherRequire::ExactMatch, matchers.begin(), +            matchers.end()));    }   private: @@ -3116,8 +3057,8 @@ class ElementsAreMatcher {      matchers.reserve(::std::tuple_size<MatcherTuple>::value);      TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,                           ::std::back_inserter(matchers)); -    return MakeMatcher(new ElementsAreMatcherImpl<Container>( -                           matchers.begin(), matchers.end())); +    return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>( +        matchers.begin(), matchers.end()));    }   private: @@ -3136,8 +3077,9 @@ class UnorderedElementsAreArrayMatcher {    template <typename Container>    operator Matcher<Container>() const { -    return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>( -        match_flags_, matchers_.begin(), matchers_.end())); +    return Matcher<Container>( +        new UnorderedElementsAreMatcherImpl<const Container&>( +            match_flags_, matchers_.begin(), matchers_.end()));    }   private: @@ -3160,7 +3102,7 @@ class ElementsAreArrayMatcher {          !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,          use_UnorderedElementsAreArray_with_hash_tables); -    return MakeMatcher(new ElementsAreMatcherImpl<Container>( +    return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(          matchers_.begin(), matchers_.end()));    } @@ -3548,13 +3490,11 @@ ElementsAreArray(const Container& container) {    return ElementsAreArray(container.begin(), container.end());  } -#if GTEST_HAS_STD_INITIALIZER_LIST_  template <typename T>  inline internal::ElementsAreArrayMatcher<T>  ElementsAreArray(::std::initializer_list<T> xs) {    return ElementsAreArray(xs.begin(), xs.end());  } -#endif  // UnorderedElementsAreArray(iterator_first, iterator_last)  // UnorderedElementsAreArray(pointer, count) @@ -3597,13 +3537,11 @@ UnorderedElementsAreArray(const Container& container) {    return UnorderedElementsAreArray(container.begin(), container.end());  } -#if GTEST_HAS_STD_INITIALIZER_LIST_  template <typename T>  inline internal::UnorderedElementsAreArrayMatcher<T>  UnorderedElementsAreArray(::std::initializer_list<T> xs) {    return UnorderedElementsAreArray(xs.begin(), xs.end());  } -#endif  // _ is a matcher that matches anything of any type.  // @@ -3770,8 +3708,7 @@ Property(PropertyType (Class::*property)() const,    return MakePolymorphicMatcher(        internal::PropertyMatcher<Class, PropertyType,                                  PropertyType (Class::*)() const>( -          property, -          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); +          property, MatcherCast<const PropertyType&>(matcher)));    // The call to MatcherCast() is required for supporting inner    // matchers of compatible types.  For example, it allows    //   Property(&Foo::bar, m) @@ -3789,11 +3726,9 @@ Property(const std::string& property_name,    return MakePolymorphicMatcher(        internal::PropertyMatcher<Class, PropertyType,                                  PropertyType (Class::*)() const>( -          property_name, property, -          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); +          property_name, property, MatcherCast<const PropertyType&>(matcher)));  } -#if GTEST_LANG_CXX11  // The same as above but for reference-qualified member functions.  template <typename Class, typename PropertyType, typename PropertyMatcher>  inline PolymorphicMatcher<internal::PropertyMatcher< @@ -3802,9 +3737,8 @@ Property(PropertyType (Class::*property)() const &,           const PropertyMatcher& matcher) {    return MakePolymorphicMatcher(        internal::PropertyMatcher<Class, PropertyType, -                                PropertyType (Class::*)() const &>( -          property, -          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); +                                PropertyType (Class::*)() const&>( +          property, MatcherCast<const PropertyType&>(matcher)));  }  // Three-argument form for reference-qualified member functions. @@ -3816,11 +3750,9 @@ Property(const std::string& property_name,           const PropertyMatcher& matcher) {    return MakePolymorphicMatcher(        internal::PropertyMatcher<Class, PropertyType, -                                PropertyType (Class::*)() const &>( -          property_name, property, -          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher))); +                                PropertyType (Class::*)() const&>( +          property_name, property, MatcherCast<const PropertyType&>(matcher)));  } -#endif  // Creates a matcher that matches an object iff the result of applying  // a callable to x matches 'matcher'. @@ -4112,7 +4044,6 @@ Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {        tuple_matcher, rhs);  } -#if GTEST_HAS_STD_INITIALIZER_LIST_  // Supports the Pointwise(m, {a, b, c}) syntax.  template <typename TupleMatcher, typename T> @@ -4121,7 +4052,6 @@ inline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(    return Pointwise(tuple_matcher, std::vector<T>(rhs));  } -#endif  // GTEST_HAS_STD_INITIALIZER_LIST_  // UnorderedPointwise(pair_matcher, rhs) matches an STL-style  // container or a native array that contains the same number of @@ -4166,7 +4096,6 @@ UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,    return UnorderedElementsAreArray(matchers);  } -#if GTEST_HAS_STD_INITIALIZER_LIST_  // Supports the UnorderedPointwise(m, {a, b, c}) syntax.  template <typename Tuple2Matcher, typename T> @@ -4177,7 +4106,6 @@ UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,    return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));  } -#endif  // GTEST_HAS_STD_INITIALIZER_LIST_  // Matches an STL-style container or a native array that contains at  // least one element matching the given value or matcher. @@ -4257,13 +4185,11 @@ IsSupersetOf(const Container& container) {    return IsSupersetOf(container.begin(), container.end());  } -#if GTEST_HAS_STD_INITIALIZER_LIST_  template <typename T>  inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(      ::std::initializer_list<T> xs) {    return IsSupersetOf(xs.begin(), xs.end());  } -#endif  // IsSubsetOf(iterator_first, iterator_last)  // IsSubsetOf(pointer, count) @@ -4316,13 +4242,11 @@ IsSubsetOf(const Container& container) {    return IsSubsetOf(container.begin(), container.end());  } -#if GTEST_HAS_STD_INITIALIZER_LIST_  template <typename T>  inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(      ::std::initializer_list<T> xs) {    return IsSubsetOf(xs.begin(), xs.end());  } -#endif  // Matches an STL-style container or a native array that contains only  // elements matching the given value or matcher. diff --git a/googlemock/include/gmock/gmock-generated-nice-strict.h.pump b/googlemock/include/gmock/gmock-nice-strict.h index 024baeda..5495a980 100644 --- a/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +++ b/googlemock/include/gmock/gmock-nice-strict.h @@ -1,8 +1,3 @@ -$$ -*- mode: c++; -*- -$$ This is a Pump source file. Please use Pump to convert -$$ it to gmock-generated-nice-strict.h. -$$ -$var n = 10  $$ The maximum arity we support.  // Copyright 2008, Google Inc.  // All rights reserved.  // @@ -65,34 +60,60 @@ $var n = 10  $$ The maximum arity we support.  // GOOGLETEST_CM0002 DO NOT DELETE -#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ -#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ +#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_ +#define GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_  #include "gmock/gmock-spec-builders.h"  #include "gmock/internal/gmock-port.h"  namespace testing { -$range kind 0..2 -$for kind [[ +template <class MockClass> +class NiceMock : public MockClass { + public: +  NiceMock() : MockClass() { +    ::testing::Mock::AllowUninterestingCalls( +        internal::ImplicitCast_<MockClass*>(this)); +  } -$var clazz=[[$if kind==0 [[NiceMock]] -             $elif kind==1 [[NaggyMock]] -             $else [[StrictMock]]]] +  // Ideally, we would inherit base class's constructors through a using +  // declaration, which would preserve their visibility. However, many existing +  // tests rely on the fact that current implementation reexports protected +  // constructors as public. These tests would need to be cleaned up first. -$var method=[[$if kind==0 [[AllowUninterestingCalls]] -             $elif kind==1 [[WarnUninterestingCalls]] -             $else [[FailUninterestingCalls]]]] +  // Single argument constructor is special-cased so that it can be +  // made explicit. +  template <typename A> +  explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) { +    ::testing::Mock::AllowUninterestingCalls( +        internal::ImplicitCast_<MockClass*>(this)); +  } + +  template <typename A1, typename A2, typename... An> +  NiceMock(A1&& arg1, A2&& arg2, An&&... args) +      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2), +                  std::forward<An>(args)...) { +    ::testing::Mock::AllowUninterestingCalls( +        internal::ImplicitCast_<MockClass*>(this)); +  } + +  ~NiceMock() {  // NOLINT +    ::testing::Mock::UnregisterCallReaction( +        internal::ImplicitCast_<MockClass*>(this)); +  } + + private: +  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock); +};  template <class MockClass> -class $clazz : public MockClass { +class NaggyMock : public MockClass {   public: -  $clazz() : MockClass() { -    ::testing::Mock::$method( +  NaggyMock() : MockClass() { +    ::testing::Mock::WarnUninterestingCalls(          internal::ImplicitCast_<MockClass*>(this));    } -#if GTEST_LANG_CXX11    // Ideally, we would inherit base class's constructors through a using    // declaration, which would preserve their visibility. However, many existing    // tests rely on the fact that current implementation reexports protected @@ -101,51 +122,66 @@ class $clazz : public MockClass {    // Single argument constructor is special-cased so that it can be    // made explicit.    template <typename A> -  explicit $clazz(A&& arg) : MockClass(std::forward<A>(arg)) { -    ::testing::Mock::$method( +  explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) { +    ::testing::Mock::WarnUninterestingCalls(          internal::ImplicitCast_<MockClass*>(this));    }    template <typename A1, typename A2, typename... An> -  $clazz(A1&& arg1, A2&& arg2, An&&... args) +  NaggyMock(A1&& arg1, A2&& arg2, An&&... args)        : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),                    std::forward<An>(args)...) { -    ::testing::Mock::$method( +    ::testing::Mock::WarnUninterestingCalls(          internal::ImplicitCast_<MockClass*>(this));    } -#else -  // C++98 doesn't have variadic templates, so we have to define one -  // for each arity. -  template <typename A1> -  explicit $clazz(const A1& a1) : MockClass(a1) { -    ::testing::Mock::$method( + +  ~NaggyMock() {  // NOLINT +    ::testing::Mock::UnregisterCallReaction(          internal::ImplicitCast_<MockClass*>(this));    } -$range i 2..n -$for i [[ -$range j 1..i -  template <$for j, [[typename A$j]]> -  $clazz($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) { -    ::testing::Mock::$method( + private: +  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock); +}; + +template <class MockClass> +class StrictMock : public MockClass { + public: +  StrictMock() : MockClass() { +    ::testing::Mock::FailUninterestingCalls(          internal::ImplicitCast_<MockClass*>(this));    } +  // Ideally, we would inherit base class's constructors through a using +  // declaration, which would preserve their visibility. However, many existing +  // tests rely on the fact that current implementation reexports protected +  // constructors as public. These tests would need to be cleaned up first. + +  // Single argument constructor is special-cased so that it can be +  // made explicit. +  template <typename A> +  explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) { +    ::testing::Mock::FailUninterestingCalls( +        internal::ImplicitCast_<MockClass*>(this)); +  } -]] -#endif  // GTEST_LANG_CXX11 +  template <typename A1, typename A2, typename... An> +  StrictMock(A1&& arg1, A2&& arg2, An&&... args) +      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2), +                  std::forward<An>(args)...) { +    ::testing::Mock::FailUninterestingCalls( +        internal::ImplicitCast_<MockClass*>(this)); +  } -  ~$clazz() {  // NOLINT +  ~StrictMock() {  // NOLINT      ::testing::Mock::UnregisterCallReaction(          internal::ImplicitCast_<MockClass*>(this));    }   private: -  GTEST_DISALLOW_COPY_AND_ASSIGN_($clazz); +  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);  }; -]] -  // The following specializations catch some (relatively more common)  // user errors of nesting nice and strict mocks.  They do NOT catch  // all possible errors. @@ -176,4 +212,4 @@ class StrictMock<StrictMock<MockClass> >;  }  // namespace testing -#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ +#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_ diff --git a/googlemock/include/gmock/gmock-spec-builders.h b/googlemock/include/gmock/gmock-spec-builders.h index 3fe31734..526fe7aa 100644 --- a/googlemock/include/gmock/gmock-spec-builders.h +++ b/googlemock/include/gmock/gmock-spec-builders.h @@ -186,7 +186,6 @@ class GTEST_API_ UntypedFunctionMockerBase {    // this information in the global mock registry.  Will be called    // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock    // method. -  // FIXME: rename to SetAndRegisterOwner().    void RegisterOwner(const void* mock_obj)        GTEST_LOCK_EXCLUDED_(g_gmock_mutex); @@ -301,12 +300,7 @@ class OnCallSpec : public UntypedOnCallSpecBase {               const ArgumentMatcherTuple& matchers)        : UntypedOnCallSpecBase(a_file, a_line),          matchers_(matchers), -        // By default, extra_matcher_ should match anything.  However, -        // we cannot initialize it with _ as that triggers a compiler -        // bug in Symbian's C++ compiler (cannot decide between two -        // overloaded constructors of Matcher<const ArgumentTuple&>). -        extra_matcher_(A<const ArgumentTuple&>()) { -  } +        extra_matcher_(_) {}    // Implements the .With() clause.    OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) { @@ -896,11 +890,7 @@ class TypedExpectation : public ExpectationBase {        : ExpectationBase(a_file, a_line, a_source_text),          owner_(owner),          matchers_(m), -        // By default, extra_matcher_ should match anything.  However, -        // we cannot initialize it with _ as that triggers a compiler -        // bug in Symbian's C++ compiler (cannot decide between two -        // overloaded constructors of Matcher<const ArgumentTuple&>). -        extra_matcher_(A<const ArgumentTuple&>()), +        extra_matcher_(_),          repeated_action_(DoDefault()) {}    ~TypedExpectation() override { @@ -1206,9 +1196,6 @@ class TypedExpectation : public ExpectationBase {        mocker->DescribeDefaultActionTo(args, what);        DescribeCallCountTo(why); -      // FIXME: allow the user to control whether -      // unexpected calls should fail immediately or continue using a -      // flag --gmock_unexpected_calls_are_fatal.        return nullptr;      } diff --git a/googlemock/include/gmock/gmock.h b/googlemock/include/gmock/gmock.h index a1e1e6f1..c68ae1c7 100644 --- a/googlemock/include/gmock/gmock.h +++ b/googlemock/include/gmock/gmock.h @@ -62,10 +62,10 @@  #include "gmock/gmock-generated-actions.h"  #include "gmock/gmock-generated-function-mockers.h"  #include "gmock/gmock-generated-matchers.h" -#include "gmock/gmock-generated-nice-strict.h"  #include "gmock/gmock-matchers.h"  #include "gmock/gmock-more-actions.h"  #include "gmock/gmock-more-matchers.h" +#include "gmock/gmock-nice-strict.h"  #include "gmock/internal/gmock-internal-utils.h"  namespace testing { diff --git a/googlemock/include/gmock/internal/gmock-generated-internal-utils.h b/googlemock/include/gmock/internal/gmock-generated-internal-utils.h index efa04629..eb85e266 100644 --- a/googlemock/include/gmock/internal/gmock-generated-internal-utils.h +++ b/googlemock/include/gmock/internal/gmock-generated-internal-utils.h @@ -43,6 +43,7 @@  #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_  #include "gmock/internal/gmock-port.h" +#include "gtest/gtest.h"  namespace testing { @@ -51,19 +52,6 @@ class Matcher;  namespace internal { -// An IgnoredValue object can be implicitly constructed from ANY value. -// This is used in implementing the IgnoreResult(a) action. -class IgnoredValue { - public: -  // This constructor template allows any value to be implicitly -  // converted to IgnoredValue.  The object has no data member and -  // doesn't try to remember anything about the argument.  We -  // deliberately omit the 'explicit' keyword in order to allow the -  // conversion to be implicit. -  template <typename T> -  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit) -}; -  // MatcherTuple<T>::type is a tuple type where each field is a Matcher  // for the corresponding field in tuple type T.  template <typename Tuple> diff --git a/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump b/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump index 9962f6b3..6787905b 100644 --- a/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump +++ b/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump @@ -44,6 +44,7 @@ $var n = 10  $$ The maximum arity we support.  #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_  #include "gmock/internal/gmock-port.h" +#include "gtest/gtest.h"  namespace testing { @@ -52,19 +53,6 @@ class Matcher;  namespace internal { -// An IgnoredValue object can be implicitly constructed from ANY value. -// This is used in implementing the IgnoreResult(a) action. -class IgnoredValue { - public: -  // This constructor template allows any value to be implicitly -  // converted to IgnoredValue.  The object has no data member and -  // doesn't try to remember anything about the argument.  We -  // deliberately omit the 'explicit' keyword in order to allow the -  // conversion to be implicit. -  template <typename T> -  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit) -}; -  // MatcherTuple<T>::type is a tuple type where each field is a Matcher  // for the corresponding field in tuple type T.  template <typename Tuple> diff --git a/googlemock/include/gmock/internal/gmock-internal-utils.h b/googlemock/include/gmock/internal/gmock-internal-utils.h index 7514635e..7ebd645e 100644 --- a/googlemock/include/gmock/internal/gmock-internal-utils.h +++ b/googlemock/include/gmock/internal/gmock-internal-utils.h @@ -92,16 +92,11 @@ inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {  template <typename Element>  inline Element* GetRawPointer(Element* p) { return p; } -// Symbian compilation can be done with wchar_t being either a native -// type or a typedef.  Using Google Mock with OpenC without wchar_t -// should require the definition of _STLP_NO_WCHAR_T. -//  // MSVC treats wchar_t as a native type usually, but treats it as the  // same as unsigned short when the compiler option /Zc:wchar_t- is  // specified.  It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t  // is a native type. -#if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \ -    (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)) +#if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)  // wchar_t is a typedef.  #else  # define GMOCK_WCHAR_T_IS_NATIVE_ 1 @@ -351,8 +346,6 @@ class WithoutMatchers {  // Internal use only: access the singleton instance of WithoutMatchers.  GTEST_API_ WithoutMatchers GetWithoutMatchers(); -// FIXME: group all type utilities together. -  // Type traits.  // is_reference<T>::value is non-zero iff T is a reference type. @@ -452,32 +445,10 @@ class StlContainerView<Element[N]> {    static const_reference ConstReference(const Element (&array)[N]) {      // Ensures that Element is not a const type.      testing::StaticAssertTypeEq<Element, RawElement>(); -#if GTEST_OS_SYMBIAN -    // The Nokia Symbian compiler confuses itself in template instantiation -    // for this call without the cast to Element*: -    // function call '[testing::internal::NativeArray<char *>].NativeArray( -    //     {lval} const char *[4], long, testing::internal::RelationToSource)' -    //     does not match -    // 'testing::internal::NativeArray<char *>::NativeArray( -    //     char *const *, unsigned int, testing::internal::RelationToSource)' -    // (instantiating: 'testing::internal::ContainsMatcherImpl -    //     <const char * (&)[4]>::Matches(const char * (&)[4]) const') -    // (instantiating: 'testing::internal::StlContainerView<char *[4]>:: -    //     ConstReference(const char * (&)[4])') -    // (and though the N parameter type is mismatched in the above explicit -    // conversion of it doesn't help - only the conversion of the array). -    return type(const_cast<Element*>(&array[0]), N, -                RelationToSourceReference()); -#else      return type(array, N, RelationToSourceReference()); -#endif  // GTEST_OS_SYMBIAN    }    static type Copy(const Element (&array)[N]) { -#if GTEST_OS_SYMBIAN -    return type(const_cast<Element*>(&array[0]), N, RelationToSourceCopy()); -#else      return type(array, N, RelationToSourceCopy()); -#endif  // GTEST_OS_SYMBIAN    }  }; @@ -528,7 +499,6 @@ struct BooleanConstant {};  // reduce code size.  GTEST_API_ void IllegalDoDefault(const char* file, int line); -#if GTEST_LANG_CXX11  // Helper types for Apply() below.  template <size_t... Is> struct int_pack { typedef int_pack type; }; @@ -554,7 +524,6 @@ auto Apply(F&& f, Tuple&& args)    return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),                     make_int_pack<std::tuple_size<Tuple>::value>());  } -#endif  #ifdef _MSC_VER  | 
