Author: gadamopoulos
Date: Sun Apr 10 15:14:15 2011
New Revision: 51312
URL:
http://svn.reactos.org/svn/reactos?rev=51312&view=rev
Log:
[user32_apitest]
- Add some more tests for SetCursorPos
Modified:
trunk/rostests/apitests/user32/SetCursorPos.c
Modified: trunk/rostests/apitests/user32/SetCursorPos.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/SetCursor…
==============================================================================
--- trunk/rostests/apitests/user32/SetCursorPos.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/SetCursorPos.c [iso-8859-1] Sun Apr 10 15:14:15 2011
@@ -10,29 +10,153 @@
#include <windows.h>
#include <assert.h>
-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)