xref: /aosp_15_r20/external/libchrome/testing/gmock_mutant.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef TESTING_GMOCK_MUTANT_H_
6*635a8641SAndroid Build Coastguard Worker #define TESTING_GMOCK_MUTANT_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker // The intention of this file is to make possible using GMock actions in
9*635a8641SAndroid Build Coastguard Worker // all of its syntactic beauty.
10*635a8641SAndroid Build Coastguard Worker //
11*635a8641SAndroid Build Coastguard Worker //
12*635a8641SAndroid Build Coastguard Worker // Sample usage with gMock:
13*635a8641SAndroid Build Coastguard Worker //
14*635a8641SAndroid Build Coastguard Worker // struct Mock : public ObjectDelegate {
15*635a8641SAndroid Build Coastguard Worker //   MOCK_METHOD2(string, OnRequest(int n, const string& request));
16*635a8641SAndroid Build Coastguard Worker //   MOCK_METHOD1(void, OnQuit(int exit_code));
17*635a8641SAndroid Build Coastguard Worker //   MOCK_METHOD2(void, LogMessage(int level, const string& message));
18*635a8641SAndroid Build Coastguard Worker //
19*635a8641SAndroid Build Coastguard Worker //   string HandleFlowers(const string& reply, int n, const string& request) {
20*635a8641SAndroid Build Coastguard Worker //     string result = SStringPrintf("In request of %d %s ", n, request);
21*635a8641SAndroid Build Coastguard Worker //     for (int i = 0; i < n; ++i) result.append(reply)
22*635a8641SAndroid Build Coastguard Worker //     return result;
23*635a8641SAndroid Build Coastguard Worker //   }
24*635a8641SAndroid Build Coastguard Worker //
25*635a8641SAndroid Build Coastguard Worker //   void DoLogMessage(int level, const string& message) {
26*635a8641SAndroid Build Coastguard Worker //   }
27*635a8641SAndroid Build Coastguard Worker //
28*635a8641SAndroid Build Coastguard Worker //   void QuitMessageLoop(int seconds) {
29*635a8641SAndroid Build Coastguard Worker //     base::MessageLoop* loop = base::MessageLoop::current();
30*635a8641SAndroid Build Coastguard Worker //     loop->PostDelayedTask(FROM_HERE,
31*635a8641SAndroid Build Coastguard Worker //                           base::MessageLoop::QuitWhenIdleClosure(),
32*635a8641SAndroid Build Coastguard Worker //                           1000 * seconds);
33*635a8641SAndroid Build Coastguard Worker //   }
34*635a8641SAndroid Build Coastguard Worker // };
35*635a8641SAndroid Build Coastguard Worker //
36*635a8641SAndroid Build Coastguard Worker // Mock mock;
37*635a8641SAndroid Build Coastguard Worker // // Will invoke mock.HandleFlowers("orchids", n, request)
38*635a8641SAndroid Build Coastguard Worker // // "orchids" is a pre-bound argument, and <n> and <request> are call-time
39*635a8641SAndroid Build Coastguard Worker // // arguments - they are not known until the OnRequest mock is invoked.
40*635a8641SAndroid Build Coastguard Worker // EXPECT_CALL(mock, OnRequest(Ge(5), base::StartsWith("flower"))
41*635a8641SAndroid Build Coastguard Worker //   .Times(1)
42*635a8641SAndroid Build Coastguard Worker //   .WillOnce(Invoke(CreateFunctor(
43*635a8641SAndroid Build Coastguard Worker //       &Mock::HandleFlowers, base::Unretained(&mock), string("orchids"))));
44*635a8641SAndroid Build Coastguard Worker //
45*635a8641SAndroid Build Coastguard Worker //
46*635a8641SAndroid Build Coastguard Worker // // No pre-bound arguments, two call-time arguments passed
47*635a8641SAndroid Build Coastguard Worker // // directly to DoLogMessage
48*635a8641SAndroid Build Coastguard Worker // EXPECT_CALL(mock, OnLogMessage(_, _))
49*635a8641SAndroid Build Coastguard Worker //   .Times(AnyNumber())
50*635a8641SAndroid Build Coastguard Worker //   .WillAlways(Invoke(CreateFunctor(
51*635a8641SAndroid Build Coastguard Worker //       &Mock::DoLogMessage, base::Unretained(&mock))));
52*635a8641SAndroid Build Coastguard Worker //
53*635a8641SAndroid Build Coastguard Worker //
54*635a8641SAndroid Build Coastguard Worker // // In this case we have a single pre-bound argument - 3. We ignore
55*635a8641SAndroid Build Coastguard Worker // // all of the arguments of OnQuit.
56*635a8641SAndroid Build Coastguard Worker // EXCEPT_CALL(mock, OnQuit(_))
57*635a8641SAndroid Build Coastguard Worker //   .Times(1)
58*635a8641SAndroid Build Coastguard Worker //   .WillOnce(InvokeWithoutArgs(CreateFunctor(
59*635a8641SAndroid Build Coastguard Worker //       &Mock::QuitMessageLoop, base::Unretained(&mock), 3)));
60*635a8641SAndroid Build Coastguard Worker //
61*635a8641SAndroid Build Coastguard Worker // MessageLoop loop;
62*635a8641SAndroid Build Coastguard Worker // loop.Run();
63*635a8641SAndroid Build Coastguard Worker //
64*635a8641SAndroid Build Coastguard Worker //
65*635a8641SAndroid Build Coastguard Worker //  // Here is another example of how we can set an action that invokes
66*635a8641SAndroid Build Coastguard Worker //  // method of an object that is not yet created.
67*635a8641SAndroid Build Coastguard Worker // struct Mock : public ObjectDelegate {
68*635a8641SAndroid Build Coastguard Worker //   MOCK_METHOD1(void, DemiurgeCreated(Demiurge*));
69*635a8641SAndroid Build Coastguard Worker //   MOCK_METHOD2(void, OnRequest(int count, const string&));
70*635a8641SAndroid Build Coastguard Worker //
71*635a8641SAndroid Build Coastguard Worker //   void StoreDemiurge(Demiurge* w) {
72*635a8641SAndroid Build Coastguard Worker //     demiurge_ = w;
73*635a8641SAndroid Build Coastguard Worker //   }
74*635a8641SAndroid Build Coastguard Worker //
75*635a8641SAndroid Build Coastguard Worker //   Demiurge* demiurge;
76*635a8641SAndroid Build Coastguard Worker // }
77*635a8641SAndroid Build Coastguard Worker //
78*635a8641SAndroid Build Coastguard Worker // EXPECT_CALL(mock, DemiurgeCreated(_)).Times(1)
79*635a8641SAndroid Build Coastguard Worker //    .WillOnce(Invoke(CreateFunctor(
80*635a8641SAndroid Build Coastguard Worker //        &Mock::StoreDemiurge, base::Unretained(&mock))));
81*635a8641SAndroid Build Coastguard Worker //
82*635a8641SAndroid Build Coastguard Worker // EXPECT_CALL(mock, OnRequest(_, StrEq("Moby Dick")))
83*635a8641SAndroid Build Coastguard Worker //    .Times(AnyNumber())
84*635a8641SAndroid Build Coastguard Worker //    .WillAlways(WithArgs<0>(Invoke(CreateFunctor(
85*635a8641SAndroid Build Coastguard Worker //        &Demiurge::DecreaseMonsters, base::Unretained(&mock->demiurge_)))));
86*635a8641SAndroid Build Coastguard Worker //
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
89*635a8641SAndroid Build Coastguard Worker 
90*635a8641SAndroid Build Coastguard Worker namespace testing {
91*635a8641SAndroid Build Coastguard Worker 
92*635a8641SAndroid Build Coastguard Worker template <typename Signature>
93*635a8641SAndroid Build Coastguard Worker class CallbackToFunctorHelper;
94*635a8641SAndroid Build Coastguard Worker 
95*635a8641SAndroid Build Coastguard Worker template <typename R, typename... Args>
96*635a8641SAndroid Build Coastguard Worker class CallbackToFunctorHelper<R(Args...)> {
97*635a8641SAndroid Build Coastguard Worker  public:
CallbackToFunctorHelper(const base::Callback<R (Args...)> & cb)98*635a8641SAndroid Build Coastguard Worker   explicit CallbackToFunctorHelper(const base::Callback<R(Args...)>& cb)
99*635a8641SAndroid Build Coastguard Worker       : cb_(cb) {}
100*635a8641SAndroid Build Coastguard Worker 
101*635a8641SAndroid Build Coastguard Worker   template <typename... RunArgs>
operator()102*635a8641SAndroid Build Coastguard Worker   R operator()(RunArgs&&... args) {
103*635a8641SAndroid Build Coastguard Worker     return cb_.Run(std::forward<RunArgs>(args)...);
104*635a8641SAndroid Build Coastguard Worker   }
105*635a8641SAndroid Build Coastguard Worker 
106*635a8641SAndroid Build Coastguard Worker  private:
107*635a8641SAndroid Build Coastguard Worker   base::Callback<R(Args...)> cb_;
108*635a8641SAndroid Build Coastguard Worker };
109*635a8641SAndroid Build Coastguard Worker 
110*635a8641SAndroid Build Coastguard Worker template <typename Signature>
111*635a8641SAndroid Build Coastguard Worker CallbackToFunctorHelper<Signature>
CallbackToFunctor(const base::Callback<Signature> & cb)112*635a8641SAndroid Build Coastguard Worker CallbackToFunctor(const base::Callback<Signature>& cb) {
113*635a8641SAndroid Build Coastguard Worker   return CallbackToFunctorHelper<Signature>(cb);
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker 
116*635a8641SAndroid Build Coastguard Worker template <typename Functor>
CreateFunctor(Functor functor)117*635a8641SAndroid Build Coastguard Worker CallbackToFunctorHelper<typename Functor::RunType> CreateFunctor(
118*635a8641SAndroid Build Coastguard Worker     Functor functor) {
119*635a8641SAndroid Build Coastguard Worker   return CallbackToFunctor(functor);
120*635a8641SAndroid Build Coastguard Worker }
121*635a8641SAndroid Build Coastguard Worker 
122*635a8641SAndroid Build Coastguard Worker template <typename Functor, typename... BoundArgs>
123*635a8641SAndroid Build Coastguard Worker CallbackToFunctorHelper<base::MakeUnboundRunType<Functor, BoundArgs...>>
CreateFunctor(Functor functor,const BoundArgs &...args)124*635a8641SAndroid Build Coastguard Worker CreateFunctor(Functor functor, const BoundArgs&... args) {
125*635a8641SAndroid Build Coastguard Worker   return CallbackToFunctor(base::Bind(functor, args...));
126*635a8641SAndroid Build Coastguard Worker }
127*635a8641SAndroid Build Coastguard Worker 
128*635a8641SAndroid Build Coastguard Worker }  // namespace testing
129*635a8641SAndroid Build Coastguard Worker 
130*635a8641SAndroid Build Coastguard Worker #endif  // TESTING_GMOCK_MUTANT_H_
131