| 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 |