37 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ 38 #define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ 48 #include <type_traits> 51 #include "gmock/internal/gmock-internal-utils.h" 52 #include "gmock/internal/gmock-port.h" 55 # pragma warning(push) 56 # pragma warning(disable:4100) 77 template <
typename T,
bool kDefaultConstructible>
79 static T Get() {
return T(); }
84 Assert(
false, __FILE__, __LINE__,
85 "Default action undefined for the function return type.");
86 return internal::Invalid<T>();
103 static bool Exists() {
104 return ::std::is_default_constructible<T>::value;
109 T, ::std::is_default_constructible<T>::value>::Get();
115 template <
typename T>
124 template <
typename T>
127 static bool Exists() {
return true; }
128 static T* Get() {
return nullptr; }
133 #define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ 135 class BuiltInDefaultValue<type> { \ 137 static bool Exists() { return true; } \ 138 static type Get() { return value; } \ 141 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
void, );
142 #if GTEST_HAS_GLOBAL_STRING 143 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::
string,
"");
144 #endif // GTEST_HAS_GLOBAL_STRING 145 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string,
"");
146 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
bool,
false);
147 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
unsigned char,
'\0');
148 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
signed char,
'\0');
149 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
char,
'\0');
157 #if GMOCK_WCHAR_T_IS_NATIVE_ 158 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
wchar_t, 0U);
161 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
unsigned short, 0U);
162 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
signed short, 0);
163 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
unsigned int, 0U);
164 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
signed int, 0);
165 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
unsigned long, 0UL);
166 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
signed long, 0L);
167 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0);
168 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0);
169 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
float, 0);
170 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(
double, 0);
172 #undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ 189 template <
typename T>
194 static void Set(T x) {
196 producer_ =
new FixedValueProducer(x);
202 typedef T (*FactoryFunction)();
203 static void SetFactory(FactoryFunction factory) {
205 producer_ =
new FactoryValueProducer(factory);
209 static void Clear() {
215 static bool IsSet() {
return producer_ !=
nullptr; }
219 static bool Exists() {
228 : producer_->Produce();
232 class ValueProducer {
234 virtual ~ValueProducer() {}
235 virtual T Produce() = 0;
238 class FixedValueProducer :
public ValueProducer {
240 explicit FixedValueProducer(T value) : value_(value) {}
241 T Produce()
override {
return value_; }
245 GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer);
248 class FactoryValueProducer :
public ValueProducer {
250 explicit FactoryValueProducer(FactoryFunction factory)
251 : factory_(factory) {}
252 T Produce()
override {
return factory_(); }
255 const FactoryFunction factory_;
256 GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer);
259 static ValueProducer* producer_;
264 template <
typename T>
268 static void Set(T& x) {
273 static void Clear() { address_ =
nullptr; }
276 static bool IsSet() {
return address_ !=
nullptr; }
280 static bool Exists() {
301 static bool Exists() {
return true; }
306 template <
typename T>
310 template <
typename T>
314 template <
typename F>
327 virtual Result Perform(
const ArgumentTuple& args) = 0;
340 template <
typename F>
344 struct ActionAdapter {
346 ::std::shared_ptr<ActionInterface<F>> impl_;
348 template <
typename... Args>
350 return impl_->Perform(
351 ::std::forward_as_tuple(::std::forward<Args>(args)...));
366 template <
typename G,
367 typename = typename ::std::enable_if<
368 ::std::is_constructible<::std::function<F>, G>::value>::type>
369 Action(G&& fun) : fun_(::std::forward<G>(fun)) {}
373 : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {}
378 template <
typename Func>
379 explicit Action(
const Action<Func>& action) : fun_(action.fun_) {}
382 bool IsDoDefault()
const {
return fun_ ==
nullptr; }
390 Result Perform(ArgumentTuple args)
const {
392 internal::IllegalDoDefault(__FILE__, __LINE__);
394 return internal::Apply(fun_, ::std::move(args));
398 template <
typename G>
402 ::std::function<F> fun_;
426 template <
typename Impl>
431 template <
typename F>
433 return Action<F>(
new MonomorphicImpl<F>(impl_));
437 template <
typename F>
443 explicit MonomorphicImpl(
const Impl& impl) : impl_(impl) {}
445 Result Perform(
const ArgumentTuple& args)
override {
446 return impl_.template Perform<Result>(args);
452 GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);
462 template <
typename F>
474 template <
typename Impl>
483 template <
typename T>
485 explicit ByMoveWrapper(T value) : payload(std::move(value)) {}
516 template <
typename R>
522 explicit ReturnAction(R value) : value_(
new R(std::move(value))) {}
526 template <
typename F>
537 GTEST_COMPILE_ASSERT_(
539 use_ReturnRef_instead_of_Return_to_return_a_reference);
540 static_assert(!std::is_void<Result>::value,
541 "Can't use Return() on an action expected to return `void`.");
542 return Action<F>(
new Impl<R, F>(value_));
547 template <
typename R_,
typename F>
560 explicit Impl(
const std::shared_ptr<R>& value)
561 : value_before_cast_(*value),
562 value_(ImplicitCast_<Result>(value_before_cast_)) {}
564 Result Perform(
const ArgumentTuple&)
override {
return value_; }
568 Result_cannot_be_a_reference_type);
571 R value_before_cast_;
574 GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
579 template <
typename R_,
typename F>
585 explicit Impl(
const std::shared_ptr<R>& wrapper)
586 : performed_(
false), wrapper_(wrapper) {}
588 Result Perform(
const ArgumentTuple&)
override {
589 GTEST_CHECK_(!performed_)
590 <<
"A ByMove() action should only be performed once.";
592 return std::move(wrapper_->payload);
597 const std::shared_ptr<R> wrapper_;
599 GTEST_DISALLOW_ASSIGN_(Impl);
602 const std::shared_ptr<R> value_;
613 template <
typename Result,
typename ArgumentTuple>
614 static Result Perform(
const ArgumentTuple&) {
623 template <
typename Result,
typename ArgumentTuple>
624 static void Perform(
const ArgumentTuple&) {
632 template <
typename T>
640 template <
typename F>
647 use_Return_instead_of_ReturnRef_to_return_a_value);
653 template <
typename F>
659 explicit Impl(T& ref) : ref_(ref) {}
661 Result Perform(
const ArgumentTuple&)
override {
return ref_; }
666 GTEST_DISALLOW_ASSIGN_(Impl);
677 template <
typename T>
686 template <
typename F>
692 GTEST_COMPILE_ASSERT_(
694 use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);
700 template <
typename F>
706 explicit Impl(
const T& value) : value_(value) {}
708 Result Perform(
const ArgumentTuple&)
override {
return value_; }
713 GTEST_DISALLOW_ASSIGN_(Impl);
726 template <
typename F>
732 template <
typename T1,
typename T2>
735 AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {}
737 template <
typename Result,
typename ArgumentTuple>
738 void Perform(
const ArgumentTuple& )
const {
749 #if !GTEST_OS_WINDOWS_MOBILE 753 template <
typename T>
757 : errno_(errno_value),
759 template <
typename Result,
typename ArgumentTuple>
760 Result Perform(
const ArgumentTuple& )
const {
772 #endif // !GTEST_OS_WINDOWS_MOBILE 778 template <
size_t N,
typename A,
bool kIsProto>
785 template <
typename Result,
typename ArgumentTuple>
786 void Perform(
const ArgumentTuple& args)
const {
788 *::std::get<N>(args) = value_;
797 template <
size_t N,
typename Proto>
805 proto_->CopyFrom(proto);
808 template <
typename Result,
typename ArgumentTuple>
809 void Perform(
const ArgumentTuple& args)
const {
811 ::std::get<N>(args)->CopyFrom(*proto_);
815 const std::shared_ptr<Proto> proto_;
821 template <
class Class,
typename MethodPtr>
823 Class*
const obj_ptr;
824 const MethodPtr method_ptr;
826 template <
typename... Args>
827 auto operator()(Args&&... args)
const 828 -> decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) {
829 return (obj_ptr->*method_ptr)(std::forward<Args>(args)...);
837 template <
typename FunctionImpl>
839 FunctionImpl function_impl;
843 template <
typename... Args>
844 auto operator()(
const Args&...) -> decltype(function_impl()) {
845 return function_impl();
850 template <
class Class,
typename MethodPtr>
852 Class*
const obj_ptr;
853 const MethodPtr method_ptr;
855 using ReturnType =
typename std::result_of<MethodPtr(Class*)>::type;
857 template <
typename... Args>
858 ReturnType operator()(
const Args&...)
const {
859 return (obj_ptr->*method_ptr)();
864 template <
typename A>
869 template <
typename F>
888 template <
typename F>
894 explicit Impl(
const A& action) : action_(action) {}
896 void Perform(
const ArgumentTuple& args)
override {
898 action_.Perform(args);
909 GTEST_DISALLOW_ASSIGN_(Impl);
917 template <
typename InnerAction,
size_t... I>
923 template <
typename R,
typename... Args>
924 operator Action<R(Args...)>()
const {
925 Action<R(
typename std::tuple_element<I, std::tuple<Args...>>::type...)>
928 return [converted](Args... args) -> R {
929 return converted.Perform(std::forward_as_tuple(
930 std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...));
935 template <
typename... Actions>
938 template <
typename... Args,
size_t... I>
940 return {std::get<I>(actions)...};
944 std::tuple<Actions...> actions;
946 template <
typename R,
typename... Args>
947 operator Action<R(Args...)>()
const {
949 std::vector<
Action<void(Args...)>> converted;
951 R operator()(Args... args)
const {
952 auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...);
953 for (
auto& a : converted) {
954 a.Perform(tuple_args);
956 return last.Perform(tuple_args);
960 std::get<
sizeof...(Actions) - 1>(actions)};
1000 template <
typename...
Action>
1003 return {std::forward_as_tuple(std::forward<Action>(action)...)};
1011 template <
size_t k,
typename InnerAction>
1013 WithArg(InnerAction&& action) {
1014 return {std::forward<InnerAction>(action)};
1021 template <
size_t k,
size_t... ks,
typename InnerAction>
1022 internal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...>
1023 WithArgs(InnerAction&& action) {
1024 return {std::forward<InnerAction>(action)};
1031 template <
typename InnerAction>
1032 internal::WithArgsAction<typename std::decay<InnerAction>::type>
1033 WithoutArgs(InnerAction&& action) {
1034 return {std::forward<InnerAction>(action)};
1040 template <
typename R>
1056 template <
typename R>
1064 template <
typename R>
1073 template <
typename R>
1085 template <
size_t N,
typename T>
1089 SetArgPointee(
const T& x) {
1097 SetArgPointee(
const char* p) {
1099 N,
const char*,
false>(p));
1105 SetArgPointee(
const wchar_t* p) {
1107 N,
const wchar_t*,
false>(p));
1111 template <
size_t N,
typename T>
1115 SetArgumentPointee(
const T& x) {
1121 template <
typename T1,
typename T2>
1126 #if !GTEST_OS_WINDOWS_MOBILE 1129 template <
typename T>
1131 SetErrnoAndReturn(
int errval, T result) {
1132 return MakePolymorphicAction(
1136 #endif // !GTEST_OS_WINDOWS_MOBILE 1144 template <
typename FunctionImpl>
1145 typename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) {
1146 return std::forward<FunctionImpl>(function_impl);
1151 template <
class Class,
typename MethodPtr>
1153 MethodPtr method_ptr) {
1154 return {obj_ptr, method_ptr};
1158 template <
typename FunctionImpl>
1160 InvokeWithoutArgs(FunctionImpl function_impl) {
1161 return {std::move(function_impl)};
1166 template <
class Class,
typename MethodPtr>
1168 Class* obj_ptr, MethodPtr method_ptr) {
1169 return {obj_ptr, method_ptr};
1175 template <
typename A>
1190 template <
typename T>
1191 inline ::std::reference_wrapper<T> ByRef(T& l_value) {
1192 return ::std::reference_wrapper<T>(l_value);
1198 # pragma warning(pop) 1202 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ Definition: gmock-actions.h:78
Definition: gmock-actions.h:59
Definition: gmock-actions.h:851
Definition: gtest-internal.h:879
Definition: gmock-actions.h:633
Definition: gmock-actions.h:517
Definition: gmock-actions.h:190
Definition: gmock-actions.h:341
Definition: gmock-actions.h:722
Definition: gmock-actions.h:608
Definition: gmock-actions.h:838
Definition: gtest-internal.h:1200
Definition: gmock-internal-utils.h:356
Definition: gmock-actions.h:315
Definition: gtest-internal.h:1181
Definition: gmock-actions.h:918
Definition: gmock-actions.h:733
Definition: gmock-actions.h:865
Definition: gmock-actions.h:620
Definition: gmock-actions.h:754
Definition: gmock-actions.h:427
Definition: gmock-actions.h:779
Definition: gmock-actions.h:484
Definition: gmock-internal-utils.h:546
Definition: gtest-internal.h:927
Definition: gmock-actions.h:936
Definition: gmock-actions.h:100
Definition: gmock-actions.h:678
Definition: gmock-actions.h:822
Definition: gtest-internal.h:111