[PATCH 6/8] xinput1_3/tests: Wait for the state to change before checking it.

Rémi Bernon rbernon at codeweavers.com
Fri Sep 3 00:57:38 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/xinput1_3/tests/xinput.c | 84 ++++++++++++++++++++++++-----------
 1 file changed, 57 insertions(+), 27 deletions(-)

diff --git a/dlls/xinput1_3/tests/xinput.c b/dlls/xinput1_3/tests/xinput.c
index 272a41c690c..811fe045d10 100644
--- a/dlls/xinput1_3/tests/xinput.c
+++ b/dlls/xinput1_3/tests/xinput.c
@@ -434,10 +434,10 @@ static void check_hid_caps(DWORD index, HANDLE device,  PHIDP_PREPARSED_DATA pre
     HIDP_LINK_COLLECTION_NODE collections[16];
     HIDP_BUTTON_CAPS button_caps[16];
     HIDP_VALUE_CAPS value_caps[16];
+    XINPUT_STATE last_state, state;
     XINPUT_CAPABILITIES xi_caps;
     char buffer[200] = {0};
     ULONG length, value;
-    XINPUT_STATE state;
     USAGE usages[15];
     NTSTATUS status;
     USHORT count;
@@ -637,19 +637,31 @@ static void check_hid_caps(DWORD index, HANDLE device,  PHIDP_PREPARSED_DATA pre
     else if (attrs->VendorID == 0x045e && attrs->ProductID == 0x02ff) skip("skipping interactive tests (Xbox One For Windows)\n");
     else
     {
-        trace("press A button on gamepad %d\n", index);
+        res = pXInputGetState(index, &last_state);
+        ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
 
-        SetLastError(0xdeadbeef);
-        memset(buffer, 0, sizeof(buffer));
-        length = hid_caps->InputReportByteLength;
-        ret = ReadFile(device, buffer, hid_caps->InputReportByteLength, &length, NULL);
-        ok(ret, "ReadFile failed, last error %u\n", GetLastError());
-        ok(length == hid_caps->InputReportByteLength, "ReadFile returned length %u\n", length);
+        trace("press A button on gamepad %d\n", index);
 
-        res = pXInputGetState(index, &state);
-        ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
+        do
+        {
+            Sleep(5);
+            res = pXInputGetState(index, &state);
+            ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
+        } while (res == ERROR_SUCCESS && state.dwPacketNumber == last_state.dwPacketNumber);
         ok(state.Gamepad.wButtons & XINPUT_GAMEPAD_A, "unexpected button state %#x\n", state.Gamepad.wButtons);
 
+        /* now read as many reports from the device to get a consistent final state */
+        for (i = 0; i < (state.dwPacketNumber - last_state.dwPacketNumber); ++i)
+        {
+            SetLastError(0xdeadbeef);
+            memset(buffer, 0, sizeof(buffer));
+            length = hid_caps->InputReportByteLength;
+            ret = ReadFile(device, buffer, hid_caps->InputReportByteLength, &length, NULL);
+            ok(ret, "ReadFile failed, last error %u\n", GetLastError());
+            ok(length == hid_caps->InputReportByteLength, "ReadFile returned length %u\n", length);
+        }
+        last_state = state;
+
         length = ARRAY_SIZE(usages);
         status = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &length, preparsed, buffer, hid_caps->InputReportByteLength);
         ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsages returned %#x\n", status);
@@ -658,17 +670,26 @@ static void check_hid_caps(DWORD index, HANDLE device,  PHIDP_PREPARSED_DATA pre
 
         trace("release A on gamepad %d\n", index);
 
-        SetLastError(0xdeadbeef);
-        memset(buffer, 0, sizeof(buffer));
-        length = hid_caps->InputReportByteLength;
-        ret = ReadFile(device, buffer, hid_caps->InputReportByteLength, &length, NULL);
-        ok(ret, "ReadFile failed, last error %u\n", GetLastError());
-        ok(length == hid_caps->InputReportByteLength, "ReadFile returned length %u\n", length);
-
-        res = pXInputGetState(index, &state);
-        ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
+        do
+        {
+            Sleep(5);
+            res = pXInputGetState(index, &state);
+            ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
+        } while (res == ERROR_SUCCESS && state.dwPacketNumber == last_state.dwPacketNumber);
         ok(!state.Gamepad.wButtons, "unexpected button state %#x\n", state.Gamepad.wButtons);
 
+        /* now read as many reports from the device to get a consistent final state */
+        for (i = 0; i < (state.dwPacketNumber - last_state.dwPacketNumber); ++i)
+        {
+            SetLastError(0xdeadbeef);
+            memset(buffer, 0, sizeof(buffer));
+            length = hid_caps->InputReportByteLength;
+            ret = ReadFile(device, buffer, hid_caps->InputReportByteLength, &length, NULL);
+            ok(ret, "ReadFile failed, last error %u\n", GetLastError());
+            ok(length == hid_caps->InputReportByteLength, "ReadFile returned length %u\n", length);
+        }
+        last_state = state;
+
         length = ARRAY_SIZE(usages);
         status = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &length, preparsed, buffer, hid_caps->InputReportByteLength);
         ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsages returned %#x\n", status);
@@ -678,15 +699,24 @@ static void check_hid_caps(DWORD index, HANDLE device,  PHIDP_PREPARSED_DATA pre
 
         do
         {
-            SetLastError(0xdeadbeef);
-            memset(buffer, 0, sizeof(buffer));
-            length = hid_caps->InputReportByteLength;
-            ret = ReadFile(device, buffer, hid_caps->InputReportByteLength, &length, NULL);
-            ok(ret, "ReadFile failed, last error %u\n", GetLastError());
-            ok(length == hid_caps->InputReportByteLength, "ReadFile returned length %u\n", length);
+            do
+            {
+                Sleep(5);
+                res = pXInputGetState(index, &state);
+                ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
+            } while (res == ERROR_SUCCESS && state.dwPacketNumber == last_state.dwPacketNumber);
 
-            res = pXInputGetState(index, &state);
-            ok(res == ERROR_SUCCESS, "XInputGetState returned %#x\n", res);
+            /* now read as many reports from the device to get a consistent final state */
+            for (i = 0; i < (state.dwPacketNumber - last_state.dwPacketNumber); ++i)
+            {
+                SetLastError(0xdeadbeef);
+                memset(buffer, 0, sizeof(buffer));
+                length = hid_caps->InputReportByteLength;
+                ret = ReadFile(device, buffer, hid_caps->InputReportByteLength, &length, NULL);
+                ok(ret, "ReadFile failed, last error %u\n", GetLastError());
+                ok(length == hid_caps->InputReportByteLength, "ReadFile returned length %u\n", length);
+            }
+            last_state = state;
 
             value = 0;
             status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X, &value, preparsed, buffer, hid_caps->InputReportByteLength);
-- 
2.33.0




More information about the wine-devel mailing list