25
25
using namespace testing;
27
// See: https://bugs.launchpad.net/mir/+bug/1311699
28
#define MIR_EVENT_ACTION_POINTER_INDEX_MASK 0xff00
29
#define MIR_EVENT_ACTION_POINTER_INDEX_SHIFT 8;
30
#define MIR_EVENT_ACTION_MASK 0xff
32
// TODO: Refactor event initializers
36
// Never exposed in old event, so lets avoid leaking it in to a header now.
39
AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
41
AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
42
AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
43
AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
44
AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
45
AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010
49
AINPUT_SOURCE_UNKNOWN = 0x00000000,
51
AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
52
AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
53
AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
54
AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
55
AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
56
AINPUT_SOURCE_STYLUS = 0x00004000 | AINPUT_SOURCE_CLASS_POINTER,
57
AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
58
AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
59
AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
61
AINPUT_SOURCE_ANY = 0xffffff00
64
MirKeyboardEvent a_key_ev()
27
TEST(InputEvent, old_style_key_and_motion_events_are_input_events)
66
29
MirKeyboardEvent key_ev;
71
MirMotionEvent a_motion_ev(int device_class = AINPUT_SOURCE_UNKNOWN)
73
MirMotionEvent motion_ev;
75
motion_ev.set_source_id(device_class);
82
TEST(InputEvent, old_style_key_and_motion_events_are_input_events)
84
auto key_ev = a_key_ev();
86
31
EXPECT_EQ(mir_event_type_input, mir_event_get_type(&key_ev));
87
32
EXPECT_EQ(mir_input_event_type_key, mir_input_event_get_type(mir_event_get_input_event(&key_ev)));
89
auto motion_ev = a_motion_ev();
34
MirTouchEvent motion_ev;
91
36
EXPECT_EQ(mir_event_type_input, mir_event_get_type(&motion_ev));
92
37
EXPECT_NE(nullptr, mir_event_get_input_event(&motion_ev));
97
42
TEST(CommonInputEventProperties, device_id_taken_from_old_style_event)
99
44
int64_t dev_id_1 = 17, dev_id_2 = 23;
100
auto old_ev = a_motion_ev();
102
47
old_ev.set_device_id(dev_id_1);
103
48
EXPECT_EQ(dev_id_1, mir_input_event_get_device_id(
104
49
mir_event_get_input_event(&old_ev)));
106
auto kev = a_key_ev();
107
52
kev.set_device_id(dev_id_2);
108
53
EXPECT_EQ(dev_id_2, mir_input_event_get_device_id(
109
54
mir_event_get_input_event(&kev)));
112
57
TEST(CommonInputEventProperties, event_time_taken_from_old_style_event)
114
59
std::chrono::nanoseconds event_time_1{79}, event_time_2{83};
115
auto old_ev = a_motion_ev();
117
62
old_ev.set_event_time(event_time_1);
118
63
EXPECT_EQ(event_time_1.count(), mir_input_event_get_event_time(
119
64
mir_event_get_input_event(&old_ev)));
121
auto kev = a_key_ev();
122
67
kev.set_event_time(event_time_2);
123
68
EXPECT_EQ(event_time_2.count(), mir_input_event_get_event_time(
124
69
mir_event_get_input_event(&kev)));
127
72
TEST(KeyInputEventProperties, timestamp_taken_from_old_style_event)
129
74
std::chrono::nanoseconds event_time_1{79}, event_time_2{83};
130
auto old_ev = a_key_ev();
75
MirKeyboardEvent old_ev;
131
76
auto const keyboard_event = mir_input_event_get_keyboard_event(mir_event_get_input_event(&old_ev));
133
78
for (auto expected : {event_time_1, event_time_2})
144
89
TEST(KeyInputEventProperties, up_and_down_actions_copied_from_old_style_event)
146
auto old_ev = a_key_ev();
91
MirKeyboardEvent old_ev;
148
93
old_ev.set_action(mir_keyboard_action_down);
150
95
auto new_kev = mir_input_event_get_keyboard_event(mir_event_get_input_event(&old_ev));
151
96
EXPECT_EQ(mir_keyboard_action_down, mir_keyboard_event_action(new_kev));
174
119
TEST(TouchEventProperties, timestamp_taken_from_old_style_event)
176
121
std::chrono::nanoseconds event_time_1{79}, event_time_2{83};
177
auto old_ev = a_motion_ev(AINPUT_SOURCE_TOUCHSCREEN);
122
MirTouchEvent old_ev;
178
123
auto const touch_event = mir_input_event_get_touch_event(mir_event_get_input_event(&old_ev));
180
125
for (auto expected : {event_time_1, event_time_2})
213
158
// mir_motion_action_up/down represent the start of a gesture. pointers only go up/down one at a time
214
159
TEST(TouchEventProperties, down_and_up_actions_are_taken_from_old_event)
216
auto old_ev = a_motion_ev(AINPUT_SOURCE_TOUCHSCREEN);
161
MirTouchEvent old_ev;
217
162
old_ev.set_pointer_count(1);
218
163
old_ev.set_action(0, mir_touch_action_change);
239
184
TEST(TouchEventProperties, axis_values_used_by_qtmir_copied)
241
float x_value = 19, y_value = 23, touch_major = .3, touch_minor = .2, pressure = .9, size = 1111;
242
auto old_ev = a_motion_ev(AINPUT_SOURCE_TOUCHSCREEN);
186
float x_value = 19, y_value = 23, touch_major = .3, touch_minor = .2, pressure = .9;
187
MirTouchEvent old_ev;
243
188
old_ev.set_pointer_count(1);
244
189
old_ev.set_x(0, x_value);
245
190
old_ev.set_y(0, y_value);
246
191
old_ev.set_touch_major(0, touch_major);
247
192
old_ev.set_touch_minor(0, touch_minor);
248
193
old_ev.set_pressure(0, pressure);
249
old_ev.set_size(0, size);
251
195
auto tev = mir_input_event_get_touch_event(mir_event_get_input_event(&old_ev));
252
196
EXPECT_EQ(x_value, mir_touch_event_axis_value(tev, 0, mir_touch_axis_x));
254
198
EXPECT_EQ(touch_major, mir_touch_event_axis_value(tev, 0, mir_touch_axis_touch_major));
255
199
EXPECT_EQ(touch_minor, mir_touch_event_axis_value(tev, 0, mir_touch_axis_touch_minor));
256
200
EXPECT_EQ(pressure, mir_touch_event_axis_value(tev, 0, mir_touch_axis_pressure));
257
EXPECT_EQ(size, mir_touch_event_axis_value(tev, 0, mir_touch_axis_size));
260
/* Pointer and touch event differentiation */
264
struct DeviceClassTestParameters
266
MirInputEventType expected_type;
267
int32_t device_class;
270
struct DeviceClassTest : public testing::Test, testing::WithParamInterface<DeviceClassTestParameters>
275
TEST_P(DeviceClassTest, pointer_and_touch_events_differentiated_on_device_class)
277
auto const& param = GetParam();
278
auto old_ev = a_motion_ev(param.device_class);
280
auto iev = mir_event_get_input_event(&old_ev);
281
EXPECT_EQ(param.expected_type, mir_input_event_get_type(iev));
284
INSTANTIATE_TEST_CASE_P(MouseDeviceClassTest,
285
DeviceClassTest, ::testing::Values(DeviceClassTestParameters{mir_input_event_type_pointer, AINPUT_SOURCE_MOUSE}));
287
INSTANTIATE_TEST_CASE_P(TouchpadDeviceClassTest,
288
DeviceClassTest, ::testing::Values(DeviceClassTestParameters{mir_input_event_type_pointer, AINPUT_SOURCE_TOUCHPAD}));
290
INSTANTIATE_TEST_CASE_P(TrackballDeviceClassTest,
291
DeviceClassTest, ::testing::Values(DeviceClassTestParameters{mir_input_event_type_pointer, AINPUT_SOURCE_TRACKBALL}));
293
INSTANTIATE_TEST_CASE_P(TouchscreenDeviceClassTest,
294
DeviceClassTest, ::testing::Values(DeviceClassTestParameters{mir_input_event_type_touch, AINPUT_SOURCE_TOUCHSCREEN}));
296
INSTANTIATE_TEST_CASE_P(StylusDeviceClassTest,
297
DeviceClassTest, ::testing::Values(DeviceClassTestParameters{mir_input_event_type_touch, AINPUT_SOURCE_STYLUS}));
299
/* Pointer event property accessors */
301
203
TEST(PointerInputEventProperties, timestamp_taken_from_old_style_event)
303
205
std::chrono::nanoseconds event_time_1{79}, event_time_2{83};
304
auto old_ev = a_motion_ev(AINPUT_SOURCE_MOUSE);
206
MirPointerEvent old_ev;
305
207
auto const pointer_event = mir_input_event_get_pointer_event(mir_event_get_input_event(&old_ev));
307
209
for (auto expected : {event_time_1, event_time_2})
348
250
TEST(PointerInputEventProperties, axis_values_copied)
350
252
float x = 7, y = 9.3, hscroll = 13, vscroll = 17;
351
auto old_ev = a_motion_ev(AINPUT_SOURCE_MOUSE);
352
old_ev.set_pointer_count(0);
355
old_ev.set_vscroll(0, vscroll);
356
old_ev.set_hscroll(0, hscroll);
253
MirPointerEvent old_ev;
256
old_ev.set_vscroll(vscroll);
257
old_ev.set_hscroll(hscroll);
358
259
auto pev = mir_input_event_get_pointer_event(mir_event_get_input_event(&old_ev));
359
260
EXPECT_EQ(x, mir_pointer_event_axis_value(pev, mir_pointer_axis_x));