1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/callback.h"
6 #include "base/callback_internal.h"
7 #include "base/callback_old.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "testing/gtest/include/gtest/gtest.h"
16 HelperObject() : next_number_(0) { }
17 int GetNextNumber() { return ++next_number_
; }
18 void GetNextNumberArg(int* number
) { *number
= GetNextNumber(); }
25 typedef void(RunType
)(internal::BindStateBase
*);
26 static void Run(internal::BindStateBase
*) {
30 // White-box testpoints to inject into a Callback<> object for checking
31 // comparators and emptiness APIs.
32 class FakeBindState1
: public internal::BindStateBase
{
34 typedef FakeInvoker InvokerType
;
37 class FakeBindState2
: public internal::BindStateBase
{
39 typedef FakeInvoker InvokerType
;
42 TEST(CallbackOld
, OneArg
) {
44 scoped_ptr
<Callback1
<int*>::Type
> callback(
45 NewCallback(&obj
, &HelperObject::GetNextNumberArg
));
48 callback
->Run(&number
);
52 TEST(CallbackOld
, ReturnValue
) {
54 scoped_ptr
<CallbackWithReturnValue
<int>::Type
> callback(
55 NewCallbackWithReturnValue(&obj
, &HelperObject::GetNextNumber
));
57 EXPECT_EQ(callback
->Run(), 1);
60 class CallbackTest
: public ::testing::Test
{
63 : callback_a_(MakeBindStateHolder(new FakeBindState1())),
64 callback_b_(MakeBindStateHolder(new FakeBindState2())) {
67 virtual ~CallbackTest() {
71 Callback
<void(void)> callback_a_
;
72 const Callback
<void(void)> callback_b_
; // Ensure APIs work with const.
73 Callback
<void(void)> null_callback_
;
76 // Ensure we can create unbound callbacks. We need this to be able to store
77 // them in class members that can be initialized later.
78 TEST_F(CallbackTest
, DefaultConstruction
) {
79 Callback
<void(void)> c0
;
80 Callback
<void(int)> c1
;
81 Callback
<void(int,int)> c2
;
82 Callback
<void(int,int,int)> c3
;
83 Callback
<void(int,int,int,int)> c4
;
84 Callback
<void(int,int,int,int,int)> c5
;
85 Callback
<void(int,int,int,int,int,int)> c6
;
87 EXPECT_TRUE(c0
.is_null());
88 EXPECT_TRUE(c1
.is_null());
89 EXPECT_TRUE(c2
.is_null());
90 EXPECT_TRUE(c3
.is_null());
91 EXPECT_TRUE(c4
.is_null());
92 EXPECT_TRUE(c5
.is_null());
93 EXPECT_TRUE(c6
.is_null());
96 TEST_F(CallbackTest
, IsNull
) {
97 EXPECT_TRUE(null_callback_
.is_null());
98 EXPECT_FALSE(callback_a_
.is_null());
99 EXPECT_FALSE(callback_b_
.is_null());
102 TEST_F(CallbackTest
, Equals
) {
103 EXPECT_TRUE(callback_a_
.Equals(callback_a_
));
104 EXPECT_FALSE(callback_a_
.Equals(callback_b_
));
105 EXPECT_FALSE(callback_b_
.Equals(callback_a_
));
107 // We should compare based on instance, not type.
108 Callback
<void(void)> callback_c(
109 MakeBindStateHolder(new FakeBindState1()));
110 Callback
<void(void)> callback_a2
= callback_a_
;
111 EXPECT_TRUE(callback_a_
.Equals(callback_a2
));
112 EXPECT_FALSE(callback_a_
.Equals(callback_c
));
114 // Empty, however, is always equal to empty.
115 Callback
<void(void)> empty2
;
116 EXPECT_TRUE(null_callback_
.Equals(empty2
));
119 TEST_F(CallbackTest
, Reset
) {
120 // Resetting should bring us back to empty.
121 ASSERT_FALSE(callback_a_
.is_null());
122 ASSERT_FALSE(callback_a_
.Equals(null_callback_
));
126 EXPECT_TRUE(callback_a_
.is_null());
127 EXPECT_TRUE(callback_a_
.Equals(null_callback_
));