[APITESTS][USER32] Add testcase for SwitchToThisWindow (#980)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Fri, 26 Oct 2018 10:56:25 +0000 (19:56 +0900)
committerGitHub <noreply@github.com>
Fri, 26 Oct 2018 10:56:25 +0000 (19:56 +0900)
Add an API test program for user32!SwitchToThisWindow function.
JIRA issue: CORE-15165

modules/rostests/apitests/user32/CMakeLists.txt
modules/rostests/apitests/user32/SwitchToThisWindow.c [new file with mode: 0644]
modules/rostests/apitests/user32/testlist.c

index 4d901a4..0a82490 100644 (file)
@@ -36,6 +36,7 @@ list(APPEND SOURCE
     SetProp.c
     SetScrollInfo.c
     SetScrollRange.c
     SetProp.c
     SetScrollInfo.c
     SetScrollRange.c
+    SwitchToThisWindow.c
     SystemParametersInfo.c
     TrackMouseEvent.c
     WndProc.c
     SystemParametersInfo.c
     TrackMouseEvent.c
     WndProc.c
diff --git a/modules/rostests/apitests/user32/SwitchToThisWindow.c b/modules/rostests/apitests/user32/SwitchToThisWindow.c
new file mode 100644 (file)
index 0000000..e89bf11
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * PURPOSE:         Test for SwitchToThisWindow
+ * PROGRAMMERS:     Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
+ */
+
+#include "precomp.h"
+
+static const WCHAR s_szClassName[] = L"SwitchTest";
+
+static BOOL s_bTracing = FALSE;
+
+static INT s_nWM_SYSCOMMAND_SC_RESTORE = 0;
+static INT s_nWM_SYSCOMMAND_NOT_SC_RESTORE = 0;
+static INT s_nWM_NCACTIVATE = 0;
+static INT s_nWM_WINDOWPOSCHANGING = 0;
+static INT s_nWM_ACTIVATE = 0;
+
+#define TIMER_INTERVAL 200
+
+static void
+DoMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    if (uMsg == WM_TIMER || !s_bTracing)
+        return;
+
+    trace("uMsg:0x%04X, wParam:0x%08lX, lParam:0x%08lX\n", uMsg, (LONG)wParam, (LONG)lParam);
+
+    if (uMsg == WM_SYSCOMMAND)
+    {
+        if (wParam == SC_RESTORE)
+            ++s_nWM_SYSCOMMAND_SC_RESTORE;
+        else
+            ++s_nWM_SYSCOMMAND_NOT_SC_RESTORE;
+    }
+
+    if (uMsg == WM_NCACTIVATE)
+        ++s_nWM_NCACTIVATE;
+
+    if (uMsg == WM_WINDOWPOSCHANGING)
+        ++s_nWM_WINDOWPOSCHANGING;
+
+    if (uMsg == WM_ACTIVATE)
+        ++s_nWM_ACTIVATE;
+}
+
+// WM_TIMER
+static void
+OnTimer(HWND hwnd, UINT id)
+{
+    KillTimer(hwnd, id);
+    switch (id)
+    {
+        //
+        // SwitchToThisWindow(TRUE)
+        //
+        case 0: // minimize
+            SetForegroundWindow(GetDesktopWindow());
+            SetActiveWindow(GetDesktopWindow());
+            ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n");
+            ok(GetActiveWindow() == NULL, "GetActiveWindow() != NULL\n");
+            ok(GetFocus() == NULL, "GetFocus() != NULL\n");
+            CloseWindow(hwnd);  // minimize
+            break;
+        case 1: // start tracing
+            ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n");
+            ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n");
+            ok(GetFocus() == NULL, "GetFocus() != NULL\n");
+            s_nWM_SYSCOMMAND_SC_RESTORE = 0;
+            s_nWM_SYSCOMMAND_NOT_SC_RESTORE = 0;
+            s_nWM_NCACTIVATE = 0;
+            s_nWM_WINDOWPOSCHANGING = 0;
+            s_nWM_ACTIVATE = 0;
+            s_bTracing = TRUE;
+            SwitchToThisWindow(hwnd, TRUE);
+            trace("SwitchToThisWindow(TRUE): tracing...\n");
+            break;
+        case 2: // tracing done
+            s_bTracing = FALSE;
+            trace("SwitchToThisWindow(TRUE): tracing done\n");
+            ok(GetForegroundWindow() == hwnd, "GetForegroundWindow() != hwnd\n");
+            ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n");
+            ok(GetFocus() == hwnd, "GetFocus() != hwnd\n");
+            ok(s_nWM_SYSCOMMAND_SC_RESTORE == 1, "WM_SYSCOMMAND SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_SC_RESTORE);
+            ok(!s_nWM_SYSCOMMAND_NOT_SC_RESTORE, "WM_SYSCOMMAND non-SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_NOT_SC_RESTORE);
+            ok(s_nWM_NCACTIVATE > 0, "WM_NCACTIVATE: not found\n");
+            ok(s_nWM_WINDOWPOSCHANGING > 0, "WM_WINDOWPOSCHANGING: not found\n");
+            ok(s_nWM_ACTIVATE > 0, "WM_ACTIVATE: not found\n");
+            break;
+        //
+        // SwitchToThisWindow(FALSE)
+        //
+        case 3: // minimize
+            SetForegroundWindow(GetDesktopWindow());
+            SetActiveWindow(GetDesktopWindow());
+            ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n");
+            ok(GetActiveWindow() == NULL, "GetActiveWindow() != NULL\n");
+            ok(GetFocus() == NULL, "GetFocus() != NULL\n");
+            CloseWindow(hwnd);  // minimize
+            break;
+        case 4: // start tracing
+            ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n");
+            ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n");
+            ok(GetFocus() == NULL, "GetFocus() != NULL\n");
+            s_nWM_SYSCOMMAND_SC_RESTORE = 0;
+            s_nWM_SYSCOMMAND_NOT_SC_RESTORE = 0;
+            s_nWM_NCACTIVATE = 0;
+            s_nWM_WINDOWPOSCHANGING = 0;
+            s_nWM_ACTIVATE = 0;
+            s_bTracing = TRUE;
+            SwitchToThisWindow(hwnd, FALSE);
+            trace("SwitchToThisWindow(FALSE): tracing...\n");
+            break;
+        case 5: // tracing done
+            s_bTracing = FALSE;
+            trace("SwitchToThisWindow(FALSE): tracing done\n");
+            ok(GetForegroundWindow() == NULL, "GetForegroundWindow() != NULL\n");
+            ok(GetActiveWindow() == hwnd, "GetActiveWindow() != hwnd\n");
+            ok(GetFocus() == NULL, "GetFocus() != NULL\n");
+            ok(!s_nWM_SYSCOMMAND_SC_RESTORE, "WM_SYSCOMMAND SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_SC_RESTORE);
+            ok(!s_nWM_SYSCOMMAND_NOT_SC_RESTORE, "WM_SYSCOMMAND non-SC_RESTORE: %d\n", s_nWM_SYSCOMMAND_NOT_SC_RESTORE);
+            ok(!s_nWM_NCACTIVATE, "WM_NCACTIVATE: %d\n", s_nWM_NCACTIVATE);
+            ok(!s_nWM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING: %d\n", s_nWM_WINDOWPOSCHANGING);
+            ok(!s_nWM_ACTIVATE, "WM_ACTIVATE: %d\n", s_nWM_ACTIVATE);
+            break;
+        default: // finish
+            DestroyWindow(hwnd);
+            return;
+    }
+    SetTimer(hwnd, id + 1, TIMER_INTERVAL, NULL);
+}
+
+static LRESULT CALLBACK
+WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    DoMessage(hwnd, uMsg, wParam, lParam);
+    switch (uMsg)
+    {
+        case WM_CREATE:
+            SetTimer(hwnd, 0, TIMER_INTERVAL, NULL);
+            break;
+        case WM_TIMER:
+            OnTimer(hwnd, (UINT)wParam);
+            break;
+        case WM_DESTROY:
+            PostQuitMessage(0);
+            break;
+        default:
+            return DefWindowProc(hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+START_TEST(SwitchToThisWindow)
+{
+    WNDCLASSW wc;
+    HICON hIcon;
+    HCURSOR hCursor;
+    ATOM atom;
+    HWND hwnd;
+    MSG msg;
+
+    hIcon = LoadIcon(NULL, IDI_APPLICATION);
+    ok(hIcon != NULL, "hIcon was NULL\n");
+    hCursor = LoadCursor(NULL, IDC_ARROW);
+    ok(hCursor != NULL, "hCursor was NULL\n");
+
+    ZeroMemory(&wc, sizeof(wc));
+    wc.lpfnWndProc = WindowProc;
+    wc.hInstance = GetModuleHandleW(NULL);
+    wc.hIcon = hIcon;
+    wc.hCursor = hCursor;
+    wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
+    wc.lpszClassName = s_szClassName;
+    atom = RegisterClassW(&wc);
+    ok(atom != 0, "RegisterClassW failed\n");
+
+    if (!atom)
+    {
+        skip("atom is zero\n");
+        DestroyIcon(hIcon);
+        DestroyCursor(hCursor);
+        return;
+    }
+
+    hwnd = CreateWindowW(s_szClassName, L"SwitchToThisWindow", WS_OVERLAPPEDWINDOW,
+                         CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
+                         NULL, NULL, GetModuleHandleW(NULL), NULL);
+    ok(hwnd != NULL, "CreateWindowW failed\n");
+    trace("hwnd: %p\n", hwnd);
+
+    if (!hwnd)
+    {
+        skip("hwnd is NULL\n");
+        UnregisterClassW(s_szClassName, GetModuleHandleW(NULL));
+        DestroyIcon(hIcon);
+        DestroyCursor(hCursor);
+        return;
+    }
+
+    ShowWindow(hwnd, SW_SHOWNORMAL);
+    UpdateWindow(hwnd);
+
+    while (GetMessage(&msg, NULL, 0, 0))
+    {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    }
+
+    UnregisterClassW(s_szClassName, GetModuleHandleW(NULL));
+    DestroyIcon(hIcon);
+    DestroyCursor(hCursor);
+}
index 86a1bdb..1155a39 100644 (file)
@@ -38,6 +38,7 @@ extern void func_SetParent(void);
 extern void func_SetProp(void);
 extern void func_SetScrollInfo(void);
 extern void func_SetScrollRange(void);
 extern void func_SetProp(void);
 extern void func_SetScrollInfo(void);
 extern void func_SetScrollRange(void);
+extern void func_SwitchToThisWindow(void);
 extern void func_SystemParametersInfo(void);
 extern void func_TrackMouseEvent(void);
 extern void func_WndProc(void);
 extern void func_SystemParametersInfo(void);
 extern void func_TrackMouseEvent(void);
 extern void func_WndProc(void);
@@ -80,6 +81,7 @@ const struct test winetest_testlist[] =
     { "SetProp", func_SetProp },
     { "SetScrollInfo", func_SetScrollInfo },
     { "SetScrollRange", func_SetScrollRange },
     { "SetProp", func_SetProp },
     { "SetScrollInfo", func_SetScrollInfo },
     { "SetScrollRange", func_SetScrollRange },
+    { "SwitchToThisWindow", func_SwitchToThisWindow },
     { "SystemParametersInfo", func_SystemParametersInfo },
     { "TrackMouseEvent", func_TrackMouseEvent },
     { "WndProc", func_WndProc },
     { "SystemParametersInfo", func_SystemParametersInfo },
     { "TrackMouseEvent", func_TrackMouseEvent },
     { "WndProc", func_WndProc },