Chromium Code Reviews| Index: ui/base/cocoa/controls/hover_image_menu_button_unittest.mm |
| diff --git a/ui/base/cocoa/controls/hover_image_menu_button_unittest.mm b/ui/base/cocoa/controls/hover_image_menu_button_unittest.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2b121fc4d032206f38b305dcb1bebdd685e7ea88 |
| --- /dev/null |
| +++ b/ui/base/cocoa/controls/hover_image_menu_button_unittest.mm |
| @@ -0,0 +1,168 @@ |
| +// Copyright 2013 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 "ui/base/cocoa/controls/hover_image_menu_button.h" |
| + |
| +#include "base/mac/foundation_util.h" |
| +#import "testing/gtest_mac.h" |
| +#import "ui/base/cocoa/controls/hover_image_menu_button_cell.h" |
| +#import "ui/base/test/ui_cocoa_test_helper.h" |
| + |
| +namespace ui { |
| + |
| +namespace { |
| + |
| +// Test initialization and display of the NSPopUpButton that shows the drop- |
| +// down menu. Don't try to show the menu, since it will block the thread. |
| +class HoverImageMenuButtonTest : public CocoaTest { |
| + public: |
| + HoverImageMenuButtonTest() {} |
| + |
| + // CocoaTest override: |
| + virtual void SetUp() OVERRIDE; |
| + |
| + protected: |
| + scoped_nsobject<HoverImageMenuButton> menu_button_; |
| + scoped_nsobject<NSImage> normal_; |
| + scoped_nsobject<NSImage> pressed_; |
| + scoped_nsobject<NSImage> hovered_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(HoverImageMenuButtonTest); |
| +}; |
| + |
| +void HoverImageMenuButtonTest::SetUp() { |
| + menu_button_.reset( |
| + [[HoverImageMenuButton alloc] initWithFrame:NSMakeRect(0, 0, 50, 30) |
| + pullsDown:YES]); |
| + |
| + normal_.reset([base::mac::ObjCCastStrict<NSImage>( |
| + [NSImage imageNamed:NSImageNameStatusAvailable]) retain]); |
|
tapted
2013/06/14 09:27:30
This seems to cause AppKit to use a custom class w
|
| + pressed_.reset([base::mac::ObjCCastStrict<NSImage>( |
| + [NSImage imageNamed:NSImageNameStatusUnavailable]) retain]); |
| + hovered_.reset([base::mac::ObjCCastStrict<NSImage>( |
| + [NSImage imageNamed:NSImageNameStatusPartiallyAvailable]) retain]); |
| + [[menu_button_ hoverImageMenuButtonCell] setImage:normal_]; |
| + [[menu_button_ hoverImageMenuButtonCell] setAlternateImage:pressed_]; |
| + [[menu_button_ hoverImageMenuButtonCell] setHoverImage:hovered_]; |
| + |
| + CocoaTest::SetUp(); |
| + [[test_window() contentView] addSubview:menu_button_]; |
| +} |
| + |
| +} // namespace |
| + |
| +TEST_VIEW(HoverImageMenuButtonTest, menu_button_); |
| + |
| +// Tests that the correct image is chosen, depending on the cell's state flags. |
| +TEST_F(HoverImageMenuButtonTest, CheckImagesForState) { |
| + EXPECT_FALSE([[menu_button_ cell] isHovered]); |
| + EXPECT_FALSE([[menu_button_ cell] isHighlighted]); |
| + EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| + |
| + [[menu_button_ cell] setHovered:YES]; |
| + EXPECT_TRUE([[menu_button_ cell] isHovered]); |
| + EXPECT_FALSE([[menu_button_ cell] isHighlighted]); |
| + EXPECT_NSEQ(hovered_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| + |
| + // Highlighted takes precendece over hover. |
| + [[menu_button_ cell] setHighlighted:YES]; |
| + EXPECT_TRUE([[menu_button_ cell] isHovered]); |
| + EXPECT_TRUE([[menu_button_ cell] isHighlighted]); |
| + EXPECT_NSEQ(pressed_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| + |
| + [[menu_button_ cell] setHovered:NO]; |
| + EXPECT_FALSE([[menu_button_ cell] isHovered]); |
| + EXPECT_TRUE([[menu_button_ cell] isHighlighted]); |
| + EXPECT_NSEQ(pressed_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| + |
| + [[menu_button_ cell] setHighlighted:NO]; |
| + EXPECT_FALSE([[menu_button_ cell] isHovered]); |
| + EXPECT_FALSE([[menu_button_ cell] isHighlighted]); |
| + EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| +} |
| + |
| +// Tests that calling the various setXImage functions calls setNeedsDisplay. |
| +TEST_F(HoverImageMenuButtonTest, NewImageCausesDisplay) { |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Note that regular setImage is overridden to ensure the image goes into the |
| + // NSPopUpButtonCell's menuItem. |
| + [[menu_button_ cell] setImage:pressed_]; |
| + |
| + // Highlighting the cell requires a redisplay. |
| + [[menu_button_ cell] setHighlighted:YES]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // setAlternateImage comes from NSButtonCell. Ensure the added setHover* |
| + // behaviour matches. |
| + [[menu_button_ cell] setAlternateImage:normal_]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Setting the same image should not cause a redisplay. |
| + [[menu_button_ cell] setAlternateImage:normal_]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Unhighlighting requires a redisplay. |
| + [[menu_button_ cell] setHighlighted:NO]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Changing hover state requires a redisplay. |
| + [[menu_button_ cell] setHovered:YES]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // setHoverImage comes directly from storage in HoverImageMenuButtonCell. |
| + [[menu_button_ cell] setHoverImage:normal_]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Setting the same image should not cause a redisplay. |
| + [[menu_button_ cell] setHoverImage:normal_]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Unhover requires a redisplay. |
| + [[menu_button_ cell] setHovered:NO]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + // Changing the image while not hovered should not require a redisplay. |
| + [[menu_button_ cell] setHoverImage:pressed_]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| +} |
| + |
| +// Test that the mouse enter and exit is properly handled, to set hover state. |
| +TEST_F(HoverImageMenuButtonTest, SimulateMouseEnterExit) { |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]); |
| + |
| + [menu_button_ mouseEntered:nil]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + EXPECT_NSEQ(hovered_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| + |
| + [menu_button_ mouseExited:nil]; |
| + EXPECT_TRUE([menu_button_ needsDisplay]); |
| + EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]); |
| + [menu_button_ display]; |
| + EXPECT_FALSE([menu_button_ needsDisplay]); |
| +} |
| + |
| +} // namespace ui |