These tests make sure that any tablets with the capability to report a tool's
serial number do so properly, that the tool changes when another tool of the
same type with a different serial number is used, and that libinput doesn't
change the current tool when -1 is reported as the serial number (-1 is used for
special purposes by the linuxwacom driver).

Signed-off-by: Stephen Chandler Paul <[email protected]>
---
 test/litest-wacom-cintiq-tablet.c |   2 +-
 test/litest-wacom-intuos-tablet.c |   2 +-
 test/litest.h                     |   1 +
 test/tablet.c                     | 113 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 116 insertions(+), 2 deletions(-)

diff --git a/test/litest-wacom-cintiq-tablet.c 
b/test/litest-wacom-cintiq-tablet.c
index 93cd2a8..0217f56 100644
--- a/test/litest-wacom-cintiq-tablet.c
+++ b/test/litest-wacom-cintiq-tablet.c
@@ -125,7 +125,7 @@ static int events[] = {
 
 struct litest_test_device litest_wacom_cintiq_tablet_device = {
        .type = LITEST_WACOM_CINTIQ,
-       .features = LITEST_TABLET | LITEST_DISTANCE,
+       .features = LITEST_TABLET | LITEST_DISTANCE | LITEST_TOOL_SERIAL,
        .shortname = "wacom-cintiq-tablet",
        .setup = litest_wacom_cintiq_tablet_setup,
        .interface = &interface,
diff --git a/test/litest-wacom-intuos-tablet.c 
b/test/litest-wacom-intuos-tablet.c
index 0cbb632..e30d606 100644
--- a/test/litest-wacom-intuos-tablet.c
+++ b/test/litest-wacom-intuos-tablet.c
@@ -123,7 +123,7 @@ static int events[] = {
 
 struct litest_test_device litest_wacom_intuos_tablet_device = {
        .type = LITEST_WACOM_INTUOS,
-       .features = LITEST_TABLET | LITEST_DISTANCE,
+       .features = LITEST_TABLET | LITEST_DISTANCE | LITEST_TOOL_SERIAL,
        .shortname = "wacom-intuos-tablet",
        .setup = litest_wacom_intuos_tablet_setup,
        .interface = &interface,
diff --git a/test/litest.h b/test/litest.h
index 5904805..9e159a3 100644
--- a/test/litest.h
+++ b/test/litest.h
@@ -64,6 +64,7 @@ enum litest_device_feature {
        LITEST_TOPBUTTONPAD = 1 << 9,
        LITEST_TABLET = 1 << 10,
        LITEST_DISTANCE = 1 << 11,
+       LITEST_TOOL_SERIAL = 1 << 12,
 };
 
 struct litest_device {
diff --git a/test/tablet.c b/test/tablet.c
index 1121914..3bfbb6a 100644
--- a/test/tablet.c
+++ b/test/tablet.c
@@ -427,9 +427,122 @@ START_TEST(normalization)
 }
 END_TEST
 
+START_TEST(tool_serial)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       struct libinput_event_tablet *tablet_event;
+       struct libinput_event *event;
+       struct libinput_tool *tool;
+
+       litest_drain_events(li);
+
+       litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1);
+       litest_event(dev, EV_MSC, MSC_SERIAL, 1000);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+       libinput_dispatch(li);
+       while ((event = libinput_get_event(li))) {
+               if (libinput_event_get_type(event) ==
+                   LIBINPUT_EVENT_TABLET_TOOL_UPDATE) {
+                       tablet_event = libinput_event_get_tablet_event(event);
+                       tool = libinput_event_tablet_get_tool(tablet_event);
+
+                       ck_assert_uint_eq(libinput_tool_get_serial(tool), 1000);
+               }
+
+               libinput_event_destroy(event);
+       }
+}
+END_TEST
+
+START_TEST(serial_changes_tool)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       struct libinput_event_tablet *tablet_event;
+       struct libinput_event *event;
+       struct libinput_tool *tool;
+       bool tool_updated = false;
+
+       litest_drain_events(li);
+
+       litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1);
+       litest_event(dev, EV_MSC, MSC_SERIAL, 1000);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+       litest_drain_events(li);
+
+       litest_event(dev, EV_MSC, MSC_SERIAL, 2000);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+       libinput_dispatch(li);
+       while ((event = libinput_get_event(li))) {
+               if (libinput_event_get_type(event) ==
+                   LIBINPUT_EVENT_TABLET_TOOL_UPDATE) {
+                       tablet_event = libinput_event_get_tablet_event(event);
+                       tool = libinput_event_tablet_get_tool(tablet_event);
+
+                       ck_assert_uint_eq(libinput_tool_get_serial(tool), 2000);
+                       tool_updated = true;
+               }
+
+               libinput_event_destroy(event);
+       }
+       ck_assert(tool_updated);
+}
+END_TEST
+
+START_TEST(invalid_serials)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       struct libinput_event *event;
+       bool tool_updated = false;
+
+       litest_drain_events(li);
+
+       litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1);
+       litest_event(dev, EV_MSC, MSC_SERIAL, 1000);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+       litest_drain_events(li);
+
+       litest_event(dev, EV_MSC, MSC_SERIAL, -1);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+       libinput_dispatch(li);
+       while ((event = libinput_get_event(li))) {
+               if (libinput_event_get_type(event) ==
+                   LIBINPUT_EVENT_TABLET_TOOL_UPDATE)
+                       tool_updated = true;
+
+               libinput_event_destroy(event);
+       }
+       ck_assert(!tool_updated);
+
+       /* Make sure libinput doesn't report a tool update when the serial
+        * number goes back from -1 to what it was previously */
+       litest_event(dev, EV_MSC, MSC_SERIAL, 1000);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+       libinput_dispatch(li);
+       while ((event = libinput_get_event(li))) {
+               if (libinput_event_get_type(event) ==
+                   LIBINPUT_EVENT_TABLET_TOOL_UPDATE)
+                       tool_updated = true;
+
+               libinput_event_destroy(event);
+       }
+       ck_assert(!tool_updated);
+}
+END_TEST
+
 int
 main(int argc, char **argv)
 {
+       litest_add("tablet:tool_serial", tool_serial, LITEST_TABLET | 
LITEST_TOOL_SERIAL, LITEST_ANY);
+       litest_add("tablet:tool_serial", serial_changes_tool, LITEST_TABLET | 
LITEST_TOOL_SERIAL, LITEST_ANY);
+       litest_add("tablet:tool_serial", invalid_serials, LITEST_TABLET | 
LITEST_TOOL_SERIAL, LITEST_ANY);
        litest_add("tablet:proximity", proximity_out_clear_buttons, 
LITEST_TABLET, LITEST_ANY);
        litest_add("tablet:proximity", proximity_in_out, LITEST_TABLET, 
LITEST_ANY);
        litest_add("tablet:proximity", bad_distance_events, LITEST_TABLET | 
LITEST_DISTANCE, LITEST_ANY);
-- 
1.8.5.5

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to