| /* |
| * The Wine project - Xinput Joystick Library |
| * Copyright 2008 Andrew Fenn |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include <windows.h> |
| #include <stdio.h> |
| |
| #include "xinput.h" |
| #include "wine/test.h" |
| |
| static DWORD (WINAPI *pXInputGetState)(DWORD, XINPUT_STATE*); |
| static DWORD (WINAPI *pXInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*); |
| static DWORD (WINAPI *pXInputSetState)(DWORD, XINPUT_VIBRATION*); |
| static void (WINAPI *pXInputEnable)(BOOL); |
| 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 test_set_state(void) |
| { |
| XINPUT_VIBRATION vibrator; |
| DWORD controllerNum; |
| DWORD result; |
| |
| for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) |
| { |
| ZeroMemory(&vibrator, sizeof(XINPUT_VIBRATION)); |
| |
| 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); |
| |
| 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); |
| } |
| |
| result = pXInputSetState(XUSER_MAX_COUNT+1, &vibrator); |
| ok(result == ERROR_BAD_ARGUMENTS, "XInputSetState returned (%d)\n", result); |
| } |
| |
| static void test_get_state(void) |
| { |
| |
| XINPUT_STATE controllerState; |
| DWORD controllerNum; |
| DWORD result; |
| |
| for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) |
| { |
| ZeroMemory(&controllerState, sizeof(XINPUT_STATE)); |
| |
| result = pXInputGetState(controllerNum, &controllerState); |
| ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputGetState failed with (%d)\n", result); |
| |
| 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); |
| 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); |
| } |
| } |
| |
| ZeroMemory(&controllerState, sizeof(XINPUT_STATE)); |
| result = pXInputGetState(XUSER_MAX_COUNT+1, &controllerState); |
| ok(result == ERROR_BAD_ARGUMENTS, "XInputGetState returned (%d)\n", result); |
| } |
| |
| static void test_get_keystroke(void) |
| { |
| XINPUT_KEYSTROKE keystroke; |
| DWORD controllerNum; |
| DWORD result; |
| |
| for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) |
| { |
| 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); |
| |
| if (ERROR_DEVICE_NOT_CONNECTED == result) |
| { |
| skip("Controller %d is not connected\n", controllerNum); |
| } |
| } |
| |
| ZeroMemory(&keystroke, sizeof(XINPUT_KEYSTROKE)); |
| result = pXInputGetKeystroke(XUSER_MAX_COUNT+1, XINPUT_FLAG_GAMEPAD, &keystroke); |
| ok(result == ERROR_BAD_ARGUMENTS, "XInputGetKeystroke returned (%d)\n", result); |
| } |
| |
| static void test_get_capabilities(void) |
| { |
| XINPUT_CAPABILITIES capabilities; |
| DWORD controllerNum; |
| DWORD result; |
| |
| for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) |
| { |
| ZeroMemory(&capabilities, sizeof(XINPUT_CAPABILITIES)); |
| |
| result = pXInputGetCapabilities(controllerNum, XINPUT_FLAG_GAMEPAD, &capabilities); |
| ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputGetCapabilities failed with (%d)\n", result); |
| |
| if (ERROR_DEVICE_NOT_CONNECTED == result) |
| { |
| skip("Controller %d is not connected\n", controllerNum); |
| } |
| } |
| |
| ZeroMemory(&capabilities, sizeof(XINPUT_CAPABILITIES)); |
| result = pXInputGetCapabilities(XUSER_MAX_COUNT+1, XINPUT_FLAG_GAMEPAD, &capabilities); |
| ok(result == ERROR_BAD_ARGUMENTS, "XInputGetCapabilities returned (%d)\n", result); |
| } |
| |
| static void test_get_dsoundaudiodevice(void) |
| { |
| DWORD controllerNum; |
| DWORD result; |
| GUID soundRender; |
| GUID soundCapture; |
| |
| for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) |
| { |
| 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); |
| } |
| } |
| |
| result = pXInputGetDSoundAudioDeviceGuids(XUSER_MAX_COUNT+1, &soundRender, &soundCapture); |
| ok(result == ERROR_BAD_ARGUMENTS, "XInputGetDSoundAudioDeviceGuids returned (%d)\n", result); |
| } |
| |
| static void test_get_batteryinformation(void) |
| { |
| DWORD controllerNum; |
| DWORD result; |
| XINPUT_BATTERY_INFORMATION batteryInfo; |
| |
| for(controllerNum=0; controllerNum < XUSER_MAX_COUNT; controllerNum++) |
| { |
| ZeroMemory(&batteryInfo, sizeof(XINPUT_BATTERY_INFORMATION)); |
| |
| result = pXInputGetBatteryInformation(controllerNum, BATTERY_DEVTYPE_GAMEPAD, &batteryInfo); |
| ok(result == ERROR_SUCCESS || result == ERROR_DEVICE_NOT_CONNECTED, "XInputGetBatteryInformation failed with (%d)\n", result); |
| |
| if (ERROR_DEVICE_NOT_CONNECTED == result) |
| { |
| ok(batteryInfo.BatteryLevel == BATTERY_TYPE_DISCONNECTED, "Failed to report device as being disconnected.\n"); |
| skip("Controller %d is not connected\n", controllerNum); |
| } |
| } |
| |
| result = pXInputGetBatteryInformation(XUSER_MAX_COUNT+1, BATTERY_DEVTYPE_GAMEPAD, &batteryInfo); |
| ok(result == ERROR_BAD_ARGUMENTS, "XInputGetBatteryInformation returned (%d)\n", result); |
| } |
| |
| START_TEST(xinput) |
| { |
| HMODULE hXinput; |
| hXinput = LoadLibraryA( "xinput1_3.dll" ); |
| |
| if (!hXinput) |
| { |
| win_skip("Could not load xinput1_3.dll\n"); |
| return; |
| } |
| |
| 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); |
| } |