From 3e00e7fb22fe98e32f6d93c34e1d1cf058146758 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Fri, 26 Oct 2018 19:56:25 +0900 Subject: [PATCH] [APITESTS][USER32] Add testcase for SwitchToThisWindow (#980) Add an API test program for user32!SwitchToThisWindow function. JIRA issue: CORE-15165 --- .../rostests/apitests/user32/CMakeLists.txt | 1 + .../apitests/user32/SwitchToThisWindow.c | 214 ++++++++++++++++++ modules/rostests/apitests/user32/testlist.c | 2 + 3 files changed, 217 insertions(+) create mode 100644 modules/rostests/apitests/user32/SwitchToThisWindow.c diff --git a/modules/rostests/apitests/user32/CMakeLists.txt b/modules/rostests/apitests/user32/CMakeLists.txt index 4d901a4c9d9..0a82490574a 100644 --- a/modules/rostests/apitests/user32/CMakeLists.txt +++ b/modules/rostests/apitests/user32/CMakeLists.txt @@ -36,6 +36,7 @@ list(APPEND SOURCE SetProp.c SetScrollInfo.c SetScrollRange.c + SwitchToThisWindow.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 index 00000000000..e89bf11c474 --- /dev/null +++ b/modules/rostests/apitests/user32/SwitchToThisWindow.c @@ -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 + */ + +#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); +} diff --git a/modules/rostests/apitests/user32/testlist.c b/modules/rostests/apitests/user32/testlist.c index 86a1bdbc84a..1155a39aa8c 100644 --- a/modules/rostests/apitests/user32/testlist.c +++ b/modules/rostests/apitests/user32/testlist.c @@ -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_SwitchToThisWindow(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 }, + { "SwitchToThisWindow", func_SwitchToThisWindow }, { "SystemParametersInfo", func_SystemParametersInfo }, { "TrackMouseEvent", func_TrackMouseEvent }, { "WndProc", func_WndProc },