Author: gadamopoulos Date: Fri Sep 23 12:05:40 2011 New Revision: 53812
URL: http://svn.reactos.org/svn/reactos?rev=53812&view=rev Log: [user32_apitest.rbuild] - Move shared code used to log window messages in helper.c - Implement logging hooks - Fix comparing the logged messages to show the correct line of the test - Add tests for hooks in TrackMouseEvent test
Added: trunk/rostests/apitests/user32/helper.c (with props) trunk/rostests/apitests/user32/helper.h (with props) Modified: trunk/rostests/apitests/user32/CMakeLists.txt trunk/rostests/apitests/user32/SetActiveWindow.c trunk/rostests/apitests/user32/SetCursorPos.c trunk/rostests/apitests/user32/TrackMouseEvent.c trunk/rostests/apitests/user32/user32_apitest.rbuild
Modified: trunk/rostests/apitests/user32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/CMakeLists... ============================================================================== --- trunk/rostests/apitests/user32/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/apitests/user32/CMakeLists.txt [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -4,6 +4,7 @@ set_rc_compiler()
list(APPEND SOURCE + helper.c DeferWindowPos.c GetIconInfo.c GetKeyState.c
Modified: trunk/rostests/apitests/user32/SetActiveWindow.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/SetActiveW... ============================================================================== --- trunk/rostests/apitests/user32/SetActiveWindow.c [iso-8859-1] (original) +++ trunk/rostests/apitests/user32/SetActiveWindow.c [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -8,104 +8,18 @@ #include <stdio.h> #include <wine/test.h> #include <windows.h> - -typedef struct _MSG_ENTRY -{ - int iwnd; - UINT msg; -} MSG_ENTRY; +#include "helper.h"
MSG_ENTRY message_cache[100]; -int message_cache_size = 0; - HWND hWnd1, hWnd2, hWnd3, hWnd4;
-/* helper functions */ - -static char* get_msg_name(UINT msg) +static int get_iwnd(HWND hWnd) { - switch(msg) - { - case WM_NCACTIVATE: return "WM_NCACTIVATE"; - case WM_ACTIVATE: return "WM_ACTIVATE"; - case WM_ACTIVATEAPP: return "WM_ACTIVATEAPP"; - case WM_WINDOWPOSCHANGING: return "WM_WINDOWPOSCHANGING"; - case WM_WINDOWPOSCHANGED: return "WM_WINDOWPOSCHANGED"; - case WM_SETFOCUS: return "WM_SETFOCUS"; - case WM_KILLFOCUS: return "WM_KILLFOCUS"; - case WM_NCPAINT: return "WM_NCPAINT"; - case WM_PAINT: return "WM_PAINT"; - case WM_ERASEBKGND: return "WM_ERASEBKGND"; - case WM_SIZE: return "WM_SIZE"; - case WM_MOVE: return "WM_MOVE"; - case WM_SHOWWINDOW: return "WM_SHOWWINDOW"; - case WM_QUERYNEWPALETTE: return "WM_QUERYNEWPALETTE"; - default: return NULL; - } -} - -static void empty_message_cache() -{ - memset(message_cache, 0, sizeof(message_cache)); - message_cache_size = 0; -} - -void trace_cache() -{ - int i; - char *szMsgName; - - for (i=0; i < message_cache_size; i++) - { - if((szMsgName = get_msg_name(message_cache[i].msg))) - { - trace("hwnd%d, msg:%s\n",message_cache[i].iwnd, szMsgName ); - } - else - { - trace("hwnd%d, msg:%d\n",message_cache[i].iwnd, message_cache[i].msg ); - } - } - trace("\n"); -} - -void compare_cache(char* testname, MSG_ENTRY *msg_chain) -{ - int i = 0; - - while(1) - { - char *szMsgExpected, *szMsgGot; - szMsgExpected = get_msg_name(msg_chain->msg); - szMsgGot = get_msg_name(message_cache[i].msg); - if(szMsgExpected && szMsgGot) - { - ok(message_cache[i].iwnd == msg_chain->iwnd && - message_cache[i].msg == msg_chain->msg, - "%s, message %d: expected %s to hwnd%d and got %s to hwnd%d\n", - testname,i, szMsgExpected, msg_chain->iwnd, szMsgGot, message_cache[i].iwnd); - } - else - { - ok(message_cache[i].iwnd == msg_chain->iwnd && - message_cache[i].msg == msg_chain->msg, - "%s, message %d: expected msg %d to hwnd%d and got msg %d to hwnd%d\n", - testname,i, msg_chain->msg, msg_chain->iwnd, message_cache[i].msg, message_cache[i].iwnd); - } - - if(msg_chain->msg !=0 && msg_chain->iwnd != 0) - { - msg_chain++; - } - else - { - if(i>message_cache_size) - { - break; - } - } - i++; - } + if(hWnd == hWnd1) return 1; + else if(hWnd == hWnd2) return 2; + else if(hWnd == hWnd3) return 3; + else if(hWnd == hWnd4) return 4; + else return 0; }
LRESULT CALLBACK OwnerTestProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) @@ -121,20 +35,10 @@ message != WM_PAINT && message != 0x031f /*WM_DWMNCRENDERINGCHANGED*/) { - if (message_cache_size<100) - { - int iwnd; - if(hWnd == hWnd1) iwnd = 1; - else if(hWnd == hWnd2) iwnd = 2; - else if(hWnd == hWnd3) iwnd = 3; - else if(hWnd == hWnd4) iwnd = 4; - else - return DefWindowProc(hWnd, message, wParam, lParam); - - message_cache[message_cache_size].iwnd = iwnd; - message_cache[message_cache_size].msg = message; - message_cache_size++; - } + int iwnd; + iwnd = get_iwnd(hWnd); + if(iwnd) + record_message(iwnd, message, FALSE, 0,0); }
return DefWindowProc(hWnd, message, wParam, lParam); @@ -142,23 +46,7 @@
static void create_test_windows() { - WNDCLASSEXW wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = 0; - wcex.lpfnWndProc = OwnerTestProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = 0; - wcex.hIcon = 0; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = 0; - wcex.lpszClassName = L"ownertest"; - wcex.hIconSm = 0; - - RegisterClassExW(&wcex); - + RegisterSimpleClass(OwnerTestProc, L"ownertest"); hWnd1 = CreateWindowW(L"ownertest", L"ownertest", WS_OVERLAPPEDWINDOW, 20, 20, 300, 300, NULL, NULL, 0, NULL);
@@ -222,14 +110,11 @@ {1,WM_SETFOCUS}, {0,0}};
-#define EXPECT_NEXT(hWnd1, hWnd2) ok(GetWindow(hWnd1,GW_HWNDNEXT) == hWnd2, "Expected %p after %p, not %p\n",hWnd2,hWnd1,GetWindow(hWnd1,GW_HWNDNEXT) ) -#define EXPECT_ACTIVE(hwnd) ok(GetActiveWindow() == hwnd, "Expected %p to be the active window, not %p\n",hwnd,GetActiveWindow()) -#define FLUSH_MESSAGES(msg) while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); - - void Test_SetActiveWindow() { MSG msg; + + SetCursorPos(0,0);
create_test_windows();
@@ -268,9 +153,7 @@ EXPECT_NEXT(hWnd2,hWnd1); EXPECT_NEXT(hWnd1,hWnd3); EXPECT_ACTIVE(hWnd1); - compare_cache("Activate1", Activate1_chain); - trace_cache(); - empty_message_cache(); + COMPARE_CACHE(Activate1_chain);
SetActiveWindow(hWnd3); FLUSH_MESSAGES(msg); @@ -278,9 +161,7 @@ EXPECT_NEXT(hWnd4,hWnd2); EXPECT_NEXT(hWnd2,hWnd1); EXPECT_ACTIVE(hWnd3); - compare_cache("Activate2", Activate2_chain); - trace_cache(); - empty_message_cache(); + COMPARE_CACHE(Activate2_chain);
SetActiveWindow(hWnd2); FLUSH_MESSAGES(msg); @@ -288,9 +169,7 @@ EXPECT_NEXT(hWnd4,hWnd1); EXPECT_NEXT(hWnd1,hWnd3); EXPECT_ACTIVE(hWnd2); - compare_cache("Activate3", Activate3_chain); - trace_cache(); - empty_message_cache(); + COMPARE_CACHE(Activate3_chain);
SetActiveWindow(hWnd1); FLUSH_MESSAGES(msg); @@ -298,9 +177,7 @@ EXPECT_NEXT(hWnd4,hWnd1); EXPECT_NEXT(hWnd1,hWnd3); EXPECT_ACTIVE(hWnd1); - compare_cache("Activate4", Activate4_chain); - trace_cache(); - empty_message_cache(); + COMPARE_CACHE(Activate4_chain); }
START_TEST(SetActiveWindow)
Modified: trunk/rostests/apitests/user32/SetCursorPos.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/SetCursorP... ============================================================================== --- trunk/rostests/apitests/user32/SetCursorPos.c [iso-8859-1] (original) +++ trunk/rostests/apitests/user32/SetCursorPos.c [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -20,7 +20,7 @@ };
struct _test_info info[] = { {0,0,0}, /* SetCursorPos without a window */ - {1,2,0}, /* mouse_event without a window */ + {1,1,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 */ @@ -97,7 +97,7 @@ memset(results, sizeof(results), 0);
hMouseHookLL = SetWindowsHookEx(WH_MOUSE_LL, MouseLLHookProc, GetModuleHandleA( NULL ), 0); - hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, GetModuleHandleA( NULL ), 0); + hMouseHook = SetWindowsHookExW(WH_MOUSE, MouseHookProc, GetModuleHandleW( NULL ), GetCurrentThreadId()); ok(hMouseHook!=NULL,"failed to set hook\n"); ok(hMouseHookLL!=NULL,"failed to set hook\n");
Modified: trunk/rostests/apitests/user32/TrackMouseEvent.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/TrackMouse... ============================================================================== --- trunk/rostests/apitests/user32/TrackMouseEvent.c [iso-8859-1] (original) +++ trunk/rostests/apitests/user32/TrackMouseEvent.c [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -8,121 +8,17 @@ #include <stdio.h> #include <wine/test.h> #include <windows.h> - -typedef struct _MSG_ENTRY -{ - int iwnd; - UINT msg; -} MSG_ENTRY; - -MSG_ENTRY message_cache[100]; -static int message_cache_size = 0; +#include "helper.h"
HWND hWnd1, hWnd2, hWnd3; - -/* helper functions */ - -static char* get_msg_name(UINT msg) -{ - switch(msg) - { - case WM_NCACTIVATE: return "WM_NCACTIVATE"; - case WM_ACTIVATE: return "WM_ACTIVATE"; - case WM_ACTIVATEAPP: return "WM_ACTIVATEAPP"; - case WM_WINDOWPOSCHANGING: return "WM_WINDOWPOSCHANGING"; - case WM_WINDOWPOSCHANGED: return "WM_WINDOWPOSCHANGED"; - case WM_SETFOCUS: return "WM_SETFOCUS"; - case WM_KILLFOCUS: return "WM_KILLFOCUS"; - case WM_NCPAINT: return "WM_NCPAINT"; - case WM_PAINT: return "WM_PAINT"; - case WM_ERASEBKGND: return "WM_ERASEBKGND"; - case WM_SIZE: return "WM_SIZE"; - case WM_MOVE: return "WM_MOVE"; - case WM_SHOWWINDOW: return "WM_SHOWWINDOW"; - case WM_QUERYNEWPALETTE: return "WM_QUERYNEWPALETTE"; - case WM_MOUSELEAVE: return "WM_MOUSELEAVE"; - case WM_MOUSEHOVER: return "WM_MOUSEHOVER"; - case WM_NCMOUSELEAVE: return "WM_NCMOUSELEAVE"; - case WM_NCMOUSEHOVER: return "WM_NCMOUSEHOVER"; - case WM_NCHITTEST: return "WM_NCHITTEST"; - case WM_SETCURSOR: return "WM_SETCURSOR"; - case WM_MOUSEMOVE: return "WM_MOUSEMOVE"; - default: return NULL; - } -} - -static void empty_message_cache() -{ - memset(message_cache, 0, sizeof(message_cache)); - message_cache_size = 0; -} -#if 0 -static void trace_cache() -{ - int i; - char *szMsgName; - - for (i=0; i < message_cache_size; i++) - { - if((szMsgName = get_msg_name(message_cache[i].msg))) - { - trace("hwnd%d, msg:%s\n",message_cache[i].iwnd, szMsgName ); - } - else - { - trace("hwnd%d, msg:%d\n",message_cache[i].iwnd, message_cache[i].msg ); - } - } - trace("\n"); -} -#endif - -static void compare_cache(char* testname, MSG_ENTRY *msg_chain) -{ - int i = 0; - - while(1) - { - char *szMsgExpected, *szMsgGot; - szMsgExpected = get_msg_name(msg_chain->msg); - szMsgGot = get_msg_name(message_cache[i].msg); - if(szMsgExpected && szMsgGot) - { - ok(message_cache[i].iwnd == msg_chain->iwnd && - message_cache[i].msg == msg_chain->msg, - "%s, message %d: expected %s to hwnd%d and got %s to hwnd%d\n", - testname,i, szMsgExpected, msg_chain->iwnd, szMsgGot, message_cache[i].iwnd); - } - else - { - ok(message_cache[i].iwnd == msg_chain->iwnd && - message_cache[i].msg == msg_chain->msg, - "%s, message %d: expected msg %d to hwnd%d and got msg %d to hwnd%d\n", - testname,i, msg_chain->msg, msg_chain->iwnd, message_cache[i].msg, message_cache[i].iwnd); - } - - if(msg_chain->msg !=0 && msg_chain->iwnd != 0) - { - msg_chain++; - } - else - { - if(i>message_cache_size) - { - break; - } - } - i++; - } - - empty_message_cache(); -} - -static void record_message(int iwnd, UINT message) -{ - message_cache[message_cache_size].iwnd = iwnd; - message_cache[message_cache_size].msg = message; - message_cache_size++; +HHOOK hMouseHookLL, hMouseHook; + +static int get_iwnd(HWND hWnd) +{ + if(hWnd == hWnd1) return 1; + else if(hWnd == hWnd2) return 2; + else if(hWnd == hWnd3) return 3; + else return 0; }
LRESULT CALLBACK TmeTestProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) @@ -138,17 +34,9 @@ message != WM_PAINT && message != 0x031f /*WM_DWMNCRENDERINGCHANGED*/) { - if (message_cache_size<100) - { - int iwnd; - if(hWnd == hWnd1) iwnd = 1; - else if(hWnd == hWnd2) iwnd = 2; - else if(hWnd == hWnd3) iwnd = 3; - else - return DefWindowProc(hWnd, message, wParam, lParam); - - record_message(iwnd, message); - } + int iwnd = get_iwnd(hWnd); + if(iwnd) + record_message(iwnd, message, FALSE,0,0); }
if(message == WM_PAINT) @@ -158,27 +46,33 @@ Rectangle(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom); EndPaint(hWnd, &ps); } - + return DefWindowProc(hWnd, message, wParam, lParam); }
+static LRESULT CALLBACK MouseLLHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + record_message(0, WH_MOUSE_LL, TRUE, wParam, 0); + return CallNextHookEx(hMouseHookLL, nCode, wParam, lParam); +} + +static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + MOUSEHOOKSTRUCT *hs = (MOUSEHOOKSTRUCT*) lParam; + record_message(get_iwnd(hs->hwnd), WH_MOUSE, TRUE, wParam, hs->wHitTestCode); + return CallNextHookEx(hMouseHook, nCode, wParam, lParam); +} + static void create_test_windows() { WNDCLASSEXW wcex;
- wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = 0; - wcex.lpfnWndProc = TmeTestProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = 0; - wcex.hIcon = 0; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = 0; - wcex.lpszClassName = L"testClass"; - wcex.hIconSm = 0; - + hMouseHookLL = SetWindowsHookExW(WH_MOUSE_LL, MouseLLHookProc, GetModuleHandleW( NULL ), 0); + hMouseHook = SetWindowsHookExW(WH_MOUSE, MouseHookProc, GetModuleHandleW( NULL ), GetCurrentThreadId()); + ok(hMouseHook!=NULL,"failed to set hook\n"); + ok(hMouseHookLL!=NULL,"failed to set hook\n"); + + RegisterSimpleClass(TmeTestProc, L"testClass"); RegisterClassExW(&wcex);
hWnd1 = CreateWindowW(L"testClass", L"test", WS_OVERLAPPEDWINDOW, @@ -238,6 +132,7 @@
/* the mouse moves over hwnd2 */ MSG_ENTRY mousemove2_chain[]={{2, WM_NCHITTEST}, + {2, WH_MOUSE,1, WM_MOUSEMOVE, HTCLIENT}, {2, WM_SETCURSOR}, {1, WM_SETCURSOR}, {2, WM_MOUSEMOVE}, @@ -245,6 +140,7 @@
/* the mouse hovers hwnd2 */ MSG_ENTRY mousehover2_chain[]={{2, WM_NCHITTEST}, + {2, WH_MOUSE,1, WM_MOUSEMOVE, HTCLIENT}, {2, WM_SETCURSOR}, {1, WM_SETCURSOR}, {2, WM_MOUSEMOVE}, @@ -253,6 +149,7 @@
/* the mouse leaves hwnd2 and moves to hwnd1 */ MSG_ENTRY mouseleave2to1_chain[]={{1, WM_NCHITTEST}, + {1, WH_MOUSE,1, WM_MOUSEMOVE, HTCLIENT}, {1, WM_SETCURSOR}, {1, WM_MOUSEMOVE}, {2, WM_MOUSELEAVE}, @@ -260,6 +157,7 @@
/* the mouse leaves hwnd2 and moves to hwnd3 */ MSG_ENTRY mouseleave2to3_chain[]={{3, WM_NCHITTEST}, + {3, WH_MOUSE,1, WM_MOUSEMOVE, HTCLIENT}, {3, WM_SETCURSOR}, {1, WM_SETCURSOR}, {3, WM_MOUSEMOVE}, @@ -278,71 +176,71 @@ /* the mouse moves over hwnd2 */ SetCursorPos(220,220); FLUSH_MESSAGES(msg); - compare_cache("mousemove2", mousemove2_chain); - EXPECT_TME_FLAGS(hWnd2, 0); - TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); - EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); - FLUSH_MESSAGES(msg); - compare_cache("empty1", empty_chain); + COMPARE_CACHE(mousemove2_chain); + EXPECT_TME_FLAGS(hWnd2, 0); + TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); + EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); + FLUSH_MESSAGES(msg); + COMPARE_CACHE(empty_chain);
/* the mouse hovers hwnd2 */ SetCursorPos(221,221); Sleep(100); - EXPECT_QUEUE_STATUS(QS_TIMER|QS_MOUSEMOVE, QS_POSTMESSAGE); + EXPECT_QUEUE_STATUS(QS_TIMER|QS_MOUSEMOVE, 0); EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); FLUSH_MESSAGES(msg); EXPECT_TME_FLAGS(hWnd2, TME_LEAVE); - compare_cache("mousehover2", mousehover2_chain); + COMPARE_CACHE(mousehover2_chain);
/* the mouse leaves hwnd2 and moves to hwnd1 */ SetCursorPos(150,150); - EXPECT_QUEUE_STATUS(QS_MOUSEMOVE,QS_TIMER|QS_POSTMESSAGE ); + EXPECT_QUEUE_STATUS(QS_MOUSEMOVE,QS_TIMER ); EXPECT_TME_FLAGS(hWnd2, TME_LEAVE); FLUSH_MESSAGES(msg); EXPECT_TME_FLAGS(hWnd2, 0); - compare_cache("mouseleave2to1", mouseleave2to1_chain); - - FLUSH_MESSAGES(msg); - compare_cache("empty2", empty_chain); + COMPARE_CACHE(mouseleave2to1_chain); + + FLUSH_MESSAGES(msg); + COMPARE_CACHE(empty_chain);
/* the mouse moves over hwnd2 */ SetCursorPos(220,220); - EXPECT_QUEUE_STATUS(QS_MOUSEMOVE, QS_TIMER|QS_POSTMESSAGE); - FLUSH_MESSAGES(msg); - compare_cache("mousemove2", mousemove2_chain); - EXPECT_TME_FLAGS(hWnd2, 0); - compare_cache("empty3", empty_chain); - TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); - TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); - TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); - TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); - EXPECT_QUEUE_STATUS(0, QS_TIMER|QS_MOUSEMOVE|QS_POSTMESSAGE); - FLUSH_MESSAGES(msg); - compare_cache("empty4", empty_chain); - EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); - - FLUSH_MESSAGES(msg); - compare_cache("empty5", empty_chain); + EXPECT_QUEUE_STATUS(QS_MOUSEMOVE, QS_TIMER); + FLUSH_MESSAGES(msg); + COMPARE_CACHE(mousemove2_chain); + EXPECT_TME_FLAGS(hWnd2, 0); + COMPARE_CACHE(empty_chain); + TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); + TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); + TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); + TmeStartTracking(hWnd2, TME_HOVER|TME_LEAVE); + EXPECT_QUEUE_STATUS(0, QS_TIMER|QS_MOUSEMOVE); + FLUSH_MESSAGES(msg); + COMPARE_CACHE(empty_chain); + EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); + + FLUSH_MESSAGES(msg); + COMPARE_CACHE(empty_chain);
/* the mouse moves from hwnd2 to the intersection of hwnd2 and hwnd3 */ SetCursorPos(300,300); - EXPECT_QUEUE_STATUS(QS_MOUSEMOVE, QS_TIMER|QS_POSTMESSAGE); - FLUSH_MESSAGES(msg); - EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); - compare_cache("mousemove2", mousemove2_chain); - - FLUSH_MESSAGES(msg); - compare_cache("empty6", empty_chain); + EXPECT_QUEUE_STATUS(QS_MOUSEMOVE, QS_TIMER); + FLUSH_MESSAGES(msg); + EXPECT_TME_FLAGS(hWnd2, TME_HOVER|TME_LEAVE); + COMPARE_CACHE(mousemove2_chain); + + FLUSH_MESSAGES(msg); + COMPARE_CACHE(empty_chain);
/* the mouse moves from hwnd2 to hwnd3 */ SetCursorPos(400,400); - EXPECT_QUEUE_STATUS(QS_MOUSEMOVE, QS_TIMER|QS_POSTMESSAGE); - FLUSH_MESSAGES(msg); - EXPECT_TME_FLAGS(hWnd2, 0); - compare_cache("mousemove2to3", mouseleave2to3_chain); - - FLUSH_MESSAGES(msg); - compare_cache("empty7", empty_chain); + EXPECT_QUEUE_STATUS(QS_MOUSEMOVE, QS_TIMER); + FLUSH_MESSAGES(msg); + EXPECT_TME_FLAGS(hWnd2, 0); + COMPARE_CACHE(mouseleave2to3_chain); + + FLUSH_MESSAGES(msg); + COMPARE_CACHE(empty_chain); }
START_TEST(TrackMouseEvent)
Added: trunk/rostests/apitests/user32/helper.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/helper.c?r... ============================================================================== --- trunk/rostests/apitests/user32/helper.c (added) +++ trunk/rostests/apitests/user32/helper.c [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -1,0 +1,169 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: helper functions + * PROGRAMMERS: Giannis Adamopoulos + */ + +#include <stdio.h> +#include <wine/test.h> +#include <windows.h> +#include "helper.h" + +MSG_ENTRY message_cache[100]; +static int message_cache_size = 0; + +static char* get_msg_name(UINT msg) +{ + switch(msg) + { + case WM_NCACTIVATE: return "WM_NCACTIVATE"; + case WM_ACTIVATE: return "WM_ACTIVATE"; + case WM_ACTIVATEAPP: return "WM_ACTIVATEAPP"; + case WM_WINDOWPOSCHANGING: return "WM_WINDOWPOSCHANGING"; + case WM_WINDOWPOSCHANGED: return "WM_WINDOWPOSCHANGED"; + case WM_SETFOCUS: return "WM_SETFOCUS"; + case WM_KILLFOCUS: return "WM_KILLFOCUS"; + case WM_NCPAINT: return "WM_NCPAINT"; + case WM_PAINT: return "WM_PAINT"; + case WM_ERASEBKGND: return "WM_ERASEBKGND"; + case WM_SIZE: return "WM_SIZE"; + case WM_MOVE: return "WM_MOVE"; + case WM_SHOWWINDOW: return "WM_SHOWWINDOW"; + case WM_QUERYNEWPALETTE: return "WM_QUERYNEWPALETTE"; + case WM_MOUSELEAVE: return "WM_MOUSELEAVE"; + case WM_MOUSEHOVER: return "WM_MOUSEHOVER"; + case WM_NCMOUSELEAVE: return "WM_NCMOUSELEAVE"; + case WM_NCMOUSEHOVER: return "WM_NCMOUSEHOVER"; + case WM_NCHITTEST: return "WM_NCHITTEST"; + case WM_SETCURSOR: return "WM_SETCURSOR"; + case WM_MOUSEMOVE: return "WM_MOUSEMOVE"; + default: return NULL; + } +} + +void empty_message_cache() +{ + memset(message_cache, 0, sizeof(message_cache)); + message_cache_size = 0; +} + +void trace_cache(const char* file, int line) +{ + int i; + char *szMsgName; + + for (i=0; i < message_cache_size; i++) + { + if(!message_cache[i].hook) + { + if((szMsgName = get_msg_name(message_cache[i].msg))) + { + trace_(file,line)("hwnd%d, msg:%s\n",message_cache[i].iwnd, szMsgName ); + } + else + { + trace_(file,line)("hwnd%d, msg:%d\n",message_cache[i].iwnd, message_cache[i].msg ); + } + } + else + { + trace_(file,line)("hwnd%d, hook:%d, param1:%d, param2:%d\n",message_cache[i].iwnd, + message_cache[i].msg, + message_cache[i].param1, + message_cache[i].param2); + } + } + trace("\n"); +} + +void compare_cache(const char* file, int line, MSG_ENTRY *msg_chain) +{ + int i = 0; + BOOL got_error = FALSE; + + while(1) + { + char *szMsgExpected, *szMsgGot; + BOOL same = !memcmp(&message_cache[i],msg_chain, sizeof(MSG_ENTRY)); + + szMsgExpected = get_msg_name(msg_chain->msg); + szMsgGot = get_msg_name(message_cache[i].msg); + if(!msg_chain->hook) + { + if(szMsgExpected && szMsgGot) + { + ok_(file,line)(same, + "message %d: expected %s to hwnd%d and got %s to hwnd%d\n", + i, szMsgExpected, msg_chain->iwnd, szMsgGot, message_cache[i].iwnd); + } + else + { + ok_(file,line)(same, + "message %d: expected msg %d to hwnd%d and got msg %d to hwnd%d\n", + i, msg_chain->msg, msg_chain->iwnd, message_cache[i].msg, message_cache[i].iwnd); + } + } + else + { + ok_(file,line)(same, + "message %d: expected hook %d, hwnd%d, param1 %d, param2 %d and got hook %d, hwnd%d, param1 %d, param2 %d\n", + i, msg_chain->msg, msg_chain->iwnd,msg_chain->param1, msg_chain->param2, + message_cache[i].msg, message_cache[i].iwnd, message_cache[i].param1, message_cache[i].param2); + } + + if(!got_error && !same) + { + got_error = TRUE; + } + + if(msg_chain->msg !=0 && msg_chain->iwnd != 0) + { + msg_chain++; + } + else + { + if(i>message_cache_size) + { + break; + } + } + i++; + } + + if(got_error ) + { + trace_(file,line)("The complete list of messages got is:\n"); + trace_cache(file,line); + } + + empty_message_cache(); +} + +void record_message(int iwnd, UINT message, BOOL hook, int param1,int param2) +{ + if(message_cache_size>=100) + { + return; + } + + message_cache[message_cache_size].iwnd = iwnd; + message_cache[message_cache_size].msg = message; + message_cache[message_cache_size].hook = hook; + message_cache[message_cache_size].param1 = param1; + message_cache[message_cache_size].param2 = param2; + message_cache_size++; +} + +ATOM RegisterSimpleClass(WNDPROC lpfnWndProc, LPCWSTR lpszClassName) +{ + WNDCLASSEXW wcex; + + memset(&wcex, 0, sizeof(wcex)); + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.lpfnWndProc = lpfnWndProc; + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszClassName = lpszClassName; + return RegisterClassExW(&wcex); +}
Propchange: trunk/rostests/apitests/user32/helper.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/apitests/user32/helper.h URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/helper.h?r... ============================================================================== --- trunk/rostests/apitests/user32/helper.h (added) +++ trunk/rostests/apitests/user32/helper.h [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -1,0 +1,31 @@ + + +typedef struct _MSG_ENTRY +{ + int iwnd; + UINT msg; + BOOL hook; + int param1; + int param2; +} MSG_ENTRY; + +void record_message(int iwnd, UINT message, BOOL hook, int param1,int param2); +void compare_cache(const char* file, int line, MSG_ENTRY *msg_chain); +void trace_cache(const char* file, int line); +void empty_message_cache(); +ATOM RegisterSimpleClass(WNDPROC lpfnWndProc, LPCWSTR lpszClassName); + +#define COMPARE_CACHE(...) compare_cache(__FILE__, __LINE__, ##__VA_ARGS__) +#define TRACE_CACHE() trace_cache(__FILE__, __LINE__) + +#define FLUSH_MESSAGES(msg) while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); +#define EXPECT_NEXT(hWnd1, hWnd2) ok(GetWindow(hWnd1,GW_HWNDNEXT) == hWnd2, "Expected %p after %p, not %p\n",hWnd2,hWnd1,GetWindow(hWnd1,GW_HWNDNEXT) ) +#define EXPECT_ACTIVE(hwnd) ok(GetActiveWindow() == hwnd, "Expected %p to be the active window, not %p\n",hwnd,GetActiveWindow()) + +#define EXPECT_QUEUE_STATUS(expected, notexpected) \ + { \ + DWORD status = HIWORD(GetQueueStatus(QS_ALLEVENTS)); \ + ok(((status) & (expected))== (expected),"wrong queue status. expected %li, and got %li\n", (DWORD)(expected), status); \ + if(notexpected) \ + ok((status & (notexpected))!=(notexpected), "wrong queue status. got non expected %li\n", (DWORD)(notexpected)); \ + }
Propchange: trunk/rostests/apitests/user32/helper.h ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/rostests/apitests/user32/user32_apitest.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/user32_api... ============================================================================== --- trunk/rostests/apitests/user32/user32_apitest.rbuild [iso-8859-1] (original) +++ trunk/rostests/apitests/user32/user32_apitest.rbuild [iso-8859-1] Fri Sep 23 12:05:40 2011 @@ -10,6 +10,7 @@ <file>testlist.c</file> <file>user32_apitest.rc</file>
+ <file>helper.c</file> <file>GetKeyState.c</file> <file>InitializeLpkHooks.c</file> <file>RealGetWindowClass.c</file>