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) | ||||
| { | ||||
|     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/XIFocusEvent", test_convert_XIFocusEvent); | ||||
|     g_test_add_func("/xi2/eventconvert/XIDeviceEvent", test_convert_XIDeviceEvent); | ||||
| 
 | ||||
|     return g_test_run(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue