[XINPUT1_3_WINETEST] Sync with Wine Staging 1.9.23. CORE-12409
authorAmine Khaldi <amine.khaldi@reactos.org>
Thu, 17 Nov 2016 23:29:18 +0000 (23:29 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Thu, 17 Nov 2016 23:29:18 +0000 (23:29 +0000)
svn path=/trunk/; revision=73310

rostests/winetests/xinput1_3/xinput.c

index 2a07f2d..17884e1 100644 (file)
@@ -24,6 +24,7 @@
 #include "wine/test.h"
 
 static DWORD (WINAPI *pXInputGetState)(DWORD, XINPUT_STATE*);
+static DWORD (WINAPI *pXInputGetStateEx)(DWORD, XINPUT_STATE_EX*);
 static DWORD (WINAPI *pXInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
 static DWORD (WINAPI *pXInputSetState)(DWORD, XINPUT_VIBRATION*);
 static void  (WINAPI *pXInputEnable)(BOOL);
@@ -46,14 +47,14 @@ static void test_set_state(void)
         result = pXInputSetState(controllerNum, &vibrator);
         ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputSetState failed with (%d)\n", result);
 
-        pXInputEnable(0);
+        if (pXInputEnable) pXInputEnable(0);
 
         vibrator.wLeftMotorSpeed = 65535;
         vibrator.wRightMotorSpeed = 65535;
         result = pXInputSetState(controllerNum, &vibrator);
         ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputSetState failed with (%d)\n", result);
 
-        pXInputEnable(1);
+        if (pXInputEnable) pXInputEnable(1);
     }
 
     result = pXInputSetState(XUSER_MAX_COUNT+1, &vibrator);
@@ -62,41 +63,63 @@ static void test_set_state(void)
 
 static void test_get_state(void)
 {
-
-    XINPUT_STATE controllerState;
-    DWORD controllerNum;
+    union
+    {
+        XINPUT_STATE state;
+        XINPUT_STATE_EX state_ex;
+    } xinput;
+    DWORD controllerNum, i;
     DWORD result;
 
-    for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++)
+    for (i = 0; i < (pXInputGetStateEx ? 2 : 1); i++)
     {
-        ZeroMemory(&controllerState, sizeof(XINPUT_STATE));
+        for (controllerNum = 0; controllerNum < XUSER_MAX_COUNT; controllerNum++)
+        {
+            ZeroMemory(&xinput, sizeof(xinput));
 
-        result = pXInputGetState(controllerNum, &controllerState);
-        ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputGetState failed with (%d)\n", result);
+            if (i == 0)
+                result = pXInputGetState(controllerNum, &xinput.state);
+            else
+                result = pXInputGetStateEx(controllerNum, &xinput.state_ex);
+            ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED,
+               "%s failed with (%d)\n", i == 0 ? "XInputGetState" : "XInputGetStateEx", result);
+
+            if (ERROR_DEVICE_NOT_CONNECTED == result)
+            {
+                skip("Controller %d is not connected\n", controllerNum);
+                continue;
+            }
 
-        if (ERROR_DEVICE_NOT_CONNECTED == result)
-        {
-            skip("Controller %d is not connected\n", controllerNum);
-        }
-        else
-        {
             trace("-- Results for controller %d --\n", controllerNum);
-            trace("XInputGetState: %d\n", result);
-            trace("State->dwPacketNumber: %d\n", controllerState.dwPacketNumber);
+            if (i == 0)
+                trace("XInputGetState: %d\n", result);
+            else
+                trace("XInputGetStateEx: %d\n", result);
+            trace("State->dwPacketNumber: %d\n", xinput.state.dwPacketNumber);
             trace("Gamepad Variables --\n");
-            trace("Gamepad.wButtons: %#x\n", controllerState.Gamepad.wButtons);
-            trace("Gamepad.bLeftTrigger: 0x%08x\n", controllerState.Gamepad.bLeftTrigger);
-            trace("Gamepad.bRightTrigger: 0x%08x\n", controllerState.Gamepad.bRightTrigger);
-            trace("Gamepad.sThumbLX: %d\n", controllerState.Gamepad.sThumbLX);
-            trace("Gamepad.sThumbLY: %d\n", controllerState.Gamepad.sThumbLY);
-            trace("Gamepad.sThumbRX: %d\n", controllerState.Gamepad.sThumbRX);
-            trace("Gamepad.sThumbRY: %d\n", controllerState.Gamepad.sThumbRY);
+            trace("Gamepad.wButtons: %#x\n", xinput.state.Gamepad.wButtons);
+            trace("Gamepad.bLeftTrigger: 0x%08x\n", xinput.state.Gamepad.bLeftTrigger);
+            trace("Gamepad.bRightTrigger: 0x%08x\n", xinput.state.Gamepad.bRightTrigger);
+            trace("Gamepad.sThumbLX: %d\n", xinput.state.Gamepad.sThumbLX);
+            trace("Gamepad.sThumbLY: %d\n", xinput.state.Gamepad.sThumbLY);
+            trace("Gamepad.sThumbRX: %d\n", xinput.state.Gamepad.sThumbRX);
+            trace("Gamepad.sThumbRY: %d\n", xinput.state.Gamepad.sThumbRY);
         }
     }
 
-    ZeroMemory(&controllerState, sizeof(XINPUT_STATE));
-    result = pXInputGetState(XUSER_MAX_COUNT+1, &controllerState);
+    result = pXInputGetState(XUSER_MAX_COUNT, &xinput.state);
     ok(result == ERROR_BAD_ARGUMENTS, "XInputGetState returned (%d)\n", result);
+
+    result = pXInputGetState(XUSER_MAX_COUNT+1, &xinput.state);
+    ok(result == ERROR_BAD_ARGUMENTS, "XInputGetState returned (%d)\n", result);
+    if (pXInputGetStateEx)
+    {
+        result = pXInputGetStateEx(XUSER_MAX_COUNT, &xinput.state_ex);
+        ok(result == ERROR_BAD_ARGUMENTS, "XInputGetState returned (%d)\n", result);
+
+        result = pXInputGetStateEx(XUSER_MAX_COUNT+1, &xinput.state_ex);
+        ok(result == ERROR_BAD_ARGUMENTS, "XInputGetState returned (%d)\n", result);
+    }
 }
 
 static void test_get_keystroke(void)
