[SHELL32_APITEST] Try to close windows opened by each test (#7861)

This commit is contained in:
Whindmar Saksit
2025-07-06 13:47:12 +02:00
committed by GitHub
parent a753f34e30
commit 2a901a72f3
3 changed files with 128 additions and 45 deletions

View File

@@ -12,11 +12,29 @@
#include <shlwapi.h>
#include "closewnd.h"
#define WAIT_SLEEP 700
// ShellExecuteW(handle, "open", <path_to_executable>, <parameters>, NULL, SW_SHOWNORMAL);
static WINDOW_LIST s_List1, s_List2;
WINDOW_LIST g_winlist;
static void CloseWindow(HINSTANCE hInstance, PCWSTR ClassName, PCWSTR Title)
{
if ((SIZE_T)hInstance <= 32)
return;
HWND hWnd = NULL;
for (UINT i = 0; i < 1500; i += 250)
{
hWnd = FindWindowW(ClassName, Title);
if (hWnd && IsWindowVisible(hWnd) && !FindInWindowList(g_winlist, hWnd))
break;
hWnd = NULL;
Sleep(250);
}
if (!hWnd || !PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0))
CloseNewWindows(&g_winlist);
}
START_TEST(ShellExecuteW)
{
@@ -24,8 +42,6 @@ START_TEST(ShellExecuteW)
HINSTANCE hInstance;
WCHAR WinDir[MAX_PATH], SysDir[MAX_PATH], SysDrive[MAX_PATH];
GetWindowList(&s_List1);
if (!GetWindowsDirectoryW(WinDir, _countof(WinDir)))
{
skip("GetWindowsDirectoryW failed\n");
@@ -45,63 +61,67 @@ START_TEST(ShellExecuteW)
}
PathAddBackslashW(SysDrive);
GetWindowList(&g_winlist);
// TEST #1: Open Control Panel
hInstance = ShellExecuteW(NULL, L"open", L"rundll32.exe", L"shell32.dll,Control_RunDLL desk.cpl",
NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #1: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #1 ret: %d.\n", ret);
CloseWindow(hInstance, NULL, L"Properties for Display"); // FIXME: Dynamically determine the window title.
// TEST #2: Open Notepad
hInstance = ShellExecuteW(NULL, L"open", L"notepad.exe", NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #2: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #2 ret: %d.\n", ret);
CloseWindow(hInstance, L"Notepad", L"Untitled - Notepad"); // FIXME: Dynamically determine the window title.
// TEST #3: Open Windows folder
hInstance = ShellExecuteW(NULL, NULL, WinDir, NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #3: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #3 ret: %d.\n", ret);
CloseWindow(hInstance, L"CabinetWClass", PathFindFileNameW(WinDir));
// TEST #4: Open system32 folder
hInstance = ShellExecuteW(NULL, L"open", SysDir, NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #4: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #4 ret: %d.\n", ret);
CloseWindow(hInstance, L"CabinetWClass", PathFindFileNameW(SysDir));
// TEST #5: Open %SystemDrive%
hInstance = ShellExecuteW(NULL, L"explore", SysDrive, NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #5: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #5 ret: %d.\n", ret);
CloseWindow(hInstance, L"ExploreWClass", NULL);
// TEST #6: Open Explorer Search on %SYSTEMDRIVE%
hInstance = ShellExecuteW(NULL, L"find", SysDrive, NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #6: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #6 ret: %d.\n", ret);
CloseWindow(hInstance, L"CabinetWClass", L"Search Results"); // FIXME: Dynamically determine the window title.
// TEST #7: Open My Documents ("::{450d8fba-ad25-11d0-98a8-0800361b1103}")
hInstance = ShellExecuteW(NULL, NULL, L"::{450d8fba-ad25-11d0-98a8-0800361b1103}", NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #7: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #7 ret: %d.\n", ret);
CloseWindow(hInstance, L"CabinetWClass", NULL);
// TEST #8: Open My Documents ("shell:::{450d8fba-ad25-11d0-98a8-0800361b1103}")
hInstance = ShellExecuteW(NULL, L"open", L"shell:::{450d8fba-ad25-11d0-98a8-0800361b1103}", NULL, NULL, SW_SHOWNORMAL);
ret = (INT)(UINT_PTR)hInstance;
ok(ret > 31, "TEST #8: ret:%d, LastError: %ld\n", ret, GetLastError());
trace("TEST #8 ret: %d.\n", ret);
CloseWindow(hInstance, L"CabinetWClass", NULL);
// Execution can be asynchronous; you have to wait for it to finish.
Sleep(2000);
// Close newly-opened window(s)
GetWindowList(&s_List2);
CloseNewWindows(&s_List1, &s_List2);
FreeWindowList(&s_List1);
FreeWindowList(&s_List2);
CloseNewWindows(&g_winlist);
FreeWindowList(&g_winlist);
}
// Windows Server 2003 and Windows XP SP3 return values (Win 7 returns 42 in all cases)