[PATCH 3/4] dinput8/tests: Make overlapped format test more robust.

Arkadiusz Hiler ahiler at codeweavers.com
Fri Jul 23 10:37:05 CDT 2021


On Windows dinput sometimes ignores injected input events. We already do
similar check in test_device_input().

Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
---
 dlls/dinput8/tests/device.c | 68 ++++++++++++++++++++++++++++---------
 1 file changed, 52 insertions(+), 16 deletions(-)

diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 4a6fc21ecec..fd6da6e0495 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -1058,6 +1058,8 @@ void test_overlapped_format(void)
     IDirectInput8A *di = NULL;
     IDirectInputDevice8A *di_keyboard;
     struct overlapped_state state;
+    DIPROPDWORD dp;
+    DWORD data_size;
 
     hr = CoCreateInstance(&CLSID_DirectInput8, 0, CLSCTX_INPROC_SERVER, &IID_IDirectInput8A, (LPVOID*)&di);
     if (hr == DIERR_OLDDIRECTINPUTVERSION ||
@@ -1083,6 +1085,14 @@ void test_overlapped_format(void)
     hr = IDirectInput8_CreateDevice(di, &GUID_SysKeyboard, &di_keyboard, NULL);
     ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %08x\n", hr);
 
+    dp.diph.dwSize = sizeof(DIPROPDWORD);
+    dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+    dp.diph.dwObj = 0;
+    dp.diph.dwHow = DIPH_DEVICE;
+    dp.dwData = 10;
+    hr = IDirectInputDevice8_SetProperty(di_keyboard, DIPROP_BUFFERSIZE, &(dp.diph));
+    ok(SUCCEEDED(hr), "IDirectInputDevice8_SetProperty() failed: %08x\n", hr);
+
     /* test overlapped slider - default value 0 */
     hr = IDirectInputDevice8_SetDataFormat(di_keyboard, &overlapped_slider_format);
     ok(SUCCEEDED(hr), "IDirectInputDevice8_SetDataFormat() failed: %08x\n", hr);
@@ -1091,20 +1101,33 @@ void test_overlapped_format(void)
 
     SetFocus(hwnd);
     flush_events();
+    data_size = INFINITE;
+    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0);
+    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr);
 
     /* press D */
     keybd_event(0, DIK_D, KEYEVENTF_SCANCODE, 0);
     flush_events();
 
-    memset(&state, 0xFF, sizeof(state));
-    hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state);
-    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState() failed: %08x\n", hr);
+    data_size = 10;
+    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0);
+    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr);
+    if (data_size != 1)
+    {
+        win_skip("We're not able to inject input into Windows dinput8 with events\n");
+    }
+    else
+    {
+        memset(&state, 0xFF, sizeof(state));
+        hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state);
+        ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState() failed: %08x\n", hr);
 
-    ok(state.keys[0] == 0x00, "key A should be still up\n");
-    ok(state.keys[1] == 0x00, "key S should be still up\n");
-    ok(state.keys[2] == 0x80, "keydown for D did not register\n");
-    ok(state.keys[3] == 0x00, "key F should be still up\n");
-    ok(state.extra_element == 0, "State struct was not memset to zero\n");
+        ok(state.keys[0] == 0x00, "key A should be still up\n");
+        ok(state.keys[1] == 0x00, "key S should be still up\n");
+        ok(state.keys[2] == 0x80, "keydown for D did not register\n");
+        ok(state.keys[3] == 0x00, "key F should be still up\n");
+        ok(state.extra_element == 0, "State struct was not memset to zero\n");
+    }
 
     /* release D */
     keybd_event(0, DIK_D, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0);
@@ -1121,20 +1144,33 @@ void test_overlapped_format(void)
 
     SetFocus(hwnd);
     flush_events();
+    data_size = INFINITE;
+    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0);
+    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr);
 
     /* press D */
     keybd_event(0, DIK_D, KEYEVENTF_SCANCODE, 0);
     flush_events();
 
-    memset(&state, 0xFF, sizeof(state));
-    hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state);
-    ok(SUCCEEDED(hr), "IDirectInputDevice_8GetDeviceState() failed: %08x\n", hr);
+    data_size = 10;
+    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), NULL, &data_size, 0);
+    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceData() failed: %08x\n", hr);
+    if (data_size != 1)
+    {
+        win_skip("We're not able to inject input into Windows dinput8 with events\n");
+    }
+    else
+    {
+        memset(&state, 0xFF, sizeof(state));
+        hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(state), &state);
+        ok(SUCCEEDED(hr), "IDirectInputDevice_8GetDeviceState() failed: %08x\n", hr);
 
-    ok(state.keys[0] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
-    ok(state.keys[1] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
-    ok(state.keys[2] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
-    ok(state.keys[3] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
-    ok(state.extra_element == 0, "State struct was not memset to zero\n");
+        ok(state.keys[0] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
+        ok(state.keys[1] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
+        ok(state.keys[2] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
+        ok(state.keys[3] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
+        ok(state.extra_element == 0, "State struct was not memset to zero\n");
+    }
 
     /* release D */
     keybd_event(0, DIK_D, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0);
-- 
2.32.0




More information about the wine-devel mailing list