OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |