From 2aff90f702ffcbacb3b17ade2e954ba4b981deb2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 26 Feb 2017 20:37:54 +0000 Subject: [PATCH] [XINPUT1_3_WINETEST] Sync with Wine Staging 2.2. CORE-12823 svn path=/trunk/; revision=73988 --- rostests/winetests/xinput1_3/xinput.c | 116 ++++++++++++++++++++------ 1 file changed, 89 insertions(+), 27 deletions(-) diff --git a/rostests/winetests/xinput1_3/xinput.c b/rostests/winetests/xinput1_3/xinput.c index 17884e1226b..87f99297826 100644 --- a/rostests/winetests/xinput1_3/xinput.c +++ b/rostests/winetests/xinput1_3/xinput.c @@ -32,29 +32,57 @@ static DWORD (WINAPI *pXInputGetKeystroke)(DWORD, DWORD, PXINPUT_KEYSTROKE); static DWORD (WINAPI *pXInputGetDSoundAudioDeviceGuids)(DWORD, GUID*, GUID*); static DWORD (WINAPI *pXInputGetBatteryInformation)(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*); +static void dump_gamepad(XINPUT_GAMEPAD *data) +{ + trace("-- Gamepad Variables --\n"); + trace("Gamepad.wButtons: %#x\n", data->wButtons); + trace("Gamepad.bLeftTrigger: %d\n", data->bLeftTrigger); + trace("Gamepad.bRightTrigger: %d\n", data->bRightTrigger); + trace("Gamepad.sThumbLX: %d\n", data->sThumbLX); + trace("Gamepad.sThumbLY: %d\n", data->sThumbLY); + trace("Gamepad.sThumbRX: %d\n", data->sThumbRX); + trace("Gamepad.sThumbRY: %d\n\n", data->sThumbRY); +} + static void test_set_state(void) { XINPUT_VIBRATION vibrator; DWORD controllerNum; DWORD result; - for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) + for(controllerNum = 0; controllerNum < XUSER_MAX_COUNT; controllerNum++) { ZeroMemory(&vibrator, sizeof(XINPUT_VIBRATION)); + vibrator.wLeftMotorSpeed = 32767; + vibrator.wRightMotorSpeed = 32767; + result = pXInputSetState(controllerNum, &vibrator); + if (result == ERROR_DEVICE_NOT_CONNECTED) continue; + + Sleep(250); + vibrator.wLeftMotorSpeed = 0; + vibrator.wRightMotorSpeed = 0; + result = pXInputSetState(controllerNum, &vibrator); + ok(result == ERROR_SUCCESS, "XInputSetState failed with (%d)\n", result); + + /* Disabling XInput here, queueing a vibration and then re-enabling XInput + * is used to prove that vibrations are auto enabled when resuming XInput. + * If XInputEnable(1) is removed below the vibration will never play. */ + if (pXInputEnable) pXInputEnable(0); + + Sleep(250); + vibrator.wLeftMotorSpeed = 65535; + vibrator.wRightMotorSpeed = 65535; + result = pXInputSetState(controllerNum, &vibrator); + ok(result == ERROR_SUCCESS, "XInputSetState failed with (%d)\n", result); + + if (pXInputEnable) pXInputEnable(1); + Sleep(250); + vibrator.wLeftMotorSpeed = 0; vibrator.wRightMotorSpeed = 0; result = pXInputSetState(controllerNum, &vibrator); - ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputSetState failed with (%d)\n", result); - - 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); - - if (pXInputEnable) pXInputEnable(1); + ok(result == ERROR_SUCCESS, "XInputSetState failed with (%d)\n", result); } result = pXInputSetState(XUSER_MAX_COUNT+1, &vibrator); @@ -68,8 +96,7 @@ static void test_get_state(void) XINPUT_STATE state; XINPUT_STATE_EX state_ex; } xinput; - DWORD controllerNum, i; - DWORD result; + DWORD controllerNum, i, result, good = XUSER_MAX_COUNT; for (i = 0; i < (pXInputGetStateEx ? 2 : 1); i++) { @@ -92,18 +119,14 @@ static void test_get_state(void) trace("-- Results for controller %d --\n", controllerNum); if (i == 0) + { + good = controllerNum; 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", 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); + dump_gamepad(&xinput.state.Gamepad); } } @@ -120,6 +143,28 @@ static void test_get_state(void) result = pXInputGetStateEx(XUSER_MAX_COUNT+1, &xinput.state_ex); ok(result == ERROR_BAD_ARGUMENTS, "XInputGetState returned (%d)\n", result); } + + if (winetest_interactive && good < XUSER_MAX_COUNT) + { + DWORD now = GetTickCount(), packet = 0; + XINPUT_GAMEPAD *game = &xinput.state.Gamepad; + + trace("You have 20 seconds to test the joystick freely\n"); + do + { + Sleep(100); + pXInputGetState(good, &xinput.state); + if (xinput.state.dwPacketNumber == packet) + continue; + + packet = xinput.state.dwPacketNumber; + trace("Buttons 0x%04X Triggers %3d/%3d LT %6d/%6d RT %6d/%6d\n", + game->wButtons, game->bLeftTrigger, game->bRightTrigger, + game->sThumbLX, game->sThumbLY, game->sThumbRX, game->sThumbRY); + } + while(GetTickCount() - now < 20000); + trace("Test over...\n"); + } } static void test_get_keystroke(void) @@ -128,7 +173,7 @@ static void test_get_keystroke(void) DWORD controllerNum; DWORD result; - for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) + for(controllerNum = 0; controllerNum < XUSER_MAX_COUNT; controllerNum++) { ZeroMemory(&keystroke, sizeof(XINPUT_KEYSTROKE)); @@ -153,7 +198,7 @@ static void test_get_capabilities(void) DWORD controllerNum; DWORD result; - for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) + for(controllerNum = 0; controllerNum < XUSER_MAX_COUNT; controllerNum++) { ZeroMemory(&capabilities, sizeof(XINPUT_CAPABILITIES)); @@ -163,7 +208,11 @@ static void test_get_capabilities(void) if (ERROR_DEVICE_NOT_CONNECTED == result) { skip("Controller %d is not connected\n", controllerNum); + continue; } + + /* Important to show that the results changed between 1.3 and 1.4 XInput version */ + dump_gamepad(&capabilities.Gamepad); } ZeroMemory(&capabilities, sizeof(XINPUT_CAPABILITIES)); @@ -175,18 +224,31 @@ static void test_get_dsoundaudiodevice(void) { DWORD controllerNum; DWORD result; - GUID soundRender; - GUID soundCapture; + GUID soundRender, soundCapture; + GUID testGuid = {0xFFFFFFFF, 0xFFFF, 0xFFFF, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}; + GUID emptyGuid = {0x0, 0x0, 0x0, {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}; - for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) + for(controllerNum = 0; controllerNum < XUSER_MAX_COUNT; controllerNum++) { + soundRender = soundCapture = testGuid; result = pXInputGetDSoundAudioDeviceGuids(controllerNum, &soundRender, &soundCapture); ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputGetDSoundAudioDeviceGuids failed with (%d)\n", result); if (ERROR_DEVICE_NOT_CONNECTED == result) { skip("Controller %d is not connected\n", controllerNum); + continue; } + + if (!IsEqualGUID(&soundRender, &emptyGuid)) + ok(!IsEqualGUID(&soundRender, &testGuid), "Broken GUID returned for sound render device\n"); + else + trace("Headset phone not attached\n"); + + if (!IsEqualGUID(&soundCapture, &emptyGuid)) + ok(!IsEqualGUID(&soundCapture, &testGuid), "Broken GUID returned for sound capture device\n"); + else + trace("Headset microphone not attached\n"); } result = pXInputGetDSoundAudioDeviceGuids(XUSER_MAX_COUNT+1, &soundRender, &soundCapture); @@ -199,7 +261,7 @@ static void test_get_batteryinformation(void) DWORD result; XINPUT_BATTERY_INFORMATION batteryInfo; - for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) + for(controllerNum = 0; controllerNum < XUSER_MAX_COUNT; controllerNum++) { ZeroMemory(&batteryInfo, sizeof(XINPUT_BATTERY_INFORMATION));