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..45ed3689f0699e9d9ca3cd8882f2057bb356f95a |
--- /dev/null |
+++ b/ui/base/cocoa/controls/hover_image_menu_button_unittest.mm |
@@ -0,0 +1,173 @@ |
+// 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]); |
+ pressed_.reset([base::mac::ObjCCastStrict<NSImage>( |
+ [NSImage imageNamed:NSImageNameStatusUnavailable]) retain]); |
+ hovered_.reset([base::mac::ObjCCastStrict<NSImage>( |
+ [NSImage imageNamed:NSImageNameStatusPartiallyAvailable]) retain]); |
+ [[menu_button_ hoverImageMenuButtonCell] setDefaultImage: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]); |
+ |
+ // Uses setDefaultImage rather than setImage to ensure the image goes into the |
+ // NSPopUpButtonCell's menuItem. It is then accessible using [NSCell image]. |
+ EXPECT_NSEQ(normal_, [[menu_button_ cell] image]); |
+ [[menu_button_ cell] setDefaultImage:pressed_]; |
+ EXPECT_NSEQ(pressed_, [[menu_button_ cell] image]); |
+ EXPECT_TRUE([menu_button_ needsDisplay]); |
+ [menu_button_ display]; |
+ EXPECT_FALSE([menu_button_ needsDisplay]); |
+ |
+ // 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 |