// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import #include "base/memory/scoped_nsobject.h" #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" #include "chrome/browser/ui/cocoa/infobars/mock_confirm_infobar_delegate.h" #include "chrome/browser/ui/cocoa/infobars/mock_link_infobar_delegate.h" #import "chrome/browser/ui/cocoa/view_resizer_pong.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" namespace { class InfoBarContainerControllerTest : public CocoaTest { virtual void SetUp() { CocoaTest::SetUp(); resizeDelegate_.reset([[ViewResizerPong alloc] init]); ViewResizerPong *viewResizer = resizeDelegate_.get(); controller_ = [[InfoBarContainerController alloc] initWithResizeDelegate:viewResizer]; NSView* view = [controller_ view]; [[test_window() contentView] addSubview:view]; } virtual void TearDown() { [[controller_ view] removeFromSuperviewWithoutNeedingDisplay]; [controller_ release]; CocoaTest::TearDown(); } public: scoped_nsobject resizeDelegate_; InfoBarContainerController* controller_; }; TEST_VIEW(InfoBarContainerControllerTest, [controller_ view]) TEST_F(InfoBarContainerControllerTest, BWCPong) { // Call positionInfoBarsAndResize and check that |resizeDelegate_| got a // resize message. [resizeDelegate_ setHeight:-1]; [controller_ positionInfoBarsAndRedraw]; EXPECT_NE(-1, [resizeDelegate_ height]); } TEST_F(InfoBarContainerControllerTest, AddAndRemoveInfoBars) { NSView* view = [controller_ view]; // Add three infobars and then remove them. // After each step check to make sure we have the correct number of // infobar subviews. // These delegates delete themselves when they're told their infobars have // closed. InfoBarDelegate* linkDelegate = new MockLinkInfoBarDelegate(NULL); InfoBarDelegate* linkDelegate2 = new MockLinkInfoBarDelegate(NULL); InfoBarDelegate* confirmDelegate = new MockConfirmInfoBarDelegate(NULL); [controller_ addInfoBar:linkDelegate->CreateInfoBar(NULL) animate:NO]; EXPECT_EQ(1U, [[view subviews] count]); [controller_ addInfoBar:confirmDelegate->CreateInfoBar(NULL) animate:NO]; EXPECT_EQ(2U, [[view subviews] count]); [controller_ addInfoBar:linkDelegate2->CreateInfoBar(NULL) animate:NO]; EXPECT_EQ(3U, [[view subviews] count]); // Just to mix things up, remove them in a different order. [controller_ closeInfoBarsForDelegate:confirmDelegate animate:NO]; EXPECT_EQ(2U, [[view subviews] count]); [controller_ closeInfoBarsForDelegate:linkDelegate animate:NO]; EXPECT_EQ(1U, [[view subviews] count]); [controller_ closeInfoBarsForDelegate:linkDelegate2 animate:NO]; EXPECT_EQ(0U, [[view subviews] count]); } TEST_F(InfoBarContainerControllerTest, RemoveAllInfoBars) { NSView* view = [controller_ view]; // Add three infobars and then remove them all. // removeAllInfobars does not close these, so we stack-allocate them so // they'll get cleaned up. MockLinkInfoBarDelegate linkDelegate(NULL); MockConfirmInfoBarDelegate confirmDelegate(NULL); MockConfirmInfoBarDelegate confirmDelegate2(NULL); InfoBarDelegate* linkDelegatePtr = &linkDelegate; InfoBarDelegate* confirmDelegatePtr = &confirmDelegate; InfoBarDelegate* confirmDelegate2Ptr = &confirmDelegate2; [controller_ addInfoBar:linkDelegatePtr->CreateInfoBar(NULL) animate:NO]; [controller_ addInfoBar:confirmDelegatePtr->CreateInfoBar(NULL) animate:NO]; [controller_ addInfoBar:confirmDelegate2Ptr->CreateInfoBar(NULL) animate:NO]; EXPECT_EQ(3U, [[view subviews] count]); [controller_ removeAllInfoBars]; EXPECT_EQ(0U, [[view subviews] count]); } } // namespace