[PATCH xserver 17/17] Test: Input: Add touch tests
Peter Hutterer
peter.hutterer at who-t.net
Wed Jan 5 16:29:12 PST 2011
On Tue, Dec 28, 2010 at 05:58:08PM +0000, Daniel Stone wrote:
> Add tests for:
> * checking basic functionality of TouchCreate, FindTouchPoint, and
> FinishTouchPoint
> * ensuring all touch event types match each other in
> GrabMatchesSecond
> * ensuring all touch events are selected together, or not at all, in
> XISelectEvents (this test authored by Chase Douglas)
> * ensuring EventToXI2 is predictable between runs
> * validating TouchBegin, TouchMotion and TouchEnd protocol
> conversion
>
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> ---
> test/input.c | 117 +++++++++++++++++++++++++++++++++++-
> test/xi2/protocol-eventconvert.c | 54 ++++++++++++++++
> test/xi2/protocol-xiselectevents.c | 44 +++++++++++++
> 3 files changed, 214 insertions(+), 1 deletions(-)
>
> diff --git a/test/input.c b/test/input.c
> index e443f75..b59391f 100644
> --- a/test/input.c
> +++ b/test/input.c
> @@ -277,6 +277,9 @@ static void dix_event_to_core_conversion(void)
> dix_event_to_core_fail(ET_DeviceChanged, BadImplementation);
> dix_event_to_core_fail(ET_ProximityIn, BadMatch);
> dix_event_to_core_fail(ET_ProximityOut, BadMatch);
> + dix_event_to_core_fail(ET_TouchBegin, BadMatch);
> + dix_event_to_core_fail(ET_TouchMotion, BadMatch);
> + dix_event_to_core_fail(ET_TouchEnd, BadMatch);
>
> dix_event_to_core(ET_KeyPress);
> dix_event_to_core(ET_KeyRelease);
> @@ -285,6 +288,34 @@ static void dix_event_to_core_conversion(void)
> dix_event_to_core(ET_Motion);
> }
>
> +static void dix_event_to_xi2_conversion(void)
> +{
> + DeviceEvent ev;
> + xXIDeviceEvent *xi2, *xi2_flags;
> + int rc;
> +
> + memset(&ev, 0, sizeof(ev));
> +
> + ev.header = 0xFF;
> + ev.length = sizeof(DeviceEvent);
> + ev.type = ET_TouchBegin;
> +
> + rc = EventToXI2((InternalEvent*)&ev, (xEvent**)&xi2);
> + g_assert(rc == Success);
> + g_assert(xi2->type == GenericEvent);
> + g_assert(xi2->evtype == XI_TouchBegin);
> + g_assert(xi2->flags == 0);
> +
> + ev.flags = XITouchOwner;
> + rc = EventToXI2((InternalEvent*)&ev, (xEvent**)&xi2_flags);
> + g_assert(rc == Success);
> + g_assert(xi2_flags->type == GenericEvent);
> + g_assert(xi2_flags->evtype == XI_TouchBegin);
> + g_assert(xi2_flags->flags == XITouchOwner);
> + xi2_flags->flags = 0;
> + g_assert(memcmp(xi2, xi2_flags, sizeof(*xi2)) == 0);
> +}
> +
> static void xi2_struct_sizes(void)
> {
> #define compare(req) \
> @@ -674,6 +705,20 @@ static void dix_grab_matching(void)
> g_assert(rc == TRUE);
> rc = GrabMatchesSecond(&b, &a, FALSE);
> g_assert(rc == TRUE);
> +
> + /* A TouchMotion/TouchEnd grab must match a TouchBegin grab. */
add the case for XI_TouchEnd then, please.
> + a.grabtype = GRABTYPE_XI2;
> + b.grabtype = GRABTYPE_XI2;
> + a.type = XI_TouchBegin;
> + b.type = XI_TouchMotion;
> + a.detail.exact = 0;
> + b.detail.exact = 0;
> + a.modifiersDetail.exact = 0;
> + b.modifiersDetail.exact = 0;
> + rc = GrabMatchesSecond(&a, &b, FALSE);
> + g_assert(rc == TRUE);
> + rc = GrabMatchesSecond(&b, &a, FALSE);
> + g_assert(rc == TRUE);
> }
>
> static void test_bits_to_byte(int i)
> @@ -1060,6 +1105,73 @@ static void include_bit_test_macros(void)
> }
> }
>
> +static void touch_create(void)
> +{
> + DeviceIntRec dev;
> + TouchClassRec touch;
> + TouchPointInfoRec touches[2];
> + int touchid;
> +
> + memset(&dev, 0, sizeof(dev));
> + memset(&touch, 0, sizeof(touch));
> + memset(touches, 0, sizeof(*touches) * 2);
> + touch.num_touches = 2;
> + touch.touches = touches;
> + dev.touch = &touch;
> + touchid = CreateTouchPoint(&dev, 0xdeadbeef);
> + g_assert(touchid >= 0);
> + g_assert(touch.touches[touchid].active == TRUE);
> + g_assert(touch.touches[touchid].id == 0xdeadbeef);
> + g_assert(touch.touches[touchid].pending_finish == 0);
> + g_assert(touch.touches[touchid].num_listeners == 0);
> + g_assert(touch.touches[touchid].num_grabs == 0);
> + g_assert(touch.touches[touchid].sprite.spriteTraceGood == 0);
> +}
> +
> +static void touch_find_point(void)
> +{
> + DeviceIntRec dev;
> + TouchClassRec touch;
> + TouchPointInfoRec touches[2];
> + int create_id, find_id;
> +
> + memset(&dev, 0, sizeof(dev));
> + memset(&touch, 0, sizeof(touch));
> + memset(touches, 0, sizeof(*touches) * 2);
> + touch.num_touches = 2;
> + touch.touches = touches;
> + dev.touch = &touch;
> + create_id = CreateTouchPoint(&dev, 0xdeadbeef);
> + g_assert(create_id >= 0);
> + find_id = FindTouchPoint(&dev, 0xdeadbeef);
> + g_assert(create_id == find_id);
> + g_assert(touch.touches[find_id].active == TRUE);
> + g_assert(touch.touches[find_id].id == 0xdeadbeef);
> +}
> +
> +static void touch_finish(void)
> +{
> + DeviceIntRec dev;
> + TouchClassRec touch;
> + TouchPointInfoRec touches[2];
> + int touchid;
> +
> + memset(&dev, 0, sizeof(dev));
> + memset(&touch, 0, sizeof(touch));
> + memset(touches, 0, sizeof(*touches) * 2);
> + touch.num_touches = 2;
> + touch.touches = touches;
> + dev.touch = &touch;
> + touchid = CreateTouchPoint(&dev, 0xdeadbeef);
> + g_assert(touchid >= 0);
> + FinishTouchPoint(&dev, 0xdeadbeef);
> + g_assert(touch.touches[touchid].active == FALSE);
> + g_assert(touch.touches[touchid].pending_finish == 0);
> + g_assert(touch.touches[touchid].num_listeners == 0);
> + g_assert(touch.touches[touchid].num_grabs == 0);
> + g_assert(touch.touches[touchid].sprite.spriteTraceGood == 0);
maybe make sure that FindTouchPoint won't find the deleted touch point
anymore here.
either way, Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net> though
this one I guess will see changes as the server code moves.
Cheers,
Peter
> +}
> +
> int main(int argc, char** argv)
> {
> g_test_init(&argc, &argv,NULL);
> @@ -1069,6 +1181,7 @@ int main(int argc, char** argv)
> g_test_add_func("/dix/input/attributes", dix_input_attributes);
> g_test_add_func("/dix/input/init-valuators", dix_init_valuators);
> g_test_add_func("/dix/input/event-core-conversion", dix_event_to_core_conversion);
> + g_test_add_func("/dix/input/event-xi2-conversion", dix_event_to_xi2_conversion);
> g_test_add_func("/dix/input/check-grab-values", dix_check_grab_values);
> g_test_add_func("/dix/input/xi2-struct-sizes", xi2_struct_sizes);
> g_test_add_func("/dix/input/grab_matching", dix_grab_matching);
> @@ -1076,7 +1189,9 @@ int main(int argc, char** argv)
> g_test_add_func("/include/byte_padding_macros", include_byte_padding_macros);
> g_test_add_func("/include/bit_test_macros", include_bit_test_macros);
> g_test_add_func("/Xi/xiproperty/register-unregister", xi_unregister_handlers);
> -
> + g_test_add_func("/dix/input/touch-create", touch_create);
> + g_test_add_func("/dix/input/touch-find-point", touch_find_point);
> + g_test_add_func("/dix/input/touch-finish", touch_finish);
>
> return g_test_run();
> }
> diff --git a/test/xi2/protocol-eventconvert.c b/test/xi2/protocol-eventconvert.c
> index 0478c33..6c9595a 100644
> --- a/test/xi2/protocol-eventconvert.c
> +++ b/test/xi2/protocol-eventconvert.c
> @@ -311,6 +311,18 @@ static void test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent *out,
> g_assert(out->sourceid == in->sourceid);
>
> switch (in->type) {
> + case ET_TouchMotion:
> + flagmask = (XITouchOwnerAccepted | XITouchPendingFinish);
> + /* fallthrough */
> + case ET_TouchBegin:
> + case ET_TouchEnd:
> + flagmask |= XITouchOwner;
> + break;
> + case ET_ButtonPress:
> + case ET_ButtonRelease:
> + case ET_Motion:
> + flagmask = XITouchPointer;
> + break;
> case ET_KeyPress:
> flagmask = XIKeyRepeat;
> break;
> @@ -636,6 +648,47 @@ static void test_convert_XIDeviceEvent(void)
> }
> }
>
> +static void test_convert_XITouch(void)
> +{
> + DeviceEvent in;
> +
> + memset(&in, 0, sizeof(in));
> +
> + g_test_message("Testing TouchBegin");
> + in.header = ET_Internal;
> + in.type = ET_TouchBegin;
> + in.length = sizeof(DeviceEvent);
> + in.time = 0;
> + in.deviceid = 1;
> + in.sourceid = 2;
> + in.root = 3;
> + in.root_x = 4;
> + in.root_x_frac = 5;
> + in.root_y = 6;
> + in.root_y_frac = 7;
> + in.detail.button = 8;
> + in.mods.base = 9;
> + in.mods.latched = 10;
> + in.mods.locked = 11;
> + in.mods.effective = 11;
> + in.group.base = 12;
> + in.group.latched = 13;
> + in.group.locked = 14;
> + in.group.effective = 15;
> + in.flags = XITouchOwner;
> + test_XIDeviceEvent(&in);
> +
> + g_test_message("Testing TouchMotion");
> + in.type = ET_TouchMotion;
> + in.flags = XITouchOwnerAccepted;
> + test_XIDeviceEvent(&in);
> +
> + g_test_message("Testing TouchEnd");
> + in.type = ET_TouchEnd;
> + in.flags = 0;
> + test_XIDeviceEvent(&in);
> +}
> +
> static void test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
> xXIDeviceChangedEvent *out,
> BOOL swap)
> @@ -912,6 +965,7 @@ int main(int argc, char** argv)
> g_test_add_func("/xi2/eventconvert/XIFocusEvent", test_convert_XIFocusEvent);
> g_test_add_func("/xi2/eventconvert/XIDeviceEvent", test_convert_XIDeviceEvent);
> g_test_add_func("/xi2/eventconvert/XIDeviceChangedEvent", test_convert_XIDeviceChangedEvent);
> + g_test_add_func("/xi2/eventconvert/XITouch", test_convert_XITouch);
>
> return g_test_run();
> }
> diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c
> index f951a14..6fa97a0 100644
> --- a/test/xi2/protocol-xiselectevents.c
> +++ b/test/xi2/protocol-xiselectevents.c
> @@ -159,7 +159,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
> memset(bits, 0, mask->mask_len * 4);
> for (j = 0; j <= XI2LASTEVENT; j++)
> {
> + /* Can't select for these events alone */
> + if (j == XI_TouchMotion || j == XI_TouchEnd)
> + continue;
> +
> SetBit(bits, j);
> +
> + /* Must select for all touch events at once */
> + if (j == XI_TouchBegin) {
> + SetBit(bits, XI_TouchMotion);
> + SetBit(bits, XI_TouchEnd);
> + }
> +
> request_XISelectEvent(req, Success);
> ClearBit(bits, j);
> }
> @@ -175,7 +186,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
>
> for (j = 0; j <= XI2LASTEVENT; j++)
> {
> + /* Can't select for these events alone */
> + if (j == XI_TouchMotion || j == XI_TouchEnd)
> + continue;
> +
> SetBit(bits, j);
> +
> + /* Must select for all touch events at once */
> + if (j == XI_TouchBegin) {
> + SetBit(bits, XI_TouchMotion);
> + SetBit(bits, XI_TouchEnd);
> + }
> +
> request_XISelectEvent(req, Success);
> }
>
> @@ -189,7 +211,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
>
> for (j = XI2LASTEVENT + 1; j < mask->mask_len * 4; j++)
> {
> + /* Can't select for these events alone */
> + if (j == XI_TouchMotion || j == XI_TouchEnd)
> + continue;
> +
> SetBit(bits, j);
> +
> + /* Must select for all touch events at once */
> + if (j == XI_TouchBegin) {
> + SetBit(bits, XI_TouchMotion);
> + SetBit(bits, XI_TouchEnd);
> + }
> +
> request_XISelectEvent(req, BadValue);
> ClearBit(bits, j);
> }
> @@ -202,7 +235,18 @@ static void request_XISelectEvents_masks(xXISelectEventsReq *req)
> memset(bits, 0, mask->mask_len * 4);
> for (j = 0; j <= XI2LASTEVENT; j++)
> {
> + /* Can't select for these events alone */
> + if (j == XI_TouchMotion || j == XI_TouchEnd)
> + continue;
> +
> SetBit(bits, j);
> +
> + /* Must select for all touch events at once */
> + if (j == XI_TouchBegin) {
> + SetBit(bits, XI_TouchMotion);
> + SetBit(bits, XI_TouchEnd);
> + }
> +
> request_XISelectEvent(req, Success);
> }
>
> --
> 1.7.2.3
More information about the xorg-devel
mailing list