Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / ui / base / cocoa / controls / hover_image_menu_button_unittest.mm
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #import "ui/base/cocoa/controls/hover_image_menu_button.h"
6
7 #include "base/mac/foundation_util.h"
8 #import "testing/gtest_mac.h"
9 #import "ui/base/cocoa/controls/hover_image_menu_button_cell.h"
10 #import "ui/gfx/test/ui_cocoa_test_helper.h"
11
12 namespace ui {
13
14 namespace {
15
16 // Test initialization and display of the NSPopUpButton that shows the drop-
17 // down menu. Don't try to show the menu, since it will block the thread.
18 class HoverImageMenuButtonTest : public CocoaTest {
19  public:
20   HoverImageMenuButtonTest() {}
21
22   // CocoaTest override:
23   virtual void SetUp() OVERRIDE;
24
25  protected:
26   base::scoped_nsobject<HoverImageMenuButton> menu_button_;
27   base::scoped_nsobject<NSImage> normal_;
28   base::scoped_nsobject<NSImage> pressed_;
29   base::scoped_nsobject<NSImage> hovered_;
30
31   DISALLOW_COPY_AND_ASSIGN(HoverImageMenuButtonTest);
32 };
33
34 void HoverImageMenuButtonTest::SetUp() {
35   menu_button_.reset(
36       [[HoverImageMenuButton alloc] initWithFrame:NSMakeRect(0, 0, 50, 30)
37                                         pullsDown:YES]);
38
39   normal_.reset([base::mac::ObjCCastStrict<NSImage>(
40       [NSImage imageNamed:NSImageNameStatusAvailable]) retain]);
41   pressed_.reset([base::mac::ObjCCastStrict<NSImage>(
42       [NSImage imageNamed:NSImageNameStatusUnavailable]) retain]);
43   hovered_.reset([base::mac::ObjCCastStrict<NSImage>(
44       [NSImage imageNamed:NSImageNameStatusPartiallyAvailable]) retain]);
45   [[menu_button_ hoverImageMenuButtonCell] setDefaultImage:normal_];
46   [[menu_button_ hoverImageMenuButtonCell] setAlternateImage:pressed_];
47   [[menu_button_ hoverImageMenuButtonCell] setHoverImage:hovered_];
48
49   CocoaTest::SetUp();
50   [[test_window() contentView] addSubview:menu_button_];
51 }
52
53 }  // namespace
54
55 TEST_VIEW(HoverImageMenuButtonTest, menu_button_);
56
57 // Tests that the correct image is chosen, depending on the cell's state flags.
58 TEST_F(HoverImageMenuButtonTest, CheckImagesForState) {
59   EXPECT_FALSE([[menu_button_ cell] isHovered]);
60   EXPECT_FALSE([[menu_button_ cell] isHighlighted]);
61   EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]);
62   [menu_button_ display];
63
64   [[menu_button_ cell] setHovered:YES];
65   EXPECT_TRUE([[menu_button_ cell] isHovered]);
66   EXPECT_FALSE([[menu_button_ cell] isHighlighted]);
67   EXPECT_NSEQ(hovered_, [[menu_button_ cell] imageToDraw]);
68   [menu_button_ display];
69
70   // Highlighted takes precendece over hover.
71   [[menu_button_ cell] setHighlighted:YES];
72   EXPECT_TRUE([[menu_button_ cell] isHovered]);
73   EXPECT_TRUE([[menu_button_ cell] isHighlighted]);
74   EXPECT_NSEQ(pressed_, [[menu_button_ cell] imageToDraw]);
75   [menu_button_ display];
76
77   [[menu_button_ cell] setHovered:NO];
78   EXPECT_FALSE([[menu_button_ cell] isHovered]);
79   EXPECT_TRUE([[menu_button_ cell] isHighlighted]);
80   EXPECT_NSEQ(pressed_, [[menu_button_ cell] imageToDraw]);
81   [menu_button_ display];
82
83   [[menu_button_ cell] setHighlighted:NO];
84   EXPECT_FALSE([[menu_button_ cell] isHovered]);
85   EXPECT_FALSE([[menu_button_ cell] isHighlighted]);
86   EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]);
87   [menu_button_ display];
88 }
89
90 // Tests that calling the various setXImage functions calls setNeedsDisplay.
91 TEST_F(HoverImageMenuButtonTest, NewImageCausesDisplay) {
92   [menu_button_ display];
93   EXPECT_FALSE([menu_button_ needsDisplay]);
94
95   // Uses setDefaultImage rather than setImage to ensure the image goes into the
96   // NSPopUpButtonCell's menuItem. It is then accessible using [NSCell image].
97   EXPECT_NSEQ(normal_, [[menu_button_ cell] image]);
98   [[menu_button_ cell] setDefaultImage:pressed_];
99   EXPECT_NSEQ(pressed_, [[menu_button_ cell] image]);
100   EXPECT_TRUE([menu_button_ needsDisplay]);
101   [menu_button_ display];
102   EXPECT_FALSE([menu_button_ needsDisplay]);
103
104   // Highlighting the cell requires a redisplay.
105   [[menu_button_ cell] setHighlighted:YES];
106   EXPECT_TRUE([menu_button_ needsDisplay]);
107   [menu_button_ display];
108   EXPECT_FALSE([menu_button_ needsDisplay]);
109
110   // setAlternateImage comes from NSButtonCell. Ensure the added setHover*
111   // behaviour matches.
112   [[menu_button_ cell] setAlternateImage:normal_];
113   EXPECT_TRUE([menu_button_ needsDisplay]);
114   [menu_button_ display];
115   EXPECT_FALSE([menu_button_ needsDisplay]);
116
117   // Setting the same image should not cause a redisplay.
118   [[menu_button_ cell] setAlternateImage:normal_];
119   EXPECT_FALSE([menu_button_ needsDisplay]);
120
121   // Unhighlighting requires a redisplay.
122   [[menu_button_ cell] setHighlighted:NO];
123   EXPECT_TRUE([menu_button_ needsDisplay]);
124   [menu_button_ display];
125   EXPECT_FALSE([menu_button_ needsDisplay]);
126
127   // Changing hover state requires a redisplay.
128   [[menu_button_ cell] setHovered:YES];
129   EXPECT_TRUE([menu_button_ needsDisplay]);
130   [menu_button_ display];
131   EXPECT_FALSE([menu_button_ needsDisplay]);
132
133   // setHoverImage comes directly from storage in HoverImageMenuButtonCell.
134   [[menu_button_ cell] setHoverImage:normal_];
135   EXPECT_TRUE([menu_button_ needsDisplay]);
136   [menu_button_ display];
137   EXPECT_FALSE([menu_button_ needsDisplay]);
138
139   // Setting the same image should not cause a redisplay.
140   [[menu_button_ cell] setHoverImage:normal_];
141   EXPECT_FALSE([menu_button_ needsDisplay]);
142
143   // Unhover requires a redisplay.
144   [[menu_button_ cell] setHovered:NO];
145   EXPECT_TRUE([menu_button_ needsDisplay]);
146   [menu_button_ display];
147   EXPECT_FALSE([menu_button_ needsDisplay]);
148
149   // Changing the image while not hovered should not require a redisplay.
150   [[menu_button_ cell] setHoverImage:pressed_];
151   EXPECT_FALSE([menu_button_ needsDisplay]);
152 }
153
154 // Test that the mouse enter and exit is properly handled, to set hover state.
155 TEST_F(HoverImageMenuButtonTest, SimulateMouseEnterExit) {
156   [menu_button_ display];
157   EXPECT_FALSE([menu_button_ needsDisplay]);
158   EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]);
159
160   [menu_button_ mouseEntered:nil];
161   EXPECT_TRUE([menu_button_ needsDisplay]);
162   EXPECT_NSEQ(hovered_, [[menu_button_ cell] imageToDraw]);
163   [menu_button_ display];
164   EXPECT_FALSE([menu_button_ needsDisplay]);
165
166   [menu_button_ mouseExited:nil];
167   EXPECT_TRUE([menu_button_ needsDisplay]);
168   EXPECT_NSEQ(normal_, [[menu_button_ cell] imageToDraw]);
169   [menu_button_ display];
170   EXPECT_FALSE([menu_button_ needsDisplay]);
171 }
172
173 }  // namespace ui