Andrew Nguyen : dinput: Add tests for IDirectInput:: EnumDevices and add a parameter check.
Alexandre Julliard
julliard at winehq.org
Wed Jul 6 13:31:05 CDT 2011
Module: wine
Branch: master
Commit: 9b1060d0902960ad2a353f8f58094c7562b855b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9b1060d0902960ad2a353f8f58094c7562b855b7
Author: Andrew Nguyen <anguyen at codeweavers.com>
Date: Tue Jul 5 07:19:06 2011 -0500
dinput: Add tests for IDirectInput::EnumDevices and add a parameter check.
---
dlls/dinput/dinput_main.c | 6 +++
dlls/dinput/tests/dinput.c | 78 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+), 0 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index bbaefec..1ab6899 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -325,6 +325,9 @@ static HRESULT WINAPI IDirectInputAImpl_EnumDevices(
lpCallback, pvRef, dwFlags);
_dump_EnumDevices_dwFlags(dwFlags);
+ if (!lpCallback)
+ return DIERR_INVALIDPARAM;
+
for (i = 0; i < NB_DINPUT_DEVICES; i++) {
if (!dinput_devices[i]->enum_deviceA) continue;
for (j = 0, r = -1; r != 0; j++) {
@@ -356,6 +359,9 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
lpCallback, pvRef, dwFlags);
_dump_EnumDevices_dwFlags(dwFlags);
+ if (!lpCallback)
+ return DIERR_INVALIDPARAM;
+
for (i = 0; i < NB_DINPUT_DEVICES; i++) {
if (!dinput_devices[i]->enum_deviceW) continue;
for (j = 0, r = -1; r != 0; j++) {
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index 19b1819..676e5f8 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -168,6 +168,83 @@ static void test_CreateDevice(void)
IDirectInput_Release(pDI);
}
+struct enum_devices_test
+{
+ unsigned int device_count;
+ BOOL return_value;
+};
+
+static BOOL CALLBACK enum_devices_callback(const DIDEVICEINSTANCEA *instance, void *context)
+{
+ struct enum_devices_test *enum_test = context;
+
+ enum_test->device_count++;
+ return enum_test->return_value;
+}
+
+static void test_EnumDevices(void)
+{
+ IDirectInputA *pDI;
+ HRESULT hr;
+ struct enum_devices_test enum_test, enum_test_return;
+
+ hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
+ if (FAILED(hr))
+ {
+ win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
+ return;
+ }
+
+ hr = IDirectInput_EnumDevices(pDI, 0, NULL, NULL, 0);
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+
+ hr = IDirectInput_EnumDevices(pDI, 0, NULL, NULL, ~0u);
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+
+ /* Test crashes on Wine. */
+ if (0)
+ {
+ hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, NULL, ~0u);
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+ }
+
+ hr = IDirectInput_EnumDevices(pDI, 0xdeadbeef, NULL, NULL, 0);
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+
+ hr = IDirectInput_EnumDevices(pDI, 0xdeadbeef, NULL, NULL, ~0u);
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+
+ hr = IDirectInput_EnumDevices(pDI, 0xdeadbeef, enum_devices_callback, NULL, 0);
+ todo_wine
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+
+ hr = IDirectInput_EnumDevices(pDI, 0xdeadbeef, enum_devices_callback, NULL, ~0u);
+ todo_wine
+ ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+
+ enum_test.device_count = 0;
+ enum_test.return_value = DIENUM_CONTINUE;
+ hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, &enum_test, 0);
+ ok(hr == DI_OK, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+ ok(enum_test.device_count != 0, "Device count is %u\n", enum_test.device_count);
+
+ /* Enumeration only stops with an explicit DIENUM_STOP. */
+ enum_test_return.device_count = 0;
+ enum_test_return.return_value = 42;
+ hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, &enum_test_return, 0);
+ ok(hr == DI_OK, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+ ok(enum_test_return.device_count == enum_test.device_count,
+ "Device count is %u vs. %u\n", enum_test_return.device_count, enum_test.device_count);
+
+ enum_test.device_count = 0;
+ enum_test.return_value = DIENUM_STOP;
+ hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, &enum_test, 0);
+ ok(hr == DI_OK, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
+ ok(enum_test.device_count == 1, "Device count is %u\n", enum_test.device_count);
+
+ IDirectInput_Release(pDI);
+}
+
static void test_Initialize(void)
{
IDirectInputA *pDI;
@@ -251,6 +328,7 @@ START_TEST(dinput)
CoInitialize(NULL);
test_QueryInterface();
test_CreateDevice();
+ test_EnumDevices();
test_Initialize();
test_RunControlPanel();
CoUninitialize();
More information about the wine-cvs
mailing list