1// Copyright (c) 2011 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 <Cocoa/Cocoa.h>
6
7#include "base/mac/scoped_nsobject.h"
8#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
9#import "chrome/browser/ui/cocoa/gradient_button_cell.h"
10#include "testing/gtest/include/gtest/gtest.h"
11#include "testing/platform_test.h"
12
13@interface GradientButtonCell (HoverValueTesting)
14- (void)performOnePulseStep;
15@end
16
17namespace {
18
19class GradientButtonCellTest : public CocoaTest {
20 public:
21  GradientButtonCellTest() {
22    NSRect frame = NSMakeRect(0, 0, 50, 30);
23    base::scoped_nsobject<NSButton> view(
24        [[NSButton alloc] initWithFrame:frame]);
25    view_ = view.get();
26    base::scoped_nsobject<GradientButtonCell> cell(
27        [[GradientButtonCell alloc] initTextCell:@"Testing"]);
28    [view_ setCell:cell.get()];
29    [[test_window() contentView] addSubview:view_];
30  }
31
32  NSButton* view_;
33};
34
35TEST_VIEW(GradientButtonCellTest, view_)
36
37// Test drawing, mostly to ensure nothing leaks or crashes.
38TEST_F(GradientButtonCellTest, DisplayWithHover) {
39  [[view_ cell] setHoverAlpha:0.0];
40  [view_ display];
41  [[view_ cell] setHoverAlpha:0.5];
42  [view_ display];
43  [[view_ cell] setHoverAlpha:1.0];
44  [view_ display];
45}
46
47// Test hover, mostly to ensure nothing leaks or crashes.
48TEST_F(GradientButtonCellTest, Hover) {
49  GradientButtonCell* cell = [view_ cell];
50  [cell setMouseInside:YES animate:NO];
51  EXPECT_EQ([[view_ cell] hoverAlpha], 1.0);
52
53  [cell setMouseInside:NO animate:YES];
54  CGFloat alpha1 = [cell hoverAlpha];
55  [cell performOnePulseStep];
56  CGFloat alpha2 = [cell hoverAlpha];
57  EXPECT_TRUE(alpha2 < alpha1);
58}
59
60// Tracking rects
61TEST_F(GradientButtonCellTest, TrackingRects) {
62  GradientButtonCell* cell = [view_ cell];
63  EXPECT_FALSE([cell showsBorderOnlyWhileMouseInside]);
64  EXPECT_FALSE([cell isMouseInside]);
65
66  [cell setShowsBorderOnlyWhileMouseInside:YES];
67  [cell mouseEntered:nil];
68  EXPECT_TRUE([cell isMouseInside]);
69  [cell mouseExited:nil];
70  EXPECT_FALSE([cell isMouseInside]);
71
72  [cell setShowsBorderOnlyWhileMouseInside:NO];
73  EXPECT_FALSE([cell isMouseInside]);
74
75  [cell setShowsBorderOnlyWhileMouseInside:YES];
76  [cell setShowsBorderOnlyWhileMouseInside:YES];
77  [cell setShowsBorderOnlyWhileMouseInside:NO];
78  [cell setShowsBorderOnlyWhileMouseInside:NO];
79}
80
81TEST_F(GradientButtonCellTest, ContinuousPulseOnOff) {
82  GradientButtonCell* cell = [view_ cell];
83
84  // On/off
85  EXPECT_FALSE([cell isContinuousPulsing]);
86  [cell setIsContinuousPulsing:YES];
87  EXPECT_TRUE([cell isContinuousPulsing]);
88  EXPECT_TRUE([cell pulsing]);
89  [cell setIsContinuousPulsing:NO];
90  EXPECT_FALSE([cell isContinuousPulsing]);
91
92  // On/safeOff
93  [cell setIsContinuousPulsing:YES];
94  EXPECT_TRUE([cell isContinuousPulsing]);
95  [cell safelyStopPulsing];
96}
97
98// More for valgrind; we don't confirm state change does anything useful.
99TEST_F(GradientButtonCellTest, PulseState) {
100  GradientButtonCell* cell = [view_ cell];
101
102  [cell setMouseInside:YES animate:YES];
103  // Allow for immediate state changes to keep test unflaky
104  EXPECT_TRUE(([cell pulseState] == gradient_button_cell::kPulsingOn) ||
105              ([cell pulseState] == gradient_button_cell::kPulsedOn));
106
107  [cell setMouseInside:NO animate:YES];
108  // Allow for immediate state changes to keep test unflaky
109  EXPECT_TRUE(([cell pulseState] == gradient_button_cell::kPulsingOff) ||
110              ([cell pulseState] == gradient_button_cell::kPulsedOff));
111}
112
113// Test drawing when first responder, mostly to ensure nothing leaks or
114// crashes.
115TEST_F(GradientButtonCellTest, FirstResponder) {
116  [test_window() makePretendKeyWindowAndSetFirstResponder:view_];
117  [view_ display];
118}
119
120}  // namespace
121