dinput8/tests: Moved EnumDevicesBySemantics specific tests to dinput.c and added a couple more.
This commit is contained in:
parent
6ca1a943eb
commit
32f79acc49
|
@ -239,29 +239,6 @@ static BOOL CALLBACK enumeration_callback(
|
|||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
/* A simpler callback function used to count and check
|
||||
the enumeration of devices.
|
||||
*/
|
||||
static BOOL CALLBACK counting_callback(
|
||||
LPCDIDEVICEINSTANCE lpddi,
|
||||
LPDIRECTINPUTDEVICE8 lpdid,
|
||||
DWORD dwFlags,
|
||||
DWORD dwRemaining,
|
||||
LPVOID pvRef)
|
||||
{
|
||||
struct enum_data *data = pvRef;
|
||||
if (!data) return DIENUM_CONTINUE;
|
||||
|
||||
data->ndevices++;
|
||||
if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysKeyboard))
|
||||
data->keyboard = lpdid;
|
||||
|
||||
if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysMouse))
|
||||
data->mouse = lpdid;
|
||||
|
||||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
static void test_action_mapping(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
@ -269,7 +246,6 @@ static void test_action_mapping(void)
|
|||
LPDIRECTINPUT8 pDI = NULL;
|
||||
DIACTIONFORMAT af;
|
||||
struct enum_data data = {pDI, &af, NULL, NULL, 0};
|
||||
struct enum_data count = {pDI, &af, NULL, NULL, 0};
|
||||
|
||||
hr = CoCreateInstance(&CLSID_DirectInput8, 0, 1, &IID_IDirectInput8A, (LPVOID*)&pDI);
|
||||
if (hr == DIERR_OLDDIRECTINPUTVERSION ||
|
||||
|
@ -301,42 +277,10 @@ static void test_action_mapping(void)
|
|||
af.dwGenre = 0x01000000; /* DIVIRTUAL_DRIVING_RACE */
|
||||
af.dwBufferSize = 32;
|
||||
|
||||
/* Test enumerating all attached and installed devices */
|
||||
count.keyboard = NULL;
|
||||
count.mouse = NULL;
|
||||
count.ndevices = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, counting_callback, &count, DIEDBSFL_ATTACHEDONLY);
|
||||
ok (count.ndevices > 0, "EnumDevicesBySemantics did not call the callback hr=%08x\n", hr);
|
||||
ok (count.keyboard != NULL, "EnumDevicesBySemantics should enumerate the keyboard\n");
|
||||
ok (count.mouse != NULL, "EnumDevicesBySemantics should enumerate the mouse\n");
|
||||
|
||||
/* Enumerate Force feedback devices. We should get no mouse nor keyboard */
|
||||
count.keyboard = NULL;
|
||||
count.mouse = NULL;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, counting_callback, &count, DIEDBSFL_FORCEFEEDBACK);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (count.keyboard == NULL, "Keyboard should not be enumerated when asking for forcefeedback\n");
|
||||
ok (count.mouse == NULL, "Mouse should not be enumerated when asking for forcefeedback\n");
|
||||
|
||||
/* Enumerate available devices. That is devices with not owned by any user.
|
||||
Before setting the action map for all devices we still have them available.
|
||||
*/
|
||||
count.ndevices = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, counting_callback, &count, DIEDBSFL_AVAILABLEDEVICES);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (count.ndevices > 0, "There should be devices available before action mapping available=%d\n", count.ndevices);
|
||||
|
||||
/* This enumeration builds and sets the action map for all devices */
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, enumeration_callback, &data, DIEDBSFL_ATTACHEDONLY);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed: hr=%08x\n", hr);
|
||||
|
||||
/* After a successful action mapping we should have no devices available */
|
||||
count.ndevices = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, counting_callback, &count, DIEDBSFL_AVAILABLEDEVICES);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
todo_wine ok (count.ndevices == 0, "No device should be available after action mapping available=%d\n", count.ndevices);
|
||||
|
||||
/* Use the devices we collect for some tests */
|
||||
if (data.keyboard != NULL)
|
||||
{
|
||||
/* Test keyboard BuildActionMap */
|
||||
|
@ -367,11 +311,6 @@ static void test_action_mapping(void)
|
|||
|
||||
test_device_input(data.mouse, INPUT_MOUSE, MOUSEEVENTF_LEFTDOWN, 3);
|
||||
}
|
||||
|
||||
/* The call fails with a zeroed GUID */
|
||||
memset(&af.guidActionMap, 0, sizeof(GUID));
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, enumeration_callback, 0, 0);
|
||||
todo_wine ok(FAILED(hr), "EnumDevicesBySemantics succeeded with invalid GUID hr=%08x\n", hr);
|
||||
}
|
||||
|
||||
START_TEST(device)
|
||||
|
|
|
@ -421,6 +421,160 @@ static void test_EnumDevices(void)
|
|||
IDirectInput8_Release(pDI);
|
||||
}
|
||||
|
||||
struct enum_semantics_test
|
||||
{
|
||||
unsigned int device_count;
|
||||
BOOL mouse;
|
||||
BOOL keyboard;
|
||||
LPDIACTIONFORMAT lpdiaf;
|
||||
const char* username;
|
||||
};
|
||||
|
||||
static DIACTION actionMapping[]=
|
||||
{
|
||||
/* axis */
|
||||
{ 0, 0x01008A01 /* DIAXIS_DRIVINGR_STEER */, 0, { "Steer" } },
|
||||
/* button */
|
||||
{ 1, 0x01000C01 /* DIBUTTON_DRIVINGR_SHIFTUP */, 0, { "Upshift" } },
|
||||
/* keyboard key */
|
||||
{ 2, DIKEYBOARD_SPACE, 0, { "Missile" } },
|
||||
/* mouse button */
|
||||
{ 3, DIMOUSE_BUTTON0, 0, { "Select" } },
|
||||
/* mouse axis */
|
||||
{ 4, DIMOUSE_YAXIS, 0, { "Y Axis" } }
|
||||
};
|
||||
|
||||
static BOOL CALLBACK enum_semantics_callback(LPCDIDEVICEINSTANCE lpddi, IDirectInputDevice8A *lpdid, DWORD dwFlags, DWORD dwRemaining, void *context)
|
||||
{
|
||||
struct enum_semantics_test *data = context;
|
||||
|
||||
if (context == NULL) return DIENUM_STOP;
|
||||
|
||||
data->device_count++;
|
||||
|
||||
if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysKeyboard)) data->keyboard = TRUE;
|
||||
|
||||
if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysMouse)) data->mouse = TRUE;
|
||||
|
||||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
static BOOL CALLBACK set_action_map_callback(LPCDIDEVICEINSTANCE lpddi, IDirectInputDevice8A *lpdid, DWORD dwFlags, DWORD dwRemaining, void *context)
|
||||
{
|
||||
HRESULT hr;
|
||||
struct enum_semantics_test *data = context;
|
||||
|
||||
/* Building and setting an action map */
|
||||
/* It should not use any pre-stored mappings so we use DIDBAM_INITIALIZE */
|
||||
hr = IDirectInputDevice8_BuildActionMap(lpdid, data->lpdiaf, NULL, DIDBAM_INITIALIZE);
|
||||
ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr);
|
||||
|
||||
hr = IDirectInputDevice8_SetActionMap(lpdid, data->lpdiaf, data->username, 0);
|
||||
ok (SUCCEEDED(hr), "SetActionMap failed hr=%08x\n", hr);
|
||||
|
||||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
static void test_EnumDevicesBySemantics(void)
|
||||
{
|
||||
IDirectInput8A *pDI;
|
||||
HRESULT hr;
|
||||
DIACTIONFORMATA diaf;
|
||||
const GUID ACTION_MAPPING_GUID = { 0x1, 0x2, 0x3, { 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb } };
|
||||
struct enum_semantics_test data = { 0, FALSE, FALSE, &diaf, NULL };
|
||||
int device_total = 0;
|
||||
|
||||
hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
|
||||
return;
|
||||
}
|
||||
|
||||
memset (&diaf, 0, sizeof(diaf));
|
||||
diaf.dwSize = sizeof(diaf);
|
||||
diaf.dwActionSize = sizeof(DIACTION);
|
||||
diaf.dwNumActions = sizeof(actionMapping) / sizeof(actionMapping[0]);
|
||||
diaf.dwDataSize = 4 * diaf.dwNumActions;
|
||||
diaf.rgoAction = actionMapping;
|
||||
diaf.guidActionMap = ACTION_MAPPING_GUID;
|
||||
diaf.dwGenre = 0x01000000; /* DIVIRTUAL_DRIVING_RACE */
|
||||
diaf.dwBufferSize = 32;
|
||||
|
||||
/* Test enumerating all attached and installed devices */
|
||||
data.keyboard = FALSE;
|
||||
data.mouse = FALSE;
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, enum_semantics_callback, &data, DIEDBSFL_ATTACHEDONLY);
|
||||
ok (data.device_count > 0, "EnumDevicesBySemantics did not call the callback hr=%08x\n", hr);
|
||||
ok (data.keyboard, "EnumDevicesBySemantics should enumerate the keyboard\n");
|
||||
ok (data.mouse, "EnumDevicesBySemantics should enumerate the mouse\n");
|
||||
|
||||
/* Enumerate Force feedback devices. We should get no mouse nor keyboard */
|
||||
data.keyboard = FALSE;
|
||||
data.mouse = FALSE;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, enum_semantics_callback, &data, DIEDBSFL_FORCEFEEDBACK);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (!data.keyboard, "Keyboard should not be enumerated when asking for forcefeedback\n");
|
||||
ok (!data.mouse, "Mouse should not be enumerated when asking for forcefeedback\n");
|
||||
|
||||
/* Enumerate available devices. That is devices not owned by any user.
|
||||
Before setting the action map for all devices we still have them available. */
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, enum_semantics_callback, &data, DIEDBSFL_AVAILABLEDEVICES);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (data.device_count > 0, "There should be devices available before action mapping available=%d\n", data.device_count);
|
||||
|
||||
/* Keep the device total */
|
||||
device_total = data.device_count;
|
||||
|
||||
/* This enumeration builds and sets the action map for all devices with a NULL username */
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, set_action_map_callback, &data, DIEDBSFL_ATTACHEDONLY);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed: hr=%08x\n", hr);
|
||||
|
||||
/* After a successful action mapping we should have no devices available */
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, enum_semantics_callback, &data, DIEDBSFL_AVAILABLEDEVICES);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
todo_wine ok (data.device_count == 0, "No device should be available after action mapping available=%d\n", data.device_count);
|
||||
|
||||
/* Now we'll give all the devices to a specific user */
|
||||
data.username = "Sh4d0w M4g3";
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, set_action_map_callback, &data, DIEDBSFL_ATTACHEDONLY);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed: hr=%08x\n", hr);
|
||||
|
||||
/* Testing with the default user, DIEDBSFL_THISUSER has no effect */
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, enum_semantics_callback, &data, DIEDBSFL_THISUSER);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (data.device_count == device_total, "THISUSER has no effect with NULL username owned=%d, expected=%d\n", data.device_count, device_total);
|
||||
|
||||
/* Using an empty user string is the same as passing NULL, DIEDBSFL_THISUSER has no effect */
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, "", &diaf, enum_semantics_callback, &data, DIEDBSFL_THISUSER);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (data.device_count == device_total, "THISUSER has no effect with \"\" as username owned=%d, expected=%d\n", data.device_count, device_total);
|
||||
|
||||
/* Testing with a user with no ownership of the devices */
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, "Ninja Brian", &diaf, enum_semantics_callback, &data, DIEDBSFL_THISUSER);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
todo_wine ok (data.device_count == 0, "This user should own no devices owned=%d\n", data.device_count);
|
||||
|
||||
/* Sh4d0w M4g3 has ownership of all devices */
|
||||
data.device_count = 0;
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, "Sh4d0w M4g3", &diaf, enum_semantics_callback, &data, DIEDBSFL_THISUSER);
|
||||
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed hr=%08x\n", hr);
|
||||
ok (data.device_count == device_total, "This user should own %d devices owned=%d\n", device_total, data.device_count);
|
||||
|
||||
/* The call fails with a zeroed GUID */
|
||||
memset(&diaf.guidActionMap, 0, sizeof(GUID));
|
||||
hr = IDirectInput8_EnumDevicesBySemantics(pDI, NULL, &diaf, enum_semantics_callback, NULL, 0);
|
||||
todo_wine ok(FAILED(hr), "EnumDevicesBySemantics succeeded with invalid GUID hr=%08x\n", hr);
|
||||
|
||||
IDirectInput8_Release(pDI);
|
||||
}
|
||||
|
||||
static void test_GetDeviceStatus(void)
|
||||
{
|
||||
IDirectInput8A *pDI;
|
||||
|
@ -529,6 +683,7 @@ START_TEST(dinput)
|
|||
test_QueryInterface();
|
||||
test_CreateDevice();
|
||||
test_EnumDevices();
|
||||
test_EnumDevicesBySemantics();
|
||||
test_GetDeviceStatus();
|
||||
test_RunControlPanel();
|
||||
test_Initialize();
|
||||
|
|
Loading…
Reference in New Issue