[PATCH libinput 6/6] test: add touchpad hover finger test

Peter Hutterer peter.hutterer at who-t.net
Mon Dec 15 19:14:51 PST 2014


Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 test/touchpad.c | 322 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 321 insertions(+), 1 deletion(-)

diff --git a/test/touchpad.c b/test/touchpad.c
index 934674c..9890566 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -2060,9 +2060,321 @@ START_TEST(touchpad_left_handed_clickpad_delayed)
 }
 END_TEST
 
+static void
+hover_continue(struct litest_device *dev, unsigned int slot,
+	       int x, int y)
+{
+	litest_event(dev, EV_ABS, ABS_MT_SLOT, slot);
+	litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+	litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+	litest_event(dev, EV_ABS, ABS_X, x);
+	litest_event(dev, EV_ABS, ABS_Y, y);
+	litest_event(dev, EV_ABS, ABS_PRESSURE, 10);
+	litest_event(dev, EV_ABS, ABS_TOOL_WIDTH, 6);
+	/* WARNING: no SYN_REPORT! */
+}
+
+static void
+hover_start(struct litest_device *dev, unsigned int slot,
+	    int x, int y)
+{
+	static unsigned int tracking_id;
+
+	litest_event(dev, EV_ABS, ABS_MT_SLOT, slot);
+	litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, ++tracking_id);
+	hover_continue(dev, slot, x, y);
+	/* WARNING: no SYN_REPORT! */
+}
+
+START_TEST(touchpad_hover_noevent)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	int i;
+	int x = 2400,
+	    y = 2400;
+
+	litest_drain_events(li);
+
+	hover_start(dev, 0, x, y);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	for (i = 0; i < 10; i++) {
+		x += 200;
+		y -= 200;
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+		litest_event(dev, EV_ABS, ABS_X, x);
+		litest_event(dev, EV_ABS, ABS_Y, y);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	}
+
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_hover_down)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	int i;
+	int x = 2400,
+	    y = 2400;
+
+	litest_drain_events(li);
+
+	hover_start(dev, 0, x, y);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	for (i = 0; i < 10; i++) {
+		x += 200;
+		y -= 200;
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+		litest_event(dev, EV_ABS, ABS_X, x);
+		litest_event(dev, EV_ABS, ABS_Y, y);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	}
+
+	litest_assert_empty_queue(li);
+
+	litest_event(dev, EV_ABS, ABS_X, x + 100);
+	litest_event(dev, EV_ABS, ABS_Y, y + 100);
+	litest_event(dev, EV_KEY, BTN_TOUCH, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	libinput_dispatch(li);
+	for (i = 0; i < 10; i++) {
+		x -= 200;
+		y += 200;
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+		litest_event(dev, EV_ABS, ABS_X, x);
+		litest_event(dev, EV_ABS, ABS_Y, y);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	}
+
+	libinput_dispatch(li);
+
+	ck_assert_int_ne(libinput_next_event_type(li),
+			 LIBINPUT_EVENT_NONE);
+	while ((event = libinput_get_event(li)) != NULL) {
+		ck_assert_int_eq(libinput_event_get_type(event),
+				 LIBINPUT_EVENT_POINTER_MOTION);
+		libinput_event_destroy(event);
+		libinput_dispatch(li);
+	}
+
+	/* go back to hover */
+	hover_continue(dev, 0, x, y);
+	litest_event(dev, EV_KEY, BTN_TOUCH, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	for (i = 0; i < 10; i++) {
+		x += 200;
+		y -= 200;
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+		litest_event(dev, EV_ABS, ABS_X, x);
+		litest_event(dev, EV_ABS, ABS_Y, y);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	}
+
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_hover_down_hover_down)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	int i, j;
+	int x = 1400,
+	    y = 1400;
+
+	litest_drain_events(li);
+
+	/* hover */
+	hover_start(dev, 0, x, y);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	litest_assert_empty_queue(li);
+
+	for (i = 0; i < 3; i++) {
+		/* touch */
+		litest_event(dev, EV_ABS, ABS_X, x + 100);
+		litest_event(dev, EV_ABS, ABS_Y, y + 100);
+		litest_event(dev, EV_KEY, BTN_TOUCH, 1);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+		libinput_dispatch(li);
+
+		for (j = 0; j < 5; j++) {
+			x += 200;
+			y += 200;
+			litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+			litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+			litest_event(dev, EV_ABS, ABS_X, x);
+			litest_event(dev, EV_ABS, ABS_Y, y);
+			litest_event(dev, EV_SYN, SYN_REPORT, 0);
+		}
+
+		libinput_dispatch(li);
+
+		ck_assert_int_ne(libinput_next_event_type(li),
+				 LIBINPUT_EVENT_NONE);
+		while ((event = libinput_get_event(li)) != NULL) {
+			ck_assert_int_eq(libinput_event_get_type(event),
+					 LIBINPUT_EVENT_POINTER_MOTION);
+			libinput_event_destroy(event);
+			libinput_dispatch(li);
+		}
+
+		/* go back to hover */
+		hover_continue(dev, 0, x, y);
+		litest_event(dev, EV_KEY, BTN_TOUCH, 0);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+		for (j = 0; j < 5; j++) {
+			x += 200;
+			y += 200;
+			litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+			litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+			litest_event(dev, EV_ABS, ABS_X, x);
+			litest_event(dev, EV_ABS, ABS_Y, y);
+			litest_event(dev, EV_SYN, SYN_REPORT, 0);
+		}
+
+		litest_assert_empty_queue(li);
+	}
+
+	/* touch */
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	litest_assert_empty_queue(li);
+
+	/* start a new touch to be sure */
+	litest_touch_down(dev, 0, 50, 50);
+	litest_touch_move_to(dev, 0, 50, 50, 70, 70, 10, 10);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	ck_assert_int_ne(libinput_next_event_type(li),
+			 LIBINPUT_EVENT_NONE);
+	while ((event = libinput_get_event(li)) != NULL) {
+		ck_assert_int_eq(libinput_event_get_type(event),
+				 LIBINPUT_EVENT_POINTER_MOTION);
+		libinput_event_destroy(event);
+		libinput_dispatch(li);
+	}
+}
+END_TEST
+
+START_TEST(touchpad_hover_2fg_noevent)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	int i;
+	int x = 2400,
+	    y = 2400;
+
+	litest_drain_events(li);
+
+	hover_start(dev, 0, x, y);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	hover_start(dev, 1, x + 500, y + 500);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
+	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	for (i = 0; i < 10; i++) {
+		x += 200;
+		y -= 200;
+		litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+		litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x + 500);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y + 500);
+		litest_event(dev, EV_ABS, ABS_X, x);
+		litest_event(dev, EV_ABS, ABS_Y, y);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	}
+
+	litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	litest_assert_empty_queue(li);
+
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_hover_2fg_1fg_down)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	int i;
+	int x = 2400,
+	    y = 2400;
+
+	litest_drain_events(li);
+
+	/* two slots active, but BTN_TOOL_FINGER only */
+	hover_start(dev, 0, x, y);
+	hover_start(dev, 1, x + 500, y + 500);
+	litest_event(dev, EV_KEY, BTN_TOUCH, 1);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 1);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	for (i = 0; i < 10; i++) {
+		x += 200;
+		y -= 200;
+		litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y);
+		litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_X, x + 500);
+		litest_event(dev, EV_ABS, ABS_MT_POSITION_Y, y + 500);
+		litest_event(dev, EV_ABS, ABS_X, x);
+		litest_event(dev, EV_ABS, ABS_Y, y);
+		litest_event(dev, EV_SYN, SYN_REPORT, 0);
+	}
+
+	litest_event(dev, EV_KEY, BTN_TOUCH, 0);
+	litest_event(dev, EV_KEY, BTN_TOOL_FINGER, 0);
+	litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+	libinput_dispatch(li);
+
+	ck_assert_int_ne(libinput_next_event_type(li),
+			 LIBINPUT_EVENT_NONE);
+	while ((event = libinput_get_event(li)) != NULL) {
+		ck_assert_int_eq(libinput_event_get_type(event),
+				 LIBINPUT_EVENT_POINTER_MOTION);
+		libinput_event_destroy(event);
+		libinput_dispatch(li);
+	}
+}
+END_TEST
+
 int main(int argc, char **argv) {
 
-
 	litest_add("touchpad:motion", touchpad_1fg_motion, LITEST_TOUCHPAD, LITEST_ANY);
 	litest_add("touchpad:motion", touchpad_2fg_no_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
 
@@ -2141,5 +2453,13 @@ int main(int argc, char **argv) {
 	litest_add("touchpad:left-handed", touchpad_left_handed_delayed, LITEST_TOUCHPAD, LITEST_CLICKPAD);
 	litest_add("touchpad:left-handed", touchpad_left_handed_clickpad_delayed, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
 
+	/* Hover tests aren't generic, they only work on this device and
+	 * ignore the semi-mt capability (it doesn't matter for the tests */
+	litest_add_for_device("touchpad:hover", touchpad_hover_noevent, LITEST_SYNAPTICS_HOVER_SEMI_MT);
+	litest_add_for_device("touchpad:hover", touchpad_hover_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
+	litest_add_for_device("touchpad:hover", touchpad_hover_down_hover_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
+	litest_add_for_device("touchpad:hover", touchpad_hover_2fg_noevent, LITEST_SYNAPTICS_HOVER_SEMI_MT);
+	litest_add_for_device("touchpad:hover", touchpad_hover_2fg_1fg_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
+
 	return litest_run(argc, argv);
 }
-- 
2.1.0



More information about the wayland-devel mailing list