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