1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/callback_internal.h"
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace base {
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HelperObject {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HelperObject() : next_number_(0) { }
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetNextNumber() { return ++next_number_; }
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetNextNumberArg(int* number) { *number = GetNextNumber(); }
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int next_number_;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct FakeInvoker {
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void DoInvoke(internal::InvokerStorageBase*) {
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// White-box testpoints to inject into a Callback<> object for checking
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// comparators and emptiness APIs.
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FakeInvokerStorage1 : public internal::InvokerStorageBase {
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef FakeInvoker Invoker;
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FakeInvokerStorage2 : public internal::InvokerStorageBase {
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef FakeInvoker Invoker;
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CallbackOld, OneArg) {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HelperObject obj;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<Callback1<int*>::Type> callback(
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallback(&obj, &HelperObject::GetNextNumberArg));
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int number = 0;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  callback->Run(&number);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(number, 1);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST(CallbackOld, ReturnValue) {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HelperObject obj;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<CallbackWithReturnValue<int>::Type> callback(
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewCallbackWithReturnValue(&obj, &HelperObject::GetNextNumber));
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(callback->Run(), 1);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CallbackTest : public ::testing::Test {
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CallbackTest()
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : callback_a_(MakeInvokerStorageHolder(new FakeInvokerStorage1())),
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        callback_b_(MakeInvokerStorageHolder(new FakeInvokerStorage2())) {
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~CallbackTest() {
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected:
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(void)> callback_a_;
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Callback<void(void)> callback_b_;  // Ensure APIs work with const.
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(void)> null_callback_;
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Ensure we can create unbound callbacks. We need this to be able to store
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// them in class members that can be initialized later.
77dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, DefaultConstruction) {
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(void)> c0;
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(int)> c1;
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(int,int)> c2;
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(int,int,int)> c3;
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(int,int,int,int)> c4;
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(int,int,int,int,int)> c5;
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(int,int,int,int,int,int)> c6;
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c0.is_null());
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c1.is_null());
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c2.is_null());
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c3.is_null());
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c4.is_null());
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c5.is_null());
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(c6.is_null());
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
95dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, IsNull) {
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(null_callback_.is_null());
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(callback_a_.is_null());
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(callback_b_.is_null());
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
101dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, Equals) {
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(callback_a_.Equals(callback_a_));
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(callback_a_.Equals(callback_b_));
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(callback_b_.Equals(callback_a_));
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We should compare based on instance, not type.
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(void)> callback_c(
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      MakeInvokerStorageHolder(new FakeInvokerStorage1()));
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(void)> callback_a2 = callback_a_;
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(callback_a_.Equals(callback_a2));
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(callback_a_.Equals(callback_c));
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Empty, however, is always equal to empty.
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback<void(void)> empty2;
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(null_callback_.Equals(empty2));
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
118dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(CallbackTest, Reset) {
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Resetting should bring us back to empty.
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_FALSE(callback_a_.is_null());
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_FALSE(callback_a_.Equals(null_callback_));
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  callback_a_.Reset();
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(callback_a_.is_null());
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_TRUE(callback_a_.Equals(null_callback_));
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace base
131