@@ -110,7 +133,8 @@ static void test_get_keystroke(void)
         ZeroMemory(&keystroke, sizeof(XINPUT_KEYSTROKE));
 
         result = pXInputGetKeystroke(controllerNum, XINPUT_FLAG_GAMEPAD, &keystroke);
-        ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputGetKeystroke failed with (%d)\n", result);
+        ok(result == ERROR_EMPTY || result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED,
+           "XInputGetKeystroke failed with (%d)\n", result);
 
         if (ERROR_DEVICE_NOT_CONNECTED == result)
         {
@@ -195,29 +219,70 @@ static void test_get_batteryinformation(void)
 
 START_TEST(xinput)
 {
+    struct
+    {
+        const char *name;
+        int version;
+    } libs[] = {
+        { "xinput1_1.dll",   1 },
+        { "xinput1_2.dll",   2 },
+        { "xinput1_3.dll",   3 },
+        { "xinput1_4.dll",   4 },
+        { "xinput9_1_0.dll", 0 } /* legacy for XP/Vista */
+    };
     HMODULE hXinput;
-    hXinput = LoadLibraryA( "xinput1_3.dll" );
+    void *pXInputGetStateEx_Ordinal;
+    int i;
 
-    if (!hXinput)
+    for (i = 0; i < sizeof(libs) / sizeof(libs[0]); i++)
     {
-        win_skip("Could not load xinput1_3.dll\n");
-        return;
-    }
+        hXinput = LoadLibraryA( libs[i].name );
+
+        if (!hXinput)
+        {
+            win_skip("Could not load %s\n", libs[i].name);
+            continue;
+        }
+        trace("Testing %s\n", libs[i].name);
+
+        pXInputEnable = (void*)GetProcAddress(hXinput, "XInputEnable");
+        pXInputSetState = (void*)GetProcAddress(hXinput, "XInputSetState");
+        pXInputGetState = (void*)GetProcAddress(hXinput, "XInputGetState");
+        pXInputGetStateEx = (void*)GetProcAddress(hXinput, "XInputGetStateEx"); /* Win >= 8 */
+        pXInputGetStateEx_Ordinal = (void*)GetProcAddress(hXinput, (LPCSTR) 100);
+        pXInputGetKeystroke = (void*)GetProcAddress(hXinput, "XInputGetKeystroke");
+        pXInputGetCapabilities = (void*)GetProcAddress(hXinput, "XInputGetCapabilities");
+        pXInputGetDSoundAudioDeviceGuids = (void*)GetProcAddress(hXinput, "XInputGetDSoundAudioDeviceGuids");
+        pXInputGetBatteryInformation = (void*)GetProcAddress(hXinput, "XInputGetBatteryInformation");
+
+        /* XInputGetStateEx may not be present by name, use ordinal in this case */
+        if (!pXInputGetStateEx)
+            pXInputGetStateEx = pXInputGetStateEx_Ordinal;
+
+        test_set_state();
+        test_get_state();
+        test_get_capabilities();
+
+        if (libs[i].version != 4)
+            test_get_dsoundaudiodevice();
+        else
+            ok(!pXInputGetDSoundAudioDeviceGuids, "XInputGetDSoundAudioDeviceGuids exists in %s\n", libs[i].name);
 
-    pXInputEnable = (void*)GetProcAddress(hXinput, "XInputEnable");
-    pXInputSetState = (void*)GetProcAddress(hXinput, "XInputSetState");
-    pXInputGetState = (void*)GetProcAddress(hXinput, "XInputGetState");
-    pXInputGetKeystroke = (void*)GetProcAddress(hXinput, "XInputGetKeystroke");
-    pXInputGetCapabilities = (void*)GetProcAddress(hXinput, "XInputGetCapabilities");
-    pXInputGetDSoundAudioDeviceGuids = (void*)GetProcAddress(hXinput, "XInputGetDSoundAudioDeviceGuids");
-    pXInputGetBatteryInformation = (void*)GetProcAddress(hXinput, "XInputGetBatteryInformation");
-
-    test_set_state();
-    test_get_state();
-    test_get_keystroke();
-    test_get_capabilities();
-    test_get_dsoundaudiodevice();
-    test_get_batteryinformation();
-
-    FreeLibrary(hXinput);
+        if (libs[i].version > 2)
+        {
+            test_get_keystroke();
+            test_get_batteryinformation();
+            ok(pXInputGetStateEx != NULL, "XInputGetStateEx not found in %s\n", libs[i].name);
+        }
+        else
+        {
+            ok(!pXInputGetKeystroke, "XInputGetKeystroke exists in %s\n", libs[i].name);
+            ok(!pXInputGetStateEx, "XInputGetStateEx exists in %s\n", libs[i].name);
+            ok(!pXInputGetBatteryInformation, "XInputGetBatteryInformation exists in %s\n", libs[i].name);
+            if (libs[i].version == 0)
+                ok(!pXInputEnable, "XInputEnable exists in %s\n", libs[i].name);
+        }
+
+        FreeLibrary(hXinput);
+    }
 }