[PATCH 1/3] user32/tests: Add tests for activating windows.

Zebediah Figura zfigura at codeweavers.com
Tue Jul 11 10:38:33 CDT 2017


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/user32/tests/win.c | 229 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 224 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 2399228a323..55a1fd8022f 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -3156,7 +3156,7 @@ todo_wine
 
 static void test_SetActiveWindow(HWND hwnd)
 {
-    HWND hwnd2;
+    HWND hwnd2, ret;
 
     flush_events( TRUE );
     ShowWindow(hwnd, SW_HIDE);
@@ -3169,13 +3169,13 @@ static void test_SetActiveWindow(HWND hwnd)
     ShowWindow(hwnd, SW_SHOW);
     check_wnd_state(hwnd, hwnd, hwnd, 0);
 
-    hwnd2 = SetActiveWindow(0);
-    ok(hwnd2 == hwnd, "SetActiveWindow returned %p instead of %p\n", hwnd2, hwnd);
+    ret = SetActiveWindow(0);
+    ok(ret == hwnd, "SetActiveWindow returned %p instead of %p\n", ret, hwnd);
     if (!GetActiveWindow())  /* doesn't always work on vista */
     {
         check_wnd_state(0, 0, 0, 0);
-        hwnd2 = SetActiveWindow(hwnd);
-        ok(hwnd2 == 0, "SetActiveWindow returned %p instead of 0\n", hwnd2);
+        ret = SetActiveWindow(hwnd);
+        ok(ret == 0, "SetActiveWindow returned %p instead of 0\n", ret);
     }
     check_wnd_state(hwnd, hwnd, hwnd, 0);
 
@@ -3198,6 +3198,9 @@ static void test_SetActiveWindow(HWND hwnd)
     hwnd2 = CreateWindowExA(0, "static", NULL, WS_POPUP|WS_VISIBLE, 0, 0, 0, 0, hwnd, 0, 0, NULL);
     check_wnd_state(hwnd2, hwnd2, hwnd2, 0);
 
+    SetActiveWindow(hwnd);
+    check_wnd_state(hwnd, hwnd, hwnd, 0);
+
     DestroyWindow(hwnd2);
     check_wnd_state(hwnd, hwnd, hwnd, 0);
 
@@ -3209,6 +3212,31 @@ static void test_SetActiveWindow(HWND hwnd)
 
     DestroyWindow(hwnd2);
     check_wnd_state(hwnd, hwnd, hwnd, 0);
+
+    /* try to activate the desktop */
+    SetLastError(0xdeadbeef);
+    ret = SetActiveWindow(GetDesktopWindow());
+    ok(ret == NULL, "expected NULL, got %p\n", ret);
+    todo_wine
+    ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", GetLastError());
+    check_wnd_state(hwnd, hwnd, hwnd, 0);
+
+    /* activating a child should activate the parent */
+    hwnd2 = CreateWindowExA(0, "MainWindowClass", "Child window", WS_CHILD, 0, 0, 0, 0, hwnd, 0, GetModuleHandleA(NULL), NULL);
+    check_wnd_state(hwnd, hwnd, hwnd, 0);
+    ret = SetActiveWindow(hwnd2);
+    ok(ret == hwnd, "expected %p, got %p\n", hwnd, ret);
+    check_wnd_state(hwnd, hwnd, hwnd, 0);
+    ret = SetActiveWindow(0);
+    ok(ret == hwnd, "expected %p, got %p\n", hwnd, ret);
+    if (!GetActiveWindow())
+    {
+        ret = SetActiveWindow(hwnd2);
+        ok(ret == NULL, "expected NULL, got %p\n", ret);
+        todo_wine
+        check_active_state(hwnd, hwnd, hwnd);
+    }
+    DestroyWindow(hwnd2);
 }
 
 struct create_window_thread_params
@@ -9793,6 +9821,194 @@ static void test_LockWindowUpdate(HWND parent)
     DestroyWindow(child);
 }
 
