dinput8/tests: Moved EnumDevicesBySemantics specific tests to dinput.c and added a couple more.

This commit is contained in:
Lucas Fialho Zawacki 2011-10-22 18:53:20 -02:00 committed by Alexandre Julliard
parent 6ca1a943eb
commit 32f79acc49
2 changed files with 155 additions and 61 deletions

View File

@ -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)

View File

@ -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();