Index: ui/base/x/events_x_unittest.cc |
diff --git a/ui/base/x/events_x_unittest.cc b/ui/base/x/events_x_unittest.cc |
deleted file mode 100644 |
index 3a85a0a0dfa7c1346a522bd3ee4ae09f4609d8b8..0000000000000000000000000000000000000000 |
--- a/ui/base/x/events_x_unittest.cc |
+++ /dev/null |
@@ -1,335 +0,0 @@ |
-// 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 <cstring> |
- |
-#include <X11/extensions/XInput2.h> |
-#include <X11/Xlib.h> |
- |
-// Generically-named #defines from Xlib that conflict with symbols in GTest. |
-#undef Bool |
-#undef None |
- |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/base/touch/touch_factory_x11.h" |
-#include "ui/base/x/device_data_manager.h" |
-#include "ui/events/event.h" |
-#include "ui/events/event_constants.h" |
-#include "ui/events/event_utils.h" |
-#include "ui/gfx/point.h" |
- |
-namespace ui { |
- |
-namespace { |
- |
-// Initializes the passed-in Xlib event. |
-void InitButtonEvent(XEvent* event, |
- bool is_press, |
- const gfx::Point& location, |
- int button, |
- int state) { |
- memset(event, 0, sizeof(*event)); |
- |
- // We don't bother setting fields that the event code doesn't use, such as |
- // x_root/y_root and window/root/subwindow. |
- XButtonEvent* button_event = &(event->xbutton); |
- button_event->type = is_press ? ButtonPress : ButtonRelease; |
- button_event->x = location.x(); |
- button_event->y = location.y(); |
- button_event->button = button; |
- button_event->state = state; |
-} |
- |
-#if defined(USE_XI2_MT) |
-const int kValuatorNum = 3; |
-const int kTouchValuatorMap[kValuatorNum][4] = { |
- // { valuator_index, valuator_type, min_val, max_val } |
- { 0, DeviceDataManager::DT_TOUCH_MAJOR, 0, 1000}, |
- { 1, DeviceDataManager::DT_TOUCH_ORIENTATION, 0, 1.0}, |
- { 2, DeviceDataManager::DT_TOUCH_PRESSURE, 0, 1000}, |
-}; |
- |
-struct Valuator { |
- Valuator(DeviceDataManager::DataType type, double v) |
- : data_type(type), value(v) {} |
- |
- DeviceDataManager::DataType data_type; |
- double value; |
-}; |
- |
-XEvent* CreateTouchEvent(int deviceid, |
- int evtype, |
- int tracking_id, |
- const gfx::Point& location, |
- const std::vector<Valuator>& valuators) { |
- XEvent* event = new XEvent; |
- memset(event, 0, sizeof(*event)); |
- event->type = GenericEvent; |
- event->xcookie.data = new XIDeviceEvent; |
- XIDeviceEvent* xiev = |
- static_cast<XIDeviceEvent*>(event->xcookie.data); |
- xiev->deviceid = deviceid; |
- xiev->sourceid = deviceid; |
- xiev->evtype = evtype; |
- xiev->detail = tracking_id; |
- xiev->event_x = location.x(); |
- xiev->event_y = location.y(); |
- |
- xiev->valuators.mask_len = (valuators.size() / 8) + 1; |
- xiev->valuators.mask = new unsigned char[xiev->valuators.mask_len]; |
- memset(xiev->valuators.mask, 0, xiev->valuators.mask_len); |
- xiev->valuators.values = new double[valuators.size()]; |
- |
- int val_count = 0; |
- for (int i = 0; i < kValuatorNum; i++) { |
- for(size_t j = 0; j < valuators.size(); j++) { |
- if (valuators[j].data_type == kTouchValuatorMap[i][1]) { |
- XISetMask(xiev->valuators.mask, kTouchValuatorMap[i][0]); |
- xiev->valuators.values[val_count++] = valuators[j].value; |
- } |
- } |
- } |
- |
- return event; |
-} |
- |
-void DestroyTouchEvent(XEvent* event) { |
- XIDeviceEvent* xiev = |
- static_cast<XIDeviceEvent*>(event->xcookie.data); |
- if (xiev) { |
- delete[] xiev->valuators.mask; |
- delete[] xiev->valuators.values; |
- delete xiev; |
- } |
- delete event; |
-} |
- |
-void SetupTouchFactory(const std::vector<unsigned int>& devices) { |
- TouchFactory* factory = TouchFactory::GetInstance(); |
- factory->SetTouchDeviceForTest(devices); |
-} |
- |
-void SetupDeviceDataManager(const std::vector<unsigned int>& devices) { |
- ui::DeviceDataManager* manager = ui::DeviceDataManager::GetInstance(); |
- manager->SetDeviceListForTest(devices); |
- for (size_t i = 0; i < devices.size(); i++) { |
- for (int j = 0; j < kValuatorNum; j++) { |
- manager->SetDeviceValuatorForTest( |
- devices[i], |
- kTouchValuatorMap[j][0], |
- static_cast<DeviceDataManager::DataType>(kTouchValuatorMap[j][1]), |
- kTouchValuatorMap[j][2], |
- kTouchValuatorMap[j][3]); |
- } |
- } |
-} |
-#endif |
-} // namespace |
- |
-TEST(EventsXTest, ButtonEvents) { |
- XEvent event; |
- gfx::Point location(5, 10); |
- gfx::Vector2d offset; |
- |
- InitButtonEvent(&event, true, location, 1, 0); |
- EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- |
- InitButtonEvent(&event, true, location, 2, Button1Mask | ShiftMask); |
- EXPECT_EQ(ui::ET_MOUSE_PRESSED, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_MIDDLE_MOUSE_BUTTON | |
- ui::EF_SHIFT_DOWN, |
- ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- |
- InitButtonEvent(&event, false, location, 3, 0); |
- EXPECT_EQ(ui::ET_MOUSE_RELEASED, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- |
- // Scroll up. |
- InitButtonEvent(&event, true, location, 4, 0); |
- EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- offset = ui::GetMouseWheelOffset(&event); |
- EXPECT_GT(offset.y(), 0); |
- EXPECT_EQ(0, offset.x()); |
- |
- // Scroll down. |
- InitButtonEvent(&event, true, location, 5, 0); |
- EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- offset = ui::GetMouseWheelOffset(&event); |
- EXPECT_LT(offset.y(), 0); |
- EXPECT_EQ(0, offset.x()); |
- |
- // Scroll left, typically. |
- InitButtonEvent(&event, true, location, 6, 0); |
- EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- offset = ui::GetMouseWheelOffset(&event); |
- EXPECT_EQ(0, offset.y()); |
- EXPECT_EQ(0, offset.x()); |
- |
- // Scroll right, typically. |
- InitButtonEvent(&event, true, location, 7, 0); |
- EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ(0, ui::EventFlagsFromNative(&event)); |
- EXPECT_EQ(location, ui::EventLocationFromNative(&event)); |
- EXPECT_TRUE(ui::IsMouseEvent(&event)); |
- offset = ui::GetMouseWheelOffset(&event); |
- EXPECT_EQ(0, offset.y()); |
- EXPECT_EQ(0, offset.x()); |
- |
- // TODO(derat): Test XInput code. |
-} |
- |
-TEST(EventsXTest, AvoidExtraEventsOnWheelRelease) { |
- XEvent event; |
- gfx::Point location(5, 10); |
- |
- InitButtonEvent(&event, true, location, 4, 0); |
- EXPECT_EQ(ui::ET_MOUSEWHEEL, ui::EventTypeFromNative(&event)); |
- |
- // We should return ET_UNKNOWN for the release event instead of returning |
- // ET_MOUSEWHEEL; otherwise we'll scroll twice for each scrollwheel step. |
- InitButtonEvent(&event, false, location, 4, 0); |
- EXPECT_EQ(ui::ET_UNKNOWN, ui::EventTypeFromNative(&event)); |
- |
- // TODO(derat): Test XInput code. |
-} |
- |
-TEST(EventsXTest, EnterLeaveEvent) { |
- XEvent event; |
- event.xcrossing.type = EnterNotify; |
- event.xcrossing.x = 10; |
- event.xcrossing.y = 20; |
- event.xcrossing.x_root = 110; |
- event.xcrossing.y_root = 120; |
- |
- // Mouse enter events are converted to mouse move events to be consistent with |
- // the way views handle mouse enter. See comments for EnterNotify case in |
- // ui::EventTypeFromNative for more details. |
- EXPECT_EQ(ui::ET_MOUSE_MOVED, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ("10,20", ui::EventLocationFromNative(&event).ToString()); |
- EXPECT_EQ("110,120", ui::EventSystemLocationFromNative(&event).ToString()); |
- |
- event.xcrossing.type = LeaveNotify; |
- event.xcrossing.x = 30; |
- event.xcrossing.y = 40; |
- event.xcrossing.x_root = 230; |
- event.xcrossing.y_root = 240; |
- EXPECT_EQ(ui::ET_MOUSE_EXITED, ui::EventTypeFromNative(&event)); |
- EXPECT_EQ("30,40", ui::EventLocationFromNative(&event).ToString()); |
- EXPECT_EQ("230,240", ui::EventSystemLocationFromNative(&event).ToString()); |
-} |
- |
-TEST(EventsXTest, ClickCount) { |
- XEvent event; |
- gfx::Point location(5, 10); |
- |
- for (int i = 1; i <= 3; ++i) { |
- InitButtonEvent(&event, true, location, 1, 0); |
- { |
- MouseEvent mouseev(&event); |
- EXPECT_EQ(ui::ET_MOUSE_PRESSED, mouseev.type()); |
- EXPECT_EQ(i, mouseev.GetClickCount()); |
- } |
- |
- InitButtonEvent(&event, false, location, 1, 0); |
- { |
- MouseEvent mouseev(&event); |
- EXPECT_EQ(ui::ET_MOUSE_RELEASED, mouseev.type()); |
- EXPECT_EQ(i, mouseev.GetClickCount()); |
- } |
- } |
-} |
- |
-#if defined(USE_XI2_MT) |
-TEST(EventsXTest, TouchEventBasic) { |
- std::vector<unsigned int> devices; |
- devices.push_back(0); |
- SetupTouchFactory(devices); |
- SetupDeviceDataManager(devices); |
- XEvent* event = NULL; |
- std::vector<Valuator> valuators; |
- |
- // Init touch begin with tracking id 5, touch id 0. |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 20)); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.3f)); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 100)); |
- event = CreateTouchEvent(0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators); |
- EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event)); |
- EXPECT_EQ("10,10", ui::EventLocationFromNative(event).ToString()); |
- EXPECT_EQ(GetTouchId(event), 0); |
- EXPECT_EQ(GetTouchRadiusX(event), 10); |
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.15f); |
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.1f); |
- DestroyTouchEvent(event); |
- |
- // Touch update, with new orientation info. |
- valuators.clear(); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.5f)); |
- event = CreateTouchEvent(0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators); |
- EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromNative(event)); |
- EXPECT_EQ("20,20", ui::EventLocationFromNative(event).ToString()); |
- EXPECT_EQ(GetTouchId(event), 0); |
- EXPECT_EQ(GetTouchRadiusX(event), 10); |
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.25f); |
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.1f); |
- DestroyTouchEvent(event); |
- |
- // Another touch with tracking id 6, touch id 1. |
- valuators.clear(); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 100)); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.9f)); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 500)); |
- event = CreateTouchEvent( |
- 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators); |
- EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event)); |
- EXPECT_EQ("200,200", ui::EventLocationFromNative(event).ToString()); |
- EXPECT_EQ(GetTouchId(event), 1); |
- EXPECT_EQ(GetTouchRadiusX(event), 50); |
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.45f); |
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.5f); |
- DestroyTouchEvent(event); |
- |
- // Touch with tracking id 5 should have old radius/angle value and new pressue |
- // value. |
- valuators.clear(); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 50)); |
- event = CreateTouchEvent(0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators); |
- EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event)); |
- EXPECT_EQ("30,30", ui::EventLocationFromNative(event).ToString()); |
- EXPECT_EQ(GetTouchId(event), 0); |
- EXPECT_EQ(GetTouchRadiusX(event), 10); |
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.25f); |
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.05f); |
- DestroyTouchEvent(event); |
- |
- // Touch with tracking id 6 should have old angle/pressure value and new |
- // radius value. |
- valuators.clear(); |
- valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 50)); |
- event = CreateTouchEvent(0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators); |
- EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event)); |
- EXPECT_EQ("200,200", ui::EventLocationFromNative(event).ToString()); |
- EXPECT_EQ(GetTouchId(event), 1); |
- EXPECT_EQ(GetTouchRadiusX(event), 25); |
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.45f); |
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.5f); |
- DestroyTouchEvent(event); |
-} |
-#endif |
-} // namespace ui |