// Copyright 2016 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 "ui/events/event_utils.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/win/window_impl.h"

namespace ui {

namespace {

class TestWindow : public gfx::WindowImpl {
 public:
  TestWindow() {}
  ~TestWindow() override {}

  BOOL ProcessWindowMessage(HWND window,
                            UINT message,
                            WPARAM w_param,
                            LPARAM l_param,
                            LRESULT& result,
                            DWORD msg_map_id = 0) override {
    return true;
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(TestWindow);
};

MSG CreateEvent(UINT type, WORD x, WORD y, HWND hwnd) {
  MSG event;
  event.message = type;
  event.hwnd = hwnd;
  event.lParam = MAKELPARAM(x, y);
  return event;
}

TEST(EventWinTest, EventSystemLocationFromNative) {
  TestWindow test_window;
  const WORD x_coord = 10;
  const WORD y_coord = 20;
  const WORD x_window_offset = 100;
  const WORD y_window_offset = 100;
  test_window.Init(nullptr,
                   gfx::Rect(x_window_offset, y_window_offset, 100, 100));
  EXPECT_TRUE(test_window.hwnd() != nullptr);

  {
    MSG event =
        CreateEvent(WM_MOUSEWHEEL, x_coord, y_coord, test_window.hwnd());
    // Mouse wheel events already have screen coordinates so they should not be
    // converted.
    EXPECT_EQ(gfx::Point(x_coord, y_coord),
              EventSystemLocationFromNative(event));
  }

  MSG event = CreateEvent(WM_LBUTTONDOWN, x_coord, y_coord, test_window.hwnd());
  EXPECT_EQ(gfx::Point(x_coord + x_window_offset, y_coord + y_window_offset),
            EventSystemLocationFromNative(event));
}

}  // namespace

}  // namespace ui
