Commit 77cab1ce authored by Lucas Zawacki's avatar Lucas Zawacki Committed by Alexandre Julliard

dinput8/tests: Added tests for saving and retrieving settings with SetActionMap.

parent 4e2959ab
...@@ -132,7 +132,7 @@ static void test_build_action_map( ...@@ -132,7 +132,7 @@ static void test_build_action_map(
ddi.dwSize = sizeof(ddi); ddi.dwSize = sizeof(ddi);
IDirectInputDevice_GetDeviceInfo(lpdid, &ddi); IDirectInputDevice_GetDeviceInfo(lpdid, &ddi);
hr = IDirectInputDevice8_BuildActionMap(lpdid, lpdiaf, NULL, DIDBAM_INITIALIZE); hr = IDirectInputDevice8_BuildActionMap(lpdid, lpdiaf, NULL, DIDBAM_HWDEFAULTS);
ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr); ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr);
actions = lpdiaf->rgoAction; actions = lpdiaf->rgoAction;
...@@ -195,8 +195,8 @@ static BOOL CALLBACK enumeration_callback( ...@@ -195,8 +195,8 @@ static BOOL CALLBACK enumeration_callback(
} }
/* Building and setting an action map */ /* Building and setting an action map */
/* It should not use any pre-stored mappings so we use DIDBAM_INITIALIZE */ /* It should not use any pre-stored mappings so we use DIDBAM_HWDEFAULTS */
hr = IDirectInputDevice8_BuildActionMap(lpdid, data->lpdiaf, NULL, DIDBAM_INITIALIZE); hr = IDirectInputDevice8_BuildActionMap(lpdid, data->lpdiaf, NULL, DIDBAM_HWDEFAULTS);
ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr); ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr);
/* Device has no data format and thus can't be acquired */ /* Device has no data format and thus can't be acquired */
...@@ -322,7 +322,7 @@ static void test_action_mapping(void) ...@@ -322,7 +322,7 @@ static void test_action_mapping(void)
af.dwDataSize = 4 * DITEST_KEYBOARDSPACE; af.dwDataSize = 4 * DITEST_KEYBOARDSPACE;
af.dwNumActions = DITEST_KEYBOARDSPACE; af.dwNumActions = DITEST_KEYBOARDSPACE;
hr = IDirectInputDevice8_BuildActionMap(data.keyboard, data.lpdiaf, NULL, DIDBAM_INITIALIZE); hr = IDirectInputDevice8_BuildActionMap(data.keyboard, data.lpdiaf, NULL, DIDBAM_HWDEFAULTS);
ok (hr == DI_NOEFFECT, "BuildActionMap should have no effect with no actions hr=%08x\n", hr); ok (hr == DI_NOEFFECT, "BuildActionMap should have no effect with no actions hr=%08x\n", hr);
hr = IDirectInputDevice8_SetActionMap(data.keyboard, data.lpdiaf, NULL, 0); hr = IDirectInputDevice8_SetActionMap(data.keyboard, data.lpdiaf, NULL, 0);
...@@ -342,11 +342,137 @@ static void test_action_mapping(void) ...@@ -342,11 +342,137 @@ static void test_action_mapping(void)
} }
} }
static void test_save_settings(void)
{
HRESULT hr;
HINSTANCE hinst = GetModuleHandle(NULL);
LPDIRECTINPUT8 pDI = NULL;
DIACTIONFORMAT af;
IDirectInputDevice8A *pKey;
static const GUID mapping_guid = { 0xcafecafe, 0x2, 0x3, { 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb } };
static DIACTION actions[] = {
{ 0, DIKEYBOARD_A , 0, { "Blam" } },
{ 1, DIKEYBOARD_B , 0, { "Kapow"} }
};
static const DWORD results[] = {
DIDFT_MAKEINSTANCE(DIK_A) | DIDFT_PSHBUTTON,
DIDFT_MAKEINSTANCE(DIK_B) | DIDFT_PSHBUTTON
};
static const DWORD other_results[] = {
DIDFT_MAKEINSTANCE(DIK_C) | DIDFT_PSHBUTTON,
DIDFT_MAKEINSTANCE(DIK_D) | DIDFT_PSHBUTTON
};
hr = CoCreateInstance(&CLSID_DirectInput8, 0, CLSCTX_INPROC_SERVER, &IID_IDirectInput8A, (LPVOID*)&pDI);
if (hr == DIERR_OLDDIRECTINPUTVERSION ||
hr == DIERR_BETADIRECTINPUTVERSION ||
hr == REGDB_E_CLASSNOTREG)
{
win_skip("ActionMapping requires dinput8\n");
return;
}
ok (SUCCEEDED(hr), "DirectInput8 Create failed: hr=%08x\n", hr);
if (FAILED(hr)) return;
hr = IDirectInput8_Initialize(pDI,hinst, DIRECTINPUT_VERSION);
if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_BETADIRECTINPUTVERSION)
{
win_skip("ActionMapping requires dinput8\n");
return;
}
ok (SUCCEEDED(hr), "DirectInput8 Initialize failed: hr=%08x\n", hr);
if (FAILED(hr)) return;
hr = IDirectInput_CreateDevice(pDI, &GUID_SysKeyboard, &pKey, NULL);
ok (SUCCEEDED(hr), "IDirectInput_Create device failed hr: 0x%08x\n", hr);
if (FAILED(hr)) return;
memset (&af, 0, sizeof(af));
af.dwSize = sizeof(af);
af.dwActionSize = sizeof(DIACTION);
af.dwDataSize = 4 * sizeof(actions) / sizeof(actions[0]);
af.dwNumActions = sizeof(actions) / sizeof(actions[0]);
af.rgoAction = actions;
af.guidActionMap = mapping_guid;
af.dwGenre = 0x01000000; /* DIVIRTUAL_DRIVING_RACE */
af.dwBufferSize = 32;
/* Easy case. Ask for default mapping, save, ask for previous map and read it back */
hr = IDirectInputDevice8_BuildActionMap(pKey, &af, NULL, DIDBAM_HWDEFAULTS);
ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr);
ok (results[0] == af.rgoAction[0].dwObjID,
"Mapped incorrectly expected: 0x%08x got: 0x%08x\n", results[0], af.rgoAction[0].dwObjID);
ok (results[1] == af.rgoAction[1].dwObjID,
"Mapped incorrectly expected: 0x%08x got: 0x%08x\n", results[1], af.rgoAction[1].dwObjID);
hr = IDirectInputDevice8_SetActionMap(pKey, &af, NULL, DIDSAM_FORCESAVE);
ok (SUCCEEDED(hr), "SetActionMap failed hr=%08x\n", hr);
if (hr == DI_SETTINGSNOTSAVED)
{
skip ("Cant test saving settings if SetActionMap returns DI_SETTINGSNOTSAVED\n");
return;
}
af.rgoAction[0].dwObjID = 0;
af.rgoAction[1].dwObjID = 0;
memset(&af.rgoAction[0].guidInstance, 0, sizeof(GUID));
memset(&af.rgoAction[1].guidInstance, 0, sizeof(GUID));
hr = IDirectInputDevice8_BuildActionMap(pKey, &af, NULL, 0);
ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr);
ok (results[0] == af.rgoAction[0].dwObjID,
"Mapped incorrectly expected: 0x%08x got: 0x%08x\n", results[0], af.rgoAction[0].dwObjID);
ok (IsEqualGUID(&GUID_SysKeyboard, &af.rgoAction[0].guidInstance), "Action should be mapped to keyboard\n");
ok (results[1] == af.rgoAction[1].dwObjID,
"Mapped incorrectly expected: 0x%08x got: 0x%08x\n", results[1], af.rgoAction[1].dwObjID);
ok (IsEqualGUID(&GUID_SysKeyboard, &af.rgoAction[1].guidInstance), "Action should be mapped to keyboard\n");
/* Hard case. Customized mapping, save, ask for previous map and read it back */
af.rgoAction[0].dwObjID = other_results[0];
af.rgoAction[0].dwHow = DIAH_USERCONFIG;
af.rgoAction[0].guidInstance = GUID_SysKeyboard;
af.rgoAction[1].dwObjID = other_results[1];
af.rgoAction[1].dwHow = DIAH_USERCONFIG;
af.rgoAction[1].guidInstance = GUID_SysKeyboard;
hr = IDirectInputDevice8_SetActionMap(pKey, &af, NULL, DIDSAM_FORCESAVE);
ok (SUCCEEDED(hr), "SetActionMap failed hr=%08x\n", hr);
if (hr == DI_SETTINGSNOTSAVED)
{
skip ("Cant test saving settings if SetActionMap returns DI_SETTINGSNOTSAVED\n");
return;
}
af.rgoAction[0].dwObjID = 0;
af.rgoAction[1].dwObjID = 0;
memset(&af.rgoAction[0].guidInstance, 0, sizeof(GUID));
memset(&af.rgoAction[1].guidInstance, 0, sizeof(GUID));
hr = IDirectInputDevice8_BuildActionMap(pKey, &af, NULL, 0);
ok (SUCCEEDED(hr), "BuildActionMap failed hr=%08x\n", hr);
todo_wine ok (other_results[0] == af.rgoAction[0].dwObjID,
"Mapped incorrectly expected: 0x%08x got: 0x%08x\n", other_results[0], af.rgoAction[0].dwObjID);
todo_wine ok (IsEqualGUID(&GUID_SysKeyboard, &af.rgoAction[0].guidInstance), "Action should be mapped to keyboard\n");
todo_wine ok (other_results[1] == af.rgoAction[1].dwObjID,
"Mapped incorrectly expected: 0x%08x got: 0x%08x\n", other_results[1], af.rgoAction[1].dwObjID);
todo_wine ok (IsEqualGUID(&GUID_SysKeyboard, &af.rgoAction[1].guidInstance), "Action should be mapped to keyboard\n");
}
START_TEST(device) START_TEST(device)
{ {
CoInitialize(NULL); CoInitialize(NULL);
test_action_mapping(); test_action_mapping();
test_save_settings();
CoUninitialize(); CoUninitialize();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment