// 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/base/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]);
}
