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.txt?rev=53812&r1=53811&r2=53812&view=diff
==============================================================================
--- 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/SetActiveWindow.c?rev=53812&r1=53811&r2=53812&view=diff
==============================================================================
--- 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/SetCursorPos.c?rev=53812&r1=53811&r2=53812&view=diff
==============================================================================
--- 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/TrackMouseEvent.c?rev=53812&r1=53811&r2=53812&view=diff
==============================================================================
--- 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?rev=53812&view=auto
==============================================================================
--- 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?rev=53812&view=auto
==============================================================================
--- 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_apitest.rbuild?rev=53812&r1=53811&r2=53812&view=diff
==============================================================================
--- 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>


Reply via email to