Files
reactos/modules/rostests/apitests/shell32/PathMakeUniqueName.cpp
Carl J. Bialorucki b86422cd4b [SHELL32_APITEST] Several fixes (#8266)
Fix the shell32 apitests so that they pass on Windows Server 2003 - Windows 10. Many of these fixes are for Vista+, but the most important fixes are for ShellExecCmdLine and FindExecutable which had issues closing windows after tests and deleting test files. Failing to delete these files breaks the other test (i.e. running ShellExecCmdLine would break FindExecutable and vis-versa.)
2025-07-29 14:06:13 -06:00

120 lines
4.4 KiB
C++

/*
* PROJECT: ReactOS api tests
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Tests for PathMakeUniqueName
* COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "shelltest.h"
#include <stdio.h>
#include <versionhelpers.h>
#define ok_wstri(x, y) \
ok(_wcsicmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
/* IsLFNDriveW */
typedef BOOL (WINAPI *FN_IsLFNDriveW)(LPCWSTR);
START_TEST(PathMakeUniqueName)
{
WCHAR szPath[MAX_PATH], szCurDir[MAX_PATH], szTempDir[MAX_PATH];
BOOL result, bUseLong = FALSE;
FN_IsLFNDriveW pIsLFNDriveW =
(FN_IsLFNDriveW)GetProcAddress(GetModuleHandleW(L"shell32"), MAKEINTRESOURCEA(42));
// Move to temporary folder
GetCurrentDirectoryW(_countof(szCurDir), szCurDir);
GetEnvironmentVariableW(L"TEMP", szTempDir, _countof(szTempDir));
SetCurrentDirectoryW(szTempDir);
if (pIsLFNDriveW)
bUseLong = pIsLFNDriveW(szTempDir) && (GetNTVersion() >= _WIN32_WINNT_WIN10);
trace("bUseLong: %d\n", bUseLong);
DeleteFileW(L"test.txt");
// Test 1: Basic operation
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.txt", NULL, NULL);
ok_int(result, TRUE);
ok_wstri(szPath, L"test (1).txt");
// Test 2: Specify directory
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.txt", NULL, L".");
ok_int(result, TRUE);
ok_wstri(szPath, (bUseLong ? L".\\test (1).txt" : L".\\test1.txt"));
// Test 3: Duplicated filename
CreateFileW(L"test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.txt", NULL, NULL);
ok_int(result, TRUE);
ok_wstri(szPath, L"test (1).txt");
DeleteFileW(L"test.txt");
// Build long name
WCHAR longName[MAX_PATH + 32];
for (auto& ch : longName)
ch = L'A';
longName[_countof(longName) - 10] = UNICODE_NULL;
lstrcatW(longName, L".txt");
// Test 4: Long filename
result = PathMakeUniqueName(szPath, _countof(szPath), longName, NULL, NULL);
szPath[0] = UNICODE_NULL;
ok_int(result, FALSE);
ok_wstri(szPath, L"");
// Test 5: Invalid parameter
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(NULL, 0, L"test.txt", NULL, NULL);
ok_int(result, FALSE);
// Test 6: Template and longplate
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"template.txt", L"longplate.txt", NULL);
ok_int(result, TRUE);
ok_wstri(szPath, L"longplate (1).txt");
// Test 7: Template only
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"template.txt", NULL, NULL);
ok_int(result, TRUE);
ok_wstri(szPath, L"template (1).txt");
// Test 8: Folder and duplicated filename
CreateFileW(L".\\temp\\test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.txt", NULL, L".");
ok_int(result, TRUE);
ok_wstri(szPath, (bUseLong ? L".\\test (1).txt" : L".\\test1.txt"));
DeleteFileW(L".\\test.txt");
// Test 9: Test extension
CreateFileW(L".\\test.hoge", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.hoge", NULL, L".");
ok_int(result, TRUE);
ok_wstri(szPath, (bUseLong ? L".\\test (1).hoge" : L".\\test1.hoge"));
DeleteFileW(L".\\test.hoge");
// Test 10: Folder in folder
CreateDirectoryW(L".\\hoge", NULL);
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.txt", NULL, L".\\hoge");
ok_int(result, TRUE);
ok_wstri(szPath, (bUseLong ? L".\\hoge\\test (1).txt" : L".\\hoge\\test1.txt"));
RemoveDirectoryW(L".\\hoge");
// Test 11: File in folder
CreateFileW(L".\\hoge.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
szPath[0] = UNICODE_NULL;
result = PathMakeUniqueName(szPath, _countof(szPath), L"test.txt", NULL, L".");
ok_int(result, TRUE);
ok_wstri(szPath, (bUseLong ? L".\\test (1).txt" : L".\\test1.txt"));
DeleteFileW(L".\\hoge.txt");
SetCurrentDirectoryW(szCurDir);
}