test: add event conversion tests for XIDeviceEvents
This commit is contained in:
		
							parent
							
								
									3f2e4b9867
								
							
						
					
					
						commit
						af38f6790c
					
				|  | @ -267,6 +267,366 @@ static void test_convert_XIRawEvent(void) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void test_values_XIDeviceEvent(DeviceEvent *in, xXIDeviceEvent *out, | ||||||
|  |                                       BOOL swap) | ||||||
|  | { | ||||||
|  |     int buttons, valuators; | ||||||
|  |     int i; | ||||||
|  |     unsigned char *ptr; | ||||||
|  |     FP3232 *values; | ||||||
|  | 
 | ||||||
|  |     if (swap) { | ||||||
|  |         char n; | ||||||
|  | 
 | ||||||
|  |         swaps(&out->sequenceNumber, n); | ||||||
|  |         swapl(&out->length, n); | ||||||
|  |         swaps(&out->evtype, n); | ||||||
|  |         swaps(&out->deviceid, n); | ||||||
|  |         swaps(&out->sourceid, n); | ||||||
|  |         swapl(&out->time, n); | ||||||
|  |         swapl(&out->detail, n); | ||||||
|  |         swapl(&out->root, n); | ||||||
|  |         swapl(&out->event, n); | ||||||
|  |         swapl(&out->child, n); | ||||||
|  |         swapl(&out->root_x, n); | ||||||
|  |         swapl(&out->root_y, n); | ||||||
|  |         swapl(&out->event_x, n); | ||||||
|  |         swapl(&out->event_y, n); | ||||||
|  |         swaps(&out->buttons_len, n); | ||||||
|  |         swaps(&out->valuators_len, n); | ||||||
|  |         swapl(&out->mods.base_mods, n); | ||||||
|  |         swapl(&out->mods.latched_mods, n); | ||||||
|  |         swapl(&out->mods.locked_mods, n); | ||||||
|  |         swapl(&out->mods.effective_mods, n); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     g_assert(out->extension == 0); /* IReqCode defaults to 0 */ | ||||||
|  |     g_assert(out->evtype == GetXI2Type((InternalEvent*)in)); | ||||||
|  |     g_assert(out->time == in->time); | ||||||
|  |     g_assert(out->detail == in->detail.button); | ||||||
|  |     g_assert(out->length >= 12); | ||||||
|  | 
 | ||||||
|  |     g_assert(out->deviceid == in->deviceid); | ||||||
|  |     g_assert(out->sourceid == in->sourceid); | ||||||
|  | 
 | ||||||
|  |     g_assert(out->flags == 0); /* FIXME: we don't set the flags yet */ | ||||||
|  | 
 | ||||||
|  |     g_assert(out->root == in->root); | ||||||
|  |     g_assert(out->event == None); /* set in FixUpEventFromWindow */ | ||||||
|  |     g_assert(out->child == None); /* set in FixUpEventFromWindow */ | ||||||
|  | 
 | ||||||
|  |     g_assert(out->mods.base_mods == in->mods.base); | ||||||
|  |     g_assert(out->mods.latched_mods == in->mods.latched); | ||||||
|  |     g_assert(out->mods.locked_mods == in->mods.locked); | ||||||
|  |     g_assert(out->mods.effective_mods == in->mods.effective); | ||||||
|  | 
 | ||||||
|  |     g_assert(out->group.base_group == in->group.base); | ||||||
|  |     g_assert(out->group.latched_group == in->group.latched); | ||||||
|  |     g_assert(out->group.locked_group == in->group.locked); | ||||||
|  |     g_assert(out->group.effective_group == in->group.effective); | ||||||
|  | 
 | ||||||
|  |     g_assert(out->event_x == 0); /* set in FixUpEventFromWindow */ | ||||||
|  |     g_assert(out->event_y == 0); /* set in FixUpEventFromWindow */ | ||||||
|  | 
 | ||||||
|  |     g_assert(out->root_x == FP1616(in->root_x, in->root_x_frac)); | ||||||
|  |     g_assert(out->root_y == FP1616(in->root_y, in->root_y_frac)); | ||||||
|  | 
 | ||||||
|  |     buttons = 0; | ||||||
|  |     for (i = 0; i < bits_to_bytes(sizeof(in->buttons)); i++) | ||||||
|  |     { | ||||||
|  |         if (XIMaskIsSet(in->buttons, i)) | ||||||
|  |         { | ||||||
|  |             g_assert(out->buttons_len >= bytes_to_int32(bits_to_bytes(i))); | ||||||
|  |             buttons++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ptr = (unsigned char*)&out[1]; | ||||||
|  |     for (i = 0; i < sizeof(in->buttons) * 8; i++) | ||||||
|  |         g_assert(XIMaskIsSet(in->buttons, i) == XIMaskIsSet(ptr, i)); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     valuators = 0; | ||||||
|  |     for (i = 0; i < sizeof(in->valuators.mask) * 8; i++) | ||||||
|  |         if (XIMaskIsSet(in->valuators.mask, i)) | ||||||
|  |             valuators++; | ||||||
|  | 
 | ||||||
|  |     g_assert(out->valuators_len >= bytes_to_int32(bits_to_bytes(valuators))); | ||||||
|  | 
 | ||||||
|  |     ptr += out->buttons_len * 4; | ||||||
|  |     values = (FP3232*)(ptr + out->valuators_len * 4); | ||||||
|  |     for (i = 0; i < sizeof(in->valuators.mask) * 8 || | ||||||
|  |                 i < (out->valuators_len * 4) * 8; i++) | ||||||
|  |     { | ||||||
|  |         if (i > sizeof(in->valuators.mask) * 8) | ||||||
|  |             g_assert(!XIMaskIsSet(ptr, i)); | ||||||
|  |         else if (i > out->valuators_len * 4 * 8) | ||||||
|  |             g_assert(!XIMaskIsSet(in->valuators.mask, i)); | ||||||
|  |         else { | ||||||
|  |             g_assert(XIMaskIsSet(in->valuators.mask, i) == | ||||||
|  |                      XIMaskIsSet(ptr, i)); | ||||||
|  | 
 | ||||||
|  |             if (XIMaskIsSet(ptr, i)) | ||||||
|  |             { | ||||||
|  |                 FP3232 vi, vo; | ||||||
|  | 
 | ||||||
|  |                 vi.integral = in->valuators.data[i]; | ||||||
|  |                 vi.frac = in->valuators.data_frac[i]; | ||||||
|  | 
 | ||||||
|  |                 vo = *values; | ||||||
|  | 
 | ||||||
|  |                 if (swap) | ||||||
|  |                 { | ||||||
|  |                     char n; | ||||||
|  |                     swapl(&vo.integral, n); | ||||||
|  |                     swapl(&vo.frac, n); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 g_assert(vi.integral == vo.integral); | ||||||
|  |                 g_assert(vi.frac == vo.frac); | ||||||
|  |                 values++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void test_XIDeviceEvent(DeviceEvent *in) | ||||||
|  | { | ||||||
|  |     xXIDeviceEvent *out, *swapped; | ||||||
|  |     int rc; | ||||||
|  | 
 | ||||||
|  |     rc = EventToXI2((InternalEvent*)in, (xEvent**)&out); | ||||||
|  |     g_assert(rc == Success); | ||||||
|  | 
 | ||||||
|  |     test_values_XIDeviceEvent(in, out, FALSE); | ||||||
|  | 
 | ||||||
|  |     swapped = xcalloc(1, sizeof(xEvent) + out->length * 4); | ||||||
|  |     XI2EventSwap(out, swapped); | ||||||
|  |     test_values_XIDeviceEvent(in, swapped, TRUE); | ||||||
|  | 
 | ||||||
|  |     xfree(out); | ||||||
|  |     xfree(swapped); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void test_convert_XIDeviceEvent(void) | ||||||
|  | { | ||||||
|  |     DeviceEvent in; | ||||||
|  |     int i; | ||||||
|  | 
 | ||||||
|  |     memset(&in, 0, sizeof(in)); | ||||||
|  | 
 | ||||||
|  |     g_test_message("Testing simple field values"); | ||||||
|  |     in.header = ET_Internal; | ||||||
|  |     in.type = ET_Motion; | ||||||
|  |     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; | ||||||
|  | 
 | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     g_test_message("Testing field ranges"); | ||||||
|  |     /* 32 bit */ | ||||||
|  |     in.detail.button = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.detail.button = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.detail.button = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.detail.button = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.detail.button = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 32 bit */ | ||||||
|  |     in.time = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.time = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.time = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.time = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.time = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 16 bit */ | ||||||
|  |     in.deviceid = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.deviceid = 1 << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.deviceid = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 16 bit */ | ||||||
|  |     in.sourceid = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.deviceid = 1 << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.deviceid = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 32 bit */ | ||||||
|  |     in.root = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 16 bit */ | ||||||
|  |     in.root_x = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_x = 1 << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_x = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.root_x_frac = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_x_frac = 1 << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_x_frac = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.root_y = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_y = 1 << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_y = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.root_y_frac = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_y_frac = 1 << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.root_y_frac = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 32 bit */ | ||||||
|  |     in.mods.base = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.base = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.base = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.base = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.base = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.mods.latched = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.latched = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.latched = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.latched = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.latched = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.mods.locked = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.locked = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.locked = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.locked = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.locked = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.mods.effective = 1L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.effective = 1L << 8; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.effective = 1L << 16; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.effective = 1L << 24; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.effective = ~0L; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     /* 8 bit */ | ||||||
|  |     in.group.base = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.group.base = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.group.latched = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.group.latched = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.group.locked = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.group.locked = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     in.mods.effective = 1; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  |     in.mods.effective = ~0 & 0xFF; | ||||||
|  |     test_XIDeviceEvent(&in); | ||||||
|  | 
 | ||||||
|  |     g_test_message("Testing button masks"); | ||||||
|  |     for (i = 0; i < sizeof(in.buttons) * 8; i++) | ||||||
|  |     { | ||||||
|  |         XISetMask(in.buttons, i); | ||||||
|  |         test_XIDeviceEvent(&in); | ||||||
|  |         XIClearMask(in.buttons, i); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < sizeof(in.buttons) * 8; i++) | ||||||
|  |     { | ||||||
|  |         XISetMask(in.buttons, i); | ||||||
|  |         test_XIDeviceEvent(&in); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     g_test_message("Testing valuator masks"); | ||||||
|  |     for (i = 0; i < sizeof(in.valuators.mask) * 8; i++) | ||||||
|  |     { | ||||||
|  |         XISetMask(in.valuators.mask, i); | ||||||
|  |         test_XIDeviceEvent(&in); | ||||||
|  |         XIClearMask(in.valuators.mask, i); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < sizeof(in.valuators.mask) * 8; i++) | ||||||
|  |     { | ||||||
|  |         XISetMask(in.valuators.mask, i); | ||||||
|  | 
 | ||||||
|  |         in.valuators.data[i] = i; | ||||||
|  |         in.valuators.data_frac[i] = i + 20; | ||||||
|  |         test_XIDeviceEvent(&in); | ||||||
|  |         XIClearMask(in.valuators.mask, i); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < sizeof(in.valuators.mask) * 8; i++) | ||||||
|  |     { | ||||||
|  |         XISetMask(in.valuators.mask, i); | ||||||
|  |         test_XIDeviceEvent(&in); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int main(int argc, char** argv) | int main(int argc, char** argv) | ||||||
| { | { | ||||||
|     g_test_init(&argc, &argv,NULL); |     g_test_init(&argc, &argv,NULL); | ||||||
|  | @ -274,6 +634,7 @@ int main(int argc, char** argv) | ||||||
| 
 | 
 | ||||||
|     g_test_add_func("/xi2/eventconvert/XIRawEvent", test_convert_XIRawEvent); |     g_test_add_func("/xi2/eventconvert/XIRawEvent", test_convert_XIRawEvent); | ||||||
|     g_test_add_func("/xi2/eventconvert/XIFocusEvent", test_convert_XIFocusEvent); |     g_test_add_func("/xi2/eventconvert/XIFocusEvent", test_convert_XIFocusEvent); | ||||||
|  |     g_test_add_func("/xi2/eventconvert/XIDeviceEvent", test_convert_XIDeviceEvent); | ||||||
| 
 | 
 | ||||||
|     return g_test_run(); |     return g_test_run(); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue