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

Side by Side Diff: components/bubble/bubble_manager_unittest.cc

Issue 1310483003: Add ability for a BubbleReference to update the BubbleUI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bm-reference-own-file.gitbr
Patch Set: Add UI thread checks to controller Created 5 years, 3 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
« no previous file with comments | « components/bubble/bubble_delegate.cc ('k') | components/bubble/bubble_ui.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/bubble/bubble_manager.h" 5 #include "components/bubble/bubble_manager.h"
6 6
7 #include "components/bubble/bubble_controller.h" 7 #include "components/bubble/bubble_controller.h"
8 #include "components/bubble/bubble_delegate.h" 8 #include "components/bubble/bubble_delegate.h"
9 #include "components/bubble/bubble_reference.h"
9 #include "components/bubble/bubble_ui.h" 10 #include "components/bubble/bubble_ui.h"
10 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
12 13
13 namespace { 14 namespace {
14 15
15 class MockBubbleUI : public BubbleUI { 16 class MockBubbleUi : public BubbleUi {
16 public: 17 public:
17 MockBubbleUI() {} 18 MockBubbleUi() {}
18 ~MockBubbleUI() override { Destroyed(); } 19 ~MockBubbleUi() override { Destroyed(); }
19 20
20 MOCK_METHOD1(Show, void(BubbleReference)); 21 MOCK_METHOD1(Show, void(BubbleReference));
21 MOCK_METHOD0(Close, void()); 22 MOCK_METHOD0(Close, void());
22 MOCK_METHOD0(UpdateAnchorPosition, void()); 23 MOCK_METHOD0(UpdateAnchorPosition, void());
23 24
24 // To verify destructor call. 25 // To verify destructor call.
25 MOCK_METHOD0(Destroyed, void()); 26 MOCK_METHOD0(Destroyed, void());
26 }; 27 };
27 28
28 class MockBubbleDelegate : public BubbleDelegate { 29 class MockBubbleDelegate : public BubbleDelegate {
29 public: 30 public:
30 MockBubbleDelegate() {} 31 MockBubbleDelegate() {}
31 ~MockBubbleDelegate() override { Destroyed(); } 32 ~MockBubbleDelegate() override { Destroyed(); }
32 33
33 // Default bubble shows UI and closes when asked to close. 34 // Default bubble shows UI and closes when asked to close.
34 static scoped_ptr<MockBubbleDelegate> Default(); 35 static scoped_ptr<MockBubbleDelegate> Default();
35 36
36 // Stubborn bubble shows UI and doesn't want to close. 37 // Stubborn bubble shows UI and doesn't want to close.
37 static scoped_ptr<MockBubbleDelegate> Stubborn(); 38 static scoped_ptr<MockBubbleDelegate> Stubborn();
38 39
39 MOCK_METHOD1(ShouldClose, bool(BubbleCloseReason reason)); 40 MOCK_METHOD1(ShouldClose, bool(BubbleCloseReason reason));
40 41
41 // A scoped_ptr can't be returned in MOCK_METHOD. 42 // A scoped_ptr can't be returned in MOCK_METHOD.
42 MOCK_METHOD0(BuildBubbleUIMock, BubbleUI*()); 43 MOCK_METHOD0(BuildBubbleUiMock, BubbleUi*());
43 scoped_ptr<BubbleUI> BuildBubbleUI() override { 44 scoped_ptr<BubbleUi> BuildBubbleUi() override {
44 return make_scoped_ptr(BuildBubbleUIMock()); 45 return make_scoped_ptr(BuildBubbleUiMock());
45 } 46 }
46 47
48 MOCK_METHOD1(UpdateBubbleUi, bool(BubbleUi*));
49
47 // To verify destructor call. 50 // To verify destructor call.
48 MOCK_METHOD0(Destroyed, void()); 51 MOCK_METHOD0(Destroyed, void());
49 }; 52 };
50 53
51 // static 54 // static
52 scoped_ptr<MockBubbleDelegate> MockBubbleDelegate::Default() { 55 scoped_ptr<MockBubbleDelegate> MockBubbleDelegate::Default() {
53 MockBubbleDelegate* delegate = new MockBubbleDelegate; 56 MockBubbleDelegate* delegate = new MockBubbleDelegate;
54 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 57 EXPECT_CALL(*delegate, BuildBubbleUiMock())
55 .WillOnce(testing::Return(new MockBubbleUI)); 58 .WillOnce(testing::Return(new MockBubbleUi));
56 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 59 EXPECT_CALL(*delegate, ShouldClose(testing::_))
57 .WillOnce(testing::Return(true)); 60 .WillOnce(testing::Return(true));
58 return make_scoped_ptr(delegate); 61 return make_scoped_ptr(delegate);
59 } 62 }
60 63
61 // static 64 // static
62 scoped_ptr<MockBubbleDelegate> MockBubbleDelegate::Stubborn() { 65 scoped_ptr<MockBubbleDelegate> MockBubbleDelegate::Stubborn() {
63 MockBubbleDelegate* delegate = new MockBubbleDelegate; 66 MockBubbleDelegate* delegate = new MockBubbleDelegate;
64 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 67 EXPECT_CALL(*delegate, BuildBubbleUiMock())
65 .WillOnce(testing::Return(new MockBubbleUI)); 68 .WillOnce(testing::Return(new MockBubbleUi));
66 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 69 EXPECT_CALL(*delegate, ShouldClose(testing::_))
67 .WillRepeatedly(testing::Return(false)); 70 .WillRepeatedly(testing::Return(false));
68 return make_scoped_ptr(delegate); 71 return make_scoped_ptr(delegate);
69 } 72 }
70 73
71 // Helper class used to test chaining another bubble. 74 // Helper class used to test chaining another bubble.
72 class DelegateChainHelper { 75 class DelegateChainHelper {
73 public: 76 public:
74 DelegateChainHelper(BubbleManager* manager, 77 DelegateChainHelper(BubbleManager* manager,
75 scoped_ptr<BubbleDelegate> next_delegate); 78 scoped_ptr<BubbleDelegate> next_delegate);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 void BubbleManagerTest::SetUp() { 110 void BubbleManagerTest::SetUp() {
108 testing::Test::SetUp(); 111 testing::Test::SetUp();
109 manager_.reset(new BubbleManager); 112 manager_.reset(new BubbleManager);
110 } 113 }
111 114
112 void BubbleManagerTest::TearDown() { 115 void BubbleManagerTest::TearDown() {
113 manager_.reset(); 116 manager_.reset();
114 testing::Test::TearDown(); 117 testing::Test::TearDown();
115 } 118 }
116 119
117 TEST_F(BubbleManagerTest, ManagerShowsBubbleUI) { 120 TEST_F(BubbleManagerTest, ManagerShowsBubbleUi) {
118 // Manager will delete bubble_ui. 121 // Manager will delete bubble_ui.
119 MockBubbleUI* bubble_ui = new MockBubbleUI; 122 MockBubbleUi* bubble_ui = new MockBubbleUi;
120 EXPECT_CALL(*bubble_ui, Destroyed()); 123 EXPECT_CALL(*bubble_ui, Destroyed());
121 EXPECT_CALL(*bubble_ui, Show(testing::_)); 124 EXPECT_CALL(*bubble_ui, Show(testing::_));
122 EXPECT_CALL(*bubble_ui, Close()); 125 EXPECT_CALL(*bubble_ui, Close());
123 EXPECT_CALL(*bubble_ui, UpdateAnchorPosition()).Times(0); 126 EXPECT_CALL(*bubble_ui, UpdateAnchorPosition()).Times(0);
124 127
125 // Manager will delete delegate. 128 // Manager will delete delegate.
126 MockBubbleDelegate* delegate = new MockBubbleDelegate; 129 MockBubbleDelegate* delegate = new MockBubbleDelegate;
127 EXPECT_CALL(*delegate, Destroyed()); 130 EXPECT_CALL(*delegate, Destroyed());
128 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 131 EXPECT_CALL(*delegate, BuildBubbleUiMock())
129 .WillOnce(testing::Return(bubble_ui)); 132 .WillOnce(testing::Return(bubble_ui));
130 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 133 EXPECT_CALL(*delegate, ShouldClose(testing::_))
131 .WillOnce(testing::Return(true)); 134 .WillOnce(testing::Return(true));
132 135
133 manager_->ShowBubble(make_scoped_ptr(delegate)); 136 manager_->ShowBubble(make_scoped_ptr(delegate));
134 } 137 }
135 138
136 TEST_F(BubbleManagerTest, ManagerUpdatesBubbleUI) { 139 TEST_F(BubbleManagerTest, ManagerUpdatesBubbleUi) {
137 // Manager will delete bubble_ui. 140 // Manager will delete bubble_ui.
138 MockBubbleUI* bubble_ui = new MockBubbleUI; 141 MockBubbleUi* bubble_ui = new MockBubbleUi;
139 EXPECT_CALL(*bubble_ui, Destroyed()); 142 EXPECT_CALL(*bubble_ui, Destroyed());
140 EXPECT_CALL(*bubble_ui, Show(testing::_)); 143 EXPECT_CALL(*bubble_ui, Show(testing::_));
141 EXPECT_CALL(*bubble_ui, Close()); 144 EXPECT_CALL(*bubble_ui, Close());
142 EXPECT_CALL(*bubble_ui, UpdateAnchorPosition()); 145 EXPECT_CALL(*bubble_ui, UpdateAnchorPosition());
143 146
144 // Manager will delete delegate. 147 // Manager will delete delegate.
145 MockBubbleDelegate* delegate = new MockBubbleDelegate; 148 MockBubbleDelegate* delegate = new MockBubbleDelegate;
146 EXPECT_CALL(*delegate, Destroyed()); 149 EXPECT_CALL(*delegate, Destroyed());
147 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 150 EXPECT_CALL(*delegate, BuildBubbleUiMock())
148 .WillOnce(testing::Return(bubble_ui)); 151 .WillOnce(testing::Return(bubble_ui));
149 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 152 EXPECT_CALL(*delegate, ShouldClose(testing::_))
150 .WillOnce(testing::Return(true)); 153 .WillOnce(testing::Return(true));
151 154
152 manager_->ShowBubble(make_scoped_ptr(delegate)); 155 manager_->ShowBubble(make_scoped_ptr(delegate));
153 manager_->UpdateAllBubbleAnchors(); 156 manager_->UpdateAllBubbleAnchors();
154 } 157 }
155 158
156 TEST_F(BubbleManagerTest, CloseOnReferenceInvalidatesReference) { 159 TEST_F(BubbleManagerTest, CloseOnReferenceInvalidatesReference) {
157 BubbleReference ref = manager_->ShowBubble(MockBubbleDelegate::Default()); 160 BubbleReference ref = manager_->ShowBubble(MockBubbleDelegate::Default());
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 // Bubble should NOT get a close event because it's already closed. 283 // Bubble should NOT get a close event because it's already closed.
281 manager_->CloseAllBubbles(BUBBLE_CLOSE_FOCUS_LOST); 284 manager_->CloseAllBubbles(BUBBLE_CLOSE_FOCUS_LOST);
282 } 285 }
283 286
284 TEST_F(BubbleManagerTest, AllowBubbleChainingOnClose) { 287 TEST_F(BubbleManagerTest, AllowBubbleChainingOnClose) {
285 scoped_ptr<BubbleDelegate> chained_delegate = MockBubbleDelegate::Default(); 288 scoped_ptr<BubbleDelegate> chained_delegate = MockBubbleDelegate::Default();
286 DelegateChainHelper chain_helper(manager_.get(), chained_delegate.Pass()); 289 DelegateChainHelper chain_helper(manager_.get(), chained_delegate.Pass());
287 290
288 // Manager will delete delegate. 291 // Manager will delete delegate.
289 MockBubbleDelegate* delegate = new MockBubbleDelegate; 292 MockBubbleDelegate* delegate = new MockBubbleDelegate;
290 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 293 EXPECT_CALL(*delegate, BuildBubbleUiMock())
291 .WillOnce(testing::Return(new MockBubbleUI)); 294 .WillOnce(testing::Return(new MockBubbleUi));
292 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 295 EXPECT_CALL(*delegate, ShouldClose(testing::_))
293 .WillOnce(testing::DoAll(testing::InvokeWithoutArgs( 296 .WillOnce(testing::DoAll(testing::InvokeWithoutArgs(
294 &chain_helper, &DelegateChainHelper::Chain), 297 &chain_helper, &DelegateChainHelper::Chain),
295 testing::Return(true))); 298 testing::Return(true)));
296 299
297 BubbleReference ref = manager_->ShowBubble(make_scoped_ptr(delegate)); 300 BubbleReference ref = manager_->ShowBubble(make_scoped_ptr(delegate));
298 ASSERT_TRUE(manager_->CloseBubble(ref, BUBBLE_CLOSE_FORCED)); 301 ASSERT_TRUE(manager_->CloseBubble(ref, BUBBLE_CLOSE_FORCED));
299 302
300 ASSERT_TRUE(chain_helper.BubbleWasTaken()); 303 ASSERT_TRUE(chain_helper.BubbleWasTaken());
301 } 304 }
302 305
303 TEST_F(BubbleManagerTest, AllowBubbleChainingOnCloseAll) { 306 TEST_F(BubbleManagerTest, AllowBubbleChainingOnCloseAll) {
304 scoped_ptr<BubbleDelegate> chained_delegate = MockBubbleDelegate::Default(); 307 scoped_ptr<BubbleDelegate> chained_delegate = MockBubbleDelegate::Default();
305 DelegateChainHelper chain_helper(manager_.get(), chained_delegate.Pass()); 308 DelegateChainHelper chain_helper(manager_.get(), chained_delegate.Pass());
306 309
307 // Manager will delete delegate. 310 // Manager will delete delegate.
308 MockBubbleDelegate* delegate = new MockBubbleDelegate; 311 MockBubbleDelegate* delegate = new MockBubbleDelegate;
309 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 312 EXPECT_CALL(*delegate, BuildBubbleUiMock())
310 .WillOnce(testing::Return(new MockBubbleUI)); 313 .WillOnce(testing::Return(new MockBubbleUi));
311 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 314 EXPECT_CALL(*delegate, ShouldClose(testing::_))
312 .WillOnce(testing::DoAll(testing::InvokeWithoutArgs( 315 .WillOnce(testing::DoAll(testing::InvokeWithoutArgs(
313 &chain_helper, &DelegateChainHelper::Chain), 316 &chain_helper, &DelegateChainHelper::Chain),
314 testing::Return(true))); 317 testing::Return(true)));
315 318
316 manager_->ShowBubble(make_scoped_ptr(delegate)); 319 manager_->ShowBubble(make_scoped_ptr(delegate));
317 manager_->CloseAllBubbles(BUBBLE_CLOSE_FORCED); 320 manager_->CloseAllBubbles(BUBBLE_CLOSE_FORCED);
318 321
319 ASSERT_TRUE(chain_helper.BubbleWasTaken()); 322 ASSERT_TRUE(chain_helper.BubbleWasTaken());
320 } 323 }
321 324
322 TEST_F(BubbleManagerTest, BubblesDoNotChainOnDestroy) { 325 TEST_F(BubbleManagerTest, BubblesDoNotChainOnDestroy) {
323 // Manager will delete delegate. 326 // Manager will delete delegate.
324 MockBubbleDelegate* chained_delegate = new MockBubbleDelegate; 327 MockBubbleDelegate* chained_delegate = new MockBubbleDelegate;
325 EXPECT_CALL(*chained_delegate, BuildBubbleUIMock()).Times(0); 328 EXPECT_CALL(*chained_delegate, BuildBubbleUiMock()).Times(0);
326 EXPECT_CALL(*chained_delegate, ShouldClose(testing::_)).Times(0); 329 EXPECT_CALL(*chained_delegate, ShouldClose(testing::_)).Times(0);
327 330
328 DelegateChainHelper chain_helper(manager_.get(), 331 DelegateChainHelper chain_helper(manager_.get(),
329 make_scoped_ptr(chained_delegate)); 332 make_scoped_ptr(chained_delegate));
330 333
331 // Manager will delete delegate. 334 // Manager will delete delegate.
332 MockBubbleDelegate* delegate = new MockBubbleDelegate; 335 MockBubbleDelegate* delegate = new MockBubbleDelegate;
333 EXPECT_CALL(*delegate, BuildBubbleUIMock()) 336 EXPECT_CALL(*delegate, BuildBubbleUiMock())
334 .WillOnce(testing::Return(new MockBubbleUI)); 337 .WillOnce(testing::Return(new MockBubbleUi));
335 EXPECT_CALL(*delegate, ShouldClose(testing::_)) 338 EXPECT_CALL(*delegate, ShouldClose(testing::_))
336 .WillOnce(testing::DoAll(testing::InvokeWithoutArgs( 339 .WillOnce(testing::DoAll(testing::InvokeWithoutArgs(
337 &chain_helper, &DelegateChainHelper::Chain), 340 &chain_helper, &DelegateChainHelper::Chain),
338 testing::Return(true))); 341 testing::Return(true)));
339 342
340 manager_->ShowBubble(make_scoped_ptr(delegate)); 343 manager_->ShowBubble(make_scoped_ptr(delegate));
341 manager_.reset(); 344 manager_.reset();
342 345
343 // The manager will take the bubble, but not show it. 346 // The manager will take the bubble, but not show it.
344 ASSERT_TRUE(chain_helper.BubbleWasTaken()); 347 ASSERT_TRUE(chain_helper.BubbleWasTaken());
345 } 348 }
346 349
350 TEST_F(BubbleManagerTest, BubbleUpdatesTrue) {
351 MockBubbleUi* bubble_ui = new MockBubbleUi;
352 MockBubbleDelegate* delegate = new MockBubbleDelegate;
353 EXPECT_CALL(*delegate, BuildBubbleUiMock())
354 .WillOnce(testing::Return(bubble_ui));
355 EXPECT_CALL(*delegate, ShouldClose(testing::_))
356 .WillOnce(testing::Return(true));
357 EXPECT_CALL(*delegate, UpdateBubbleUi(bubble_ui))
358 .WillOnce(testing::Return(true));
359
360 BubbleReference ref = manager_->ShowBubble(make_scoped_ptr(delegate));
361 ASSERT_TRUE(ref->UpdateBubbleUi());
362 }
363
364 TEST_F(BubbleManagerTest, BubbleUpdatesFalse) {
365 MockBubbleUi* bubble_ui = new MockBubbleUi;
366 MockBubbleDelegate* delegate = new MockBubbleDelegate;
367 EXPECT_CALL(*delegate, BuildBubbleUiMock())
368 .WillOnce(testing::Return(bubble_ui));
369 EXPECT_CALL(*delegate, ShouldClose(testing::_))
370 .WillOnce(testing::Return(true));
371 EXPECT_CALL(*delegate, UpdateBubbleUi(bubble_ui))
372 .WillOnce(testing::Return(false));
373
374 BubbleReference ref = manager_->ShowBubble(make_scoped_ptr(delegate));
375 ASSERT_FALSE(ref->UpdateBubbleUi());
376 }
377
347 } // namespace 378 } // namespace
OLDNEW
« no previous file with comments | « components/bubble/bubble_delegate.cc ('k') | components/bubble/bubble_ui.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698