diff options
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-function-mockers.h | 373 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-function-mockers.h.pump | 4 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-generated-nice-strict.h | 370 | ||||
| -rw-r--r-- | googlemock/include/gmock/gmock-spec-builders.h | 107 | ||||
| -rw-r--r-- | googlemock/src/gmock-spec-builders.cc | 122 | ||||
| -rw-r--r-- | googlemock/test/gmock-actions_test.cc | 1 | ||||
| -rw-r--r-- | googlemock/test/gmock-spec-builders_test.cc | 2 | ||||
| -rw-r--r-- | googlemock/test/gmock_output_test_.cc | 5 | ||||
| -rw-r--r-- | googlemock/test/gmock_output_test_golden.txt | 9 | 
9 files changed, 573 insertions, 420 deletions
diff --git a/googlemock/include/gmock/gmock-generated-function-mockers.h b/googlemock/include/gmock/gmock-generated-function-mockers.h index 4fa5ca94..550cfd25 100644 --- a/googlemock/include/gmock/gmock-generated-function-mockers.h +++ b/googlemock/include/gmock/gmock-generated-function-mockers.h @@ -68,8 +68,8 @@ class FunctionMocker<R()> : public    typedef R F();    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With() { -    return this->current_spec(); +  MockSpec<F> With() { +    return MockSpec<F>(this, ::testing::make_tuple());    }    R Invoke() { @@ -88,9 +88,8 @@ class FunctionMocker<R(A1)> : public    typedef R F(A1);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1)); -    return this->current_spec(); +  MockSpec<F> With(const Matcher<A1>& m1) { +    return MockSpec<F>(this, ::testing::make_tuple(m1));    }    R Invoke(A1 a1) { @@ -98,7 +97,7 @@ class FunctionMocker<R(A1)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1)));    }  }; @@ -109,9 +108,8 @@ class FunctionMocker<R(A1, A2)> : public    typedef R F(A1, A2);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2)); -    return this->current_spec(); +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2) { +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2));    }    R Invoke(A1 a1, A2 a2) { @@ -119,7 +117,8 @@ class FunctionMocker<R(A1, A2)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2)));    }  }; @@ -130,10 +129,9 @@ class FunctionMocker<R(A1, A2, A3)> : public    typedef R F(A1, A2, A3);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3));    }    R Invoke(A1 a1, A2 a2, A3 a3) { @@ -141,7 +139,8 @@ class FunctionMocker<R(A1, A2, A3)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3)));    }  }; @@ -152,10 +151,9 @@ class FunctionMocker<R(A1, A2, A3, A4)> : public    typedef R F(A1, A2, A3, A4);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) { @@ -163,7 +161,9 @@ class FunctionMocker<R(A1, A2, A3, A4)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4)));    }  }; @@ -175,10 +175,9 @@ class FunctionMocker<R(A1, A2, A3, A4, A5)> : public    typedef R F(A1, A2, A3, A4, A5);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { @@ -186,7 +185,9 @@ class FunctionMocker<R(A1, A2, A3, A4, A5)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4), internal::forward<A5>(a5)));    }  }; @@ -198,12 +199,10 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public    typedef R F(A1, A2, A3, A4, A5, A6);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,        const Matcher<A6>& m6) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, -        m6)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { @@ -211,7 +210,10 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4), internal::forward<A5>(a5), +        internal::forward<A6>(a6)));    }  }; @@ -223,12 +225,10 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public    typedef R F(A1, A2, A3, A4, A5, A6, A7);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,        const Matcher<A6>& m6, const Matcher<A7>& m7) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, -        m6, m7)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { @@ -236,7 +236,10 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4), internal::forward<A5>(a5), +        internal::forward<A6>(a6), internal::forward<A7>(a7)));    }  }; @@ -248,12 +251,11 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public    typedef R F(A1, A2, A3, A4, A5, A6, A7, A8);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,        const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, -        m6, m7, m8)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7, +        m8));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { @@ -261,7 +263,11 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4), internal::forward<A5>(a5), +        internal::forward<A6>(a6), internal::forward<A7>(a7), +        internal::forward<A8>(a8)));    }  }; @@ -273,13 +279,12 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public    typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,        const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,        const Matcher<A9>& m9) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, -        m6, m7, m8, m9)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7, +        m8, m9));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { @@ -287,7 +292,11 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4), internal::forward<A5>(a5), +        internal::forward<A6>(a6), internal::forward<A7>(a7), +        internal::forward<A8>(a8), internal::forward<A9>(a9)));    }  }; @@ -300,13 +309,12 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public    typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; -  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2, +  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,        const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,        const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,        const Matcher<A9>& m9, const Matcher<A10>& m10) { -    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5, -        m6, m7, m8, m9, m10)); -    return this->current_spec(); +    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7, +        m8, m9, m10));    }    R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, @@ -315,8 +323,12 @@ class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public      // by the C++ standard [14.6.4] here, as the base class type is      // dependent on the template argument (and thus shouldn't be      // looked into when resolving InvokeWith). -    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9, -        a10)); +    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1), +        internal::forward<A2>(a2), internal::forward<A3>(a3), +        internal::forward<A4>(a4), internal::forward<A5>(a5), +        internal::forward<A6>(a6), internal::forward<A7>(a7), +        internal::forward<A8>(a8), internal::forward<A9>(a9), +        internal::forward<A10>(a10)));    }  }; @@ -363,7 +375,7 @@ using internal::FunctionMocker;      GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \      return GMOCK_MOCKER_(0, constness, Method).Invoke(); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method() constness { \      GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \      return GMOCK_MOCKER_(0, constness, Method).With(); \ @@ -380,9 +392,11 @@ using internal::FunctionMocker;              == 1), \          this_method_does_not_take_1_argument); \      GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(1, constness, Method).Invoke(gmock_a1); \ +    return GMOCK_MOCKER_(1, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \      GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \      return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \ @@ -393,16 +407,19 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 2), \          this_method_does_not_take_2_arguments); \      GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(2, constness, Method).Invoke(gmock_a1, gmock_a2); \ +    return GMOCK_MOCKER_(2, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \      GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \ @@ -414,18 +431,21 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, \ +          __VA_ARGS__) gmock_a3) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 3), \          this_method_does_not_take_3_arguments); \      GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(3, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3); \ +    return GMOCK_MOCKER_(3, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \ @@ -439,19 +459,22 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 4), \          this_method_does_not_take_4_arguments); \      GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(4, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4); \ +    return GMOCK_MOCKER_(4, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -466,20 +489,24 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ -      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ +          __VA_ARGS__) gmock_a5) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 5), \          this_method_does_not_take_5_arguments); \      GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(5, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4, gmock_a5); \ +    return GMOCK_MOCKER_(5, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -495,21 +522,26 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ -      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ -      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ +          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, \ +          __VA_ARGS__) gmock_a6) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 6), \          this_method_does_not_take_6_arguments); \      GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(6, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4, gmock_a5, gmock_a6); \ +    return GMOCK_MOCKER_(6, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -526,22 +558,27 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ -      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ -      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ -      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ +          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ +          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 7), \          this_method_does_not_take_7_arguments); \      GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(7, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \ +    return GMOCK_MOCKER_(7, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -559,23 +596,29 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ -      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ -      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ -      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \ -      GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ +          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ +          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \ +          __VA_ARGS__) gmock_a8) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 8), \          this_method_does_not_take_8_arguments); \      GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(8, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \ +    return GMOCK_MOCKER_(8, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -594,25 +637,31 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ -      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ -      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ -      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \ -      GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \ -      GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ +          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ +          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \ +          __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, \ +          __VA_ARGS__) gmock_a9) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 9), \          this_method_does_not_take_9_arguments); \      GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(9, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \ -        gmock_a9); \ +    return GMOCK_MOCKER_(9, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -633,26 +682,32 @@ using internal::FunctionMocker;  // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!  #define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \    GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \ -      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \ -      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \ -      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ -      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \ -      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \ -      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ -      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \ -      GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \ -      GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \ -      GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \ +      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \ +          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \ +          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \ +          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \ +          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \ +          __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \ +          GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \      GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \          tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \              == 10), \          this_method_does_not_take_10_arguments); \      GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \ -    return GMOCK_MOCKER_(10, constness, Method).Invoke(gmock_a1, gmock_a2, \ -        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \ -        gmock_a10); \ +    return GMOCK_MOCKER_(10, constness, \ +        Method).Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, \ +        __VA_ARGS__)>(gmock_a1), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9), \ +  ::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>(gmock_a10)); \    } \ -  ::testing::MockSpec<__VA_ARGS__>& \ +  ::testing::MockSpec<__VA_ARGS__> \        gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \                       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \                       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \ @@ -880,7 +935,7 @@ class MockFunction<R()> {    MOCK_METHOD0_T(Call, R());  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R()> AsStdFunction() { +  ::std::function<R()> AsStdFunction() {      return [this]() -> R {        return this->Call();      }; @@ -899,9 +954,9 @@ class MockFunction<R(A0)> {    MOCK_METHOD1_T(Call, R(A0));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0)> AsStdFunction() { +  ::std::function<R(A0)> AsStdFunction() {      return [this](A0 a0) -> R { -      return this->Call(a0); +      return this->Call(::std::move(a0));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -918,9 +973,9 @@ class MockFunction<R(A0, A1)> {    MOCK_METHOD2_T(Call, R(A0, A1));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1)> AsStdFunction() { +  ::std::function<R(A0, A1)> AsStdFunction() {      return [this](A0 a0, A1 a1) -> R { -      return this->Call(a0, a1); +      return this->Call(::std::move(a0), ::std::move(a1));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -937,9 +992,9 @@ class MockFunction<R(A0, A1, A2)> {    MOCK_METHOD3_T(Call, R(A0, A1, A2));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2)> AsStdFunction() { +  ::std::function<R(A0, A1, A2)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2) -> R { -      return this->Call(a0, a1, a2); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -956,9 +1011,10 @@ class MockFunction<R(A0, A1, A2, A3)> {    MOCK_METHOD4_T(Call, R(A0, A1, A2, A3));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R { -      return this->Call(a0, a1, a2, a3); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -976,9 +1032,10 @@ class MockFunction<R(A0, A1, A2, A3, A4)> {    MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R { -      return this->Call(a0, a1, a2, a3, a4); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3), ::std::move(a4));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -996,9 +1053,10 @@ class MockFunction<R(A0, A1, A2, A3, A4, A5)> {    MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R { -      return this->Call(a0, a1, a2, a3, a4, a5); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3), ::std::move(a4), ::std::move(a5));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -1016,9 +1074,10 @@ class MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> {    MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R { -      return this->Call(a0, a1, a2, a3, a4, a5, a6); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -1036,9 +1095,11 @@ class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> {    MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R { -      return this->Call(a0, a1, a2, a3, a4, a5, a6, a7); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6), +          ::std::move(a7));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -1056,10 +1117,12 @@ class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> {    MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,          A8 a8) -> R { -      return this->Call(a0, a1, a2, a3, a4, a5, a6, a7, a8); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6), +          ::std::move(a7), ::std::move(a8));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ @@ -1078,10 +1141,12 @@ class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> {    MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9));  #if GTEST_HAS_STD_FUNCTION_ -  std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() { +  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() {      return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,          A8 a8, A9 a9) -> R { -      return this->Call(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); +      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2), +          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6), +          ::std::move(a7), ::std::move(a8), ::std::move(a9));      };    }  #endif  // GTEST_HAS_STD_FUNCTION_ diff --git a/googlemock/include/gmock/gmock-generated-function-mockers.h.pump b/googlemock/include/gmock/gmock-generated-function-mockers.h.pump index 811502d0..55dc6c5b 100644 --- a/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +++ b/googlemock/include/gmock/gmock-generated-function-mockers.h.pump @@ -1,6 +1,6 @@  $$ -*- mode: c++; -*- -$$ This is a Pump source file.  Please use Pump to convert it to -$$ gmock-generated-function-mockers.h. +$$ This is a Pump source file.  Please use Pump to convert +$$ it to gmock-generated-function-mockers.h.  $$  $var n = 10  $$ The maximum arity we support.  // Copyright 2007, Google Inc. diff --git a/googlemock/include/gmock/gmock-generated-nice-strict.h b/googlemock/include/gmock/gmock-generated-nice-strict.h index 4095f4d5..af71fbdf 100644 --- a/googlemock/include/gmock/gmock-generated-nice-strict.h +++ b/googlemock/include/gmock/gmock-generated-nice-strict.h @@ -51,10 +51,9 @@  // NiceMock<MockFoo>.  //  // NiceMock, NaggyMock, and StrictMock "inherit" the constructors of -// their respective base class, with up-to 10 arguments.  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. +// 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 @@ -63,10 +62,6 @@  // or "strict" modifier may not affect it, depending on the compiler.  // In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT  // supported. -// -// Another known limitation is that the constructors of the base mock -// cannot have arguments passed by non-const reference, which are -// banned by the Google C++ style guide anyway.  #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_  #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ @@ -76,294 +71,329 @@  namespace testing { +namespace internal { + +// NiceMockBase serves as a mix-in to establish the "uninteresting call" +// behavior for NiceMock on construction. It accomplishes this via CRTP to get +// access to the derived MockClass. +template <class MockClass> +class NiceMockBase { + protected: +  NiceMockBase(); + +  ~NiceMockBase(); +}; + +}  // namespace internal +  template <class MockClass> -class NiceMock : public MockClass { +class NiceMock : public MockClass, public internal::NiceMockBase<MockClass> {   public: -  // We don't factor out the constructor body to a common method, as -  // we have to avoid a possible clash with members of MockClass. -  NiceMock() { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  // C++ doesn't (yet) allow inheritance of constructors, so we have -  // to define it for each arity. +  NiceMock() : MockClass() {} + +#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)) {} + +  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)...) {} +#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)); -  } +  explicit NiceMock(const A1& a1) : MockClass(a1) {}    template <typename A1, typename A2> -  NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { -    ::testing::Mock::AllowUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } +  NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {}    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)); -  } +  NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {}    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)); -  } +      const A4& a4) : MockClass(a1, a2, a3, a4) {}    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)); -  } +      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {}    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)); -  } +      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {}    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)); -  } +      a6, a7) {}    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)); -  } +      a2, a3, a4, a5, a6, a7, a8) {}    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)); -  } +      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {}    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)); -  } +      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {} -  virtual ~NiceMock() { -    ::testing::Mock::UnregisterCallReaction( -        internal::ImplicitCast_<MockClass*>(this)); -  } +#endif  // GTEST_LANG_CXX11   private:    GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);  }; +namespace internal { + +template <typename MockClass> +NiceMockBase<MockClass>::NiceMockBase() { +  ::testing::Mock::AllowUninterestingCalls( +      internal::ImplicitCast_<MockClass*>( +          static_cast<NiceMock<MockClass> *>(this))); +} + +template <typename MockClass> +NiceMockBase<MockClass>::~NiceMockBase() { +  ::testing::Mock::UnregisterCallReaction( +      internal::ImplicitCast_<MockClass*>( +          static_cast<NiceMock<MockClass>*>(this))); +} + +}  // namespace internal + +namespace internal { + +// NaggyMockBase serves as a mix-in to establish the "uninteresting call" +// behavior for NaggyMock on construction. It accomplishes this via CRTP to get +// access to the derived MockClass. +template <class MockClass> +class NaggyMockBase { + protected: +  NaggyMockBase(); + +  ~NaggyMockBase(); +}; + +}  // namespace internal +  template <class MockClass> -class NaggyMock : public MockClass { +class NaggyMock : public MockClass, public internal::NaggyMockBase<MockClass> {   public: -  // We don't factor out the constructor body to a common method, as -  // we have to avoid a possible clash with members of MockClass. -  NaggyMock() { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  // C++ doesn't (yet) allow inheritance of constructors, so we have -  // to define it for each arity. +  NaggyMock() : MockClass() {} + +#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)) {} + +  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)...) {} +#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)); -  } +  explicit NaggyMock(const A1& a1) : MockClass(a1) {}    template <typename A1, typename A2> -  NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { -    ::testing::Mock::WarnUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } +  NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {}    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)); -  } +  NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {}    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)); -  } +      const A4& a4) : MockClass(a1, a2, a3, a4) {}    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)); -  } +      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {}    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)); -  } +      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {}    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)); -  } +      a6, a7) {}    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)); -  } +      a2, a3, a4, a5, a6, a7, a8) {}    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)); -  } +      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {}    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)); -  } +      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {} -  virtual ~NaggyMock() { -    ::testing::Mock::UnregisterCallReaction( -        internal::ImplicitCast_<MockClass*>(this)); -  } +#endif  // GTEST_LANG_CXX11   private:    GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);  }; +namespace internal { + +template <typename MockClass> +NaggyMockBase<MockClass>::NaggyMockBase() { +  ::testing::Mock::WarnUninterestingCalls( +      internal::ImplicitCast_<MockClass*>( +          static_cast<NaggyMock<MockClass> *>(this))); +} + +template <typename MockClass> +NaggyMockBase<MockClass>::~NaggyMockBase() { +  ::testing::Mock::UnregisterCallReaction( +      internal::ImplicitCast_<MockClass*>( +          static_cast<NaggyMock<MockClass>*>(this))); +} + +}  // namespace internal + +namespace internal { + +// StrictMockBase serves as a mix-in to establish the "uninteresting call" +// behavior for StrictMock on construction. It accomplishes this via CRTP to get +// access to the derived MockClass. +template <class MockClass> +class StrictMockBase { + protected: +  StrictMockBase(); + +  ~StrictMockBase(); +}; + +}  // namespace internal +  template <class MockClass> -class StrictMock : public MockClass { +class StrictMock : public MockClass, +    public internal::StrictMockBase<MockClass> {   public: -  // We don't factor out the constructor body to a common method, as -  // we have to avoid a possible clash with members of MockClass. -  StrictMock() { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } - -  // C++ doesn't (yet) allow inheritance of constructors, so we have -  // to define it for each arity. +  StrictMock() : MockClass() {} + +#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)) {} + +  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)...) {} +#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)); -  } +  explicit StrictMock(const A1& a1) : MockClass(a1) {}    template <typename A1, typename A2> -  StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) { -    ::testing::Mock::FailUninterestingCalls( -        internal::ImplicitCast_<MockClass*>(this)); -  } +  StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {}    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)); -  } +  StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, +      a3) {}    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)); -  } +      const A4& a4) : MockClass(a1, a2, a3, a4) {}    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)); -  } +      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {}    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)); -  } +      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {}    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)); -  } +      a6, a7) {}    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)); -  } +      a2, a3, a4, a5, a6, a7, a8) {}    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)); -  } +      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {}    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)); -  } +      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {} -  virtual ~StrictMock() { -    ::testing::Mock::UnregisterCallReaction( -        internal::ImplicitCast_<MockClass*>(this)); -  } +#endif  // GTEST_LANG_CXX11   private:    GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);  }; +namespace internal { + +template <typename MockClass> +StrictMockBase<MockClass>::StrictMockBase() { +  ::testing::Mock::FailUninterestingCalls( +      internal::ImplicitCast_<MockClass*>( +          static_cast<StrictMock<MockClass> *>(this))); +} + +template <typename MockClass> +StrictMockBase<MockClass>::~StrictMockBase() { +  ::testing::Mock::UnregisterCallReaction( +      internal::ImplicitCast_<MockClass*>( +          static_cast<StrictMock<MockClass>*>(this))); +} + +}  // namespace internal +  // The following specializations catch some (relatively more common)  // user errors of nesting nice and strict mocks.  They do NOT catch  // all possible errors. diff --git a/googlemock/include/gmock/gmock-spec-builders.h b/googlemock/include/gmock/gmock-spec-builders.h index c1b63014..6d7f9200 100644 --- a/googlemock/include/gmock/gmock-spec-builders.h +++ b/googlemock/include/gmock/gmock-spec-builders.h @@ -103,6 +103,11 @@ class ExpectationTester;  // Base class for function mockers.  template <typename F> class FunctionMockerBase; +// Uninteresting call behavior mixins. +template <typename M> class NiceMockBase; +template <typename M> class NaggyMockBase; +template <typename M> class StrictMockBase; +  // Protects the mock object registry (in class Mock), all function  // mockers, and all expectations.  // @@ -147,14 +152,13 @@ class GTEST_API_ UntypedFunctionMockerBase {    // action fails.    // L = *    virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction( -      const void* untyped_args, const std::string& call_description) const = 0; +      void* untyped_args, const std::string& call_description) const = 0;    // Performs the given action with the given arguments and returns    // the action's result.    // L = *    virtual UntypedActionResultHolderBase* UntypedPerformAction( -      const void* untyped_action, -      const void* untyped_args) const = 0; +      const void* untyped_action, void* untyped_args) const = 0;    // Writes a message that the call is uninteresting (i.e. neither    // explicitly expected nor explicitly unexpected) to the given @@ -209,9 +213,8 @@ class GTEST_API_ UntypedFunctionMockerBase {    // arguments.  This function can be safely called from multiple    // threads concurrently.  The caller is responsible for deleting the    // result. -  UntypedActionResultHolderBase* UntypedInvokeWith( -      const void* untyped_args) -          GTEST_LOCK_EXCLUDED_(g_gmock_mutex); +  UntypedActionResultHolderBase* UntypedInvokeWith(void* untyped_args) +      GTEST_LOCK_EXCLUDED_(g_gmock_mutex);   protected:    typedef std::vector<const void*> UntypedOnCallSpecs; @@ -236,6 +239,14 @@ class GTEST_API_ UntypedFunctionMockerBase {    UntypedOnCallSpecs untyped_on_call_specs_;    // All expectations for this function mocker. +  // +  // It's undefined behavior to interleave expectations (EXPECT_CALLs +  // or ON_CALLs) and mock function calls.  Also, the order of +  // expectations is important.  Therefore it's a logic race condition +  // to read/write untyped_expectations_ concurrently.  In order for +  // tools like tsan to catch concurrent read/write accesses to +  // untyped_expectations, we deliberately leave accesses to it +  // unprotected.    UntypedExpectations untyped_expectations_;  };  // class UntypedFunctionMockerBase @@ -397,13 +408,13 @@ class GTEST_API_ Mock {    friend class internal::FunctionMockerBase;    template <typename M> -  friend class NiceMock; +  friend class internal::NiceMockBase;    template <typename M> -  friend class NaggyMock; +  friend class internal::NaggyMockBase;    template <typename M> -  friend class StrictMock; +  friend class internal::StrictMockBase;    // Tells Google Mock to allow uninteresting calls on the given mock    // object. @@ -1252,8 +1263,9 @@ class MockSpec {    // Constructs a MockSpec object, given the function mocker object    // that the spec is associated with. -  explicit MockSpec(internal::FunctionMockerBase<F>* function_mocker) -      : function_mocker_(function_mocker) {} +  MockSpec(internal::FunctionMockerBase<F>* function_mocker, +           const ArgumentMatcherTuple& matchers) +      : function_mocker_(function_mocker), matchers_(matchers) {}    // Adds a new default action spec to the function mocker and returns    // the newly created spec. @@ -1279,10 +1291,6 @@ class MockSpec {    template <typename Function>    friend class internal::FunctionMocker; -  void SetMatchers(const ArgumentMatcherTuple& matchers) { -    matchers_ = matchers; -  } -    // The function mocker that owns this spec.    internal::FunctionMockerBase<F>* const function_mocker_;    // The argument matchers specified in the spec. @@ -1390,19 +1398,20 @@ class ActionResultHolder : public UntypedActionResultHolderBase {    template <typename F>    static ActionResultHolder* PerformDefaultAction(        const FunctionMockerBase<F>* func_mocker, -      const typename Function<F>::ArgumentTuple& args, +      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,        const std::string& call_description) { -    return new ActionResultHolder(Wrapper( -        func_mocker->PerformDefaultAction(args, call_description))); +    return new ActionResultHolder(Wrapper(func_mocker->PerformDefaultAction( +        internal::move(args), call_description)));    }    // Performs the given action and returns the result in a new-ed    // ActionResultHolder.    template <typename F> -  static ActionResultHolder* -  PerformAction(const Action<F>& action, -                const typename Function<F>::ArgumentTuple& args) { -    return new ActionResultHolder(Wrapper(action.Perform(args))); +  static ActionResultHolder* PerformAction( +      const Action<F>& action, +      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) { +    return new ActionResultHolder( +        Wrapper(action.Perform(internal::move(args))));    }   private: @@ -1430,9 +1439,9 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {    template <typename F>    static ActionResultHolder* PerformDefaultAction(        const FunctionMockerBase<F>* func_mocker, -      const typename Function<F>::ArgumentTuple& args, +      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,        const std::string& call_description) { -    func_mocker->PerformDefaultAction(args, call_description); +    func_mocker->PerformDefaultAction(internal::move(args), call_description);      return new ActionResultHolder;    } @@ -1441,8 +1450,8 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {    template <typename F>    static ActionResultHolder* PerformAction(        const Action<F>& action, -      const typename Function<F>::ArgumentTuple& args) { -    action.Perform(args); +      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) { +    action.Perform(internal::move(args));      return new ActionResultHolder;    } @@ -1461,7 +1470,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {    typedef typename Function<F>::ArgumentTuple ArgumentTuple;    typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple; -  FunctionMockerBase() : current_spec_(this) {} +  FunctionMockerBase() {}    // The destructor verifies that all expectations on this mock    // function have been satisfied.  If not, it will report Google Test @@ -1497,12 +1506,13 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {    // mutable state of this object, and thus can be called concurrently    // without locking.    // L = * -  Result PerformDefaultAction(const ArgumentTuple& args, -                              const std::string& call_description) const { +  Result PerformDefaultAction( +      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args, +      const std::string& call_description) const {      const OnCallSpec<F>* const spec =          this->FindOnCallSpec(args);      if (spec != NULL) { -      return spec->GetAction().Perform(args); +      return spec->GetAction().Perform(internal::move(args));      }      const std::string message =          call_description + @@ -1524,11 +1534,11 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {    // action fails.  The caller is responsible for deleting the result.    // L = *    virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction( -      const void* untyped_args,  // must point to an ArgumentTuple +      void* untyped_args,  // must point to an ArgumentTuple        const std::string& call_description) const { -    const ArgumentTuple& args = -        *static_cast<const ArgumentTuple*>(untyped_args); -    return ResultHolder::PerformDefaultAction(this, args, call_description); +    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args); +    return ResultHolder::PerformDefaultAction(this, internal::move(*args), +                                              call_description);    }    // Performs the given action with the given arguments and returns @@ -1536,13 +1546,12 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {    // result.    // L = *    virtual UntypedActionResultHolderBase* UntypedPerformAction( -      const void* untyped_action, const void* untyped_args) const { +      const void* untyped_action, void* untyped_args) const {      // Make a copy of the action before performing it, in case the      // action deletes the mock object (and thus deletes itself).      const Action<F> action = *static_cast<const Action<F>*>(untyped_action); -    const ArgumentTuple& args = -        *static_cast<const ArgumentTuple*>(untyped_args); -    return ResultHolder::PerformAction(action, args); +    ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args); +    return ResultHolder::PerformAction(action, internal::move(*args));    }    // Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked(): @@ -1582,10 +1591,14 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {    // Returns the result of invoking this mock function with the given    // arguments.  This function can be safely called from multiple    // threads concurrently. -  Result InvokeWith(const ArgumentTuple& args) -        GTEST_LOCK_EXCLUDED_(g_gmock_mutex) { +  Result InvokeWith( +      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) +      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) { +    // const_cast is required since in C++98 we still pass ArgumentTuple around +    // by const& instead of rvalue reference. +    void* untyped_args = const_cast<void*>(static_cast<const void*>(&args));      scoped_ptr<ResultHolder> holder( -        DownCast_<ResultHolder*>(this->UntypedInvokeWith(&args))); +        DownCast_<ResultHolder*>(this->UntypedInvokeWith(untyped_args)));      return holder->Unwrap();    } @@ -1609,6 +1622,8 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {      TypedExpectation<F>* const expectation =          new TypedExpectation<F>(this, file, line, source_text, m);      const linked_ptr<ExpectationBase> untyped_expectation(expectation); +    // See the definition of untyped_expectations_ for why access to +    // it is unprotected here.      untyped_expectations_.push_back(untyped_expectation);      // Adds this expectation into the implicit sequence if there is one. @@ -1620,10 +1635,6 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {      return *expectation;    } -  // The current spec (either default action spec or expectation spec) -  // being described on this function mocker. -  MockSpec<F>& current_spec() { return current_spec_; } -   private:    template <typename Func> friend class TypedExpectation; @@ -1716,6 +1727,8 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {        const ArgumentTuple& args) const            GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {      g_gmock_mutex.AssertHeld(); +    // See the definition of untyped_expectations_ for why access to +    // it is unprotected here.      for (typename UntypedExpectations::const_reverse_iterator it =               untyped_expectations_.rbegin();           it != untyped_expectations_.rend(); ++it) { @@ -1766,10 +1779,6 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {      }    } -  // The current spec (either default action spec or expectation spec) -  // being described on this function mocker. -  MockSpec<F> current_spec_; -    // There is no generally useful and implementable semantics of    // copying a mock object, so copying a mock is usually a user error.    // Thus we disallow copying function mockers.  If the user really diff --git a/googlemock/src/gmock-spec-builders.cc b/googlemock/src/gmock-spec-builders.cc index 93a83ae5..b97bad03 100644 --- a/googlemock/src/gmock-spec-builders.cc +++ b/googlemock/src/gmock-spec-builders.cc @@ -41,6 +41,7 @@  #include <map>  #include <set>  #include <string> +#include <vector>  #include "gmock/gmock.h"  #include "gtest/gtest.h" @@ -99,12 +100,19 @@ void ExpectationBase::RetireAllPreRequisites()      return;    } -  for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); -       it != immediate_prerequisites_.end(); ++it) { -    ExpectationBase* const prerequisite = it->expectation_base().get(); -    if (!prerequisite->is_retired()) { -      prerequisite->RetireAllPreRequisites(); -      prerequisite->Retire(); +  ::std::vector<ExpectationBase*> expectations(1, this); +  while (!expectations.empty()) { +    ExpectationBase* exp = expectations.back(); +    expectations.pop_back(); + +    for (ExpectationSet::const_iterator it = +             exp->immediate_prerequisites_.begin(); +         it != exp->immediate_prerequisites_.end(); ++it) { +      ExpectationBase* next = it->expectation_base().get(); +      if (!next->is_retired()) { +        next->Retire(); +        expectations.push_back(next); +      }      }    }  } @@ -114,11 +122,18 @@ void ExpectationBase::RetireAllPreRequisites()  bool ExpectationBase::AllPrerequisitesAreSatisfied() const      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {    g_gmock_mutex.AssertHeld(); -  for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); -       it != immediate_prerequisites_.end(); ++it) { -    if (!(it->expectation_base()->IsSatisfied()) || -        !(it->expectation_base()->AllPrerequisitesAreSatisfied())) -      return false; +  ::std::vector<const ExpectationBase*> expectations(1, this); +  while (!expectations.empty()) { +    const ExpectationBase* exp = expectations.back(); +    expectations.pop_back(); + +    for (ExpectationSet::const_iterator it = +             exp->immediate_prerequisites_.begin(); +         it != exp->immediate_prerequisites_.end(); ++it) { +      const ExpectationBase* next = it->expectation_base().get(); +      if (!next->IsSatisfied()) return false; +      expectations.push_back(next); +    }    }    return true;  } @@ -127,19 +142,28 @@ bool ExpectationBase::AllPrerequisitesAreSatisfied() const  void ExpectationBase::FindUnsatisfiedPrerequisites(ExpectationSet* result) const      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {    g_gmock_mutex.AssertHeld(); -  for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); -       it != immediate_prerequisites_.end(); ++it) { -    if (it->expectation_base()->IsSatisfied()) { -      // If *it is satisfied and has a call count of 0, some of its -      // pre-requisites may not be satisfied yet. -      if (it->expectation_base()->call_count_ == 0) { -        it->expectation_base()->FindUnsatisfiedPrerequisites(result); +  ::std::vector<const ExpectationBase*> expectations(1, this); +  while (!expectations.empty()) { +    const ExpectationBase* exp = expectations.back(); +    expectations.pop_back(); + +    for (ExpectationSet::const_iterator it = +             exp->immediate_prerequisites_.begin(); +         it != exp->immediate_prerequisites_.end(); ++it) { +      const ExpectationBase* next = it->expectation_base().get(); + +      if (next->IsSatisfied()) { +        // If *it is satisfied and has a call count of 0, some of its +        // pre-requisites may not be satisfied yet. +        if (next->call_count_ == 0) { +          expectations.push_back(next); +        } +      } else { +        // Now that we know next is unsatisfied, we are not so interested +        // in whether its pre-requisites are satisfied.  Therefore we +        // don't iterate into it here. +        *result += *it;        } -    } else { -      // Now that we know *it is unsatisfied, we are not so interested -      // in whether its pre-requisites are satisfied.  Therefore we -      // don't recursively call FindUnsatisfiedPrerequisites() here. -      *result += *it;      }    }  } @@ -254,11 +278,13 @@ void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {      case kWarn:        Log(kWarning,            msg + -          "\nNOTE: You can safely ignore the above warning unless this " -          "call should not happen.  Do not suppress it by blindly adding " -          "an EXPECT_CALL() if you don't mean to enforce the call.  " -          "See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#" -          "knowing-when-to-expect for details.\n", +              "\nNOTE: You can safely ignore the above warning unless this " +              "call should not happen.  Do not suppress it by blindly adding " +              "an EXPECT_CALL() if you don't mean to enforce the call.  " +              "See " +              "https://github.com/google/googletest/blob/master/googlemock/" +              "docs/CookBook.md#" +              "knowing-when-to-expect for details.\n",            stack_frames_to_skip);        break;      default:  // FAIL @@ -334,9 +360,10 @@ const char* UntypedFunctionMockerBase::Name() const  // Calculates the result of invoking this mock function with the given  // arguments, prints it, and returns it.  The caller is responsible  // for deleting the result. -UntypedActionResultHolderBase* -UntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args) -    GTEST_LOCK_EXCLUDED_(g_gmock_mutex) { +UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith( +    void* const untyped_args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) { +  // See the definition of untyped_expectations_ for why access to it +  // is unprotected here.    if (untyped_expectations_.size() == 0) {      // No expectation is set on this mock method - we have an      // uninteresting call. @@ -355,16 +382,19 @@ UntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args)          // If the user allows this uninteresting call, we print it          // only when they want informational messages.          reaction == kAllow ? LogIsVisible(kInfo) : -        // If the user wants this to be a warning, we print it only -        // when they want to see warnings. -        reaction == kWarn ? LogIsVisible(kWarning) : -        // Otherwise, the user wants this to be an error, and we -        // should always print detailed information in the error. -        true; +                           // If the user wants this to be a warning, we print +                           // it only when they want to see warnings. +            reaction == kWarn +                ? LogIsVisible(kWarning) +                : +                // Otherwise, the user wants this to be an error, and we +                // should always print detailed information in the error. +                true;      if (!need_to_report_uninteresting_call) {        // Perform the action without printing the call information. -      return this->UntypedPerformDefaultAction(untyped_args, "Function call: " + std::string(Name())); +      return this->UntypedPerformDefaultAction( +          untyped_args, "Function call: " + std::string(Name()));      }      // Warns about the uninteresting call. @@ -446,6 +476,8 @@ UntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args)  // Returns an Expectation object that references and co-owns exp,  // which must be an expectation on this mock function.  Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) { +  // See the definition of untyped_expectations_ for why access to it +  // is unprotected here.    for (UntypedExpectations::const_iterator it =             untyped_expectations_.begin();         it != untyped_expectations_.end(); ++it) { @@ -508,7 +540,7 @@ bool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked()    return expectations_met;  } -static CallReaction intToCallReaction(int mock_behavior) { +CallReaction intToCallReaction(int mock_behavior) {    if (mock_behavior >= kAllow && mock_behavior <= kFail) {      return static_cast<internal::CallReaction>(mock_behavior);    } @@ -582,9 +614,15 @@ class MockObjectRegistry {        leaked_count++;      }      if (leaked_count > 0) { -      std::cout << "\nERROR: " << leaked_count -           << " leaked mock " << (leaked_count == 1 ? "object" : "objects") -           << " found at program exit.\n"; +      std::cout << "\nERROR: " << leaked_count << " leaked mock " +                << (leaked_count == 1 ? "object" : "objects") +                << " found at program exit. Expectations on a mock object is " +                   "verified when the object is destructed. Leaking a mock " +                   "means that its expectations aren't verified, which is " +                   "usually a test bug. If you really intend to leak a mock, " +                   "you can suppress this error using " +                   "testing::Mock::AllowLeak(mock_object), or you may use a " +                   "fake or stub instead of a mock.\n";        std::cout.flush();        ::std::cerr.flush();        // RUN_ALL_TESTS() has already returned when this destructor is diff --git a/googlemock/test/gmock-actions_test.cc b/googlemock/test/gmock-actions_test.cc index 01286634..46011570 100644 --- a/googlemock/test/gmock-actions_test.cc +++ b/googlemock/test/gmock-actions_test.cc @@ -704,6 +704,7 @@ class MockClass {    MOCK_METHOD0(MakeUnique, std::unique_ptr<int>());    MOCK_METHOD0(MakeUniqueBase, std::unique_ptr<Base>());    MOCK_METHOD0(MakeVectorUnique, std::vector<std::unique_ptr<int>>()); +  MOCK_METHOD1(TakeUnique, int(std::unique_ptr<int>));  #endif   private: diff --git a/googlemock/test/gmock-spec-builders_test.cc b/googlemock/test/gmock-spec-builders_test.cc index a7bf03e5..6001582a 100644 --- a/googlemock/test/gmock-spec-builders_test.cc +++ b/googlemock/test/gmock-spec-builders_test.cc @@ -748,7 +748,6 @@ TEST(ExpectCallSyntaxTest, WarningIsErrorWithFlag) {    testing::GMOCK_FLAG(default_mock_behavior) = original_behavior;  } -  #endif  // GTEST_HAS_STREAM_REDIRECTION  // Tests the semantics of ON_CALL(). @@ -2691,7 +2690,6 @@ int gmock_main(int argc, char **argv) {  int main(int argc, char **argv) {  #endif  // GMOCK_RENAME_MAIN    testing::InitGoogleMock(&argc, argv); -    // Ensures that the tests pass no matter what value of    // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.    testing::GMOCK_FLAG(catch_leaked_mocks) = true; diff --git a/googlemock/test/gmock_output_test_.cc b/googlemock/test/gmock_output_test_.cc index d80e2b08..ca628df6 100644 --- a/googlemock/test/gmock_output_test_.cc +++ b/googlemock/test/gmock_output_test_.cc @@ -273,6 +273,11 @@ MATCHER_P2(IsPair, first, second, "") {    return Value(arg.first, first) && Value(arg.second, second);  } +TEST_F(GMockOutputTest, PrintsMatcher) { +  const testing::Matcher<int> m1 = Ge(48); +  EXPECT_THAT((std::pair<int, bool>(42, true)), IsPair(m1, true)); +} +  void TestCatchesLeakedMocksInAdHocTests() {    MockFoo* foo = new MockFoo; diff --git a/googlemock/test/gmock_output_test_golden.txt b/googlemock/test/gmock_output_test_golden.txt index 689d5eeb..dbcb2118 100644 --- a/googlemock/test/gmock_output_test_golden.txt +++ b/googlemock/test/gmock_output_test_golden.txt @@ -288,6 +288,12 @@ Stack trace:  [       OK ] GMockOutputTest.ExplicitActionsRunOutWithDefaultAction  [ RUN      ] GMockOutputTest.CatchesLeakedMocks  [       OK ] GMockOutputTest.CatchesLeakedMocks +[ RUN      ] GMockOutputTest.PrintsMatcher +FILE:#: Failure +Value of: (std::pair<int, bool>(42, true)) +Expected: is pair (is >= 48, true) +  Actual: (42, true) (of type std::pair<int, bool>) +[  FAILED  ] GMockOutputTest.PrintsMatcher  [  FAILED  ] GMockOutputTest.UnexpectedCall  [  FAILED  ] GMockOutputTest.UnexpectedCallToVoidFunction  [  FAILED  ] GMockOutputTest.ExcessiveCall @@ -302,9 +308,10 @@ Stack trace:  [  FAILED  ] GMockOutputTest.MismatchArgumentsAndWith  [  FAILED  ] GMockOutputTest.UnexpectedCallWithDefaultAction  [  FAILED  ] GMockOutputTest.ExcessiveCallWithDefaultAction +[  FAILED  ] GMockOutputTest.PrintsMatcher  FILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#.  FILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#.  FILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#. -ERROR: 3 leaked mock objects found at program exit. +ERROR: 3 leaked mock objects found at program exit. Expectations on a mock object is verified when the object is destructed. Leaking a mock means that its expectations aren't verified, which is usually a test bug. If you really intend to leak a mock, you can suppress this error using testing::Mock::AllowLeak(mock_object), or you may use a fake or stub instead of a mock.  | 
