[DINPUT_WINETEST] Sync with Wine Staging 4.18. CORE-16441
[reactos.git] / modules / rostests / winetests / dinput / joystick.c
index b4ffba5..f009ef3 100644 (file)
@@ -30,8 +30,6 @@
 #include "wingdi.h"
 #include "dinput.h"
 
-#define numObjects(x) (sizeof(x) / sizeof(x[0]))
-
 typedef struct tagUserData {
     IDirectInputA *pDI;
     DWORD version;
@@ -62,7 +60,7 @@ static const DIDATAFORMAT c_dfDIJoystickTest = {
     sizeof(DIOBJECTDATAFORMAT),
     DIDF_ABSAXIS,
     sizeof(DIJOYSTATE2),
-    numObjects(dfDIJoystickTest),
+    ARRAY_SIZE(dfDIJoystickTest),
     (LPDIOBJECTDATAFORMAT)dfDIJoystickTest
 };
 
@@ -178,7 +176,7 @@ static const struct effect_id
 static const struct effect_id* effect_from_guid(const GUID *guid)
 {
     unsigned int i;
-    for (i = 0; i < sizeof(effect_conversion) / sizeof(effect_conversion[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(effect_conversion); i++)
         if (IsEqualGUID(guid, effect_conversion[i].guid))
             return &effect_conversion[i];
     return NULL;
@@ -272,6 +270,29 @@ static const HRESULT SetCoop_real_window[16] =  {
     E_INVALIDARG, S_OK,         S_OK,         E_INVALIDARG,
     E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG};
 
+static BOOL CALLBACK EnumAllFeedback(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
+{
+    trace("---- Device Information ----\n"
+          "Product Name  : %s\n"
+          "Instance Name : %s\n"
+          "devType       : 0x%08x\n"
+          "GUID Product  : %s\n"
+          "GUID Instance : %s\n"
+          "HID Page      : 0x%04x\n"
+          "HID Usage     : 0x%04x\n",
+          lpddi->tszProductName,
+          lpddi->tszInstanceName,
+          lpddi->dwDevType,
+          wine_dbgstr_guid(&lpddi->guidProduct),
+          wine_dbgstr_guid(&lpddi->guidInstance),
+          lpddi->wUsagePage,
+          lpddi->wUsage);
+
+    ok(!(IsEqualGUID(&GUID_SysMouse, &lpddi->guidProduct) || IsEqualGUID(&GUID_SysKeyboard, &lpddi->guidProduct)), "Invalid device returned.\n");
+
+    return DIENUM_CONTINUE;
+}
+
 static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
 {
     HRESULT hr;
@@ -300,7 +321,7 @@ static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
     DIPROPDWORD dip_gain_set, dip_gain_get;
     struct effect_enum effect_data;
 
-    ok(data->version > 0x0300, "Joysticks not supported in version 0x%04x\n", data->version);
+    ok(data->version >= 0x0300, "Joysticks not supported in version 0x%04x\n", data->version);
  
     hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, NULL, NULL);
     ok(hr==E_POINTER,"IDirectInput_CreateDevice() should have returned "
@@ -381,7 +402,23 @@ static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
     dpg.diph.dwHow = DIPH_DEVICE;
 
     hr = IDirectInputDevice_GetProperty(pJoystick, DIPROP_GUIDANDPATH, &dpg.diph);
-    todo_wine ok(SUCCEEDED(hr), "IDirectInput_GetProperty() for DIPROP_GUIDANDPATH failed: %08x\n", hr);
+    ok(SUCCEEDED(hr), "IDirectInput_GetProperty() for DIPROP_GUIDANDPATH failed: %08x\n", hr);
+
+    {
+        static const WCHAR formatW[] = {'\\','\\','?','\\','%','*','[','^','#',']','#','v','i','d','_',
+                                        '%','0','4','x','&','p','i','d','_','%','0','4','x',0};
+        static const WCHAR miW[] = {'m','i','_',0};
+        static const WCHAR igW[] = {'i','g','_',0};
+        int vid, pid;
+
+        _wcslwr(dpg.wszPath);
+        count = swscanf(dpg.wszPath, formatW, &vid, &pid);
+        ok(count == 2, "DIPROP_GUIDANDPATH path has wrong format. Expected count: 2 Got: %i Path: %s\n",
+           count, wine_dbgstr_w(dpg.wszPath));
+        ok(wcsstr(dpg.wszPath, miW) != 0 || wcsstr(dpg.wszPath, igW) != 0,
+           "DIPROP_GUIDANDPATH path should contain either 'ig_' or 'mi_' substring. Path: %s\n",
+           wine_dbgstr_w(dpg.wszPath));
+    }
 
     hr = IDirectInputDevice_SetDataFormat(pJoystick, NULL);
     ok(hr==E_POINTER,"IDirectInputDevice_SetDataFormat() should have returned "
@@ -504,7 +541,7 @@ static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
     effect_data.eff.dwDuration      = INFINITE;
     effect_data.eff.dwGain          = DI_FFNOMINALMAX;
     effect_data.eff.dwTriggerButton = DIEB_NOTRIGGER;
-    effect_data.eff.cAxes           = sizeof(axes) / sizeof(axes[0]);
+    effect_data.eff.cAxes           = ARRAY_SIZE(axes);
     effect_data.eff.rgdwAxes        = axes;
     effect_data.eff.rglDirection    = direction;
 
@@ -872,6 +909,24 @@ static void joystick_tests(DWORD version)
         trace("  Version Not Supported\n");
 }
 
+static void test_enum_feedback(void)
+{
+    HRESULT hr;
+    IDirectInputA *pDI;
+    ULONG ref;
+    HINSTANCE hInstance = GetModuleHandleW(NULL);
+
+    hr = DirectInputCreateA(hInstance, 0x0700, &pDI, NULL);
+    ok(hr==DI_OK||hr==DIERR_OLDDIRECTINPUTVERSION, "DirectInputCreateA() failed: %08x\n", hr);
+    if (hr==DI_OK && pDI!=0) {
+        hr = IDirectInput_EnumDevices(pDI, 0, EnumAllFeedback, NULL, DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK);
+        ok(hr==DI_OK,"IDirectInput_EnumDevices() failed: %08x\n", hr);
+        ref = IDirectInput_Release(pDI);
+        ok(ref==0,"IDirectInput_Release() reference count = %d\n", ref);
+    } else if (hr==DIERR_OLDDIRECTINPUTVERSION)
+        trace("  Version Not Supported\n");
+}
+
 START_TEST(joystick)
 {
     CoInitialize(NULL);
@@ -880,5 +935,7 @@ START_TEST(joystick)
     joystick_tests(0x0500);
     joystick_tests(0x0300);
 
+    test_enum_feedback();
+
     CoUninitialize();
 }