From 9f82bbf3441509d46d7779ebd8ef14907273c50a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 7 Aug 2024 10:49:08 +1000 Subject: [PATCH] test: add tests for multiple regions Adds the test for commit 0f8111454422 ("Fix region check for devices with multiple regions") --- test/test-ei-device.c | 202 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/test/test-ei-device.c b/test/test-ei-device.c index b8c240a..d623737 100644 --- a/test/test-ei-device.c +++ b/test/test-ei-device.c @@ -591,6 +591,208 @@ MUNIT_TEST(test_ei_device_regions) return MUNIT_OK; } +/* Same test as test_ei_device_regions_touch but for absmotion */ +MUNIT_TEST(test_ei_device_regions_absmotion) +{ + _unref_(peck) *peck = peck_new(); + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL); + peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES); + peck_dispatch_until_stable(peck); + + with_server(peck) { + struct eis_seat *seat = peck_eis_get_default_seat(peck); + _unref_(eis_device) *device = eis_seat_new_device(seat); + eis_device_configure_name(device, __func__); + eis_device_configure_capability(device, EIS_DEVICE_CAP_POINTER_ABSOLUTE); + + /* nothing cares about the actual values, so we're just + * checking for correct passthrough here */ + _unref_(eis_region) *r1 = eis_device_new_region(device); + eis_region_set_size(r1, 100, 200); + eis_region_set_offset(r1, 300, 400); + eis_region_add(r1); + + _unref_(eis_region) *r2 = eis_device_new_region(device); + eis_region_set_size(r2, 500, 600); + eis_region_set_offset(r2, 700, 800); + eis_region_add(r2); + + _unref_(eis_region) *r3 = eis_device_new_region(device); + eis_region_set_size(r3, 900, 1000); + eis_region_set_offset(r3, 1100, 1200); + eis_region_add(r3); + + eis_device_add(device); + eis_device_resume(device); + } + + peck_dispatch_until_stable(peck); + + with_client(peck) { + struct ei_device *device = peck_ei_get_default_pointer_absolute(peck); + ei_device_start_emulating(device, 0); + /* valid */ + ei_device_pointer_motion_absolute(device, 301, 401); + ei_device_frame(device, peck_ei_now(peck)); + + /* ignored */ + ei_device_pointer_motion_absolute(device, 401, 401); + ei_device_frame(device, peck_ei_now(peck)); + + /* valid */ + ei_device_pointer_motion_absolute(device, 701, 801); + ei_device_frame(device, peck_ei_now(peck)); + + /* ignored */ + ei_device_pointer_motion_absolute(device, 1201, 801); + ei_device_frame(device, peck_ei_now(peck)); + + /* valid */ + ei_device_pointer_motion_absolute(device, 1101, 1201); + ei_device_frame(device, peck_ei_now(peck)); + + /* ignored */ + ei_device_pointer_motion_absolute(device, 2000, 1201); + ei_device_frame(device, peck_ei_now(peck)); + } + + peck_dispatch_until_stable(peck); + + with_server(peck) { + _unref_(eis_event) *e1 = peck_eis_next_event(eis, EIS_EVENT_POINTER_MOTION_ABSOLUTE); + munit_assert_double_equal(eis_event_pointer_get_absolute_x(e1), 301, 2 /* precision */); + munit_assert_double_equal(eis_event_pointer_get_absolute_y(e1), 401, 2 /* precision */); + + _unref_(eis_event) *e2 = peck_eis_next_event(eis, EIS_EVENT_POINTER_MOTION_ABSOLUTE); + munit_assert_double_equal(eis_event_pointer_get_absolute_x(e2), 701, 2 /* precision */); + munit_assert_double_equal(eis_event_pointer_get_absolute_y(e2), 801, 2 /* precision */); + + _unref_(eis_event) *e3 = peck_eis_next_event(eis, EIS_EVENT_POINTER_MOTION_ABSOLUTE); + munit_assert_double_equal(eis_event_pointer_get_absolute_x(e3), 1101, 2 /* precision */); + munit_assert_double_equal(eis_event_pointer_get_absolute_y(e3), 1201, 2 /* precision */); + + peck_assert_no_eis_events(eis); + } + + return MUNIT_OK; +} + +/* Same test as test_ei_device_regions_absmotion but for touch */ +MUNIT_TEST(test_ei_device_regions_touch) +{ + _unref_(peck) *peck = peck_new(); + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL); + peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES); + peck_dispatch_until_stable(peck); + + with_server(peck) { + struct eis_seat *seat = peck_eis_get_default_seat(peck); + _unref_(eis_device) *device = eis_seat_new_device(seat); + eis_device_configure_name(device, __func__); + eis_device_configure_capability(device, EIS_DEVICE_CAP_TOUCH); + + /* nothing cares about the actual values, so we're just + * checking for correct passthrough here */ + _unref_(eis_region) *r1 = eis_device_new_region(device); + eis_region_set_size(r1, 100, 200); + eis_region_set_offset(r1, 300, 400); + eis_region_add(r1); + + _unref_(eis_region) *r2 = eis_device_new_region(device); + eis_region_set_size(r2, 500, 600); + eis_region_set_offset(r2, 700, 800); + eis_region_add(r2); + + _unref_(eis_region) *r3 = eis_device_new_region(device); + eis_region_set_size(r3, 900, 1000); + eis_region_set_offset(r3, 1100, 1200); + eis_region_add(r3); + + eis_device_add(device); + eis_device_resume(device); + } + + peck_dispatch_until_stable(peck); + + with_client(peck) { + struct ei_device *device = peck_ei_get_default_touch(peck); + ei_device_start_emulating(device, 0); + + /* valid */ + _unref_(ei_touch) *t1 = ei_device_touch_new(device); + ei_touch_down(t1, 301, 401); + ei_touch_up(t1); + ei_device_frame(device, peck_ei_now(peck)); + + /* ignored */ + _unref_(ei_touch) *t2 = ei_device_touch_new(device); + peck_ei_disable_fatal_bug(peck); + ei_touch_down(t2, 401, 401); + ei_touch_up(t2); + peck_ei_enable_fatal_bug(peck); + ei_device_frame(device, peck_ei_now(peck)); + + /* valid */ + _unref_(ei_touch) *t3 = ei_device_touch_new(device); + ei_touch_down(t3, 701, 801); + ei_touch_up(t3); + ei_device_frame(device, peck_ei_now(peck)); + + /* ignored */ + _unref_(ei_touch) *t4 = ei_device_touch_new(device); + peck_ei_disable_fatal_bug(peck); + ei_touch_down(t4, 1201, 801); + ei_touch_up(t4); + peck_ei_enable_fatal_bug(peck); + ei_device_frame(device, peck_ei_now(peck)); + + /* valid */ + _unref_(ei_touch) *t5 = ei_device_touch_new(device); + ei_touch_down(t5, 1101, 1201); + ei_touch_up(t5); + ei_device_frame(device, peck_ei_now(peck)); + + /* ignored */ + _unref_(ei_touch) *t6 = ei_device_touch_new(device); + peck_ei_disable_fatal_bug(peck); + ei_touch_down(t6, 2000, 1201); + ei_touch_up(t6); + peck_ei_enable_fatal_bug(peck); + ei_device_frame(device, peck_ei_now(peck)); + } + + peck_dispatch_until_stable(peck); + + with_server(peck) { + _unref_(eis_event) *t1d = peck_eis_next_event(eis, EIS_EVENT_TOUCH_DOWN); + munit_assert_double_equal(eis_event_touch_get_x(t1d), 301, 2 /* precision */); + munit_assert_double_equal(eis_event_touch_get_y(t1d), 401, 2 /* precision */); + + _unref_(eis_event) *t1u = peck_eis_next_event(eis, EIS_EVENT_TOUCH_UP); + munit_assert_ptr_not_null(t1u); + + _unref_(eis_event) *t2d = peck_eis_next_event(eis, EIS_EVENT_TOUCH_DOWN); + munit_assert_double_equal(eis_event_touch_get_x(t2d), 701, 2 /* precision */); + munit_assert_double_equal(eis_event_touch_get_y(t2d), 801, 2 /* precision */); + + _unref_(eis_event) *t2u = peck_eis_next_event(eis, EIS_EVENT_TOUCH_UP); + munit_assert_ptr_not_null(t2u); + + _unref_(eis_event) *t3d = peck_eis_next_event(eis, EIS_EVENT_TOUCH_DOWN); + munit_assert_double_equal(eis_event_touch_get_x(t3d), 1101, 2 /* precision */); + munit_assert_double_equal(eis_event_touch_get_y(t3d), 1201, 2 /* precision */); + + _unref_(eis_event) *t3u = peck_eis_next_event(eis, EIS_EVENT_TOUCH_UP); + munit_assert_ptr_not_null(t3u); + + peck_assert_no_eis_events(eis); + } + + return MUNIT_OK; +} + MUNIT_TEST(test_ei_device_regions_ref_unref) { _unref_(peck) *peck = peck_new();