// Copyright (c) 2012 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 "remoting/protocol/mouse_input_filter.h"

#include "base/stl_util.h"
#include "remoting/proto/event.pb.h"
#include "remoting/protocol/protocol_mock_objects.h"
#include "remoting/protocol/test_event_matchers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"

using ::testing::_;
using ::testing::InSequence;

namespace remoting {
namespace protocol {

using test::EqualsMouseMoveEvent;

static MouseEvent MouseMoveEvent(int x, int y) {
  MouseEvent event;
  event.set_x(x);
  event.set_y(y);
  return event;
}

static void InjectTestSequence(InputStub* input_stub) {
  struct Point {
    int x;
    int y;
  };
  static const Point input_sequence[] = {
    {-5, 10}, {0, 10}, {-1, 10}, {15, 40}, {15, 45}, {15, 39}, {15, 25}
  };
  for (unsigned int i = 0; i < base::size(input_sequence); ++i) {
    const Point& point = input_sequence[i];
    input_stub->InjectMouseEvent(MouseMoveEvent(point.x, point.y));
  }
  for (unsigned int i = 0; i < base::size(input_sequence); ++i) {
    const Point& point = input_sequence[i];
    input_stub->InjectMouseEvent(MouseMoveEvent(point.y, point.x));
  }
}

// Verify that no events get through if we don't set either dimensions.
TEST(MouseInputFilterTest, BothDimensionsZero) {
  MockInputStub mock_stub;
  MouseInputFilter mouse_filter(&mock_stub);

  EXPECT_CALL(mock_stub, InjectMouseEvent(_))
        .Times(0);

  InjectTestSequence(&mouse_filter);
}

// Verify that no events get through if there's no input size.
TEST(MouseInputFilterTest, InputDimensionsZero) {
  MockInputStub mock_stub;
  MouseInputFilter mouse_filter(&mock_stub);
  mouse_filter.set_output_size(webrtc::DesktopSize(50, 50));

  EXPECT_CALL(mock_stub, InjectMouseEvent(_))
      .Times(0);

  InjectTestSequence(&mouse_filter);
}

// Verify that no events get through if there's no output size.
TEST(MouseInputFilterTest, OutputDimensionsZero) {
  MockInputStub mock_stub;
  MouseInputFilter mouse_filter(&mock_stub);
  mouse_filter.set_input_size(webrtc::DesktopSize(50, 50));

  EXPECT_CALL(mock_stub, InjectMouseEvent(_))
      .Times(0);

  InjectTestSequence(&mouse_filter);
}

// Verify that all events get through, clamped to the output.
TEST(MouseInputFilterTest, NoScalingOrClipping) {
  MockInputStub mock_stub;
  MouseInputFilter mouse_filter(&mock_stub);
  mouse_filter.set_output_size(webrtc::DesktopSize(40,40));
  mouse_filter.set_input_size(webrtc::DesktopSize(40,40));

  {
    InSequence s;

    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 10))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(15, 39))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(15, 25))).
        Times(1);

    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(10, 0))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(39, 15))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(25, 15))).
        Times(1);
  }

  InjectTestSequence(&mouse_filter);
}

// Verify that we can up-scale with clamping.
TEST(MouseInputFilterTest, UpScalingAndClamping) {
  MockInputStub mock_stub;
  MouseInputFilter mouse_filter(&mock_stub);
  mouse_filter.set_output_size(webrtc::DesktopSize(80, 80));
  mouse_filter.set_input_size(webrtc::DesktopSize(40, 40));

  {
    InSequence s;

    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 20))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(30, 79))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(30, 51))).
        Times(1);

    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(20, 0))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(79, 30))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(51, 30))).
        Times(1);
  }

  InjectTestSequence(&mouse_filter);
}

// Verify that we can down-scale with clamping.
TEST(MouseInputFilterTest, DownScalingAndClamping) {
  MockInputStub mock_stub;
  MouseInputFilter mouse_filter(&mock_stub);
  mouse_filter.set_output_size(webrtc::DesktopSize(30, 30));
  mouse_filter.set_input_size(webrtc::DesktopSize(40, 40));

  {
    InSequence s;

    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(0, 7))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(11, 29))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(11, 19))).
        Times(1);

    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(7, 0))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(29, 11))).
        Times(3);
    EXPECT_CALL(mock_stub, InjectMouseEvent(EqualsMouseMoveEvent(19, 11))).
        Times(1);

  }

  InjectTestSequence(&mouse_filter);
}

}  // namespace protocol
}  // namespace remoting
