xref: /aosp_15_r20/external/libchrome/base/bind_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 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 #include "base/bind.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <memory>
8*635a8641SAndroid Build Coastguard Worker #include <utility>
9*635a8641SAndroid Build Coastguard Worker #include <vector>
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker #include "base/callback.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/test/bind_test_util.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
18*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
19*635a8641SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
20*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker using ::testing::_;
23*635a8641SAndroid Build Coastguard Worker using ::testing::Mock;
24*635a8641SAndroid Build Coastguard Worker using ::testing::ByMove;
25*635a8641SAndroid Build Coastguard Worker using ::testing::Return;
26*635a8641SAndroid Build Coastguard Worker using ::testing::StrictMock;
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker namespace base {
29*635a8641SAndroid Build Coastguard Worker namespace {
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker class IncompleteType;
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker class NoRef {
34*635a8641SAndroid Build Coastguard Worker  public:
35*635a8641SAndroid Build Coastguard Worker   NoRef() = default;
36*635a8641SAndroid Build Coastguard Worker 
37*635a8641SAndroid Build Coastguard Worker   MOCK_METHOD0(VoidMethod0, void());
38*635a8641SAndroid Build Coastguard Worker   MOCK_CONST_METHOD0(VoidConstMethod0, void());
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker   MOCK_METHOD0(IntMethod0, int());
41*635a8641SAndroid Build Coastguard Worker   MOCK_CONST_METHOD0(IntConstMethod0, int());
42*635a8641SAndroid Build Coastguard Worker 
43*635a8641SAndroid Build Coastguard Worker   MOCK_METHOD1(VoidMethodWithIntArg, void(int));
44*635a8641SAndroid Build Coastguard Worker   MOCK_METHOD0(UniquePtrMethod0, std::unique_ptr<int>());
45*635a8641SAndroid Build Coastguard Worker 
46*635a8641SAndroid Build Coastguard Worker  private:
47*635a8641SAndroid Build Coastguard Worker   // Particularly important in this test to ensure no copies are made.
48*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(NoRef);
49*635a8641SAndroid Build Coastguard Worker };
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker class HasRef : public NoRef {
52*635a8641SAndroid Build Coastguard Worker  public:
53*635a8641SAndroid Build Coastguard Worker   HasRef() = default;
54*635a8641SAndroid Build Coastguard Worker 
55*635a8641SAndroid Build Coastguard Worker   MOCK_CONST_METHOD0(AddRef, void());
56*635a8641SAndroid Build Coastguard Worker   MOCK_CONST_METHOD0(Release, bool());
57*635a8641SAndroid Build Coastguard Worker 
58*635a8641SAndroid Build Coastguard Worker  private:
59*635a8641SAndroid Build Coastguard Worker   // Particularly important in this test to ensure no copies are made.
60*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(HasRef);
61*635a8641SAndroid Build Coastguard Worker };
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker class HasRefPrivateDtor : public HasRef {
64*635a8641SAndroid Build Coastguard Worker  private:
65*635a8641SAndroid Build Coastguard Worker   ~HasRefPrivateDtor() = default;
66*635a8641SAndroid Build Coastguard Worker };
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker static const int kParentValue = 1;
69*635a8641SAndroid Build Coastguard Worker static const int kChildValue = 2;
70*635a8641SAndroid Build Coastguard Worker 
71*635a8641SAndroid Build Coastguard Worker class Parent {
72*635a8641SAndroid Build Coastguard Worker  public:
~Parent()73*635a8641SAndroid Build Coastguard Worker   virtual ~Parent() {}
AddRef() const74*635a8641SAndroid Build Coastguard Worker   void AddRef() const {}
Release() const75*635a8641SAndroid Build Coastguard Worker   void Release() const {}
VirtualSet()76*635a8641SAndroid Build Coastguard Worker   virtual void VirtualSet() { value = kParentValue; }
NonVirtualSet()77*635a8641SAndroid Build Coastguard Worker   void NonVirtualSet() { value = kParentValue; }
78*635a8641SAndroid Build Coastguard Worker   int value;
79*635a8641SAndroid Build Coastguard Worker };
80*635a8641SAndroid Build Coastguard Worker 
81*635a8641SAndroid Build Coastguard Worker class Child : public Parent {
82*635a8641SAndroid Build Coastguard Worker  public:
~Child()83*635a8641SAndroid Build Coastguard Worker   ~Child() override {}
VirtualSet()84*635a8641SAndroid Build Coastguard Worker   void VirtualSet() override { value = kChildValue; }
NonVirtualSet()85*635a8641SAndroid Build Coastguard Worker   void NonVirtualSet() { value = kChildValue; }
86*635a8641SAndroid Build Coastguard Worker };
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker class NoRefParent {
89*635a8641SAndroid Build Coastguard Worker  public:
~NoRefParent()90*635a8641SAndroid Build Coastguard Worker   virtual ~NoRefParent() {}
VirtualSet()91*635a8641SAndroid Build Coastguard Worker   virtual void VirtualSet() { value = kParentValue; }
NonVirtualSet()92*635a8641SAndroid Build Coastguard Worker   void NonVirtualSet() { value = kParentValue; }
93*635a8641SAndroid Build Coastguard Worker   int value;
94*635a8641SAndroid Build Coastguard Worker };
95*635a8641SAndroid Build Coastguard Worker 
96*635a8641SAndroid Build Coastguard Worker class NoRefChild : public NoRefParent {
97*635a8641SAndroid Build Coastguard Worker  public:
~NoRefChild()98*635a8641SAndroid Build Coastguard Worker   ~NoRefChild() override {}
99*635a8641SAndroid Build Coastguard Worker  private:
VirtualSet()100*635a8641SAndroid Build Coastguard Worker   void VirtualSet() override { value = kChildValue; }
NonVirtualSet()101*635a8641SAndroid Build Coastguard Worker   void NonVirtualSet() { value = kChildValue; }
102*635a8641SAndroid Build Coastguard Worker };
103*635a8641SAndroid Build Coastguard Worker 
104*635a8641SAndroid Build Coastguard Worker // Used for probing the number of copies and moves that occur if a type must be
105*635a8641SAndroid Build Coastguard Worker // coerced during argument forwarding in the Run() methods.
106*635a8641SAndroid Build Coastguard Worker struct DerivedCopyMoveCounter {
DerivedCopyMoveCounterbase::__anonab4e4da50111::DerivedCopyMoveCounter107*635a8641SAndroid Build Coastguard Worker   DerivedCopyMoveCounter(int* copies,
108*635a8641SAndroid Build Coastguard Worker                          int* assigns,
109*635a8641SAndroid Build Coastguard Worker                          int* move_constructs,
110*635a8641SAndroid Build Coastguard Worker                          int* move_assigns)
111*635a8641SAndroid Build Coastguard Worker       : copies_(copies),
112*635a8641SAndroid Build Coastguard Worker         assigns_(assigns),
113*635a8641SAndroid Build Coastguard Worker         move_constructs_(move_constructs),
114*635a8641SAndroid Build Coastguard Worker         move_assigns_(move_assigns) {}
115*635a8641SAndroid Build Coastguard Worker   int* copies_;
116*635a8641SAndroid Build Coastguard Worker   int* assigns_;
117*635a8641SAndroid Build Coastguard Worker   int* move_constructs_;
118*635a8641SAndroid Build Coastguard Worker   int* move_assigns_;
119*635a8641SAndroid Build Coastguard Worker };
120*635a8641SAndroid Build Coastguard Worker 
121*635a8641SAndroid Build Coastguard Worker // Used for probing the number of copies and moves in an argument.
122*635a8641SAndroid Build Coastguard Worker class CopyMoveCounter {
123*635a8641SAndroid Build Coastguard Worker  public:
CopyMoveCounter(int * copies,int * assigns,int * move_constructs,int * move_assigns)124*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter(int* copies,
125*635a8641SAndroid Build Coastguard Worker                   int* assigns,
126*635a8641SAndroid Build Coastguard Worker                   int* move_constructs,
127*635a8641SAndroid Build Coastguard Worker                   int* move_assigns)
128*635a8641SAndroid Build Coastguard Worker       : copies_(copies),
129*635a8641SAndroid Build Coastguard Worker         assigns_(assigns),
130*635a8641SAndroid Build Coastguard Worker         move_constructs_(move_constructs),
131*635a8641SAndroid Build Coastguard Worker         move_assigns_(move_assigns) {}
132*635a8641SAndroid Build Coastguard Worker 
CopyMoveCounter(const CopyMoveCounter & other)133*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter(const CopyMoveCounter& other)
134*635a8641SAndroid Build Coastguard Worker       : copies_(other.copies_),
135*635a8641SAndroid Build Coastguard Worker         assigns_(other.assigns_),
136*635a8641SAndroid Build Coastguard Worker         move_constructs_(other.move_constructs_),
137*635a8641SAndroid Build Coastguard Worker         move_assigns_(other.move_assigns_) {
138*635a8641SAndroid Build Coastguard Worker     (*copies_)++;
139*635a8641SAndroid Build Coastguard Worker   }
140*635a8641SAndroid Build Coastguard Worker 
CopyMoveCounter(CopyMoveCounter && other)141*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter(CopyMoveCounter&& other)
142*635a8641SAndroid Build Coastguard Worker       : copies_(other.copies_),
143*635a8641SAndroid Build Coastguard Worker         assigns_(other.assigns_),
144*635a8641SAndroid Build Coastguard Worker         move_constructs_(other.move_constructs_),
145*635a8641SAndroid Build Coastguard Worker         move_assigns_(other.move_assigns_) {
146*635a8641SAndroid Build Coastguard Worker     (*move_constructs_)++;
147*635a8641SAndroid Build Coastguard Worker   }
148*635a8641SAndroid Build Coastguard Worker 
149*635a8641SAndroid Build Coastguard Worker   // Probing for copies from coercion.
CopyMoveCounter(const DerivedCopyMoveCounter & other)150*635a8641SAndroid Build Coastguard Worker   explicit CopyMoveCounter(const DerivedCopyMoveCounter& other)
151*635a8641SAndroid Build Coastguard Worker       : copies_(other.copies_),
152*635a8641SAndroid Build Coastguard Worker         assigns_(other.assigns_),
153*635a8641SAndroid Build Coastguard Worker         move_constructs_(other.move_constructs_),
154*635a8641SAndroid Build Coastguard Worker         move_assigns_(other.move_assigns_) {
155*635a8641SAndroid Build Coastguard Worker     (*copies_)++;
156*635a8641SAndroid Build Coastguard Worker   }
157*635a8641SAndroid Build Coastguard Worker 
158*635a8641SAndroid Build Coastguard Worker   // Probing for moves from coercion.
CopyMoveCounter(DerivedCopyMoveCounter && other)159*635a8641SAndroid Build Coastguard Worker   explicit CopyMoveCounter(DerivedCopyMoveCounter&& other)
160*635a8641SAndroid Build Coastguard Worker       : copies_(other.copies_),
161*635a8641SAndroid Build Coastguard Worker         assigns_(other.assigns_),
162*635a8641SAndroid Build Coastguard Worker         move_constructs_(other.move_constructs_),
163*635a8641SAndroid Build Coastguard Worker         move_assigns_(other.move_assigns_) {
164*635a8641SAndroid Build Coastguard Worker     (*move_constructs_)++;
165*635a8641SAndroid Build Coastguard Worker   }
166*635a8641SAndroid Build Coastguard Worker 
operator =(const CopyMoveCounter & rhs)167*635a8641SAndroid Build Coastguard Worker   const CopyMoveCounter& operator=(const CopyMoveCounter& rhs) {
168*635a8641SAndroid Build Coastguard Worker     copies_ = rhs.copies_;
169*635a8641SAndroid Build Coastguard Worker     assigns_ = rhs.assigns_;
170*635a8641SAndroid Build Coastguard Worker     move_constructs_ = rhs.move_constructs_;
171*635a8641SAndroid Build Coastguard Worker     move_assigns_ = rhs.move_assigns_;
172*635a8641SAndroid Build Coastguard Worker 
173*635a8641SAndroid Build Coastguard Worker     (*assigns_)++;
174*635a8641SAndroid Build Coastguard Worker 
175*635a8641SAndroid Build Coastguard Worker     return *this;
176*635a8641SAndroid Build Coastguard Worker   }
177*635a8641SAndroid Build Coastguard Worker 
operator =(CopyMoveCounter && rhs)178*635a8641SAndroid Build Coastguard Worker   const CopyMoveCounter& operator=(CopyMoveCounter&& rhs) {
179*635a8641SAndroid Build Coastguard Worker     copies_ = rhs.copies_;
180*635a8641SAndroid Build Coastguard Worker     assigns_ = rhs.assigns_;
181*635a8641SAndroid Build Coastguard Worker     move_constructs_ = rhs.move_constructs_;
182*635a8641SAndroid Build Coastguard Worker     move_assigns_ = rhs.move_assigns_;
183*635a8641SAndroid Build Coastguard Worker 
184*635a8641SAndroid Build Coastguard Worker     (*move_assigns_)++;
185*635a8641SAndroid Build Coastguard Worker 
186*635a8641SAndroid Build Coastguard Worker     return *this;
187*635a8641SAndroid Build Coastguard Worker   }
188*635a8641SAndroid Build Coastguard Worker 
copies() const189*635a8641SAndroid Build Coastguard Worker   int copies() const {
190*635a8641SAndroid Build Coastguard Worker     return *copies_;
191*635a8641SAndroid Build Coastguard Worker   }
192*635a8641SAndroid Build Coastguard Worker 
193*635a8641SAndroid Build Coastguard Worker  private:
194*635a8641SAndroid Build Coastguard Worker   int* copies_;
195*635a8641SAndroid Build Coastguard Worker   int* assigns_;
196*635a8641SAndroid Build Coastguard Worker   int* move_constructs_;
197*635a8641SAndroid Build Coastguard Worker   int* move_assigns_;
198*635a8641SAndroid Build Coastguard Worker };
199*635a8641SAndroid Build Coastguard Worker 
200*635a8641SAndroid Build Coastguard Worker // Used for probing the number of copies in an argument. The instance is a
201*635a8641SAndroid Build Coastguard Worker // copyable and non-movable type.
202*635a8641SAndroid Build Coastguard Worker class CopyCounter {
203*635a8641SAndroid Build Coastguard Worker  public:
CopyCounter(int * copies,int * assigns)204*635a8641SAndroid Build Coastguard Worker   CopyCounter(int* copies, int* assigns)
205*635a8641SAndroid Build Coastguard Worker       : counter_(copies, assigns, nullptr, nullptr) {}
206*635a8641SAndroid Build Coastguard Worker   CopyCounter(const CopyCounter& other) = default;
207*635a8641SAndroid Build Coastguard Worker   CopyCounter& operator=(const CopyCounter& other) = default;
208*635a8641SAndroid Build Coastguard Worker 
CopyCounter(const DerivedCopyMoveCounter & other)209*635a8641SAndroid Build Coastguard Worker   explicit CopyCounter(const DerivedCopyMoveCounter& other) : counter_(other) {}
210*635a8641SAndroid Build Coastguard Worker 
copies() const211*635a8641SAndroid Build Coastguard Worker   int copies() const { return counter_.copies(); }
212*635a8641SAndroid Build Coastguard Worker 
213*635a8641SAndroid Build Coastguard Worker  private:
214*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter counter_;
215*635a8641SAndroid Build Coastguard Worker };
216*635a8641SAndroid Build Coastguard Worker 
217*635a8641SAndroid Build Coastguard Worker // Used for probing the number of moves in an argument. The instance is a
218*635a8641SAndroid Build Coastguard Worker // non-copyable and movable type.
219*635a8641SAndroid Build Coastguard Worker class MoveCounter {
220*635a8641SAndroid Build Coastguard Worker  public:
MoveCounter(int * move_constructs,int * move_assigns)221*635a8641SAndroid Build Coastguard Worker   MoveCounter(int* move_constructs, int* move_assigns)
222*635a8641SAndroid Build Coastguard Worker       : counter_(nullptr, nullptr, move_constructs, move_assigns) {}
MoveCounter(MoveCounter && other)223*635a8641SAndroid Build Coastguard Worker   MoveCounter(MoveCounter&& other) : counter_(std::move(other.counter_)) {}
operator =(MoveCounter && other)224*635a8641SAndroid Build Coastguard Worker   MoveCounter& operator=(MoveCounter&& other) {
225*635a8641SAndroid Build Coastguard Worker     counter_ = std::move(other.counter_);
226*635a8641SAndroid Build Coastguard Worker     return *this;
227*635a8641SAndroid Build Coastguard Worker   }
228*635a8641SAndroid Build Coastguard Worker 
MoveCounter(DerivedCopyMoveCounter && other)229*635a8641SAndroid Build Coastguard Worker   explicit MoveCounter(DerivedCopyMoveCounter&& other)
230*635a8641SAndroid Build Coastguard Worker       : counter_(std::move(other)) {}
231*635a8641SAndroid Build Coastguard Worker 
232*635a8641SAndroid Build Coastguard Worker  private:
233*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter counter_;
234*635a8641SAndroid Build Coastguard Worker };
235*635a8641SAndroid Build Coastguard Worker 
236*635a8641SAndroid Build Coastguard Worker class DeleteCounter {
237*635a8641SAndroid Build Coastguard Worker  public:
DeleteCounter(int * deletes)238*635a8641SAndroid Build Coastguard Worker   explicit DeleteCounter(int* deletes)
239*635a8641SAndroid Build Coastguard Worker       : deletes_(deletes) {
240*635a8641SAndroid Build Coastguard Worker   }
241*635a8641SAndroid Build Coastguard Worker 
~DeleteCounter()242*635a8641SAndroid Build Coastguard Worker   ~DeleteCounter() {
243*635a8641SAndroid Build Coastguard Worker     (*deletes_)++;
244*635a8641SAndroid Build Coastguard Worker   }
245*635a8641SAndroid Build Coastguard Worker 
VoidMethod0()246*635a8641SAndroid Build Coastguard Worker   void VoidMethod0() {}
247*635a8641SAndroid Build Coastguard Worker 
248*635a8641SAndroid Build Coastguard Worker  private:
249*635a8641SAndroid Build Coastguard Worker   int* deletes_;
250*635a8641SAndroid Build Coastguard Worker };
251*635a8641SAndroid Build Coastguard Worker 
252*635a8641SAndroid Build Coastguard Worker template <typename T>
PassThru(T scoper)253*635a8641SAndroid Build Coastguard Worker T PassThru(T scoper) {
254*635a8641SAndroid Build Coastguard Worker   return scoper;
255*635a8641SAndroid Build Coastguard Worker }
256*635a8641SAndroid Build Coastguard Worker 
257*635a8641SAndroid Build Coastguard Worker // Some test functions that we can Bind to.
258*635a8641SAndroid Build Coastguard Worker template <typename T>
PolymorphicIdentity(T t)259*635a8641SAndroid Build Coastguard Worker T PolymorphicIdentity(T t) {
260*635a8641SAndroid Build Coastguard Worker   return t;
261*635a8641SAndroid Build Coastguard Worker }
262*635a8641SAndroid Build Coastguard Worker 
263*635a8641SAndroid Build Coastguard Worker template <typename... Ts>
264*635a8641SAndroid Build Coastguard Worker struct VoidPolymorphic {
Runbase::__anonab4e4da50111::VoidPolymorphic265*635a8641SAndroid Build Coastguard Worker   static void Run(Ts... t) {}
266*635a8641SAndroid Build Coastguard Worker };
267*635a8641SAndroid Build Coastguard Worker 
Identity(int n)268*635a8641SAndroid Build Coastguard Worker int Identity(int n) {
269*635a8641SAndroid Build Coastguard Worker   return n;
270*635a8641SAndroid Build Coastguard Worker }
271*635a8641SAndroid Build Coastguard Worker 
ArrayGet(const int array[],int n)272*635a8641SAndroid Build Coastguard Worker int ArrayGet(const int array[], int n) {
273*635a8641SAndroid Build Coastguard Worker   return array[n];
274*635a8641SAndroid Build Coastguard Worker }
275*635a8641SAndroid Build Coastguard Worker 
Sum(int a,int b,int c,int d,int e,int f)276*635a8641SAndroid Build Coastguard Worker int Sum(int a, int b, int c, int d, int e, int f) {
277*635a8641SAndroid Build Coastguard Worker   return a + b + c + d + e + f;
278*635a8641SAndroid Build Coastguard Worker }
279*635a8641SAndroid Build Coastguard Worker 
CStringIdentity(const char * s)280*635a8641SAndroid Build Coastguard Worker const char* CStringIdentity(const char* s) {
281*635a8641SAndroid Build Coastguard Worker   return s;
282*635a8641SAndroid Build Coastguard Worker }
283*635a8641SAndroid Build Coastguard Worker 
GetCopies(const CopyMoveCounter & counter)284*635a8641SAndroid Build Coastguard Worker int GetCopies(const CopyMoveCounter& counter) {
285*635a8641SAndroid Build Coastguard Worker   return counter.copies();
286*635a8641SAndroid Build Coastguard Worker }
287*635a8641SAndroid Build Coastguard Worker 
UnwrapNoRefParent(NoRefParent p)288*635a8641SAndroid Build Coastguard Worker int UnwrapNoRefParent(NoRefParent p) {
289*635a8641SAndroid Build Coastguard Worker   return p.value;
290*635a8641SAndroid Build Coastguard Worker }
291*635a8641SAndroid Build Coastguard Worker 
UnwrapNoRefParentPtr(NoRefParent * p)292*635a8641SAndroid Build Coastguard Worker int UnwrapNoRefParentPtr(NoRefParent* p) {
293*635a8641SAndroid Build Coastguard Worker   return p->value;
294*635a8641SAndroid Build Coastguard Worker }
295*635a8641SAndroid Build Coastguard Worker 
UnwrapNoRefParentConstRef(const NoRefParent & p)296*635a8641SAndroid Build Coastguard Worker int UnwrapNoRefParentConstRef(const NoRefParent& p) {
297*635a8641SAndroid Build Coastguard Worker   return p.value;
298*635a8641SAndroid Build Coastguard Worker }
299*635a8641SAndroid Build Coastguard Worker 
RefArgSet(int & n)300*635a8641SAndroid Build Coastguard Worker void RefArgSet(int &n) {
301*635a8641SAndroid Build Coastguard Worker   n = 2;
302*635a8641SAndroid Build Coastguard Worker }
303*635a8641SAndroid Build Coastguard Worker 
PtrArgSet(int * n)304*635a8641SAndroid Build Coastguard Worker void PtrArgSet(int *n) {
305*635a8641SAndroid Build Coastguard Worker   *n = 2;
306*635a8641SAndroid Build Coastguard Worker }
307*635a8641SAndroid Build Coastguard Worker 
FunctionWithWeakFirstParam(WeakPtr<NoRef> o,int n)308*635a8641SAndroid Build Coastguard Worker int FunctionWithWeakFirstParam(WeakPtr<NoRef> o, int n) {
309*635a8641SAndroid Build Coastguard Worker   return n;
310*635a8641SAndroid Build Coastguard Worker }
311*635a8641SAndroid Build Coastguard Worker 
FunctionWithScopedRefptrFirstParam(const scoped_refptr<HasRef> & o,int n)312*635a8641SAndroid Build Coastguard Worker int FunctionWithScopedRefptrFirstParam(const scoped_refptr<HasRef>& o, int n) {
313*635a8641SAndroid Build Coastguard Worker   return n;
314*635a8641SAndroid Build Coastguard Worker }
315*635a8641SAndroid Build Coastguard Worker 
TakesACallback(const Closure & callback)316*635a8641SAndroid Build Coastguard Worker void TakesACallback(const Closure& callback) {
317*635a8641SAndroid Build Coastguard Worker   callback.Run();
318*635a8641SAndroid Build Coastguard Worker }
319*635a8641SAndroid Build Coastguard Worker 
Noexcept()320*635a8641SAndroid Build Coastguard Worker int Noexcept() noexcept {
321*635a8641SAndroid Build Coastguard Worker   return 42;
322*635a8641SAndroid Build Coastguard Worker }
323*635a8641SAndroid Build Coastguard Worker 
324*635a8641SAndroid Build Coastguard Worker class BindTest : public ::testing::Test {
325*635a8641SAndroid Build Coastguard Worker  public:
BindTest()326*635a8641SAndroid Build Coastguard Worker   BindTest() {
327*635a8641SAndroid Build Coastguard Worker     const_has_ref_ptr_ = &has_ref_;
328*635a8641SAndroid Build Coastguard Worker     const_no_ref_ptr_ = &no_ref_;
329*635a8641SAndroid Build Coastguard Worker     static_func_mock_ptr = &static_func_mock_;
330*635a8641SAndroid Build Coastguard Worker   }
331*635a8641SAndroid Build Coastguard Worker 
332*635a8641SAndroid Build Coastguard Worker   ~BindTest() override = default;
333*635a8641SAndroid Build Coastguard Worker 
VoidFunc0()334*635a8641SAndroid Build Coastguard Worker   static void VoidFunc0() {
335*635a8641SAndroid Build Coastguard Worker     static_func_mock_ptr->VoidMethod0();
336*635a8641SAndroid Build Coastguard Worker   }
337*635a8641SAndroid Build Coastguard Worker 
IntFunc0()338*635a8641SAndroid Build Coastguard Worker   static int IntFunc0() { return static_func_mock_ptr->IntMethod0(); }
NoexceptMethod()339*635a8641SAndroid Build Coastguard Worker   int NoexceptMethod() noexcept { return 42; }
ConstNoexceptMethod() const340*635a8641SAndroid Build Coastguard Worker   int ConstNoexceptMethod() const noexcept { return 42; }
341*635a8641SAndroid Build Coastguard Worker 
342*635a8641SAndroid Build Coastguard Worker  protected:
343*635a8641SAndroid Build Coastguard Worker   StrictMock<NoRef> no_ref_;
344*635a8641SAndroid Build Coastguard Worker   StrictMock<HasRef> has_ref_;
345*635a8641SAndroid Build Coastguard Worker   const HasRef* const_has_ref_ptr_;
346*635a8641SAndroid Build Coastguard Worker   const NoRef* const_no_ref_ptr_;
347*635a8641SAndroid Build Coastguard Worker   StrictMock<NoRef> static_func_mock_;
348*635a8641SAndroid Build Coastguard Worker 
349*635a8641SAndroid Build Coastguard Worker   // Used by the static functions to perform expectations.
350*635a8641SAndroid Build Coastguard Worker   static StrictMock<NoRef>* static_func_mock_ptr;
351*635a8641SAndroid Build Coastguard Worker 
352*635a8641SAndroid Build Coastguard Worker  private:
353*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(BindTest);
354*635a8641SAndroid Build Coastguard Worker };
355*635a8641SAndroid Build Coastguard Worker 
356*635a8641SAndroid Build Coastguard Worker StrictMock<NoRef>* BindTest::static_func_mock_ptr;
357*635a8641SAndroid Build Coastguard Worker StrictMock<NoRef>* g_func_mock_ptr;
358*635a8641SAndroid Build Coastguard Worker 
VoidFunc0()359*635a8641SAndroid Build Coastguard Worker void VoidFunc0() {
360*635a8641SAndroid Build Coastguard Worker   g_func_mock_ptr->VoidMethod0();
361*635a8641SAndroid Build Coastguard Worker }
362*635a8641SAndroid Build Coastguard Worker 
IntFunc0()363*635a8641SAndroid Build Coastguard Worker int IntFunc0() {
364*635a8641SAndroid Build Coastguard Worker   return g_func_mock_ptr->IntMethod0();
365*635a8641SAndroid Build Coastguard Worker }
366*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,BasicTest)367*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, BasicTest) {
368*635a8641SAndroid Build Coastguard Worker   Callback<int(int, int, int)> cb = Bind(&Sum, 32, 16, 8);
369*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(92, cb.Run(13, 12, 11));
370*635a8641SAndroid Build Coastguard Worker 
371*635a8641SAndroid Build Coastguard Worker   Callback<int(int, int, int, int, int, int)> c1 = Bind(&Sum);
372*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(69, c1.Run(14, 13, 12, 11, 10, 9));
373*635a8641SAndroid Build Coastguard Worker 
374*635a8641SAndroid Build Coastguard Worker   Callback<int(int, int, int)> c2 = Bind(c1, 32, 16, 8);
375*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(86, c2.Run(11, 10, 9));
376*635a8641SAndroid Build Coastguard Worker 
377*635a8641SAndroid Build Coastguard Worker   Callback<int()> c3 = Bind(c2, 4, 2, 1);
378*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(63, c3.Run());
379*635a8641SAndroid Build Coastguard Worker }
380*635a8641SAndroid Build Coastguard Worker 
381*635a8641SAndroid Build Coastguard Worker // Test that currying the rvalue result of another Bind() works correctly.
382*635a8641SAndroid Build Coastguard Worker //   - rvalue should be usable as argument to Bind().
383*635a8641SAndroid Build Coastguard Worker //   - multiple runs of resulting Callback remain valid.
TEST_F(BindTest,CurryingRvalueResultOfBind)384*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, CurryingRvalueResultOfBind) {
385*635a8641SAndroid Build Coastguard Worker   int n = 0;
386*635a8641SAndroid Build Coastguard Worker   RepeatingClosure cb = BindRepeating(&TakesACallback,
387*635a8641SAndroid Build Coastguard Worker                                       BindRepeating(&PtrArgSet, &n));
388*635a8641SAndroid Build Coastguard Worker 
389*635a8641SAndroid Build Coastguard Worker   // If we implement Bind() such that the return value has auto_ptr-like
390*635a8641SAndroid Build Coastguard Worker   // semantics, the second call here will fail because ownership of
391*635a8641SAndroid Build Coastguard Worker   // the internal BindState<> would have been transfered to a *temporary*
392*635a8641SAndroid Build Coastguard Worker   // constructon of a Callback object on the first call.
393*635a8641SAndroid Build Coastguard Worker   cb.Run();
394*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, n);
395*635a8641SAndroid Build Coastguard Worker 
396*635a8641SAndroid Build Coastguard Worker   n = 0;
397*635a8641SAndroid Build Coastguard Worker   cb.Run();
398*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, n);
399*635a8641SAndroid Build Coastguard Worker }
400*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,RepeatingCallbackBasicTest)401*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, RepeatingCallbackBasicTest) {
402*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int(int)> c0 = BindRepeating(&Sum, 1, 2, 4, 8, 16);
403*635a8641SAndroid Build Coastguard Worker 
404*635a8641SAndroid Build Coastguard Worker   // RepeatingCallback can run via a lvalue-reference.
405*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(63, c0.Run(32));
406*635a8641SAndroid Build Coastguard Worker 
407*635a8641SAndroid Build Coastguard Worker   // It is valid to call a RepeatingCallback more than once.
408*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(54, c0.Run(23));
409*635a8641SAndroid Build Coastguard Worker 
410*635a8641SAndroid Build Coastguard Worker   // BindRepeating can handle a RepeatingCallback as the target functor.
411*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> c1 = BindRepeating(c0, 11);
412*635a8641SAndroid Build Coastguard Worker 
413*635a8641SAndroid Build Coastguard Worker   // RepeatingCallback can run via a rvalue-reference.
414*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, std::move(c1).Run());
415*635a8641SAndroid Build Coastguard Worker 
416*635a8641SAndroid Build Coastguard Worker   // BindRepeating can handle a rvalue-reference of RepeatingCallback.
417*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(32, BindRepeating(std::move(c0), 1).Run());
418*635a8641SAndroid Build Coastguard Worker }
419*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,OnceCallbackBasicTest)420*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, OnceCallbackBasicTest) {
421*635a8641SAndroid Build Coastguard Worker   OnceCallback<int(int)> c0 = BindOnce(&Sum, 1, 2, 4, 8, 16);
422*635a8641SAndroid Build Coastguard Worker 
423*635a8641SAndroid Build Coastguard Worker   // OnceCallback can run via a rvalue-reference.
424*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(63, std::move(c0).Run(32));
425*635a8641SAndroid Build Coastguard Worker 
426*635a8641SAndroid Build Coastguard Worker   // After running via the rvalue-reference, the value of the OnceCallback
427*635a8641SAndroid Build Coastguard Worker   // is undefined. The implementation simply clears the instance after the
428*635a8641SAndroid Build Coastguard Worker   // invocation.
429*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.is_null());
430*635a8641SAndroid Build Coastguard Worker 
431*635a8641SAndroid Build Coastguard Worker   c0 = BindOnce(&Sum, 2, 3, 5, 7, 11);
432*635a8641SAndroid Build Coastguard Worker 
433*635a8641SAndroid Build Coastguard Worker   // BindOnce can handle a rvalue-reference of OnceCallback as the target
434*635a8641SAndroid Build Coastguard Worker   // functor.
435*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> c1 = BindOnce(std::move(c0), 13);
436*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(41, std::move(c1).Run());
437*635a8641SAndroid Build Coastguard Worker 
438*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int(int)> c2 = BindRepeating(&Sum, 2, 3, 5, 7, 11);
439*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(41, BindOnce(c2, 13).Run());
440*635a8641SAndroid Build Coastguard Worker }
441*635a8641SAndroid Build Coastguard Worker 
442*635a8641SAndroid Build Coastguard Worker // IgnoreResult adapter test.
443*635a8641SAndroid Build Coastguard Worker //   - Function with return value.
444*635a8641SAndroid Build Coastguard Worker //   - Method with return value.
445*635a8641SAndroid Build Coastguard Worker //   - Const Method with return.
446*635a8641SAndroid Build Coastguard Worker //   - Method with return value bound to WeakPtr<>.
447*635a8641SAndroid Build Coastguard Worker //   - Const Method with return bound to WeakPtr<>.
TEST_F(BindTest,IgnoreResultForRepeating)448*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, IgnoreResultForRepeating) {
449*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337));
450*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, AddRef()).Times(2);
451*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, Release()).Times(2);
452*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10));
453*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11));
454*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref_, IntMethod0()).WillOnce(Return(12));
455*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref_, IntConstMethod0()).WillOnce(Return(13));
456*635a8641SAndroid Build Coastguard Worker 
457*635a8641SAndroid Build Coastguard Worker   RepeatingClosure normal_func_cb = BindRepeating(IgnoreResult(&IntFunc0));
458*635a8641SAndroid Build Coastguard Worker   normal_func_cb.Run();
459*635a8641SAndroid Build Coastguard Worker 
460*635a8641SAndroid Build Coastguard Worker   RepeatingClosure non_void_method_cb =
461*635a8641SAndroid Build Coastguard Worker       BindRepeating(IgnoreResult(&HasRef::IntMethod0), &has_ref_);
462*635a8641SAndroid Build Coastguard Worker   non_void_method_cb.Run();
463*635a8641SAndroid Build Coastguard Worker 
464*635a8641SAndroid Build Coastguard Worker   RepeatingClosure non_void_const_method_cb =
465*635a8641SAndroid Build Coastguard Worker       BindRepeating(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_);
466*635a8641SAndroid Build Coastguard Worker   non_void_const_method_cb.Run();
467*635a8641SAndroid Build Coastguard Worker 
468*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<NoRef> weak_factory(&no_ref_);
469*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
470*635a8641SAndroid Build Coastguard Worker 
471*635a8641SAndroid Build Coastguard Worker   RepeatingClosure non_void_weak_method_cb  =
472*635a8641SAndroid Build Coastguard Worker       BindRepeating(IgnoreResult(&NoRef::IntMethod0),
473*635a8641SAndroid Build Coastguard Worker                     weak_factory.GetWeakPtr());
474*635a8641SAndroid Build Coastguard Worker   non_void_weak_method_cb.Run();
475*635a8641SAndroid Build Coastguard Worker 
476*635a8641SAndroid Build Coastguard Worker   RepeatingClosure non_void_weak_const_method_cb =
477*635a8641SAndroid Build Coastguard Worker       BindRepeating(IgnoreResult(&NoRef::IntConstMethod0),
478*635a8641SAndroid Build Coastguard Worker                     weak_factory.GetWeakPtr());
479*635a8641SAndroid Build Coastguard Worker   non_void_weak_const_method_cb.Run();
480*635a8641SAndroid Build Coastguard Worker 
481*635a8641SAndroid Build Coastguard Worker   weak_factory.InvalidateWeakPtrs();
482*635a8641SAndroid Build Coastguard Worker   non_void_weak_const_method_cb.Run();
483*635a8641SAndroid Build Coastguard Worker   non_void_weak_method_cb.Run();
484*635a8641SAndroid Build Coastguard Worker }
485*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,IgnoreResultForOnce)486*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, IgnoreResultForOnce) {
487*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337));
488*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, AddRef()).Times(2);
489*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, Release()).Times(2);
490*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10));
491*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11));
492*635a8641SAndroid Build Coastguard Worker 
493*635a8641SAndroid Build Coastguard Worker   OnceClosure normal_func_cb = BindOnce(IgnoreResult(&IntFunc0));
494*635a8641SAndroid Build Coastguard Worker   std::move(normal_func_cb).Run();
495*635a8641SAndroid Build Coastguard Worker 
496*635a8641SAndroid Build Coastguard Worker   OnceClosure non_void_method_cb =
497*635a8641SAndroid Build Coastguard Worker       BindOnce(IgnoreResult(&HasRef::IntMethod0), &has_ref_);
498*635a8641SAndroid Build Coastguard Worker   std::move(non_void_method_cb).Run();
499*635a8641SAndroid Build Coastguard Worker 
500*635a8641SAndroid Build Coastguard Worker   OnceClosure non_void_const_method_cb =
501*635a8641SAndroid Build Coastguard Worker       BindOnce(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_);
502*635a8641SAndroid Build Coastguard Worker   std::move(non_void_const_method_cb).Run();
503*635a8641SAndroid Build Coastguard Worker 
504*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<NoRef> weak_factory(&no_ref_);
505*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
506*635a8641SAndroid Build Coastguard Worker 
507*635a8641SAndroid Build Coastguard Worker   OnceClosure non_void_weak_method_cb  =
508*635a8641SAndroid Build Coastguard Worker       BindOnce(IgnoreResult(&NoRef::IntMethod0),
509*635a8641SAndroid Build Coastguard Worker                   weak_factory.GetWeakPtr());
510*635a8641SAndroid Build Coastguard Worker   OnceClosure non_void_weak_const_method_cb =
511*635a8641SAndroid Build Coastguard Worker       BindOnce(IgnoreResult(&NoRef::IntConstMethod0),
512*635a8641SAndroid Build Coastguard Worker                   weak_factory.GetWeakPtr());
513*635a8641SAndroid Build Coastguard Worker 
514*635a8641SAndroid Build Coastguard Worker   weak_factory.InvalidateWeakPtrs();
515*635a8641SAndroid Build Coastguard Worker   std::move(non_void_weak_const_method_cb).Run();
516*635a8641SAndroid Build Coastguard Worker   std::move(non_void_weak_method_cb).Run();
517*635a8641SAndroid Build Coastguard Worker }
518*635a8641SAndroid Build Coastguard Worker 
519*635a8641SAndroid Build Coastguard Worker // Functions that take reference parameters.
520*635a8641SAndroid Build Coastguard Worker //  - Forced reference parameter type still stores a copy.
521*635a8641SAndroid Build Coastguard Worker //  - Forced const reference parameter type still stores a copy.
TEST_F(BindTest,ReferenceArgumentBindingForRepeating)522*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ReferenceArgumentBindingForRepeating) {
523*635a8641SAndroid Build Coastguard Worker   int n = 1;
524*635a8641SAndroid Build Coastguard Worker   int& ref_n = n;
525*635a8641SAndroid Build Coastguard Worker   const int& const_ref_n = n;
526*635a8641SAndroid Build Coastguard Worker 
527*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> ref_copies_cb = BindRepeating(&Identity, ref_n);
528*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, ref_copies_cb.Run());
529*635a8641SAndroid Build Coastguard Worker   n++;
530*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n - 1, ref_copies_cb.Run());
531*635a8641SAndroid Build Coastguard Worker 
532*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> const_ref_copies_cb =
533*635a8641SAndroid Build Coastguard Worker       BindRepeating(&Identity, const_ref_n);
534*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, const_ref_copies_cb.Run());
535*635a8641SAndroid Build Coastguard Worker   n++;
536*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n - 1, const_ref_copies_cb.Run());
537*635a8641SAndroid Build Coastguard Worker }
538*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,ReferenceArgumentBindingForOnce)539*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ReferenceArgumentBindingForOnce) {
540*635a8641SAndroid Build Coastguard Worker   int n = 1;
541*635a8641SAndroid Build Coastguard Worker   int& ref_n = n;
542*635a8641SAndroid Build Coastguard Worker   const int& const_ref_n = n;
543*635a8641SAndroid Build Coastguard Worker 
544*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> ref_copies_cb = BindOnce(&Identity, ref_n);
545*635a8641SAndroid Build Coastguard Worker   n++;
546*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n - 1, std::move(ref_copies_cb).Run());
547*635a8641SAndroid Build Coastguard Worker 
548*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> const_ref_copies_cb =
549*635a8641SAndroid Build Coastguard Worker       BindOnce(&Identity, const_ref_n);
550*635a8641SAndroid Build Coastguard Worker   n++;
551*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n - 1, std::move(const_ref_copies_cb).Run());
552*635a8641SAndroid Build Coastguard Worker }
553*635a8641SAndroid Build Coastguard Worker 
554*635a8641SAndroid Build Coastguard Worker // Check that we can pass in arrays and have them be stored as a pointer.
555*635a8641SAndroid Build Coastguard Worker //  - Array of values stores a pointer.
556*635a8641SAndroid Build Coastguard Worker //  - Array of const values stores a pointer.
TEST_F(BindTest,ArrayArgumentBindingForRepeating)557*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ArrayArgumentBindingForRepeating) {
558*635a8641SAndroid Build Coastguard Worker   int array[4] = {1, 1, 1, 1};
559*635a8641SAndroid Build Coastguard Worker   const int (*const_array_ptr)[4] = &array;
560*635a8641SAndroid Build Coastguard Worker 
561*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> array_cb = BindRepeating(&ArrayGet, array, 1);
562*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, array_cb.Run());
563*635a8641SAndroid Build Coastguard Worker 
564*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> const_array_cb =
565*635a8641SAndroid Build Coastguard Worker       BindRepeating(&ArrayGet, *const_array_ptr, 1);
566*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, const_array_cb.Run());
567*635a8641SAndroid Build Coastguard Worker 
568*635a8641SAndroid Build Coastguard Worker   array[1] = 3;
569*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, array_cb.Run());
570*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, const_array_cb.Run());
571*635a8641SAndroid Build Coastguard Worker }
572*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,ArrayArgumentBindingForOnce)573*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ArrayArgumentBindingForOnce) {
574*635a8641SAndroid Build Coastguard Worker   int array[4] = {1, 1, 1, 1};
575*635a8641SAndroid Build Coastguard Worker   const int (*const_array_ptr)[4] = &array;
576*635a8641SAndroid Build Coastguard Worker 
577*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> array_cb = BindOnce(&ArrayGet, array, 1);
578*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> const_array_cb =
579*635a8641SAndroid Build Coastguard Worker       BindOnce(&ArrayGet, *const_array_ptr, 1);
580*635a8641SAndroid Build Coastguard Worker 
581*635a8641SAndroid Build Coastguard Worker   array[1] = 3;
582*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, std::move(array_cb).Run());
583*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, std::move(const_array_cb).Run());
584*635a8641SAndroid Build Coastguard Worker }
585*635a8641SAndroid Build Coastguard Worker 
586*635a8641SAndroid Build Coastguard Worker // WeakPtr() support.
587*635a8641SAndroid Build Coastguard Worker //   - Method bound to WeakPtr<> to non-const object.
588*635a8641SAndroid Build Coastguard Worker //   - Const method bound to WeakPtr<> to non-const object.
589*635a8641SAndroid Build Coastguard Worker //   - Const method bound to WeakPtr<> to const object.
590*635a8641SAndroid Build Coastguard Worker //   - Normal Function with WeakPtr<> as P1 can have return type and is
591*635a8641SAndroid Build Coastguard Worker //     not canceled.
TEST_F(BindTest,WeakPtrForRepeating)592*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, WeakPtrForRepeating) {
593*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref_, VoidMethod0());
594*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref_, VoidConstMethod0()).Times(2);
595*635a8641SAndroid Build Coastguard Worker 
596*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<NoRef> weak_factory(&no_ref_);
597*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
598*635a8641SAndroid Build Coastguard Worker 
599*635a8641SAndroid Build Coastguard Worker   RepeatingClosure method_cb =
600*635a8641SAndroid Build Coastguard Worker       BindRepeating(&NoRef::VoidMethod0, weak_factory.GetWeakPtr());
601*635a8641SAndroid Build Coastguard Worker   method_cb.Run();
602*635a8641SAndroid Build Coastguard Worker 
603*635a8641SAndroid Build Coastguard Worker   RepeatingClosure const_method_cb =
604*635a8641SAndroid Build Coastguard Worker       BindRepeating(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
605*635a8641SAndroid Build Coastguard Worker   const_method_cb.Run();
606*635a8641SAndroid Build Coastguard Worker 
607*635a8641SAndroid Build Coastguard Worker   RepeatingClosure const_method_const_ptr_cb =
608*635a8641SAndroid Build Coastguard Worker       BindRepeating(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
609*635a8641SAndroid Build Coastguard Worker   const_method_const_ptr_cb.Run();
610*635a8641SAndroid Build Coastguard Worker 
611*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int(int)> normal_func_cb =
612*635a8641SAndroid Build Coastguard Worker       BindRepeating(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr());
613*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, normal_func_cb.Run(1));
614*635a8641SAndroid Build Coastguard Worker 
615*635a8641SAndroid Build Coastguard Worker   weak_factory.InvalidateWeakPtrs();
616*635a8641SAndroid Build Coastguard Worker   const_weak_factory.InvalidateWeakPtrs();
617*635a8641SAndroid Build Coastguard Worker 
618*635a8641SAndroid Build Coastguard Worker   method_cb.Run();
619*635a8641SAndroid Build Coastguard Worker   const_method_cb.Run();
620*635a8641SAndroid Build Coastguard Worker   const_method_const_ptr_cb.Run();
621*635a8641SAndroid Build Coastguard Worker 
622*635a8641SAndroid Build Coastguard Worker   // Still runs even after the pointers are invalidated.
623*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, normal_func_cb.Run(2));
624*635a8641SAndroid Build Coastguard Worker }
625*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,WeakPtrForOnce)626*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, WeakPtrForOnce) {
627*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<NoRef> weak_factory(&no_ref_);
628*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
629*635a8641SAndroid Build Coastguard Worker 
630*635a8641SAndroid Build Coastguard Worker   OnceClosure method_cb =
631*635a8641SAndroid Build Coastguard Worker       BindOnce(&NoRef::VoidMethod0, weak_factory.GetWeakPtr());
632*635a8641SAndroid Build Coastguard Worker   OnceClosure const_method_cb =
633*635a8641SAndroid Build Coastguard Worker       BindOnce(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
634*635a8641SAndroid Build Coastguard Worker   OnceClosure const_method_const_ptr_cb =
635*635a8641SAndroid Build Coastguard Worker       BindOnce(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
636*635a8641SAndroid Build Coastguard Worker   Callback<int(int)> normal_func_cb =
637*635a8641SAndroid Build Coastguard Worker       Bind(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr());
638*635a8641SAndroid Build Coastguard Worker 
639*635a8641SAndroid Build Coastguard Worker   weak_factory.InvalidateWeakPtrs();
640*635a8641SAndroid Build Coastguard Worker   const_weak_factory.InvalidateWeakPtrs();
641*635a8641SAndroid Build Coastguard Worker 
642*635a8641SAndroid Build Coastguard Worker   std::move(method_cb).Run();
643*635a8641SAndroid Build Coastguard Worker   std::move(const_method_cb).Run();
644*635a8641SAndroid Build Coastguard Worker   std::move(const_method_const_ptr_cb).Run();
645*635a8641SAndroid Build Coastguard Worker 
646*635a8641SAndroid Build Coastguard Worker   // Still runs even after the pointers are invalidated.
647*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, std::move(normal_func_cb).Run(2));
648*635a8641SAndroid Build Coastguard Worker }
649*635a8641SAndroid Build Coastguard Worker 
650*635a8641SAndroid Build Coastguard Worker // ConstRef() wrapper support.
651*635a8641SAndroid Build Coastguard Worker //   - Binding w/o ConstRef takes a copy.
652*635a8641SAndroid Build Coastguard Worker //   - Binding a ConstRef takes a reference.
653*635a8641SAndroid Build Coastguard Worker //   - Binding ConstRef to a function ConstRef does not copy on invoke.
TEST_F(BindTest,ConstRefForRepeating)654*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ConstRefForRepeating) {
655*635a8641SAndroid Build Coastguard Worker   int n = 1;
656*635a8641SAndroid Build Coastguard Worker 
657*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> copy_cb = BindRepeating(&Identity, n);
658*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> const_ref_cb = BindRepeating(&Identity, ConstRef(n));
659*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, copy_cb.Run());
660*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, const_ref_cb.Run());
661*635a8641SAndroid Build Coastguard Worker   n++;
662*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n - 1, copy_cb.Run());
663*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, const_ref_cb.Run());
664*635a8641SAndroid Build Coastguard Worker 
665*635a8641SAndroid Build Coastguard Worker   int copies = 0;
666*635a8641SAndroid Build Coastguard Worker   int assigns = 0;
667*635a8641SAndroid Build Coastguard Worker   int move_constructs = 0;
668*635a8641SAndroid Build Coastguard Worker   int move_assigns = 0;
669*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns);
670*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<int()> all_const_ref_cb =
671*635a8641SAndroid Build Coastguard Worker       BindRepeating(&GetCopies, ConstRef(counter));
672*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, all_const_ref_cb.Run());
673*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, copies);
674*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
675*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_constructs);
676*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
677*635a8641SAndroid Build Coastguard Worker }
678*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,ConstRefForOnce)679*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ConstRefForOnce) {
680*635a8641SAndroid Build Coastguard Worker   int n = 1;
681*635a8641SAndroid Build Coastguard Worker 
682*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> copy_cb = BindOnce(&Identity, n);
683*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> const_ref_cb = BindOnce(&Identity, ConstRef(n));
684*635a8641SAndroid Build Coastguard Worker   n++;
685*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n - 1, std::move(copy_cb).Run());
686*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, std::move(const_ref_cb).Run());
687*635a8641SAndroid Build Coastguard Worker 
688*635a8641SAndroid Build Coastguard Worker   int copies = 0;
689*635a8641SAndroid Build Coastguard Worker   int assigns = 0;
690*635a8641SAndroid Build Coastguard Worker   int move_constructs = 0;
691*635a8641SAndroid Build Coastguard Worker   int move_assigns = 0;
692*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns);
693*635a8641SAndroid Build Coastguard Worker   OnceCallback<int()> all_const_ref_cb =
694*635a8641SAndroid Build Coastguard Worker       BindOnce(&GetCopies, ConstRef(counter));
695*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, std::move(all_const_ref_cb).Run());
696*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, copies);
697*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
698*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_constructs);
699*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
700*635a8641SAndroid Build Coastguard Worker }
701*635a8641SAndroid Build Coastguard Worker 
702*635a8641SAndroid Build Coastguard Worker // Test Owned() support.
TEST_F(BindTest,OwnedForRepeating)703*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, OwnedForRepeating) {
704*635a8641SAndroid Build Coastguard Worker   int deletes = 0;
705*635a8641SAndroid Build Coastguard Worker   DeleteCounter* counter = new DeleteCounter(&deletes);
706*635a8641SAndroid Build Coastguard Worker 
707*635a8641SAndroid Build Coastguard Worker   // If we don't capture, delete happens on Callback destruction/reset.
708*635a8641SAndroid Build Coastguard Worker   // return the same value.
709*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<DeleteCounter*()> no_capture_cb =
710*635a8641SAndroid Build Coastguard Worker       BindRepeating(&PolymorphicIdentity<DeleteCounter*>, Owned(counter));
711*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(counter, no_capture_cb.Run());
712*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(counter, no_capture_cb.Run());
713*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
714*635a8641SAndroid Build Coastguard Worker   no_capture_cb.Reset();  // This should trigger a delete.
715*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
716*635a8641SAndroid Build Coastguard Worker 
717*635a8641SAndroid Build Coastguard Worker   deletes = 0;
718*635a8641SAndroid Build Coastguard Worker   counter = new DeleteCounter(&deletes);
719*635a8641SAndroid Build Coastguard Worker   RepeatingClosure own_object_cb =
720*635a8641SAndroid Build Coastguard Worker       BindRepeating(&DeleteCounter::VoidMethod0, Owned(counter));
721*635a8641SAndroid Build Coastguard Worker   own_object_cb.Run();
722*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
723*635a8641SAndroid Build Coastguard Worker   own_object_cb.Reset();
724*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
725*635a8641SAndroid Build Coastguard Worker }
726*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,OwnedForOnce)727*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, OwnedForOnce) {
728*635a8641SAndroid Build Coastguard Worker   int deletes = 0;
729*635a8641SAndroid Build Coastguard Worker   DeleteCounter* counter = new DeleteCounter(&deletes);
730*635a8641SAndroid Build Coastguard Worker 
731*635a8641SAndroid Build Coastguard Worker   // If we don't capture, delete happens on Callback destruction/reset.
732*635a8641SAndroid Build Coastguard Worker   // return the same value.
733*635a8641SAndroid Build Coastguard Worker   OnceCallback<DeleteCounter*()> no_capture_cb =
734*635a8641SAndroid Build Coastguard Worker       BindOnce(&PolymorphicIdentity<DeleteCounter*>, Owned(counter));
735*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
736*635a8641SAndroid Build Coastguard Worker   no_capture_cb.Reset();  // This should trigger a delete.
737*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
738*635a8641SAndroid Build Coastguard Worker 
739*635a8641SAndroid Build Coastguard Worker   deletes = 0;
740*635a8641SAndroid Build Coastguard Worker   counter = new DeleteCounter(&deletes);
741*635a8641SAndroid Build Coastguard Worker   OnceClosure own_object_cb =
742*635a8641SAndroid Build Coastguard Worker       BindOnce(&DeleteCounter::VoidMethod0, Owned(counter));
743*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
744*635a8641SAndroid Build Coastguard Worker   own_object_cb.Reset();
745*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
746*635a8641SAndroid Build Coastguard Worker }
747*635a8641SAndroid Build Coastguard Worker 
748*635a8641SAndroid Build Coastguard Worker template <typename T>
749*635a8641SAndroid Build Coastguard Worker class BindVariantsTest : public ::testing::Test {
750*635a8641SAndroid Build Coastguard Worker };
751*635a8641SAndroid Build Coastguard Worker 
752*635a8641SAndroid Build Coastguard Worker struct RepeatingTestConfig {
753*635a8641SAndroid Build Coastguard Worker   template <typename Signature>
754*635a8641SAndroid Build Coastguard Worker   using CallbackType = RepeatingCallback<Signature>;
755*635a8641SAndroid Build Coastguard Worker   using ClosureType = RepeatingClosure;
756*635a8641SAndroid Build Coastguard Worker 
757*635a8641SAndroid Build Coastguard Worker   template <typename F, typename... Args>
758*635a8641SAndroid Build Coastguard Worker   static CallbackType<MakeUnboundRunType<F, Args...>>
Bindbase::__anonab4e4da50111::RepeatingTestConfig759*635a8641SAndroid Build Coastguard Worker   Bind(F&& f, Args&&... args) {
760*635a8641SAndroid Build Coastguard Worker     return BindRepeating(std::forward<F>(f), std::forward<Args>(args)...);
761*635a8641SAndroid Build Coastguard Worker   }
762*635a8641SAndroid Build Coastguard Worker };
763*635a8641SAndroid Build Coastguard Worker 
764*635a8641SAndroid Build Coastguard Worker struct OnceTestConfig {
765*635a8641SAndroid Build Coastguard Worker   template <typename Signature>
766*635a8641SAndroid Build Coastguard Worker   using CallbackType = OnceCallback<Signature>;
767*635a8641SAndroid Build Coastguard Worker   using ClosureType = OnceClosure;
768*635a8641SAndroid Build Coastguard Worker 
769*635a8641SAndroid Build Coastguard Worker   template <typename F, typename... Args>
770*635a8641SAndroid Build Coastguard Worker   static CallbackType<MakeUnboundRunType<F, Args...>>
Bindbase::__anonab4e4da50111::OnceTestConfig771*635a8641SAndroid Build Coastguard Worker   Bind(F&& f, Args&&... args) {
772*635a8641SAndroid Build Coastguard Worker     return BindOnce(std::forward<F>(f), std::forward<Args>(args)...);
773*635a8641SAndroid Build Coastguard Worker   }
774*635a8641SAndroid Build Coastguard Worker };
775*635a8641SAndroid Build Coastguard Worker 
776*635a8641SAndroid Build Coastguard Worker using BindVariantsTestConfig = ::testing::Types<
777*635a8641SAndroid Build Coastguard Worker   RepeatingTestConfig, OnceTestConfig>;
778*635a8641SAndroid Build Coastguard Worker TYPED_TEST_CASE(BindVariantsTest, BindVariantsTestConfig);
779*635a8641SAndroid Build Coastguard Worker 
780*635a8641SAndroid Build Coastguard Worker template <typename TypeParam, typename Signature>
781*635a8641SAndroid Build Coastguard Worker using CallbackType = typename TypeParam::template CallbackType<Signature>;
782*635a8641SAndroid Build Coastguard Worker 
783*635a8641SAndroid Build Coastguard Worker // Function type support.
784*635a8641SAndroid Build Coastguard Worker //   - Normal function.
785*635a8641SAndroid Build Coastguard Worker //   - Normal function bound with non-refcounted first argument.
786*635a8641SAndroid Build Coastguard Worker //   - Method bound to non-const object.
787*635a8641SAndroid Build Coastguard Worker //   - Method bound to scoped_refptr.
788*635a8641SAndroid Build Coastguard Worker //   - Const method bound to non-const object.
789*635a8641SAndroid Build Coastguard Worker //   - Const method bound to const object.
790*635a8641SAndroid Build Coastguard Worker //   - Derived classes can be used with pointers to non-virtual base functions.
791*635a8641SAndroid Build Coastguard Worker //   - Derived classes can be used with pointers to virtual base functions (and
792*635a8641SAndroid Build Coastguard Worker //     preserve virtual dispatch).
TYPED_TEST(BindVariantsTest,FunctionTypeSupport)793*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, FunctionTypeSupport) {
794*635a8641SAndroid Build Coastguard Worker   using ClosureType = typename TypeParam::ClosureType;
795*635a8641SAndroid Build Coastguard Worker 
796*635a8641SAndroid Build Coastguard Worker   StrictMock<HasRef> has_ref;
797*635a8641SAndroid Build Coastguard Worker   StrictMock<NoRef> no_ref;
798*635a8641SAndroid Build Coastguard Worker   StrictMock<NoRef> static_func_mock;
799*635a8641SAndroid Build Coastguard Worker   const HasRef* const_has_ref_ptr = &has_ref;
800*635a8641SAndroid Build Coastguard Worker   g_func_mock_ptr = &static_func_mock;
801*635a8641SAndroid Build Coastguard Worker 
802*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(static_func_mock, VoidMethod0());
803*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, AddRef()).Times(4);
804*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, Release()).Times(4);
805*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, VoidMethod0()).Times(2);
806*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, VoidConstMethod0()).Times(2);
807*635a8641SAndroid Build Coastguard Worker 
808*635a8641SAndroid Build Coastguard Worker   ClosureType normal_cb = TypeParam::Bind(&VoidFunc0);
809*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, NoRef*()> normal_non_refcounted_cb =
810*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&PolymorphicIdentity<NoRef*>, &no_ref);
811*635a8641SAndroid Build Coastguard Worker   std::move(normal_cb).Run();
812*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&no_ref, std::move(normal_non_refcounted_cb).Run());
813*635a8641SAndroid Build Coastguard Worker 
814*635a8641SAndroid Build Coastguard Worker   ClosureType method_cb = TypeParam::Bind(&HasRef::VoidMethod0, &has_ref);
815*635a8641SAndroid Build Coastguard Worker   ClosureType method_refptr_cb =
816*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::VoidMethod0, WrapRefCounted(&has_ref));
817*635a8641SAndroid Build Coastguard Worker   ClosureType const_method_nonconst_obj_cb =
818*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::VoidConstMethod0, &has_ref);
819*635a8641SAndroid Build Coastguard Worker   ClosureType const_method_const_obj_cb =
820*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::VoidConstMethod0, const_has_ref_ptr);
821*635a8641SAndroid Build Coastguard Worker   std::move(method_cb).Run();
822*635a8641SAndroid Build Coastguard Worker   std::move(method_refptr_cb).Run();
823*635a8641SAndroid Build Coastguard Worker   std::move(const_method_nonconst_obj_cb).Run();
824*635a8641SAndroid Build Coastguard Worker   std::move(const_method_const_obj_cb).Run();
825*635a8641SAndroid Build Coastguard Worker 
826*635a8641SAndroid Build Coastguard Worker   Child child;
827*635a8641SAndroid Build Coastguard Worker   child.value = 0;
828*635a8641SAndroid Build Coastguard Worker   ClosureType virtual_set_cb = TypeParam::Bind(&Parent::VirtualSet, &child);
829*635a8641SAndroid Build Coastguard Worker   std::move(virtual_set_cb).Run();
830*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kChildValue, child.value);
831*635a8641SAndroid Build Coastguard Worker 
832*635a8641SAndroid Build Coastguard Worker   child.value = 0;
833*635a8641SAndroid Build Coastguard Worker   ClosureType non_virtual_set_cb =
834*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&Parent::NonVirtualSet, &child);
835*635a8641SAndroid Build Coastguard Worker   std::move(non_virtual_set_cb).Run();
836*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kParentValue, child.value);
837*635a8641SAndroid Build Coastguard Worker }
838*635a8641SAndroid Build Coastguard Worker 
839*635a8641SAndroid Build Coastguard Worker // Return value support.
840*635a8641SAndroid Build Coastguard Worker //   - Function with return value.
841*635a8641SAndroid Build Coastguard Worker //   - Method with return value.
842*635a8641SAndroid Build Coastguard Worker //   - Const method with return value.
843*635a8641SAndroid Build Coastguard Worker //   - Move-only return value.
TYPED_TEST(BindVariantsTest,ReturnValues)844*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, ReturnValues) {
845*635a8641SAndroid Build Coastguard Worker   StrictMock<NoRef> static_func_mock;
846*635a8641SAndroid Build Coastguard Worker   StrictMock<HasRef> has_ref;
847*635a8641SAndroid Build Coastguard Worker   g_func_mock_ptr = &static_func_mock;
848*635a8641SAndroid Build Coastguard Worker   const HasRef* const_has_ref_ptr = &has_ref;
849*635a8641SAndroid Build Coastguard Worker 
850*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(static_func_mock, IntMethod0()).WillOnce(Return(1337));
851*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, AddRef()).Times(4);
852*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, Release()).Times(4);
853*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, IntMethod0()).WillOnce(Return(31337));
854*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, IntConstMethod0())
855*635a8641SAndroid Build Coastguard Worker       .WillOnce(Return(41337))
856*635a8641SAndroid Build Coastguard Worker       .WillOnce(Return(51337));
857*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, UniquePtrMethod0())
858*635a8641SAndroid Build Coastguard Worker       .WillOnce(Return(ByMove(std::make_unique<int>(42))));
859*635a8641SAndroid Build Coastguard Worker 
860*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, int()> normal_cb = TypeParam::Bind(&IntFunc0);
861*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, int()> method_cb =
862*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::IntMethod0, &has_ref);
863*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, int()> const_method_nonconst_obj_cb =
864*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::IntConstMethod0, &has_ref);
865*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, int()> const_method_const_obj_cb =
866*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::IntConstMethod0, const_has_ref_ptr);
867*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, std::unique_ptr<int>()> move_only_rv_cb =
868*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&HasRef::UniquePtrMethod0, &has_ref);
869*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1337, std::move(normal_cb).Run());
870*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(31337, std::move(method_cb).Run());
871*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(41337, std::move(const_method_nonconst_obj_cb).Run());
872*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(51337, std::move(const_method_const_obj_cb).Run());
873*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, *std::move(move_only_rv_cb).Run());
874*635a8641SAndroid Build Coastguard Worker }
875*635a8641SAndroid Build Coastguard Worker 
876*635a8641SAndroid Build Coastguard Worker // Argument binding tests.
877*635a8641SAndroid Build Coastguard Worker //   - Argument binding to primitive.
878*635a8641SAndroid Build Coastguard Worker //   - Argument binding to primitive pointer.
879*635a8641SAndroid Build Coastguard Worker //   - Argument binding to a literal integer.
880*635a8641SAndroid Build Coastguard Worker //   - Argument binding to a literal string.
881*635a8641SAndroid Build Coastguard Worker //   - Argument binding with template function.
882*635a8641SAndroid Build Coastguard Worker //   - Argument binding to an object.
883*635a8641SAndroid Build Coastguard Worker //   - Argument binding to pointer to incomplete type.
884*635a8641SAndroid Build Coastguard Worker //   - Argument gets type converted.
885*635a8641SAndroid Build Coastguard Worker //   - Pointer argument gets converted.
886*635a8641SAndroid Build Coastguard Worker //   - Const Reference forces conversion.
TYPED_TEST(BindVariantsTest,ArgumentBinding)887*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, ArgumentBinding) {
888*635a8641SAndroid Build Coastguard Worker   int n = 2;
889*635a8641SAndroid Build Coastguard Worker 
890*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(n, TypeParam::Bind(&Identity, n).Run());
891*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&n, TypeParam::Bind(&PolymorphicIdentity<int*>, &n).Run());
892*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, TypeParam::Bind(&Identity, 3).Run());
893*635a8641SAndroid Build Coastguard Worker   EXPECT_STREQ("hi", TypeParam::Bind(&CStringIdentity, "hi").Run());
894*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4, TypeParam::Bind(&PolymorphicIdentity<int>, 4).Run());
895*635a8641SAndroid Build Coastguard Worker 
896*635a8641SAndroid Build Coastguard Worker   NoRefParent p;
897*635a8641SAndroid Build Coastguard Worker   p.value = 5;
898*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(5, TypeParam::Bind(&UnwrapNoRefParent, p).Run());
899*635a8641SAndroid Build Coastguard Worker 
900*635a8641SAndroid Build Coastguard Worker   IncompleteType* incomplete_ptr = reinterpret_cast<IncompleteType*>(123);
901*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(incomplete_ptr,
902*635a8641SAndroid Build Coastguard Worker             TypeParam::Bind(&PolymorphicIdentity<IncompleteType*>,
903*635a8641SAndroid Build Coastguard Worker                             incomplete_ptr).Run());
904*635a8641SAndroid Build Coastguard Worker 
905*635a8641SAndroid Build Coastguard Worker   NoRefChild c;
906*635a8641SAndroid Build Coastguard Worker   c.value = 6;
907*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(6, TypeParam::Bind(&UnwrapNoRefParent, c).Run());
908*635a8641SAndroid Build Coastguard Worker 
909*635a8641SAndroid Build Coastguard Worker   c.value = 7;
910*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(7, TypeParam::Bind(&UnwrapNoRefParentPtr, &c).Run());
911*635a8641SAndroid Build Coastguard Worker 
912*635a8641SAndroid Build Coastguard Worker   c.value = 8;
913*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(8, TypeParam::Bind(&UnwrapNoRefParentConstRef, c).Run());
914*635a8641SAndroid Build Coastguard Worker }
915*635a8641SAndroid Build Coastguard Worker 
916*635a8641SAndroid Build Coastguard Worker // Unbound argument type support tests.
917*635a8641SAndroid Build Coastguard Worker //   - Unbound value.
918*635a8641SAndroid Build Coastguard Worker //   - Unbound pointer.
919*635a8641SAndroid Build Coastguard Worker //   - Unbound reference.
920*635a8641SAndroid Build Coastguard Worker //   - Unbound const reference.
921*635a8641SAndroid Build Coastguard Worker //   - Unbound unsized array.
922*635a8641SAndroid Build Coastguard Worker //   - Unbound sized array.
923*635a8641SAndroid Build Coastguard Worker //   - Unbound array-of-arrays.
TYPED_TEST(BindVariantsTest,UnboundArgumentTypeSupport)924*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, UnboundArgumentTypeSupport) {
925*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int)> unbound_value_cb =
926*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int>::Run);
927*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int*)> unbound_pointer_cb =
928*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int*>::Run);
929*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int&)> unbound_ref_cb =
930*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int&>::Run);
931*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(const int&)> unbound_const_ref_cb =
932*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<const int&>::Run);
933*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int[])> unbound_unsized_array_cb =
934*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int[]>::Run);
935*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int[2])> unbound_sized_array_cb =
936*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int[2]>::Run);
937*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int[][2])> unbound_array_of_arrays_cb =
938*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int[][2]>::Run);
939*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int&)> unbound_ref_with_bound_arg =
940*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&VoidPolymorphic<int, int&>::Run, 1);
941*635a8641SAndroid Build Coastguard Worker }
942*635a8641SAndroid Build Coastguard Worker 
943*635a8641SAndroid Build Coastguard Worker // Function with unbound reference parameter.
944*635a8641SAndroid Build Coastguard Worker //   - Original parameter is modified by callback.
TYPED_TEST(BindVariantsTest,UnboundReferenceSupport)945*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, UnboundReferenceSupport) {
946*635a8641SAndroid Build Coastguard Worker   int n = 0;
947*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, void(int&)> unbound_ref_cb =
948*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&RefArgSet);
949*635a8641SAndroid Build Coastguard Worker   std::move(unbound_ref_cb).Run(n);
950*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, n);
951*635a8641SAndroid Build Coastguard Worker }
952*635a8641SAndroid Build Coastguard Worker 
953*635a8641SAndroid Build Coastguard Worker // Unretained() wrapper support.
954*635a8641SAndroid Build Coastguard Worker //   - Method bound to Unretained() non-const object.
955*635a8641SAndroid Build Coastguard Worker //   - Const method bound to Unretained() non-const object.
956*635a8641SAndroid Build Coastguard Worker //   - Const method bound to Unretained() const object.
TYPED_TEST(BindVariantsTest,Unretained)957*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, Unretained) {
958*635a8641SAndroid Build Coastguard Worker   StrictMock<NoRef> no_ref;
959*635a8641SAndroid Build Coastguard Worker   const NoRef* const_no_ref_ptr = &no_ref;
960*635a8641SAndroid Build Coastguard Worker 
961*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref, VoidMethod0());
962*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref, VoidConstMethod0()).Times(2);
963*635a8641SAndroid Build Coastguard Worker 
964*635a8641SAndroid Build Coastguard Worker   TypeParam::Bind(&NoRef::VoidMethod0, Unretained(&no_ref)).Run();
965*635a8641SAndroid Build Coastguard Worker   TypeParam::Bind(&NoRef::VoidConstMethod0, Unretained(&no_ref)).Run();
966*635a8641SAndroid Build Coastguard Worker   TypeParam::Bind(&NoRef::VoidConstMethod0, Unretained(const_no_ref_ptr)).Run();
967*635a8641SAndroid Build Coastguard Worker }
968*635a8641SAndroid Build Coastguard Worker 
TYPED_TEST(BindVariantsTest,ScopedRefptr)969*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, ScopedRefptr) {
970*635a8641SAndroid Build Coastguard Worker   StrictMock<HasRef> has_ref;
971*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, AddRef()).Times(1);
972*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(has_ref, Release()).Times(1);
973*635a8641SAndroid Build Coastguard Worker 
974*635a8641SAndroid Build Coastguard Worker   const scoped_refptr<HasRef> refptr(&has_ref);
975*635a8641SAndroid Build Coastguard Worker   CallbackType<TypeParam, int()> scoped_refptr_const_ref_cb =
976*635a8641SAndroid Build Coastguard Worker       TypeParam::Bind(&FunctionWithScopedRefptrFirstParam,
977*635a8641SAndroid Build Coastguard Worker                       base::ConstRef(refptr), 1);
978*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, std::move(scoped_refptr_const_ref_cb).Run());
979*635a8641SAndroid Build Coastguard Worker }
980*635a8641SAndroid Build Coastguard Worker 
TYPED_TEST(BindVariantsTest,UniquePtrReceiver)981*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindVariantsTest, UniquePtrReceiver) {
982*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<StrictMock<NoRef>> no_ref(new StrictMock<NoRef>);
983*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(*no_ref, VoidMethod0()).Times(1);
984*635a8641SAndroid Build Coastguard Worker   TypeParam::Bind(&NoRef::VoidMethod0, std::move(no_ref)).Run();
985*635a8641SAndroid Build Coastguard Worker }
986*635a8641SAndroid Build Coastguard Worker 
987*635a8641SAndroid Build Coastguard Worker // Tests for Passed() wrapper support:
988*635a8641SAndroid Build Coastguard Worker //   - Passed() can be constructed from a pointer to scoper.
989*635a8641SAndroid Build Coastguard Worker //   - Passed() can be constructed from a scoper rvalue.
990*635a8641SAndroid Build Coastguard Worker //   - Using Passed() gives Callback Ownership.
991*635a8641SAndroid Build Coastguard Worker //   - Ownership is transferred from Callback to callee on the first Run().
992*635a8641SAndroid Build Coastguard Worker //   - Callback supports unbound arguments.
993*635a8641SAndroid Build Coastguard Worker template <typename T>
994*635a8641SAndroid Build Coastguard Worker class BindMoveOnlyTypeTest : public ::testing::Test {
995*635a8641SAndroid Build Coastguard Worker };
996*635a8641SAndroid Build Coastguard Worker 
997*635a8641SAndroid Build Coastguard Worker struct CustomDeleter {
operator ()base::__anonab4e4da50111::CustomDeleter998*635a8641SAndroid Build Coastguard Worker   void operator()(DeleteCounter* c) { delete c; }
999*635a8641SAndroid Build Coastguard Worker };
1000*635a8641SAndroid Build Coastguard Worker 
1001*635a8641SAndroid Build Coastguard Worker using MoveOnlyTypesToTest =
1002*635a8641SAndroid Build Coastguard Worker     ::testing::Types<std::unique_ptr<DeleteCounter>,
1003*635a8641SAndroid Build Coastguard Worker                      std::unique_ptr<DeleteCounter, CustomDeleter>>;
1004*635a8641SAndroid Build Coastguard Worker TYPED_TEST_CASE(BindMoveOnlyTypeTest, MoveOnlyTypesToTest);
1005*635a8641SAndroid Build Coastguard Worker 
TYPED_TEST(BindMoveOnlyTypeTest,PassedToBoundCallback)1006*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindMoveOnlyTypeTest, PassedToBoundCallback) {
1007*635a8641SAndroid Build Coastguard Worker   int deletes = 0;
1008*635a8641SAndroid Build Coastguard Worker 
1009*635a8641SAndroid Build Coastguard Worker   TypeParam ptr(new DeleteCounter(&deletes));
1010*635a8641SAndroid Build Coastguard Worker   Callback<TypeParam()> callback = Bind(&PassThru<TypeParam>, Passed(&ptr));
1011*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ptr.get());
1012*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
1013*635a8641SAndroid Build Coastguard Worker 
1014*635a8641SAndroid Build Coastguard Worker   // If we never invoke the Callback, it retains ownership and deletes.
1015*635a8641SAndroid Build Coastguard Worker   callback.Reset();
1016*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
1017*635a8641SAndroid Build Coastguard Worker }
1018*635a8641SAndroid Build Coastguard Worker 
TYPED_TEST(BindMoveOnlyTypeTest,PassedWithRvalue)1019*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindMoveOnlyTypeTest, PassedWithRvalue) {
1020*635a8641SAndroid Build Coastguard Worker   int deletes = 0;
1021*635a8641SAndroid Build Coastguard Worker   Callback<TypeParam()> callback = Bind(
1022*635a8641SAndroid Build Coastguard Worker       &PassThru<TypeParam>, Passed(TypeParam(new DeleteCounter(&deletes))));
1023*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
1024*635a8641SAndroid Build Coastguard Worker 
1025*635a8641SAndroid Build Coastguard Worker   // If we never invoke the Callback, it retains ownership and deletes.
1026*635a8641SAndroid Build Coastguard Worker   callback.Reset();
1027*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
1028*635a8641SAndroid Build Coastguard Worker }
1029*635a8641SAndroid Build Coastguard Worker 
1030*635a8641SAndroid Build Coastguard Worker // Check that ownership can be transferred back out.
TYPED_TEST(BindMoveOnlyTypeTest,ReturnMoveOnlyType)1031*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindMoveOnlyTypeTest, ReturnMoveOnlyType) {
1032*635a8641SAndroid Build Coastguard Worker   int deletes = 0;
1033*635a8641SAndroid Build Coastguard Worker   DeleteCounter* counter = new DeleteCounter(&deletes);
1034*635a8641SAndroid Build Coastguard Worker   Callback<TypeParam()> callback =
1035*635a8641SAndroid Build Coastguard Worker       Bind(&PassThru<TypeParam>, Passed(TypeParam(counter)));
1036*635a8641SAndroid Build Coastguard Worker   TypeParam result = callback.Run();
1037*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(counter, result.get());
1038*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
1039*635a8641SAndroid Build Coastguard Worker 
1040*635a8641SAndroid Build Coastguard Worker   // Resetting does not delete since ownership was transferred.
1041*635a8641SAndroid Build Coastguard Worker   callback.Reset();
1042*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, deletes);
1043*635a8641SAndroid Build Coastguard Worker 
1044*635a8641SAndroid Build Coastguard Worker   // Ensure that we actually did get ownership.
1045*635a8641SAndroid Build Coastguard Worker   result.reset();
1046*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
1047*635a8641SAndroid Build Coastguard Worker }
1048*635a8641SAndroid Build Coastguard Worker 
TYPED_TEST(BindMoveOnlyTypeTest,UnboundForwarding)1049*635a8641SAndroid Build Coastguard Worker TYPED_TEST(BindMoveOnlyTypeTest, UnboundForwarding) {
1050*635a8641SAndroid Build Coastguard Worker   int deletes = 0;
1051*635a8641SAndroid Build Coastguard Worker   TypeParam ptr(new DeleteCounter(&deletes));
1052*635a8641SAndroid Build Coastguard Worker   // Test unbound argument forwarding.
1053*635a8641SAndroid Build Coastguard Worker   Callback<TypeParam(TypeParam)> cb_unbound = Bind(&PassThru<TypeParam>);
1054*635a8641SAndroid Build Coastguard Worker   cb_unbound.Run(std::move(ptr));
1055*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, deletes);
1056*635a8641SAndroid Build Coastguard Worker }
1057*635a8641SAndroid Build Coastguard Worker 
VerifyVector(const std::vector<std::unique_ptr<int>> & v)1058*635a8641SAndroid Build Coastguard Worker void VerifyVector(const std::vector<std::unique_ptr<int>>& v) {
1059*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1u, v.size());
1060*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(12345, *v[0]);
1061*635a8641SAndroid Build Coastguard Worker }
1062*635a8641SAndroid Build Coastguard Worker 
AcceptAndReturnMoveOnlyVector(std::vector<std::unique_ptr<int>> v)1063*635a8641SAndroid Build Coastguard Worker std::vector<std::unique_ptr<int>> AcceptAndReturnMoveOnlyVector(
1064*635a8641SAndroid Build Coastguard Worker     std::vector<std::unique_ptr<int>> v) {
1065*635a8641SAndroid Build Coastguard Worker   VerifyVector(v);
1066*635a8641SAndroid Build Coastguard Worker   return v;
1067*635a8641SAndroid Build Coastguard Worker }
1068*635a8641SAndroid Build Coastguard Worker 
1069*635a8641SAndroid Build Coastguard Worker // Test that a vector containing move-only types can be used with Callback.
TEST_F(BindTest,BindMoveOnlyVector)1070*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, BindMoveOnlyVector) {
1071*635a8641SAndroid Build Coastguard Worker   using MoveOnlyVector = std::vector<std::unique_ptr<int>>;
1072*635a8641SAndroid Build Coastguard Worker 
1073*635a8641SAndroid Build Coastguard Worker   MoveOnlyVector v;
1074*635a8641SAndroid Build Coastguard Worker   v.push_back(WrapUnique(new int(12345)));
1075*635a8641SAndroid Build Coastguard Worker 
1076*635a8641SAndroid Build Coastguard Worker   // Early binding should work:
1077*635a8641SAndroid Build Coastguard Worker   base::Callback<MoveOnlyVector()> bound_cb =
1078*635a8641SAndroid Build Coastguard Worker       base::Bind(&AcceptAndReturnMoveOnlyVector, Passed(&v));
1079*635a8641SAndroid Build Coastguard Worker   MoveOnlyVector intermediate_result = bound_cb.Run();
1080*635a8641SAndroid Build Coastguard Worker   VerifyVector(intermediate_result);
1081*635a8641SAndroid Build Coastguard Worker 
1082*635a8641SAndroid Build Coastguard Worker   // As should passing it as an argument to Run():
1083*635a8641SAndroid Build Coastguard Worker   base::Callback<MoveOnlyVector(MoveOnlyVector)> unbound_cb =
1084*635a8641SAndroid Build Coastguard Worker       base::Bind(&AcceptAndReturnMoveOnlyVector);
1085*635a8641SAndroid Build Coastguard Worker   MoveOnlyVector final_result = unbound_cb.Run(std::move(intermediate_result));
1086*635a8641SAndroid Build Coastguard Worker   VerifyVector(final_result);
1087*635a8641SAndroid Build Coastguard Worker }
1088*635a8641SAndroid Build Coastguard Worker 
1089*635a8641SAndroid Build Coastguard Worker // Argument copy-constructor usage for non-reference copy-only parameters.
1090*635a8641SAndroid Build Coastguard Worker //   - Bound arguments are only copied once.
1091*635a8641SAndroid Build Coastguard Worker //   - Forwarded arguments are only copied once.
1092*635a8641SAndroid Build Coastguard Worker //   - Forwarded arguments with coercions are only copied twice (once for the
1093*635a8641SAndroid Build Coastguard Worker //     coercion, and one for the final dispatch).
TEST_F(BindTest,ArgumentCopies)1094*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ArgumentCopies) {
1095*635a8641SAndroid Build Coastguard Worker   int copies = 0;
1096*635a8641SAndroid Build Coastguard Worker   int assigns = 0;
1097*635a8641SAndroid Build Coastguard Worker 
1098*635a8641SAndroid Build Coastguard Worker   CopyCounter counter(&copies, &assigns);
1099*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyCounter>::Run, counter);
1100*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, copies);
1101*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1102*635a8641SAndroid Build Coastguard Worker 
1103*635a8641SAndroid Build Coastguard Worker   copies = 0;
1104*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1105*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyCounter>::Run, CopyCounter(&copies, &assigns));
1106*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, copies);
1107*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1108*635a8641SAndroid Build Coastguard Worker 
1109*635a8641SAndroid Build Coastguard Worker   copies = 0;
1110*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1111*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyCounter>::Run).Run(counter);
1112*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, copies);
1113*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1114*635a8641SAndroid Build Coastguard Worker 
1115*635a8641SAndroid Build Coastguard Worker   copies = 0;
1116*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1117*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(&copies, &assigns));
1118*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, copies);
1119*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1120*635a8641SAndroid Build Coastguard Worker 
1121*635a8641SAndroid Build Coastguard Worker   copies = 0;
1122*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1123*635a8641SAndroid Build Coastguard Worker   DerivedCopyMoveCounter derived(&copies, &assigns, nullptr, nullptr);
1124*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(derived));
1125*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, copies);
1126*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1127*635a8641SAndroid Build Coastguard Worker 
1128*635a8641SAndroid Build Coastguard Worker   copies = 0;
1129*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1130*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyCounter>::Run)
1131*635a8641SAndroid Build Coastguard Worker       .Run(CopyCounter(
1132*635a8641SAndroid Build Coastguard Worker           DerivedCopyMoveCounter(&copies, &assigns, nullptr, nullptr)));
1133*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, copies);
1134*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1135*635a8641SAndroid Build Coastguard Worker }
1136*635a8641SAndroid Build Coastguard Worker 
1137*635a8641SAndroid Build Coastguard Worker // Argument move-constructor usage for move-only parameters.
1138*635a8641SAndroid Build Coastguard Worker //   - Bound arguments passed by move are not copied.
TEST_F(BindTest,ArgumentMoves)1139*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ArgumentMoves) {
1140*635a8641SAndroid Build Coastguard Worker   int move_constructs = 0;
1141*635a8641SAndroid Build Coastguard Worker   int move_assigns = 0;
1142*635a8641SAndroid Build Coastguard Worker 
1143*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<const MoveCounter&>::Run,
1144*635a8641SAndroid Build Coastguard Worker        MoveCounter(&move_constructs, &move_assigns));
1145*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, move_constructs);
1146*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1147*635a8641SAndroid Build Coastguard Worker 
1148*635a8641SAndroid Build Coastguard Worker   // TODO(tzik): Support binding move-only type into a non-reference parameter
1149*635a8641SAndroid Build Coastguard Worker   // of a variant of Callback.
1150*635a8641SAndroid Build Coastguard Worker 
1151*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1152*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1153*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<MoveCounter>::Run)
1154*635a8641SAndroid Build Coastguard Worker       .Run(MoveCounter(&move_constructs, &move_assigns));
1155*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, move_constructs);
1156*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1157*635a8641SAndroid Build Coastguard Worker 
1158*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1159*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1160*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<MoveCounter>::Run)
1161*635a8641SAndroid Build Coastguard Worker       .Run(MoveCounter(DerivedCopyMoveCounter(
1162*635a8641SAndroid Build Coastguard Worker           nullptr, nullptr, &move_constructs, &move_assigns)));
1163*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, move_constructs);
1164*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1165*635a8641SAndroid Build Coastguard Worker }
1166*635a8641SAndroid Build Coastguard Worker 
1167*635a8641SAndroid Build Coastguard Worker // Argument constructor usage for non-reference movable-copyable
1168*635a8641SAndroid Build Coastguard Worker // parameters.
1169*635a8641SAndroid Build Coastguard Worker //   - Bound arguments passed by move are not copied.
1170*635a8641SAndroid Build Coastguard Worker //   - Forwarded arguments are only copied once.
1171*635a8641SAndroid Build Coastguard Worker //   - Forwarded arguments with coercions are only copied once and moved once.
TEST_F(BindTest,ArgumentCopiesAndMoves)1172*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, ArgumentCopiesAndMoves) {
1173*635a8641SAndroid Build Coastguard Worker   int copies = 0;
1174*635a8641SAndroid Build Coastguard Worker   int assigns = 0;
1175*635a8641SAndroid Build Coastguard Worker   int move_constructs = 0;
1176*635a8641SAndroid Build Coastguard Worker   int move_assigns = 0;
1177*635a8641SAndroid Build Coastguard Worker 
1178*635a8641SAndroid Build Coastguard Worker   CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns);
1179*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyMoveCounter>::Run, counter);
1180*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, copies);
1181*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1182*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_constructs);
1183*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1184*635a8641SAndroid Build Coastguard Worker 
1185*635a8641SAndroid Build Coastguard Worker   copies = 0;
1186*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1187*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1188*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1189*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyMoveCounter>::Run,
1190*635a8641SAndroid Build Coastguard Worker        CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns));
1191*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, copies);
1192*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1193*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, move_constructs);
1194*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1195*635a8641SAndroid Build Coastguard Worker 
1196*635a8641SAndroid Build Coastguard Worker   copies = 0;
1197*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1198*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1199*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1200*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyMoveCounter>::Run).Run(counter);
1201*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, copies);
1202*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1203*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, move_constructs);
1204*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1205*635a8641SAndroid Build Coastguard Worker 
1206*635a8641SAndroid Build Coastguard Worker   copies = 0;
1207*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1208*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1209*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1210*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
1211*635a8641SAndroid Build Coastguard Worker       .Run(CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns));
1212*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, copies);
1213*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1214*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, move_constructs);
1215*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1216*635a8641SAndroid Build Coastguard Worker 
1217*635a8641SAndroid Build Coastguard Worker   DerivedCopyMoveCounter derived_counter(&copies, &assigns, &move_constructs,
1218*635a8641SAndroid Build Coastguard Worker                                          &move_assigns);
1219*635a8641SAndroid Build Coastguard Worker   copies = 0;
1220*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1221*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1222*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1223*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
1224*635a8641SAndroid Build Coastguard Worker       .Run(CopyMoveCounter(derived_counter));
1225*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, copies);
1226*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1227*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, move_constructs);
1228*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1229*635a8641SAndroid Build Coastguard Worker 
1230*635a8641SAndroid Build Coastguard Worker   copies = 0;
1231*635a8641SAndroid Build Coastguard Worker   assigns = 0;
1232*635a8641SAndroid Build Coastguard Worker   move_constructs = 0;
1233*635a8641SAndroid Build Coastguard Worker   move_assigns = 0;
1234*635a8641SAndroid Build Coastguard Worker   Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
1235*635a8641SAndroid Build Coastguard Worker       .Run(CopyMoveCounter(DerivedCopyMoveCounter(
1236*635a8641SAndroid Build Coastguard Worker           &copies, &assigns, &move_constructs, &move_assigns)));
1237*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, copies);
1238*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, assigns);
1239*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, move_constructs);
1240*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, move_assigns);
1241*635a8641SAndroid Build Coastguard Worker }
1242*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,CapturelessLambda)1243*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, CapturelessLambda) {
1244*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::IsCallableObject<void>::value);
1245*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::IsCallableObject<int>::value);
1246*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::IsCallableObject<void (*)()>::value);
1247*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::IsCallableObject<void (NoRef::*)()>::value);
1248*635a8641SAndroid Build Coastguard Worker 
1249*635a8641SAndroid Build Coastguard Worker   auto f = []() {};
1250*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::IsCallableObject<decltype(f)>::value);
1251*635a8641SAndroid Build Coastguard Worker 
1252*635a8641SAndroid Build Coastguard Worker   int i = 0;
1253*635a8641SAndroid Build Coastguard Worker   auto g = [i]() { (void)i; };
1254*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::IsCallableObject<decltype(g)>::value);
1255*635a8641SAndroid Build Coastguard Worker 
1256*635a8641SAndroid Build Coastguard Worker   auto h = [](int, double) { return 'k'; };
1257*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<
1258*635a8641SAndroid Build Coastguard Worker       char(int, double),
1259*635a8641SAndroid Build Coastguard Worker       internal::ExtractCallableRunType<decltype(h)>>::value));
1260*635a8641SAndroid Build Coastguard Worker 
1261*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, Bind([] { return 42; }).Run());
1262*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, Bind([](int i) { return i * 7; }, 6).Run());
1263*635a8641SAndroid Build Coastguard Worker 
1264*635a8641SAndroid Build Coastguard Worker   int x = 1;
1265*635a8641SAndroid Build Coastguard Worker   base::Callback<void(int)> cb =
1266*635a8641SAndroid Build Coastguard Worker       Bind([](int* x, int i) { *x *= i; }, Unretained(&x));
1267*635a8641SAndroid Build Coastguard Worker   cb.Run(6);
1268*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(6, x);
1269*635a8641SAndroid Build Coastguard Worker   cb.Run(7);
1270*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, x);
1271*635a8641SAndroid Build Coastguard Worker }
1272*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,EmptyFunctor)1273*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, EmptyFunctor) {
1274*635a8641SAndroid Build Coastguard Worker   struct NonEmptyFunctor {
1275*635a8641SAndroid Build Coastguard Worker     int operator()() const { return x; }
1276*635a8641SAndroid Build Coastguard Worker     int x = 42;
1277*635a8641SAndroid Build Coastguard Worker   };
1278*635a8641SAndroid Build Coastguard Worker 
1279*635a8641SAndroid Build Coastguard Worker   struct EmptyFunctor {
1280*635a8641SAndroid Build Coastguard Worker     int operator()() { return 42; }
1281*635a8641SAndroid Build Coastguard Worker   };
1282*635a8641SAndroid Build Coastguard Worker 
1283*635a8641SAndroid Build Coastguard Worker   struct EmptyFunctorConst {
1284*635a8641SAndroid Build Coastguard Worker     int operator()() const { return 42; }
1285*635a8641SAndroid Build Coastguard Worker   };
1286*635a8641SAndroid Build Coastguard Worker 
1287*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::IsCallableObject<NonEmptyFunctor>::value);
1288*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::IsCallableObject<EmptyFunctor>::value);
1289*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::IsCallableObject<EmptyFunctorConst>::value);
1290*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, BindOnce(EmptyFunctor()).Run());
1291*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, BindOnce(EmptyFunctorConst()).Run());
1292*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, BindRepeating(EmptyFunctorConst()).Run());
1293*635a8641SAndroid Build Coastguard Worker }
1294*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,CapturingLambdaForTesting)1295*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, CapturingLambdaForTesting) {
1296*635a8641SAndroid Build Coastguard Worker   int x = 6;
1297*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, BindLambdaForTesting([=](int y) { return x * y; }).Run(7));
1298*635a8641SAndroid Build Coastguard Worker 
1299*635a8641SAndroid Build Coastguard Worker   auto f = [x](std::unique_ptr<int> y) { return x * *y; };
1300*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, BindLambdaForTesting(f).Run(std::make_unique<int>(7)));
1301*635a8641SAndroid Build Coastguard Worker }
1302*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,Cancellation)1303*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, Cancellation) {
1304*635a8641SAndroid Build Coastguard Worker   EXPECT_CALL(no_ref_, VoidMethodWithIntArg(_)).Times(2);
1305*635a8641SAndroid Build Coastguard Worker 
1306*635a8641SAndroid Build Coastguard Worker   WeakPtrFactory<NoRef> weak_factory(&no_ref_);
1307*635a8641SAndroid Build Coastguard Worker   RepeatingCallback<void(int)> cb =
1308*635a8641SAndroid Build Coastguard Worker       BindRepeating(&NoRef::VoidMethodWithIntArg, weak_factory.GetWeakPtr());
1309*635a8641SAndroid Build Coastguard Worker   RepeatingClosure cb2 = BindRepeating(cb, 8);
1310*635a8641SAndroid Build Coastguard Worker   OnceClosure cb3 = BindOnce(cb, 8);
1311*635a8641SAndroid Build Coastguard Worker 
1312*635a8641SAndroid Build Coastguard Worker   OnceCallback<void(int)> cb4 =
1313*635a8641SAndroid Build Coastguard Worker       BindOnce(&NoRef::VoidMethodWithIntArg, weak_factory.GetWeakPtr());
1314*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(cb4.IsCancelled());
1315*635a8641SAndroid Build Coastguard Worker 
1316*635a8641SAndroid Build Coastguard Worker   OnceClosure cb5 = BindOnce(std::move(cb4), 8);
1317*635a8641SAndroid Build Coastguard Worker 
1318*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.IsCancelled());
1319*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(cb2.IsCancelled());
1320*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(cb3.IsCancelled());
1321*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(cb5.IsCancelled());
1322*635a8641SAndroid Build Coastguard Worker 
1323*635a8641SAndroid Build Coastguard Worker   cb.Run(6);
1324*635a8641SAndroid Build Coastguard Worker   cb2.Run();
1325*635a8641SAndroid Build Coastguard Worker 
1326*635a8641SAndroid Build Coastguard Worker   weak_factory.InvalidateWeakPtrs();
1327*635a8641SAndroid Build Coastguard Worker 
1328*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(cb.IsCancelled());
1329*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(cb2.IsCancelled());
1330*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(cb3.IsCancelled());
1331*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(cb5.IsCancelled());
1332*635a8641SAndroid Build Coastguard Worker 
1333*635a8641SAndroid Build Coastguard Worker   cb.Run(6);
1334*635a8641SAndroid Build Coastguard Worker   cb2.Run();
1335*635a8641SAndroid Build Coastguard Worker   std::move(cb3).Run();
1336*635a8641SAndroid Build Coastguard Worker   std::move(cb5).Run();
1337*635a8641SAndroid Build Coastguard Worker }
1338*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,OnceCallback)1339*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, OnceCallback) {
1340*635a8641SAndroid Build Coastguard Worker   // Check if Callback variants have declarations of conversions as expected.
1341*635a8641SAndroid Build Coastguard Worker   // Copy constructor and assignment of RepeatingCallback.
1342*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_constructible<
1343*635a8641SAndroid Build Coastguard Worker       RepeatingClosure, const RepeatingClosure&>::value,
1344*635a8641SAndroid Build Coastguard Worker       "RepeatingClosure should be copyable.");
1345*635a8641SAndroid Build Coastguard Worker   static_assert(
1346*635a8641SAndroid Build Coastguard Worker       std::is_assignable<RepeatingClosure, const RepeatingClosure&>::value,
1347*635a8641SAndroid Build Coastguard Worker       "RepeatingClosure should be copy-assignable.");
1348*635a8641SAndroid Build Coastguard Worker 
1349*635a8641SAndroid Build Coastguard Worker   // Move constructor and assignment of RepeatingCallback.
1350*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_constructible<
1351*635a8641SAndroid Build Coastguard Worker       RepeatingClosure, RepeatingClosure&&>::value,
1352*635a8641SAndroid Build Coastguard Worker       "RepeatingClosure should be movable.");
1353*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_assignable<RepeatingClosure, RepeatingClosure&&>::value,
1354*635a8641SAndroid Build Coastguard Worker                 "RepeatingClosure should be move-assignable");
1355*635a8641SAndroid Build Coastguard Worker 
1356*635a8641SAndroid Build Coastguard Worker   // Conversions from OnceCallback to RepeatingCallback.
1357*635a8641SAndroid Build Coastguard Worker   static_assert(!std::is_constructible<
1358*635a8641SAndroid Build Coastguard Worker       RepeatingClosure, const OnceClosure&>::value,
1359*635a8641SAndroid Build Coastguard Worker       "OnceClosure should not be convertible to RepeatingClosure.");
1360*635a8641SAndroid Build Coastguard Worker   static_assert(
1361*635a8641SAndroid Build Coastguard Worker       !std::is_assignable<RepeatingClosure, const OnceClosure&>::value,
1362*635a8641SAndroid Build Coastguard Worker       "OnceClosure should not be convertible to RepeatingClosure.");
1363*635a8641SAndroid Build Coastguard Worker 
1364*635a8641SAndroid Build Coastguard Worker   // Destructive conversions from OnceCallback to RepeatingCallback.
1365*635a8641SAndroid Build Coastguard Worker   static_assert(!std::is_constructible<
1366*635a8641SAndroid Build Coastguard Worker       RepeatingClosure, OnceClosure&&>::value,
1367*635a8641SAndroid Build Coastguard Worker       "OnceClosure should not be convertible to RepeatingClosure.");
1368*635a8641SAndroid Build Coastguard Worker   static_assert(!std::is_assignable<RepeatingClosure, OnceClosure&&>::value,
1369*635a8641SAndroid Build Coastguard Worker                 "OnceClosure should not be convertible to RepeatingClosure.");
1370*635a8641SAndroid Build Coastguard Worker 
1371*635a8641SAndroid Build Coastguard Worker   // Copy constructor and assignment of OnceCallback.
1372*635a8641SAndroid Build Coastguard Worker   static_assert(!std::is_constructible<
1373*635a8641SAndroid Build Coastguard Worker       OnceClosure, const OnceClosure&>::value,
1374*635a8641SAndroid Build Coastguard Worker       "OnceClosure should not be copyable.");
1375*635a8641SAndroid Build Coastguard Worker   static_assert(!std::is_assignable<OnceClosure, const OnceClosure&>::value,
1376*635a8641SAndroid Build Coastguard Worker                 "OnceClosure should not be copy-assignable");
1377*635a8641SAndroid Build Coastguard Worker 
1378*635a8641SAndroid Build Coastguard Worker   // Move constructor and assignment of OnceCallback.
1379*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_constructible<
1380*635a8641SAndroid Build Coastguard Worker       OnceClosure, OnceClosure&&>::value,
1381*635a8641SAndroid Build Coastguard Worker       "OnceClosure should be movable.");
1382*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_assignable<OnceClosure, OnceClosure&&>::value,
1383*635a8641SAndroid Build Coastguard Worker                 "OnceClosure should be move-assignable.");
1384*635a8641SAndroid Build Coastguard Worker 
1385*635a8641SAndroid Build Coastguard Worker   // Conversions from RepeatingCallback to OnceCallback.
1386*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_constructible<
1387*635a8641SAndroid Build Coastguard Worker       OnceClosure, const RepeatingClosure&>::value,
1388*635a8641SAndroid Build Coastguard Worker       "RepeatingClosure should be convertible to OnceClosure.");
1389*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_assignable<OnceClosure, const RepeatingClosure&>::value,
1390*635a8641SAndroid Build Coastguard Worker                 "RepeatingClosure should be convertible to OnceClosure.");
1391*635a8641SAndroid Build Coastguard Worker 
1392*635a8641SAndroid Build Coastguard Worker   // Destructive conversions from RepeatingCallback to OnceCallback.
1393*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_constructible<
1394*635a8641SAndroid Build Coastguard Worker       OnceClosure, RepeatingClosure&&>::value,
1395*635a8641SAndroid Build Coastguard Worker       "RepeatingClosure should be convertible to OnceClosure.");
1396*635a8641SAndroid Build Coastguard Worker   static_assert(std::is_assignable<OnceClosure, RepeatingClosure&&>::value,
1397*635a8641SAndroid Build Coastguard Worker                 "RepeatingClosure should be covretible to OnceClosure.");
1398*635a8641SAndroid Build Coastguard Worker 
1399*635a8641SAndroid Build Coastguard Worker   OnceClosure cb = BindOnce(&VoidPolymorphic<>::Run);
1400*635a8641SAndroid Build Coastguard Worker   std::move(cb).Run();
1401*635a8641SAndroid Build Coastguard Worker 
1402*635a8641SAndroid Build Coastguard Worker   // RepeatingCallback should be convertible to OnceCallback.
1403*635a8641SAndroid Build Coastguard Worker   OnceClosure cb2 = BindRepeating(&VoidPolymorphic<>::Run);
1404*635a8641SAndroid Build Coastguard Worker   std::move(cb2).Run();
1405*635a8641SAndroid Build Coastguard Worker 
1406*635a8641SAndroid Build Coastguard Worker   RepeatingClosure cb3 = BindRepeating(&VoidPolymorphic<>::Run);
1407*635a8641SAndroid Build Coastguard Worker   cb = cb3;
1408*635a8641SAndroid Build Coastguard Worker   std::move(cb).Run();
1409*635a8641SAndroid Build Coastguard Worker 
1410*635a8641SAndroid Build Coastguard Worker   cb = std::move(cb2);
1411*635a8641SAndroid Build Coastguard Worker 
1412*635a8641SAndroid Build Coastguard Worker   OnceCallback<void(int)> cb4 =
1413*635a8641SAndroid Build Coastguard Worker       BindOnce(&VoidPolymorphic<std::unique_ptr<int>, int>::Run,
1414*635a8641SAndroid Build Coastguard Worker                std::make_unique<int>(0));
1415*635a8641SAndroid Build Coastguard Worker   BindOnce(std::move(cb4), 1).Run();
1416*635a8641SAndroid Build Coastguard Worker }
1417*635a8641SAndroid Build Coastguard Worker 
1418*635a8641SAndroid Build Coastguard Worker // Callback construction and assignment tests.
1419*635a8641SAndroid Build Coastguard Worker //   - Construction from an InvokerStorageHolder should not cause ref/deref.
1420*635a8641SAndroid Build Coastguard Worker //   - Assignment from other callback should only cause one ref
1421*635a8641SAndroid Build Coastguard Worker //
1422*635a8641SAndroid Build Coastguard Worker // TODO(ajwong): Is there actually a way to test this?
1423*635a8641SAndroid Build Coastguard Worker 
1424*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
FastCallFunc(int n)1425*635a8641SAndroid Build Coastguard Worker int __fastcall FastCallFunc(int n) {
1426*635a8641SAndroid Build Coastguard Worker   return n;
1427*635a8641SAndroid Build Coastguard Worker }
1428*635a8641SAndroid Build Coastguard Worker 
StdCallFunc(int n)1429*635a8641SAndroid Build Coastguard Worker int __stdcall StdCallFunc(int n) {
1430*635a8641SAndroid Build Coastguard Worker   return n;
1431*635a8641SAndroid Build Coastguard Worker }
1432*635a8641SAndroid Build Coastguard Worker 
1433*635a8641SAndroid Build Coastguard Worker // Windows specific calling convention support.
1434*635a8641SAndroid Build Coastguard Worker //   - Can bind a __fastcall function.
1435*635a8641SAndroid Build Coastguard Worker //   - Can bind a __stdcall function.
TEST_F(BindTest,WindowsCallingConventions)1436*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, WindowsCallingConventions) {
1437*635a8641SAndroid Build Coastguard Worker   Callback<int()> fastcall_cb = Bind(&FastCallFunc, 1);
1438*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, fastcall_cb.Run());
1439*635a8641SAndroid Build Coastguard Worker 
1440*635a8641SAndroid Build Coastguard Worker   Callback<int()> stdcall_cb = Bind(&StdCallFunc, 2);
1441*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, stdcall_cb.Run());
1442*635a8641SAndroid Build Coastguard Worker }
1443*635a8641SAndroid Build Coastguard Worker #endif
1444*635a8641SAndroid Build Coastguard Worker 
1445*635a8641SAndroid Build Coastguard Worker // Test unwrapping the various wrapping functions.
1446*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,UnwrapUnretained)1447*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, UnwrapUnretained) {
1448*635a8641SAndroid Build Coastguard Worker   int i = 0;
1449*635a8641SAndroid Build Coastguard Worker   auto unretained = Unretained(&i);
1450*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&i, internal::Unwrap(unretained));
1451*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&i, internal::Unwrap(std::move(unretained)));
1452*635a8641SAndroid Build Coastguard Worker }
1453*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,UnwrapConstRef)1454*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, UnwrapConstRef) {
1455*635a8641SAndroid Build Coastguard Worker   int p = 0;
1456*635a8641SAndroid Build Coastguard Worker   auto const_ref = ConstRef(p);
1457*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&p, &internal::Unwrap(const_ref));
1458*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(&p, &internal::Unwrap(std::move(const_ref)));
1459*635a8641SAndroid Build Coastguard Worker }
1460*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,UnwrapRetainedRef)1461*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, UnwrapRetainedRef) {
1462*635a8641SAndroid Build Coastguard Worker   auto p = MakeRefCounted<RefCountedData<int>>();
1463*635a8641SAndroid Build Coastguard Worker   auto retained_ref = RetainedRef(p);
1464*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(p.get(), internal::Unwrap(retained_ref));
1465*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(p.get(), internal::Unwrap(std::move(retained_ref)));
1466*635a8641SAndroid Build Coastguard Worker }
1467*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,UnwrapOwned)1468*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, UnwrapOwned) {
1469*635a8641SAndroid Build Coastguard Worker   int* p = new int;
1470*635a8641SAndroid Build Coastguard Worker   auto owned = Owned(p);
1471*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(p, internal::Unwrap(owned));
1472*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(p, internal::Unwrap(std::move(owned)));
1473*635a8641SAndroid Build Coastguard Worker }
1474*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,UnwrapPassed)1475*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, UnwrapPassed) {
1476*635a8641SAndroid Build Coastguard Worker   int* p = new int;
1477*635a8641SAndroid Build Coastguard Worker   auto passed = Passed(WrapUnique(p));
1478*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(p, internal::Unwrap(passed).get());
1479*635a8641SAndroid Build Coastguard Worker 
1480*635a8641SAndroid Build Coastguard Worker   p = new int;
1481*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(p, internal::Unwrap(Passed(WrapUnique(p))).get());
1482*635a8641SAndroid Build Coastguard Worker }
1483*635a8641SAndroid Build Coastguard Worker 
TEST_F(BindTest,BindNoexcept)1484*635a8641SAndroid Build Coastguard Worker TEST_F(BindTest, BindNoexcept) {
1485*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(42, base::BindOnce(&Noexcept).Run());
1486*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(
1487*635a8641SAndroid Build Coastguard Worker       42,
1488*635a8641SAndroid Build Coastguard Worker       base::BindOnce(&BindTest::NoexceptMethod, base::Unretained(this)).Run());
1489*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(
1490*635a8641SAndroid Build Coastguard Worker       42, base::BindOnce(&BindTest::ConstNoexceptMethod, base::Unretained(this))
1491*635a8641SAndroid Build Coastguard Worker               .Run());
1492*635a8641SAndroid Build Coastguard Worker }
1493*635a8641SAndroid Build Coastguard Worker 
1494*635a8641SAndroid Build Coastguard Worker // Test null callbacks cause a DCHECK.
TEST(BindDeathTest,NullCallback)1495*635a8641SAndroid Build Coastguard Worker TEST(BindDeathTest, NullCallback) {
1496*635a8641SAndroid Build Coastguard Worker   base::Callback<void(int)> null_cb;
1497*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(null_cb.is_null());
1498*635a8641SAndroid Build Coastguard Worker   EXPECT_DCHECK_DEATH(base::Bind(null_cb, 42));
1499*635a8641SAndroid Build Coastguard Worker }
1500*635a8641SAndroid Build Coastguard Worker 
1501*635a8641SAndroid Build Coastguard Worker }  // namespace
1502*635a8641SAndroid Build Coastguard Worker }  // namespace base
1503