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

Lucas Fialho Zawacki lfzawacki at gmail.com
Sat Oct 22 15:53:20 CDT 2011


From: Lucas Fialho Zawacki <lfzawacki at gmail.com>

---
 dlls/dinput8/tests/device.c |   61 -----------------
 dlls/dinput8/tests/dinput.c |  155 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 155 insertions(+), 61 deletions(-)

diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index ab44cf3..8a9b1df 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -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)
diff --git a/dlls/dinput8/tests/dinput.c b/dlls/dinput8/tests/dinput.c
index 88c4c5a..e11430a 100644
--- a/dlls/dinput8/tests/dinput.c
+++ b/dlls/dinput8/tests/dinput.c
@@ -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();
-- 
1.7.0.4




More information about the wine-patches mailing list