| // Copyright (c) 2011 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. |
| |
| #include "base/mac/scoped_nsobject.h" |
| #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" |
| #import "chrome/browser/ui/cocoa/draggable_button.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "testing/platform_test.h" |
| #import "ui/events/test/cocoa_test_event_utils.h" |
| |
| @interface TestableDraggableButton : DraggableButton { |
| NSUInteger dragCount_; |
| BOOL wasTriggered_; |
| } |
| - (void)trigger:(id)sender; |
| - (BOOL)wasTriggered; |
| - (NSUInteger)dragCount; |
| @end |
| |
| @implementation TestableDraggableButton |
| - (id)initWithFrame:(NSRect)frame { |
| if ((self = [super initWithFrame:frame])) { |
| dragCount_ = 0; |
| wasTriggered_ = NO; |
| } |
| return self; |
| } |
| - (void)beginDrag:(NSEvent*)theEvent { |
| dragCount_++; |
| } |
| |
| - (void)trigger:(id)sender { |
| wasTriggered_ = YES; |
| } |
| |
| - (BOOL)wasTriggered { |
| return wasTriggered_; |
| } |
| |
| - (NSUInteger)dragCount { |
| return dragCount_; |
| } |
| @end |
| |
| class DraggableButtonTest : public CocoaTest {}; |
| |
| // Make sure the basic case of "click" still works. |
| TEST_F(DraggableButtonTest, DownUp) { |
| base::scoped_nsobject<TestableDraggableButton> button( |
| [[TestableDraggableButton alloc] |
| initWithFrame:NSMakeRect(0, 0, 500, 500)]); |
| [[test_window() contentView] addSubview:button.get()]; |
| [button setTarget:button]; |
| [button setAction:@selector(trigger:)]; |
| EXPECT_FALSE([button wasTriggered]); |
| NSEvent* downEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(10,10), |
| NSLeftMouseDown, |
| 0); |
| NSEvent* upEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(10,10), |
| NSLeftMouseUp, |
| 0); |
| [NSApp postEvent:upEvent atStart:YES]; |
| [test_window() sendEvent:downEvent]; |
| EXPECT_TRUE([button wasTriggered]); // confirms target/action fired |
| } |
| |
| TEST_F(DraggableButtonTest, DraggableHysteresis) { |
| base::scoped_nsobject<TestableDraggableButton> button( |
| [[TestableDraggableButton alloc] |
| initWithFrame:NSMakeRect(0, 0, 500, 500)]); |
| [[test_window() contentView] addSubview:button.get()]; |
| NSEvent* downEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(10,10), |
| NSLeftMouseDown, |
| 0); |
| NSEvent* firstMove = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(11,11), |
| NSLeftMouseDragged, |
| 0); |
| NSEvent* firstUpEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(11,11), |
| NSLeftMouseUp, |
| 0); |
| NSEvent* secondMove = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(100,100), |
| NSLeftMouseDragged, |
| 0); |
| NSEvent* secondUpEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(100,100), |
| NSLeftMouseUp, |
| 0); |
| // If the mouse only moves one pixel in each direction |
| // it should not cause a drag. |
| [NSApp postEvent:firstUpEvent atStart:YES]; |
| [NSApp postEvent:firstMove atStart:YES]; |
| [button mouseDown:downEvent]; |
| EXPECT_EQ(0U, [button dragCount]); |
| |
| // If the mouse moves > 5 pixels in either direciton |
| // it should cause a drag. |
| [NSApp postEvent:secondUpEvent atStart:YES]; |
| [NSApp postEvent:secondMove atStart:YES]; |
| [button mouseDown:downEvent]; |
| EXPECT_EQ(1U, [button dragCount]); |
| } |
| |
| TEST_F(DraggableButtonTest, ResetState) { |
| base::scoped_nsobject<TestableDraggableButton> button( |
| [[TestableDraggableButton alloc] |
| initWithFrame:NSMakeRect(0, 0, 500, 500)]); |
| [[test_window() contentView] addSubview:button.get()]; |
| NSEvent* downEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(10,10), |
| NSLeftMouseDown, |
| 0); |
| NSEvent* moveEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(100,100), |
| NSLeftMouseDragged, |
| 0); |
| NSEvent* upEvent = |
| cocoa_test_event_utils::MouseEventAtPoint(NSMakePoint(100,100), |
| NSLeftMouseUp, |
| 0); |
| // If the mouse moves > 5 pixels in either direciton it should cause a drag. |
| [NSApp postEvent:upEvent atStart:YES]; |
| [NSApp postEvent:moveEvent atStart:YES]; |
| [button mouseDown:downEvent]; |
| |
| // The button should not be highlighted after the drag finishes. |
| EXPECT_FALSE([[button cell] isHighlighted]); |
| EXPECT_EQ(1U, [button dragCount]); |
| |
| // We should be able to initiate another drag immediately after the first one. |
| [NSApp postEvent:upEvent atStart:YES]; |
| [NSApp postEvent:moveEvent atStart:YES]; |
| [button mouseDown:downEvent]; |
| EXPECT_EQ(2U, [button dragCount]); |
| EXPECT_FALSE([[button cell] isHighlighted]); |
| } |