[PATCH 06/11] dinput8/tests: Add some HID joystick IDirectInputEffect_SetParameters tests.
Rémi Bernon
rbernon at codeweavers.com
Wed Oct 6 03:21:56 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput8/tests/hid.c | 364 +++++++++++++++++++++++++++++++++++++++
1 file changed, 364 insertions(+)
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 77882187edf..ebb7239a911 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -5110,6 +5110,50 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
.dwTriggerButton = -1,
.rgdwAxes = (void *)expect_axes_init,
};
+ static const DWORD expect_axes[3] =
+ {
+ DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 2 ) | DIDFT_FFACTUATOR,
+ DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 0 ) | DIDFT_FFACTUATOR,
+ DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 1 ) | DIDFT_FFACTUATOR,
+ };
+ static const LONG expect_directions[3] =
+ {
+ +3000,
+ -6000,
+ 0,
+ };
+ static const DIENVELOPE expect_envelope =
+ {
+ .dwSize = sizeof(DIENVELOPE),
+ .dwAttackLevel = 1000,
+ .dwAttackTime = 2000,
+ .dwFadeLevel = 3000,
+ .dwFadeTime = 4000,
+ };
+ static const DIPERIODIC expect_periodic =
+ {
+ .dwMagnitude = 1000,
+ .lOffset = 2000,
+ .dwPhase = 3000,
+ .dwPeriod = 4000,
+ };
+ static const DIEFFECT expect_desc =
+ {
+ .dwSize = sizeof(DIEFFECT),
+ .dwFlags = DIEFF_SPHERICAL | DIEFF_OBJECTIDS,
+ .dwDuration = 1000,
+ .dwSamplePeriod = 2000,
+ .dwGain = 3000,
+ .dwTriggerButton = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( 0 ) | DIDFT_FFEFFECTTRIGGER,
+ .dwTriggerRepeatInterval = 5000,
+ .cAxes = 3,
+ .rgdwAxes = (void *)expect_axes,
+ .rglDirection = (void *)expect_directions,
+ .lpEnvelope = (void *)&expect_envelope,
+ .cbTypeSpecificParams = sizeof(DIPERIODIC),
+ .lpvTypeSpecificParams = (void *)&expect_periodic,
+ .dwStartDelay = 6000,
+ };
struct check_created_effect_params check_params = {0};
IDirectInputEffect *effect;
DIPERIODIC periodic = {0};
@@ -5343,6 +5387,326 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
todo_wine
check_member( desc, expect_desc_init, "%u", dwStartDelay );
+ hr = IDirectInputEffect_SetParameters( effect, NULL, DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == E_POINTER, "SetParameters returned %#x\n", hr );
+ memset( &desc, 0, sizeof(desc) );
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+ desc.dwSize = sizeof(DIEFFECT);
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+
+ set_hid_expect( file, &expect_dc_reset, sizeof(expect_dc_reset) );
+ hr = IDirectInputDevice8_Unacquire( device );
+ ok( hr == DI_OK, "Unacquire returned: %#x\n", hr );
+ set_hid_expect( file, NULL, 0 );
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DURATION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ set_hid_expect( file, &expect_dc_reset, sizeof(expect_dc_reset) );
+ hr = IDirectInputDevice8_Acquire( device );
+ ok( hr == DI_OK, "Acquire returned: %#x\n", hr );
+ set_hid_expect( file, NULL, 0 );
+
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DURATION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+
+ desc.dwTriggerButton = -1;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DURATION );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", dwDuration );
+ check_member( desc, expect_desc_init, "%u", dwSamplePeriod );
+ check_member( desc, expect_desc_init, "%u", dwGain );
+ check_member( desc, expect_desc_init, "%#x", dwTriggerButton );
+ check_member( desc, expect_desc_init, "%u", dwTriggerRepeatInterval );
+ check_member( desc, expect_desc_init, "%u", cAxes );
+ check_member( desc, expect_desc_init, "%p", rglDirection );
+ check_member( desc, expect_desc_init, "%p", lpEnvelope );
+ check_member( desc, expect_desc_init, "%u", cbTypeSpecificParams );
+ check_member( desc, expect_desc_init, "%u", dwStartDelay );
+
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc,
+ DIEP_GAIN | DIEP_SAMPLEPERIOD | DIEP_STARTDELAY |
+ DIEP_TRIGGERREPEATINTERVAL | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ desc.dwDuration = 0;
+ flags = DIEP_DURATION | DIEP_GAIN | DIEP_SAMPLEPERIOD | DIEP_STARTDELAY | DIEP_TRIGGERREPEATINTERVAL;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, flags );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", dwDuration );
+ todo_wine
+ check_member( desc, expect_desc, "%u", dwSamplePeriod );
+ todo_wine
+ check_member( desc, expect_desc, "%u", dwGain );
+ check_member( desc, expect_desc_init, "%#x", dwTriggerButton );
+ todo_wine
+ check_member( desc, expect_desc, "%u", dwTriggerRepeatInterval );
+ check_member( desc, expect_desc_init, "%u", cAxes );
+ check_member( desc, expect_desc_init, "%p", rglDirection );
+ check_member( desc, expect_desc_init, "%p", lpEnvelope );
+ check_member( desc, expect_desc_init, "%u", cbTypeSpecificParams );
+ todo_wine
+ check_member( desc, expect_desc, "%u", dwStartDelay );
+
+ desc.lpEnvelope = NULL;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ desc.lpEnvelope = &envelope;
+ envelope.dwSize = 0;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+
+ desc.lpEnvelope = &envelope;
+ envelope.dwSize = sizeof(DIENVELOPE);
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_ENVELOPE );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( envelope, expect_envelope, "%u", dwAttackLevel );
+ todo_wine
+ check_member( envelope, expect_envelope, "%u", dwAttackTime );
+ todo_wine
+ check_member( envelope, expect_envelope, "%u", dwFadeLevel );
+ todo_wine
+ check_member( envelope, expect_envelope, "%u", dwFadeTime );
+
+ desc.dwFlags = 0;
+ desc.cAxes = 0;
+ desc.rgdwAxes = NULL;
+ desc.rglDirection = NULL;
+ desc.lpEnvelope = NULL;
+ desc.cbTypeSpecificParams = 0;
+ desc.lpvTypeSpecificParams = NULL;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ALLPARAMS | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+
+ desc.dwFlags = DIEFF_OBJECTOFFSETS;
+ desc.cAxes = 1;
+ desc.rgdwAxes = axes;
+ desc.rgdwAxes[0] = DIJOFS_X;
+ desc.dwTriggerButton = DIJOFS_BUTTON( 1 );
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_AXES | DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_ALREADYINITIALIZED, "SetParameters returned %#x\n", hr );
+
+ desc.cAxes = 0;
+ desc.dwFlags = DIEFF_OBJECTIDS;
+ desc.rgdwAxes = axes;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
+ todo_wine
+ ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", cAxes );
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%#x", dwTriggerButton );
+ todo_wine
+ check_member( desc, expect_desc, "%u", cAxes );
+ todo_wine
+ check_member( desc, expect_desc, "%u", rgdwAxes[0] );
+ todo_wine
+ check_member( desc, expect_desc, "%u", rgdwAxes[1] );
+ todo_wine
+ check_member( desc, expect_desc, "%u", rgdwAxes[2] );
+
+ desc.dwFlags = DIEFF_OBJECTOFFSETS;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.dwTriggerButton == 0x30, "got %#x expected %#x\n", desc.dwTriggerButton, 0x30 );
+ todo_wine
+ ok( desc.rgdwAxes[0] == 8, "got %#x expected %#x\n", desc.rgdwAxes[0], 8 );
+ ok( desc.rgdwAxes[1] == 0, "got %#x expected %#x\n", desc.rgdwAxes[1], 0 );
+ todo_wine
+ ok( desc.rgdwAxes[2] == 4, "got %#x expected %#x\n", desc.rgdwAxes[2], 4 );
+
+ desc.dwFlags = DIEFF_CARTESIAN;
+ desc.cAxes = 0;
+ desc.rglDirection = directions;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+ desc.cAxes = 3;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ desc.dwFlags = DIEFF_POLAR;
+ desc.cAxes = 3;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+
+ desc.dwFlags = DIEFF_SPHERICAL;
+ desc.cAxes = 1;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", cAxes );
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", cAxes );
+ todo_wine
+ ok( desc.rglDirection[0] == 3000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 3000 );
+ todo_wine
+ ok( desc.rglDirection[1] == 30000, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 30000 );
+ ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
+ desc.dwFlags = DIEFF_CARTESIAN;
+ desc.cAxes = 2;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", cAxes );
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( desc, expect_desc, "%u", cAxes );
+ todo_wine
+ ok( desc.rglDirection[0] == 4330, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 4330 );
+ todo_wine
+ ok( desc.rglDirection[1] == 2500, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 2500 );
+ todo_wine
+ ok( desc.rglDirection[2] == -8660, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], -8660 );
+ desc.dwFlags = DIEFF_POLAR;
+ desc.cAxes = 3;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "GetParameters returned %#x\n", hr );
+
+ desc.cbTypeSpecificParams = 0;
+ desc.lpvTypeSpecificParams = &periodic;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
+ desc.cbTypeSpecificParams = sizeof(DIPERIODIC);
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ check_member( periodic, expect_periodic, "%u", dwMagnitude );
+ todo_wine
+ check_member( periodic, expect_periodic, "%d", lOffset );
+ todo_wine
+ check_member( periodic, expect_periodic, "%u", dwPhase );
+ todo_wine
+ check_member( periodic, expect_periodic, "%u", dwPeriod );
+
+ ref = IDirectInputEffect_Release( effect );
+ ok( ref == 0, "Release returned %d\n", ref );
+
+ hr = IDirectInputDevice8_CreateEffect( device, &GUID_Sine, NULL, &effect, NULL );
+ ok( hr == DI_OK, "CreateEffect returned %#x\n", hr );
+
+ desc.dwFlags = DIEFF_POLAR | DIEFF_OBJECTIDS;
+ desc.cAxes = 2;
+ desc.rgdwAxes[0] = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 2 ) | DIDFT_FFACTUATOR;
+ desc.rgdwAxes[1] = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 0 ) | DIDFT_FFACTUATOR;
+ desc.rglDirection[0] = 3000;
+ desc.rglDirection[1] = 0;
+ desc.rglDirection[2] = 0;
+ hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_DIRECTION | DIEP_NODOWNLOAD );
+ todo_wine
+ ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
+ desc.rglDirection[0] = 0;
+
+ desc.dwFlags = DIEFF_SPHERICAL;
+ desc.cAxes = 1;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
+ todo_wine
+ ok( desc.rglDirection[0] == 30000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 30000 );
+ ok( desc.rglDirection[1] == 0, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 0 );
+ ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
+
+ desc.dwFlags = DIEFF_CARTESIAN;
+ desc.cAxes = 1;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
+ todo_wine
+ ok( desc.rglDirection[0] == 5000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 5000 );
+ todo_wine
+ ok( desc.rglDirection[1] == -8660, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], -8660 );
+ ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
+
+ desc.dwFlags = DIEFF_POLAR;
+ desc.cAxes = 1;
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
+ hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
+ todo_wine
+ ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
+ todo_wine
+ ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
+ todo_wine
+ ok( desc.rglDirection[0] == 3000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 3000 );
+ ok( desc.rglDirection[1] == 0, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 0 );
+ ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
+
ref = IDirectInputEffect_Release( effect );
ok( ref == 0, "Release returned %d\n", ref );
}
--
2.33.0
More information about the wine-devel
mailing list