From: Rémi Bernon rbernon@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput/tests/Makefile.in | 3 +- dlls/dinput/tests/device8.c | 182 +++++++++++++++++++++++++ dlls/dinput/tests/mouse.c | 242 ---------------------------------- 3 files changed, 183 insertions(+), 244 deletions(-) delete mode 100644 dlls/dinput/tests/mouse.c
diff --git a/dlls/dinput/tests/Makefile.in b/dlls/dinput/tests/Makefile.in index 1556f3cda37..6ef155e5160 100644 --- a/dlls/dinput/tests/Makefile.in +++ b/dlls/dinput/tests/Makefile.in @@ -22,5 +22,4 @@ SOURCES = \ hotplug.c \ joystick.c \ joystick8.c \ - keyboard.c \ - mouse.c + keyboard.c diff --git a/dlls/dinput/tests/device8.c b/dlls/dinput/tests/device8.c index bf9d16cbc05..08fccd00551 100644 --- a/dlls/dinput/tests/device8.c +++ b/dlls/dinput/tests/device8.c @@ -1604,13 +1604,19 @@ static void test_sys_mouse( DWORD version ) }, }; DIDEVICEOBJECTINSTANCEW objinst = {0}; + DIDEVICEOBJECTDATA objdata = {0}; DIDEVICEINSTANCEW devinst = {0}; BOOL old_localized = localized; IDirectInputDevice8W *device; + HWND hwnd, tmp_hwnd, child; DIDEVCAPS caps = {0}; + DIMOUSESTATE state; ULONG res, ref; + HANDLE event; + DWORD count; HRESULT hr; GUID guid; + int i;
if (FAILED(create_dinput_device( version, &GUID_SysMouse, &device ))) return;
@@ -1858,6 +1864,182 @@ static void test_sys_mouse( DWORD version ) check_member( objinst, expect_objects[3], "%#04x", wExponent ); check_member( objinst, expect_objects[3], "%u", wReportId );
+ + SetCursorPos( 60, 60 ); + + hwnd = CreateWindowW( L"static", L"static", WS_POPUP | WS_VISIBLE, + 50, 50, 200, 200, NULL, NULL, NULL, NULL ); + ok( !!hwnd, "CreateWindowW failed, error %lu\n", GetLastError() ); + flush_events(); + + hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_FOREGROUND ); + ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_FOREGROUND|DISCL_EXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_FOREGROUND|DISCL_NONEXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + + hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_BACKGROUND ); + ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_BACKGROUND|DISCL_EXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_BACKGROUND|DISCL_NONEXCLUSIVE ); + ok( hr == DI_OK, "SetCooperativeLevel returned %#lx\n", hr ); + + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_FOREGROUND ); + ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_FOREGROUND|DISCL_EXCLUSIVE ); + ok( hr == DI_OK, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_FOREGROUND|DISCL_NONEXCLUSIVE ); + ok( hr == DI_OK, "SetCooperativeLevel returned %#lx\n", hr ); + + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_BACKGROUND ); + ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_BACKGROUND|DISCL_EXCLUSIVE ); + ok( hr == DIERR_UNSUPPORTED, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_BACKGROUND|DISCL_NONEXCLUSIVE ); + ok( hr == DI_OK, "SetCooperativeLevel returned %#lx\n", hr ); + + child = CreateWindowW( L"static", L"static", WS_CHILD | WS_VISIBLE, + 10, 10, 50, 50, hwnd, NULL, NULL, NULL ); + ok( !!child, "CreateWindowW failed, error %lu\n", GetLastError() ); + flush_events(); + + hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_FOREGROUND ); + ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_FOREGROUND|DISCL_EXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_FOREGROUND|DISCL_NONEXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + + hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_BACKGROUND ); + ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_BACKGROUND|DISCL_EXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_BACKGROUND|DISCL_NONEXCLUSIVE ); + ok( hr == E_HANDLE, "SetCooperativeLevel returned %#lx\n", hr ); + + DestroyWindow( child ); + + + event = CreateEventW( NULL, FALSE, FALSE, NULL ); + ok( !!event, "CreateEventW failed, error %lu\n", GetLastError() ); + hr = IDirectInputDevice8_SetEventNotification( device, event ); + ok( hr == DI_OK, "SetEventNotification returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND ); + ok( hr == DI_OK, "SetCooperativeLevel returned %#lx\n", hr ); + + prop_dword.dwData = 5; + prop_dword.diph.dwHow = DIPH_DEVICE; + prop_dword.diph.dwObj = 0; + hr = IDirectInputDevice8_SetProperty( device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&prop_dword ); + ok( hr == DI_OK, "SetProperty returned %#lx\n", hr ); + hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIMouse ); + ok( hr == DI_OK, "SetDataFormat returned %#lx\n", hr ); + hr = IDirectInputDevice8_Unacquire( device ); + ok( hr == DI_NOEFFECT, "Unacquire returned %#lx\n", hr ); + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_OK, "Acquire returned %#lx\n", hr ); + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_NOEFFECT, "Acquire returned %#lx\n", hr ); + + + tmp_hwnd = CreateWindowW( L"static", L"static", WS_POPUP | WS_VISIBLE, + 50, 250, 200, 200, NULL, NULL, NULL, NULL ); + ok( !!tmp_hwnd, "CreateWindowW failed, error %lu\n", GetLastError() ); + flush_events(); + + hr = IDirectInputDevice8_GetDeviceState( device, sizeof(state), &state ); + ok( hr == DIERR_NOTACQUIRED, "GetDeviceState returned %#lx\n", hr ); + + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DIERR_OTHERAPPHASPRIO, "Acquire returned %#lx\n", hr ); + + SetActiveWindow( hwnd ); + flush_events(); + + hr = IDirectInputDevice8_SetProperty( device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&prop_dword ); + ok( hr == DI_OK, "SetProperty returned %#lx\n", hr ); + + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_OK, "Acquire returned %#lx\n", hr ); + + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */ + { + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + } + ok( !res, "WaitForSingleObject returned %#lx\n", res ); + + count = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(objdata), &objdata, &count, 0 ); + ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr ); + ok( count == 1, "got count %lu\n", count ); + + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + ok( !res, "WaitForSingleObject returned %#lx\n", res ); + + hr = IDirectInputDevice8_Unacquire( device ); + ok( hr == DI_OK, "Unacquire returned %#lx\n", hr ); + count = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(objdata), &objdata, &count, 0 ); + ok( hr == (version < 0x800 ? DI_OK : DIERR_NOTACQUIRED), "GetDeviceData returned %#lx\n", hr ); + ok( count == 1, "got count %lu\n", count ); + + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_OK, "Acquire returned %#lx\n", hr ); + + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */ + { + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + } + ok( !res, "WaitForSingleObject returned %#lx\n", res ); + + hr = IDirectInputDevice8_Unacquire( device ); + ok( hr == DI_OK, "Unacquire returned %#lx\n", hr ); + + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DI_OK, "Acquire returned %#lx\n", hr ); + count = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(objdata), &objdata, &count, 0 ); + ok( hr == (version < 0x800 ? DI_OK : DI_BUFFEROVERFLOW), "GetDeviceData returned %#lx\n", hr ); + ok( count == 1, "got count %lu\n", count ); + + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */ + { + mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + } + ok( !res, "WaitForSingleObject returned %#lx\n", res ); + + for (i = 0; i < 2; i++) + { + mouse_event( MOUSEEVENTF_MOVE, 10 + i, 10 + i, 0, 0 ); + res = WaitForSingleObject( event, 100 ); + ok( !res, "WaitForSingleObject returned %#lx\n", res ); + } + + count = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(objdata), &objdata, &count, 0 ); + ok( hr == (version < 0x800 ? DI_OK : DI_BUFFEROVERFLOW), "GetDeviceData returned %#lx\n", hr ); + count = 1; + hr = IDirectInputDevice8_GetDeviceData( device, sizeof(objdata), &objdata, &count, 0 ); + ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr ); + ok( count == 1, "got count %lu\n", count ); + + DestroyWindow( tmp_hwnd ); + + CloseHandle( event ); + DestroyWindow( hwnd ); + ref = IDirectInputDevice8_Release( device ); ok( ref == 0, "Release returned %ld\n", ref );
diff --git a/dlls/dinput/tests/mouse.c b/dlls/dinput/tests/mouse.c deleted file mode 100644 index 2079c5e1408..00000000000 --- a/dlls/dinput/tests/mouse.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2005 Robert Reif - * Copyright (c) 2006 Vitaliy Margolen - * - * 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 - */ - -#define DIRECTINPUT_VERSION 0x0700 - -#include <stdarg.h> -#include <stddef.h> - -#include "ntstatus.h" -#define WIN32_NO_STATUS -#include "windef.h" -#include "winbase.h" - -#define COBJMACROS -#include "dinput.h" - -#include "dinput_test.h" - -static const HRESULT SetCoop_null_window[16] = { - E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, - E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, - E_INVALIDARG, E_HANDLE, S_OK, E_INVALIDARG, - E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; - -static const HRESULT SetCoop_real_window[16] = { - E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, - E_INVALIDARG, S_OK, S_OK, E_INVALIDARG, - E_INVALIDARG, E_NOTIMPL, S_OK, E_INVALIDARG, - E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; - -static const HRESULT SetCoop_child_window[16] = { - E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, - E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, - E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG, - E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG}; - -static void flush_events(void) -{ - MSG msg; - int diff = 200; - int min_timeout = 100; - DWORD time = GetTickCount() + diff; - - while (diff > 0) - { - if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break; - while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); - diff = time - GetTickCount(); - } -} - -static void test_set_coop(IDirectInputA *pDI, HWND hwnd) -{ - HRESULT hr; - IDirectInputDeviceA *pMouse = NULL; - int i; - HWND child; - - hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL); - ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr); - if (FAILED(hr)) return; - - for (i=0; i<16; i++) - { - hr = IDirectInputDevice_SetCooperativeLevel(pMouse, NULL, i); - ok(hr == SetCoop_null_window[i], "SetCooperativeLevel(NULL, %d): %#lx\n", i, hr); - } - for (i=0; i<16; i++) - { - hr = IDirectInputDevice_SetCooperativeLevel(pMouse, hwnd, i); - ok(hr == SetCoop_real_window[i], "SetCooperativeLevel(hwnd, %d): %#lx\n", i, hr); - } - - child = CreateWindowA("static", "Title", WS_CHILD | WS_VISIBLE, 10, 10, 50, 50, hwnd, NULL, - NULL, NULL); - ok(child != NULL, "err: %lu\n", GetLastError()); - - for (i=0; i<16; i++) - { - hr = IDirectInputDevice_SetCooperativeLevel(pMouse, child, i); - ok(hr == SetCoop_child_window[i], "SetCooperativeLevel(child, %d): %#lx\n", i, hr); - } - - DestroyWindow(child); - if (pMouse) IUnknown_Release(pMouse); -} - -static void test_acquire(IDirectInputA *pDI, HWND hwnd) -{ - HRESULT hr; - IDirectInputDeviceA *pMouse = NULL; - DIMOUSESTATE m_state; - HWND hwnd2; - DIPROPDWORD di_op; - DIDEVICEOBJECTDATA mouse_state; - DWORD cnt; - int i; - - if (! SetForegroundWindow(hwnd)) - { - skip("Not running as foreground app, skipping acquire tests\n"); - return; - } - - hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pMouse, NULL); - ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr); - if (FAILED(hr)) return; - - hr = IDirectInputDevice_SetCooperativeLevel(pMouse, hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); - ok(hr == S_OK, "SetCooperativeLevel: %#lx\n", hr); - - memset(&di_op, 0, sizeof(di_op)); - di_op.dwData = 5; - di_op.diph.dwHow = DIPH_DEVICE; - di_op.diph.dwSize = sizeof(DIPROPDWORD); - di_op.diph.dwHeaderSize = sizeof(DIPROPHEADER); - hr = IDirectInputDevice_SetProperty(pMouse, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&di_op); - ok(hr == S_OK, "SetProperty() failed: %#lx\n", hr); - - hr = IDirectInputDevice_SetDataFormat(pMouse, &c_dfDIMouse); - ok(SUCCEEDED(hr), "IDirectInputDevice_SetDataFormat() failed: %#lx\n", hr); - hr = IDirectInputDevice_Unacquire(pMouse); - ok(hr == S_FALSE, "IDirectInputDevice_Unacquire() should have failed: %#lx\n", hr); - hr = IDirectInputDevice_Acquire(pMouse); - ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %#lx\n", hr); - hr = IDirectInputDevice_Acquire(pMouse); - ok(hr == S_FALSE, "IDirectInputDevice_Acquire() should have failed: %#lx\n", hr); - - /* Foreground coop level requires window to have focus */ - /* Create a temporary window, this should make dinput - * lose mouse input */ - hwnd2 = CreateWindowA("static", "Temporary", WS_VISIBLE, 10, 210, 200, 200, NULL, NULL, NULL, - NULL); - ok(hwnd2 != NULL, "CreateWindowA failed with %lu\n", GetLastError()); - flush_events(); - - hr = IDirectInputDevice_GetDeviceState(pMouse, sizeof(m_state), &m_state); - ok(hr == DIERR_NOTACQUIRED, "GetDeviceState() should have failed: %#lx\n", hr); - - hr = IDirectInputDevice_Acquire(pMouse); - ok(hr == DIERR_OTHERAPPHASPRIO, "Acquire() should have failed: %#lx\n", hr); - - SetActiveWindow( hwnd ); - hr = IDirectInputDevice_Acquire(pMouse); - ok(hr == S_OK, "Acquire() failed: %#lx\n", hr); - - mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0); - cnt = 1; - hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); - ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %#lx cnt:%lu\n", hr, cnt); - - mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0); - hr = IDirectInputDevice_Unacquire(pMouse); - ok(hr == S_OK, "Failed: %#lx\n", hr); - cnt = 1; - hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); - ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %#lx cnt:%lu\n", hr, cnt); - - hr = IDirectInputDevice_Acquire(pMouse); - ok(hr == S_OK, "Failed: %#lx\n", hr); - mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0); - hr = IDirectInputDevice_Unacquire(pMouse); - ok(hr == S_OK, "Failed: %#lx\n", hr); - - hr = IDirectInputDevice_Acquire(pMouse); - ok(hr == S_OK, "Failed: %#lx\n", hr); - cnt = 1; - hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); - ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %#lx cnt:%lu\n", hr, cnt); - - /* Check for buffer overflow */ - for (i = 0; i < 6; i++) - mouse_event(MOUSEEVENTF_MOVE, 10 + i, 10 + i, 0, 0); - - cnt = 1; - hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); - ok(hr == DI_OK, "GetDeviceData() failed: %#lx cnt:%lu\n", hr, cnt); - cnt = 1; - hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0); - ok(hr == DI_OK && cnt == 1, "GetDeviceData() failed: %#lx cnt:%lu\n", hr, cnt); - - IUnknown_Release(pMouse); - - DestroyWindow( hwnd2 ); -} - -static void mouse_tests(void) -{ - HRESULT hr; - IDirectInputA *pDI = NULL; - HWND hwnd; - ULONG ref = 0; - - hr = DirectInputCreateA(instance, DIRECTINPUT_VERSION, &pDI, NULL); - if (hr == DIERR_OLDDIRECTINPUTVERSION) - { - skip("Tests require a newer dinput version\n"); - return; - } - ok(SUCCEEDED(hr), "DirectInputCreateA() failed: %#lx\n", hr); - if (FAILED(hr)) return; - - hwnd = CreateWindowA("static", "Title", WS_OVERLAPPEDWINDOW, 10, 10, 200, 200, NULL, NULL, - NULL, NULL); - ok(hwnd != NULL, "err: %lu\n", GetLastError()); - if (hwnd) - { - ShowWindow(hwnd, SW_SHOW); - - test_set_coop(pDI, hwnd); - test_acquire(pDI, hwnd); - - DestroyWindow(hwnd); - } - if (pDI) ref = IUnknown_Release(pDI); - ok(!ref, "IDirectInput_Release() reference count = %lu\n", ref); -} - -START_TEST(mouse) -{ - dinput_test_init(); - - mouse_tests(); - - dinput_test_exit(); -}