Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: base/callback_list_unittest.cc

Issue 23645019: C++ Readability Review for caitkp (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nits Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/callback_list.h.pump ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/callback_list.h" 5 #include "base/callback_list.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 12
13 namespace base { 13 namespace base {
14 namespace { 14 namespace {
15 15
16 class Listener { 16 class Listener {
17 public: 17 public:
18 Listener() : total_(0), scaler_(1) {} 18 Listener() : total_(0), scaler_(1) {}
19 explicit Listener(int scaler) : total_(0), scaler_(scaler) {} 19 explicit Listener(int scaler) : total_(0), scaler_(scaler) {}
20 void IncrementTotal() { total_++; } 20 void IncrementTotal() { total_++; }
21 void IncrementByMultipleOfScaler(int x) { total_ += x * scaler_; } 21 void IncrementByMultipleOfScaler(int x) { total_ += x * scaler_; }
22 22
23 int total_; 23 int total() const { return total_; }
24 24
25 private: 25 private:
26 int total_;
26 int scaler_; 27 int scaler_;
27 DISALLOW_COPY_AND_ASSIGN(Listener); 28 DISALLOW_COPY_AND_ASSIGN(Listener);
28 }; 29 };
29 30
30 class Remover { 31 class Remover {
31 public: 32 public:
32 Remover() : total_(0) {} 33 Remover() : total_(0) {}
33 void IncrementTotalAndRemove() { 34 void IncrementTotalAndRemove() {
34 total_++; 35 total_++;
35 removal_subscription_.reset(); 36 removal_subscription_.reset();
36 } 37 }
37 void SetSubscriptionToRemove( 38 void SetSubscriptionToRemove(
38 scoped_ptr<CallbackList<void(void)>::Subscription> sub) { 39 scoped_ptr<CallbackList<void(void)>::Subscription> sub) {
39 removal_subscription_ = sub.Pass(); 40 removal_subscription_ = sub.Pass();
40 } 41 }
41 42
42 int total_; 43 int total() const { return total_; }
43 44
44 private: 45 private:
46 int total_;
45 scoped_ptr<CallbackList<void(void)>::Subscription> removal_subscription_; 47 scoped_ptr<CallbackList<void(void)>::Subscription> removal_subscription_;
46 DISALLOW_COPY_AND_ASSIGN(Remover); 48 DISALLOW_COPY_AND_ASSIGN(Remover);
47 }; 49 };
48 50
49 class Adder { 51 class Adder {
50 public: 52 public:
51 explicit Adder(CallbackList<void(void)>* cb_reg) 53 explicit Adder(CallbackList<void(void)>* cb_reg)
52 : added_(false), 54 : added_(false),
53 total_(0), 55 total_(0),
54 cb_reg_(cb_reg) {} 56 cb_reg_(cb_reg) {
57 }
55 void AddCallback() { 58 void AddCallback() {
56 if (!added_) { 59 if (!added_) {
57 added_ = true; 60 added_ = true;
58 subscription_ = 61 subscription_ =
59 cb_reg_->Add(Bind(&Adder::IncrementTotal, Unretained(this))); 62 cb_reg_->Add(Bind(&Adder::IncrementTotal, Unretained(this)));
60 } 63 }
61 } 64 }
62 void IncrementTotal() { total_++; } 65 void IncrementTotal() { total_++; }
63 66
67 bool added() const { return added_; }
68
69 int total() const { return total_; }
70
71 private:
64 bool added_; 72 bool added_;
65 int total_; 73 int total_;
66
67 private:
68 CallbackList<void(void)>* cb_reg_; 74 CallbackList<void(void)>* cb_reg_;
69 scoped_ptr<CallbackList<void(void)>::Subscription> subscription_; 75 scoped_ptr<CallbackList<void(void)>::Subscription> subscription_;
70 DISALLOW_COPY_AND_ASSIGN(Adder); 76 DISALLOW_COPY_AND_ASSIGN(Adder);
71 }; 77 };
72 78
73 class Summer { 79 class Summer {
74 public: 80 public:
75 Summer() : value_(0) {} 81 Summer() : value_(0) {}
76 82
77 void AddOneParam(int a) { value_ = a; } 83 void AddOneParam(int a) { value_ = a; }
78 void AddTwoParam(int a, int b) { value_ = a + b; } 84 void AddTwoParam(int a, int b) { value_ = a + b; }
79 void AddThreeParam(int a, int b, int c) { value_ = a + b + c; } 85 void AddThreeParam(int a, int b, int c) { value_ = a + b + c; }
80 void AddFourParam(int a, int b, int c, int d) { value_ = a + b + c + d; } 86 void AddFourParam(int a, int b, int c, int d) { value_ = a + b + c + d; }
81 void AddFiveParam(int a, int b, int c, int d, int e) { 87 void AddFiveParam(int a, int b, int c, int d, int e) {
82 value_ = a + b + c + d + e; 88 value_ = a + b + c + d + e;
83 } 89 }
84 void AddSixParam(int a, int b, int c, int d, int e , int f) { 90 void AddSixParam(int a, int b, int c, int d, int e , int f) {
85 value_ = a + b + c + d + e + f; 91 value_ = a + b + c + d + e + f;
86 } 92 }
87 93
88 int value_; 94 int value() const { return value_; }
89 95
90 private: 96 private:
97 int value_;
91 DISALLOW_COPY_AND_ASSIGN(Summer); 98 DISALLOW_COPY_AND_ASSIGN(Summer);
92 }; 99 };
93 100
94 // Sanity check that we can instantiate a CallbackList for each arity. 101 // Sanity check that we can instantiate a CallbackList for each arity.
95 TEST(CallbackListTest, ArityTest) { 102 TEST(CallbackListTest, ArityTest) {
96 Summer s; 103 Summer s;
97 104
98 CallbackList<void(int)> c1; 105 CallbackList<void(int)> c1;
99 scoped_ptr<CallbackList<void(int)>::Subscription> subscription1 = 106 scoped_ptr<CallbackList<void(int)>::Subscription> subscription1 =
100 c1.Add(Bind(&Summer::AddOneParam, Unretained(&s))); 107 c1.Add(Bind(&Summer::AddOneParam, Unretained(&s)));
101 108
102 c1.Notify(1); 109 c1.Notify(1);
103 EXPECT_EQ(1, s.value_); 110 EXPECT_EQ(1, s.value());
104 111
105 CallbackList<void(int, int)> c2; 112 CallbackList<void(int, int)> c2;
106 scoped_ptr<CallbackList<void(int, int)>::Subscription> subscription2 = 113 scoped_ptr<CallbackList<void(int, int)>::Subscription> subscription2 =
107 c2.Add(Bind(&Summer::AddTwoParam, Unretained(&s))); 114 c2.Add(Bind(&Summer::AddTwoParam, Unretained(&s)));
108 115
109 c2.Notify(1, 2); 116 c2.Notify(1, 2);
110 EXPECT_EQ(3, s.value_); 117 EXPECT_EQ(3, s.value());
111 118
112 CallbackList<void(int, int, int)> c3; 119 CallbackList<void(int, int, int)> c3;
113 scoped_ptr<CallbackList<void(int, int, int)>::Subscription> 120 scoped_ptr<CallbackList<void(int, int, int)>::Subscription>
114 subscription3 = c3.Add(Bind(&Summer::AddThreeParam, Unretained(&s))); 121 subscription3 = c3.Add(Bind(&Summer::AddThreeParam, Unretained(&s)));
115 122
116 c3.Notify(1, 2, 3); 123 c3.Notify(1, 2, 3);
117 EXPECT_EQ(6, s.value_); 124 EXPECT_EQ(6, s.value());
118 125
119 CallbackList<void(int, int, int, int)> c4; 126 CallbackList<void(int, int, int, int)> c4;
120 scoped_ptr<CallbackList<void(int, int, int, int)>::Subscription> 127 scoped_ptr<CallbackList<void(int, int, int, int)>::Subscription>
121 subscription4 = c4.Add(Bind(&Summer::AddFourParam, Unretained(&s))); 128 subscription4 = c4.Add(Bind(&Summer::AddFourParam, Unretained(&s)));
122 129
123 c4.Notify(1, 2, 3, 4); 130 c4.Notify(1, 2, 3, 4);
124 EXPECT_EQ(10, s.value_); 131 EXPECT_EQ(10, s.value());
125 132
126 CallbackList<void(int, int, int, int, int)> c5; 133 CallbackList<void(int, int, int, int, int)> c5;
127 scoped_ptr<CallbackList<void(int, int, int, int, int)>::Subscription> 134 scoped_ptr<CallbackList<void(int, int, int, int, int)>::Subscription>
128 subscription5 = c5.Add(Bind(&Summer::AddFiveParam, Unretained(&s))); 135 subscription5 = c5.Add(Bind(&Summer::AddFiveParam, Unretained(&s)));
129 136
130 c5.Notify(1, 2, 3, 4, 5); 137 c5.Notify(1, 2, 3, 4, 5);
131 EXPECT_EQ(15, s.value_); 138 EXPECT_EQ(15, s.value());
132 139
133 CallbackList<void(int, int, int, int, int, int)> c6; 140 CallbackList<void(int, int, int, int, int, int)> c6;
134 scoped_ptr<CallbackList<void(int, int, int, int, int, int)>::Subscription> 141 scoped_ptr<CallbackList<void(int, int, int, int, int, int)>::Subscription>
135 subscription6 = c6.Add(Bind(&Summer::AddSixParam, Unretained(&s))); 142 subscription6 = c6.Add(Bind(&Summer::AddSixParam, Unretained(&s)));
136 143
137 c6.Notify(1, 2, 3, 4, 5, 6); 144 c6.Notify(1, 2, 3, 4, 5, 6);
138 EXPECT_EQ(21, s.value_); 145 EXPECT_EQ(21, s.value());
139 } 146 }
140 147
141 // Sanity check that closures added to the list will be run, and those removed 148 // Sanity check that closures added to the list will be run, and those removed
142 // from the list will not be run. 149 // from the list will not be run.
143 TEST(CallbackListTest, BasicTest) { 150 TEST(CallbackListTest, BasicTest) {
144 CallbackList<void(void)> cb_reg; 151 CallbackList<void(void)> cb_reg;
145 Listener a, b, c; 152 Listener a, b, c;
146 153
147 scoped_ptr<CallbackList<void(void)>::Subscription> a_subscription = 154 scoped_ptr<CallbackList<void(void)>::Subscription> a_subscription =
148 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&a))); 155 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&a)));
149 scoped_ptr<CallbackList<void(void)>::Subscription> b_subscription = 156 scoped_ptr<CallbackList<void(void)>::Subscription> b_subscription =
150 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b))); 157 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b)));
151 158
152 EXPECT_TRUE(a_subscription.get()); 159 EXPECT_TRUE(a_subscription.get());
153 EXPECT_TRUE(b_subscription.get()); 160 EXPECT_TRUE(b_subscription.get());
154 161
155 cb_reg.Notify(); 162 cb_reg.Notify();
156 163
157 EXPECT_EQ(1, a.total_); 164 EXPECT_EQ(1, a.total());
158 EXPECT_EQ(1, b.total_); 165 EXPECT_EQ(1, b.total());
159 166
160 b_subscription.reset(); 167 b_subscription.reset();
161 168
162 scoped_ptr<CallbackList<void(void)>::Subscription> c_subscription = 169 scoped_ptr<CallbackList<void(void)>::Subscription> c_subscription =
163 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&c))); 170 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&c)));
164 171
165 cb_reg.Notify(); 172 cb_reg.Notify();
166 173
167 EXPECT_EQ(2, a.total_); 174 EXPECT_EQ(2, a.total());
168 EXPECT_EQ(1, b.total_); 175 EXPECT_EQ(1, b.total());
169 EXPECT_EQ(1, c.total_); 176 EXPECT_EQ(1, c.total());
170 177
171 a_subscription.reset(); 178 a_subscription.reset();
172 b_subscription.reset(); 179 b_subscription.reset();
173 c_subscription.reset(); 180 c_subscription.reset();
174 } 181 }
175 182
176 // Sanity check that callbacks with details added to the list will be run, with 183 // Sanity check that callbacks with details added to the list will be run, with
177 // the correct details, and those removed from the list will not be run. 184 // the correct details, and those removed from the list will not be run.
178 TEST(CallbackListTest, BasicTestWithParams) { 185 TEST(CallbackListTest, BasicTestWithParams) {
179 CallbackList<void(int)> cb_reg; 186 CallbackList<void(int)> cb_reg;
180 Listener a(1), b(-1), c(1); 187 Listener a(1), b(-1), c(1);
181 188
182 scoped_ptr<CallbackList<void(int)>::Subscription> a_subscription = 189 scoped_ptr<CallbackList<void(int)>::Subscription> a_subscription =
183 cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&a))); 190 cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&a)));
184 scoped_ptr<CallbackList<void(int)>::Subscription> b_subscription = 191 scoped_ptr<CallbackList<void(int)>::Subscription> b_subscription =
185 cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&b))); 192 cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&b)));
186 193
187 EXPECT_TRUE(a_subscription.get()); 194 EXPECT_TRUE(a_subscription.get());
188 EXPECT_TRUE(b_subscription.get()); 195 EXPECT_TRUE(b_subscription.get());
189 196
190 cb_reg.Notify(10); 197 cb_reg.Notify(10);
191 198
192 EXPECT_EQ(10, a.total_); 199 EXPECT_EQ(10, a.total());
193 EXPECT_EQ(-10, b.total_); 200 EXPECT_EQ(-10, b.total());
194 201
195 b_subscription.reset(); 202 b_subscription.reset();
196 203
197 scoped_ptr<CallbackList<void(int)>::Subscription> c_subscription = 204 scoped_ptr<CallbackList<void(int)>::Subscription> c_subscription =
198 cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&c))); 205 cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&c)));
199 206
200 cb_reg.Notify(10); 207 cb_reg.Notify(10);
201 208
202 EXPECT_EQ(20, a.total_); 209 EXPECT_EQ(20, a.total());
203 EXPECT_EQ(-10, b.total_); 210 EXPECT_EQ(-10, b.total());
204 EXPECT_EQ(10, c.total_); 211 EXPECT_EQ(10, c.total());
205 212
206 a_subscription.reset(); 213 a_subscription.reset();
207 b_subscription.reset(); 214 b_subscription.reset();
208 c_subscription.reset(); 215 c_subscription.reset();
209 } 216 }
210 217
211 // Test the a callback can remove itself or a different callback from the list 218 // Test the a callback can remove itself or a different callback from the list
212 // during iteration without invalidating the iterator. 219 // during iteration without invalidating the iterator.
213 TEST(CallbackListTest, RemoveCallbacksDuringIteration) { 220 TEST(CallbackListTest, RemoveCallbacksDuringIteration) {
214 CallbackList<void(void)> cb_reg; 221 CallbackList<void(void)> cb_reg;
(...skipping 13 matching lines...) Expand all
228 235
229 // |remover_1| will remove itself. 236 // |remover_1| will remove itself.
230 remover_1.SetSubscriptionToRemove(remover_1_sub.Pass()); 237 remover_1.SetSubscriptionToRemove(remover_1_sub.Pass());
231 // |remover_2| will remove a. 238 // |remover_2| will remove a.
232 remover_2.SetSubscriptionToRemove(a_subscription.Pass()); 239 remover_2.SetSubscriptionToRemove(a_subscription.Pass());
233 240
234 cb_reg.Notify(); 241 cb_reg.Notify();
235 242
236 // |remover_1| runs once (and removes itself), |remover_2| runs once (and 243 // |remover_1| runs once (and removes itself), |remover_2| runs once (and
237 // removes a), |a| never runs, and |b| runs once. 244 // removes a), |a| never runs, and |b| runs once.
238 EXPECT_EQ(1, remover_1.total_); 245 EXPECT_EQ(1, remover_1.total());
239 EXPECT_EQ(1, remover_2.total_); 246 EXPECT_EQ(1, remover_2.total());
240 EXPECT_EQ(0, a.total_); 247 EXPECT_EQ(0, a.total());
241 EXPECT_EQ(1, b.total_); 248 EXPECT_EQ(1, b.total());
242 249
243 cb_reg.Notify(); 250 cb_reg.Notify();
244 251
245 // Only |remover_2| and |b| run this time. 252 // Only |remover_2| and |b| run this time.
246 EXPECT_EQ(1, remover_1.total_); 253 EXPECT_EQ(1, remover_1.total());
247 EXPECT_EQ(2, remover_2.total_); 254 EXPECT_EQ(2, remover_2.total());
248 EXPECT_EQ(0, a.total_); 255 EXPECT_EQ(0, a.total());
249 EXPECT_EQ(2, b.total_); 256 EXPECT_EQ(2, b.total());
250 } 257 }
251 258
252 // Test that a callback can add another callback to the list durning iteration 259 // Test that a callback can add another callback to the list durning iteration
253 // without invalidating the iterator. The newly added callback should be run on 260 // without invalidating the iterator. The newly added callback should be run on
254 // the current iteration as will all other callbacks in the list. 261 // the current iteration as will all other callbacks in the list.
255 TEST(CallbackListTest, AddCallbacksDuringIteration) { 262 TEST(CallbackListTest, AddCallbacksDuringIteration) {
256 CallbackList<void(void)> cb_reg; 263 CallbackList<void(void)> cb_reg;
257 Adder a(&cb_reg); 264 Adder a(&cb_reg);
258 Listener b; 265 Listener b;
259 scoped_ptr<CallbackList<void(void)>::Subscription> a_subscription = 266 scoped_ptr<CallbackList<void(void)>::Subscription> a_subscription =
260 cb_reg.Add(Bind(&Adder::AddCallback, Unretained(&a))); 267 cb_reg.Add(Bind(&Adder::AddCallback, Unretained(&a)));
261 scoped_ptr<CallbackList<void(void)>::Subscription> b_subscription = 268 scoped_ptr<CallbackList<void(void)>::Subscription> b_subscription =
262 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b))); 269 cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b)));
263 270
264 cb_reg.Notify(); 271 cb_reg.Notify();
265 272
266 EXPECT_EQ(1, a.total_); 273 EXPECT_EQ(1, a.total());
267 EXPECT_EQ(1, b.total_); 274 EXPECT_EQ(1, b.total());
268 EXPECT_TRUE(a.added_); 275 EXPECT_TRUE(a.added());
269 276
270 cb_reg.Notify(); 277 cb_reg.Notify();
271 278
272 EXPECT_EQ(2, a.total_); 279 EXPECT_EQ(2, a.total());
273 EXPECT_EQ(2, b.total_); 280 EXPECT_EQ(2, b.total());
274 } 281 }
275 282
276 // Sanity check: notifying an empty list is a no-op. 283 // Sanity check: notifying an empty list is a no-op.
277 TEST(CallbackListTest, EmptyList) { 284 TEST(CallbackListTest, EmptyList) {
278 CallbackList<void(void)> cb_reg; 285 CallbackList<void(void)> cb_reg;
279 286
280 cb_reg.Notify(); 287 cb_reg.Notify();
281 } 288 }
282 289
283 } // namespace 290 } // namespace
284 } // namespace base 291 } // namespace base
OLDNEW
« no previous file with comments | « base/callback_list.h.pump ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698