From: "Rémi Bernon" Subject: [PATCH 4/6] dinput8/tests: Add some HID joystick IDirectInputDevice8_GetDeviceData tests. Message-Id: <20210917070627.3303661-4-rbernon@codeweavers.com> Date: Fri, 17 Sep 2021 09:06:25 +0200 In-Reply-To: <20210917070627.3303661-1-rbernon@codeweavers.com> References: <20210917070627.3303661-1-rbernon@codeweavers.com> Signed-off-by: Rémi Bernon --- dlls/dinput8/tests/hid.c | 128 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c index 499141a4389..b70fea1be06 100644 --- a/dlls/dinput8/tests/hid.c +++ b/dlls/dinput8/tests/hid.c @@ -3386,6 +3386,23 @@ static void test_simple_joystick(void) {.lX = 0, .lY = 0, .rgdwPOV = {-1, -1, -1, -1}, .rgbButtons = {0x80, 0x80}}, {.lX = 32767, .lY = 5594, .rgdwPOV = {13500, -1, -1, -1}, .rgbButtons = {0x80}}, }; + static const DIDEVICEOBJECTDATA expect_objdata[] = + { + {.dwOfs = 0x4, .dwData = 0xffff, .dwSequence = 0xa}, + {.dwOfs = 0x4, .dwData = 0xffff, .dwSequence = 0xa}, + {.dwOfs = 0, .dwData = 0xffff, .dwSequence = 0xa}, + {.dwOfs = 0x20, .dwData = 31500, .dwSequence = 0xa}, + {.dwOfs = 0x30, .dwData = 0x80, .dwSequence = 0xa}, + {.dwOfs = 0x4, .dwData = 0x512b, .dwSequence = 0xd}, + {.dwOfs = 0, .dwData = 0x512b, .dwSequence = 0xd}, + {.dwOfs = 0x20, .dwData = -1, .dwSequence = 0xd}, + {.dwOfs = 0x30, .dwData = 0, .dwSequence = 0xd}, + {.dwOfs = 0x31, .dwData = 0, .dwSequence = 0xd}, + {.dwOfs = 0x4, .dwData = 0, .dwSequence = 0xf}, + {.dwOfs = 0, .dwData = 0, .dwSequence = 0xf}, + {.dwOfs = 0x30, .dwData = 0x80, .dwSequence = 0xf}, + {.dwOfs = 0x31, .dwData = 0x80, .dwSequence = 0xf}, + }; const DIDEVICEINSTANCEW expect_devinst = { @@ -3445,6 +3462,7 @@ static void test_simple_joystick(void) }, }; WCHAR cwd[MAX_PATH], tempdir[MAX_PATH]; + DIDEVICEOBJECTDATA objdata[32] = {0}; DIDEVICEINSTANCEW devinst = {0}; DIDATAFORMAT dataformat = {0}; IDirectInputDevice8W *device; @@ -3846,6 +3864,116 @@ static void test_simple_joystick(void) check_member( state, expect_state[i], "%#x", rgbButtons[2] ); winetest_pop_context(); + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA) - 1, objdata, &res, DIGDD_PEEK ); + todo_wine + ok( hr == DIERR_INVALIDPARAM, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK ); + ok( hr == DIERR_NOTBUFFERED, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + + hr = IDirectInputDevice8_Unacquire( device ); + ok( hr == DI_OK, "IDirectInputDevice8_Unacquire returned: %#x\n", hr ); + prop_dword.diph.dwHow = DIPH_DEVICE; + prop_dword.diph.dwObj = 0; + prop_dword.dwData = 1; + hr = IDirectInputDevice8_SetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph ); + ok( hr == DI_OK, "IDirectInputDevice8_SetProperty DIPROP_BUFFERSIZE returned %#x\n", hr ); + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_OK, "IDirectInputDevice8_Unacquire returned: %#x\n", hr ); + + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK ); + ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 0, "got %u expected %u\n", res, 0 ); + + send_hid_input( file, &injected_input[0], sizeof(*injected_input) ); + res = WaitForSingleObject( event, 100 ); + ok( res == WAIT_OBJECT_0, "WaitForSingleObject failed\n" ); + ResetEvent( event ); + + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK ); + ok( hr == DI_BUFFEROVERFLOW, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 0, "got %u expected %u\n", res, 0 ); + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 ); + todo_wine + ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 0, "got %u expected %u\n", res, 0 ); + + hr = IDirectInputDevice8_Unacquire( device ); + ok( hr == DI_OK, "IDirectInputDevice8_Unacquire returned: %#x\n", hr ); + prop_dword.diph.dwHow = DIPH_DEVICE; + prop_dword.diph.dwObj = 0; + prop_dword.dwData = 10; + hr = IDirectInputDevice8_SetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph ); + ok( hr == DI_OK, "IDirectInputDevice8_SetProperty DIPROP_BUFFERSIZE returned %#x\n", hr ); + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_OK, "IDirectInputDevice8_Unacquire returned: %#x\n", hr ); + + send_hid_input( file, &injected_input[1], sizeof(*injected_input) ); + res = WaitForSingleObject( event, 100 ); + ok( res == WAIT_OBJECT_0, "WaitForSingleObject failed\n" ); + ResetEvent( event ); + + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK ); + ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 1, "got %u expected %u\n", res, 1 ); + check_member( objdata[0], expect_objdata[0], "%#x", dwOfs ); + check_member( objdata[0], expect_objdata[0], "%#x", dwData ); + todo_wine + check_member( objdata[0], expect_objdata[0], "%#x", dwSequence ); + ok( objdata[0].uAppData == -1, "got %p, expected %p\n", (void *)objdata[0].uAppData, (void *)-1 ); + res = 4; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 ); + ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 4, "got %u expected %u\n", res, 4 ); + for (i = 0; i < 4; ++i) + { + winetest_push_context( "objdata[%d]", i ); + check_member( objdata[i], expect_objdata[1 + i], "%#x", dwOfs ); + check_member( objdata[i], expect_objdata[1 + i], "%#x", dwData ); + todo_wine + check_member( objdata[i], expect_objdata[1 + i], "%#x", dwSequence ); + ok( objdata[i].uAppData == -1, "got %p, expected %p\n", (void *)objdata[i].uAppData, (void *)-1 ); + winetest_pop_context(); + } + + send_hid_input( file, &injected_input[2], sizeof(*injected_input) ); + res = WaitForSingleObject( event, 100 ); + ok( res == WAIT_OBJECT_0, "WaitForSingleObject failed\n" ); + ResetEvent( event ); + send_hid_input( file, &injected_input[4], sizeof(*injected_input) ); + res = WaitForSingleObject( event, 100 ); + ok( res == WAIT_OBJECT_0, "WaitForSingleObject failed\n" ); + ResetEvent( event ); + + res = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 ); + ok( hr == DI_BUFFEROVERFLOW, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 1, "got %u expected %u\n", res, 1 ); + todo_wine + check_member( objdata[0], expect_objdata[5], "%#x", dwOfs ); + todo_wine + check_member( objdata[0], expect_objdata[5], "%#x", dwData ); + ok( objdata[0].uAppData == -1, "got %p, expected %p\n", (void *)objdata[0].uAppData, (void *)-1 ); + res = ARRAY_SIZE(objdata); + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 ); + ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceData returned %#x\n", hr ); + ok( res == 8, "got %u expected %u\n", res, 8 ); + for (i = 0; i < 8; ++i) + { + winetest_push_context( "objdata[%d]", i ); + todo_wine + check_member( objdata[i], expect_objdata[6 + i], "%#x", dwOfs ); + todo_wine_if( i != 3 && i != 4 && i != 7 ) + check_member( objdata[i], expect_objdata[6 + i], "%#x", dwData ); + ok( objdata[i].uAppData == -1, "got %p, expected %p\n", (void *)objdata[i].uAppData, (void *)-1 ); + winetest_pop_context(); + } + hr = IDirectInputDevice8_Unacquire( device ); ok( hr == DI_OK, "IDirectInputDevice8_Unacquire returned: %#x\n", hr ); -- 2.33.0