+static void test_hide_window(void)
+{
+    HWND hwnd, hwnd2, hwnd3;
+
+    hwnd = CreateWindowExA(0, "MainWindowClass", "Main window", WS_POPUP | WS_VISIBLE,
+                           100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    hwnd2 = CreateWindowExA(0, "MainWindowClass", "Main window 2", WS_POPUP | WS_VISIBLE,
+                            100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    trace("hwnd = %p, hwnd2 = %p\n", hwnd, hwnd2);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    /* test hiding two normal windows */
+    ShowWindow(hwnd2, SW_HIDE);
+    check_active_state(hwnd, hwnd, hwnd);
+    todo_wine
+    ok(GetWindow(hwnd, GW_HWNDNEXT) == hwnd2, "expected %p, got %p\n", hwnd2, GetWindow(hwnd, GW_HWNDNEXT));
+
+    ShowWindow(hwnd, SW_HIDE);
+    todo_wine
+    check_active_state(0, 0, 0);
+    ok(GetWindow(hwnd, GW_HWNDNEXT) == hwnd2, "expected %p, got %p\n", hwnd2, GetWindow(hwnd, GW_HWNDNEXT));
+
+    ShowWindow(hwnd, SW_SHOW);
+    check_active_state(hwnd, hwnd, hwnd);
+
+    ShowWindow(hwnd2, SW_SHOW);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    /* hide a non-active window */
+    ShowWindow(hwnd, SW_HIDE);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    todo_wine
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    /* hide a window in the middle */
+    ShowWindow(hwnd, SW_SHOW);
+    ShowWindow(hwnd2, SW_SHOW);
+    hwnd3 = CreateWindowExA(0, "MainWindowClass", "Main window 3", WS_POPUP | WS_VISIBLE,
+                            100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    SetActiveWindow(hwnd2);
+    ShowWindow(hwnd2, SW_HIDE);
+    check_active_state(hwnd3, hwnd3, hwnd3);
+    todo_wine {
+    ok(GetWindow(hwnd3, GW_HWNDNEXT) == hwnd2, "expected %p, got %p\n", hwnd2, GetWindow(hwnd3, GW_HWNDNEXT));
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+    }
+
+    DestroyWindow(hwnd3);
+
+    /* hide a normal window when there is a topmost window */
+    hwnd3 = CreateWindowExA(WS_EX_TOPMOST, "MainWindowClass", "Topmost window 3", WS_POPUP|WS_VISIBLE,
+                            100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    ShowWindow(hwnd, SW_SHOW);
+    ShowWindow(hwnd2, SW_SHOW);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ShowWindow(hwnd2, SW_HIDE);
+    todo_wine
+    check_active_state(hwnd3, hwnd3, hwnd3);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    /* hide a topmost window */
+    ShowWindow(hwnd2, SW_SHOW);
+    ShowWindow(hwnd3, SW_SHOW);
+    ShowWindow(hwnd3, SW_HIDE);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    DestroyWindow(hwnd3);
+
+    /* hiding an owned window activates its owner */
+    ShowWindow(hwnd, SW_SHOW);
+    ShowWindow(hwnd2, SW_SHOW);
+    hwnd3 = CreateWindowExA(0, "MainWindowClass", "Owned window 3", WS_POPUP|WS_VISIBLE,
+                            100, 100, 200, 200, hwnd, 0, GetModuleHandleA(NULL), NULL);
+    ShowWindow(hwnd3, SW_HIDE);
+    check_active_state(hwnd, hwnd, hwnd);
+    todo_wine {
+    ok(GetWindow(hwnd3, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd3, GW_HWNDNEXT));
+    ok(GetWindow(hwnd, GW_HWNDNEXT) == hwnd2, "expected %p, got %p\n", hwnd2, GetWindow(hwnd, GW_HWNDNEXT));
+    }
+
+    /* hide an owner window */
+    ShowWindow(hwnd, SW_SHOW);
+    ShowWindow(hwnd2, SW_SHOW);
+    ShowWindow(hwnd3, SW_SHOW);
+    ShowWindow(hwnd, SW_HIDE);
+    check_active_state(hwnd3, hwnd3, hwnd3);
+    ok(GetWindow(hwnd3, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd3, GW_HWNDNEXT));
+    ok(GetWindow(hwnd, GW_HWNDNEXT) == hwnd2, "expected %p, got %p\n", hwnd2, GetWindow(hwnd, GW_HWNDNEXT));
+
+    DestroyWindow(hwnd3);
+    DestroyWindow(hwnd2);
+    DestroyWindow(hwnd);
+}
+
+static void test_minimize_window(void)
+{
+    HWND hwnd, hwnd2, hwnd3;
+
+    hwnd = CreateWindowExA(0, "MainWindowClass", "Main window", WS_POPUP | WS_VISIBLE,
+                           100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    hwnd2 = CreateWindowExA(0, "MainWindowClass", "Main window 2", WS_POPUP | WS_VISIBLE,
+                            100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    trace("hwnd = %p, hwnd2 = %p\n", hwnd, hwnd2);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    /* test hiding two normal windows */
+    ShowWindow(hwnd2, SW_MINIMIZE);
+    todo_wine
+    check_active_state(hwnd, hwnd, hwnd);
+
+    ShowWindow(hwnd, SW_MINIMIZE);
+    todo_wine
+    check_active_state(0, 0, 0);
+
+    ShowWindow(hwnd, SW_RESTORE);
+    check_active_state(hwnd, hwnd, hwnd);
+
+    ShowWindow(hwnd2, SW_RESTORE);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    /* hide a non-active window */
+    ShowWindow(hwnd, SW_MINIMIZE);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+
+    /* hide a window in the middle */
+    ShowWindow(hwnd, SW_RESTORE);
+    ShowWindow(hwnd2, SW_RESTORE);
+    hwnd3 = CreateWindowExA(0, "MainWindowClass", "Main window 3", WS_POPUP | WS_VISIBLE,
+                            100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    SetActiveWindow(hwnd2);
+    ShowWindow(hwnd2, SW_MINIMIZE);
+    todo_wine
+    check_active_state(hwnd3, hwnd3, hwnd3);
+    ok(GetWindow(hwnd3, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd3, GW_HWNDNEXT));
+
+    DestroyWindow(hwnd3);
+
+    /* hide a normal window when there is a topmost window */
+    hwnd3 = CreateWindowExA(WS_EX_TOPMOST, "MainWindowClass", "Topmost window 3", WS_POPUP|WS_VISIBLE,
+                            100, 100, 200, 200, 0, 0, GetModuleHandleA(NULL), NULL);
+    ShowWindow(hwnd, SW_RESTORE);
+    ShowWindow(hwnd2, SW_RESTORE);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ShowWindow(hwnd2, SW_MINIMIZE);
+    todo_wine
+    check_active_state(hwnd3, hwnd3, hwnd3);
+
+    /* hide a topmost window */
+    ShowWindow(hwnd2, SW_RESTORE);
+    ShowWindow(hwnd3, SW_RESTORE);
+    ShowWindow(hwnd3, SW_MINIMIZE);
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd2, GW_HWNDNEXT));
+
+    DestroyWindow(hwnd3);
+
+    /* hide an owned window */
+    ShowWindow(hwnd, SW_RESTORE);
+    ShowWindow(hwnd2, SW_RESTORE);
+    hwnd3 = CreateWindowExA(0, "MainWindowClass", "Owned window 3", WS_POPUP|WS_VISIBLE,
+                            100, 100, 200, 200, hwnd, 0, GetModuleHandleA(NULL), NULL);
+    ShowWindow(hwnd3, SW_MINIMIZE);
+    todo_wine {
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd2, GW_HWNDNEXT) == hwnd3, "expected %p, got %p\n", hwnd3, GetWindow(hwnd2, GW_HWNDNEXT));
+    ok(GetWindow(hwnd3, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd3, GW_HWNDNEXT));
+    }
+
+    /* hide an owner window */
+    ShowWindow(hwnd, SW_RESTORE);
+    ShowWindow(hwnd2, SW_RESTORE);
+    ShowWindow(hwnd3, SW_RESTORE);
+    ShowWindow(hwnd, SW_MINIMIZE);
+    todo_wine {
+    check_active_state(hwnd2, hwnd2, hwnd2);
+    ok(GetWindow(hwnd3, GW_HWNDNEXT) == hwnd, "expected %p, got %p\n", hwnd, GetWindow(hwnd3, GW_HWNDNEXT));
+    }
+
+    DestroyWindow(hwnd3);
+    DestroyWindow(hwnd2);
+    DestroyWindow(hwnd);
+}
+
 static void test_desktop( void )
 {
     HWND desktop = GetDesktopWindow();
@@ -9982,6 +10198,9 @@ START_TEST(win)
     test_LockWindowUpdate(hwndMain);
     test_desktop();
 
+    test_hide_window();
+    test_minimize_window();
+
     /* add the tests above this line */
     if (hhook) UnhookWindowsHookEx(hhook);
 
-- 
2.13.2




More information about the wine-patches mailing list