From c08567e81e9772b5913a2c3906004a8ca72c090c Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 10 Apr 2011 15:14:15 +0000 Subject: [PATCH] [user32_apitest] - Add some more tests for SetCursorPos svn path=/trunk/; revision=51312 --- rostests/apitests/user32/SetCursorPos.c | 156 +++++++++++++++++++++--- 1 file changed, 140 insertions(+), 16 deletions(-) diff --git a/rostests/apitests/user32/SetCursorPos.c b/rostests/apitests/user32/SetCursorPos.c index 8896f986f26..97970305fca 100644 --- a/rostests/apitests/user32/SetCursorPos.c +++ b/rostests/apitests/user32/SetCursorPos.c @@ -10,29 +10,153 @@ #include #include -HHOOK hMouseHook; -int hook_calls = 0; +HHOOK hMouseHookLL, hMouseHook; -LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) +struct _test_info { - hook_calls++; + int ll_hook_called; + int hook_called; + int mouse_move_called; +}; + +struct _test_info info[] = { {0,0,0}, /* SetCursorPos without a window */ + {1,2,0}, /* mouse_event without a window */ + {0,1,1}, /* SetCursorPos with a window */ + {1,1,1}, /* mouse_event with a window */ + {0,1,1}, /* multiple SetCursorPos with a window with coalescing */ + {0,2,2}, /* multiple SetCursorPos with a window without coalescing */ + {2,1,1}, /* multiple mouse_event with a window with coalescing */ + {2,2,2}, /* multiple mouse_event with a window without coalescing */ + }; + +struct _test_info results[8]; +int test_no = 0; + + +LRESULT CALLBACK MouseLLHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + results[test_no].ll_hook_called++; + return CallNextHookEx(hMouseHookLL, nCode, wParam, lParam); +} + +LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + results[test_no].hook_called++; return CallNextHookEx(hMouseHook, nCode, wParam, lParam); } +static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + if(msg == WM_MOUSEMOVE) + results[test_no].mouse_move_called++; + + return DefWindowProcA( hWnd, msg, wParam, lParam ); +} + +static HWND CreateTestWindow() +{ + MSG msg; + WNDCLASSA wclass; + HANDLE hInstance = GetModuleHandleA( NULL ); + HWND hWndTest; + + wclass.lpszClassName = "MouseInputTestClass"; + wclass.style = CS_HREDRAW | CS_VREDRAW; + wclass.lpfnWndProc = WndProc; + wclass.hInstance = hInstance; + wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); + wclass.lpszMenuName = 0; + wclass.cbClsExtra = 0; + wclass.cbWndExtra = 0; + RegisterClassA( &wclass ); + /* create the test window that will receive the keystrokes */ + hWndTest = CreateWindowA( wclass.lpszClassName, "MouseInputTestTest", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100, + NULL, NULL, hInstance, NULL); + assert( hWndTest ); + ShowWindow( hWndTest, SW_SHOWMAXIMIZED); + SetWindowPos( hWndTest, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); + SetForegroundWindow( hWndTest ); + UpdateWindow( hWndTest); + SetFocus(hWndTest); + + /* flush pending messages */ + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + return hWndTest; +} + void Test_SetCursorPos() { - hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandleA( NULL ), 0); - ok(hMouseHook!=NULL,"failed to set hook\n"); - - /* try SetCursorPos */ - SetCursorPos(0,0); - ok (hook_calls == 0, "hooks shouldn't be called\n"); - - /* try mouse_event with MOUSEEVENTF_MOVE*/ - mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); - ok (hook_calls == 1, "hooks should have been called\n"); - - UnhookWindowsHookEx (hMouseHook); + HWND hwnd; + MSG msg; + int i; + + memset(results, sizeof(results), 0); + + hMouseHookLL = SetWindowsHookEx(WH_MOUSE_LL, MouseLLHookProc, GetModuleHandleA( NULL ), 0); + hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, GetModuleHandleA( NULL ), 0); + ok(hMouseHook!=NULL,"failed to set hook\n"); + ok(hMouseHookLL!=NULL,"failed to set hook\n"); + + test_no = 0; + SetCursorPos(1,1); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 1; + mouse_event(MOUSEEVENTF_MOVE, 2,2, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + hwnd = CreateTestWindow(); + SetCapture(hwnd); + + test_no = 2; + SetCursorPos(50,50); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 3; + mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 4; + SetCursorPos(50,50); + SetCursorPos(60,60); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 5; + SetCursorPos(50,50); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + SetCursorPos(60,60); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 6; + mouse_event(MOUSEEVENTF_MOVE, 50,50, 0,0); + mouse_event(MOUSEEVENTF_MOVE, 60,60, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + test_no = 7; + mouse_event(MOUSEEVENTF_MOVE, 50,50, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + mouse_event(MOUSEEVENTF_MOVE, 60,60, 0,0); + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + for(i = 0; i< 8; i++) + { +#define TEST(s,x,y) ok(y == x, "%d: %s called %d times instead of %d\n",i,s, y,x); + TEST("WH_MOUSE_LL", info[i].ll_hook_called, results[i].ll_hook_called); + /* WH_MOUSE results vary greatly among windows versions */ + //TEST("WH_MOUSE", info[i].hook_called, results[i].hook_called); + TEST("WM_MOUSEMOVE", info[i].mouse_move_called, results[i].mouse_move_called); + } + + SetCapture(NULL); + DestroyWindow(hwnd); + + UnhookWindowsHookEx (hMouseHook); + UnhookWindowsHookEx (hMouseHookLL); + } START_TEST(SetCursorPos)