Files
Katayama Hirofumi MZ fe5b75083e [SHLWAPI][SHLWAPI_APITEST][SDK] Support NextPathA/W (#9039)
Implementing missing features...
JIRA issue: CORE-19278
- Implement NextPathA and
  NextPathW functions.
- Modify shlwapi.spec.
- Add prototypes into
  <shlwapi_undoc.h>.
- Add NextPath testcase.
2026-06-03 21:38:21 +09:00

159 lines
5.1 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Tests for NextPathA/W
* COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <[email protected]>
*/
#include <apitest.h>
#include <shlwapi.h>
typedef PSTR (WINAPI *FN_NextPathA)(PCSTR, PSTR, UINT);
typedef PWSTR (WINAPI *FN_NextPathW)(PCWSTR, PWSTR, UINT);
static FN_NextPathA s_pNextPathA = NULL;
static FN_NextPathW s_pNextPathW = NULL;
static void TEST_NextPathA(void)
{
PSTR pch;
CHAR sz[MAX_PATH];
/* NULL pszStart returns NULL */
pch = s_pNextPathA(NULL, sz, _countof(sz));
ok(pch == NULL, "pch was %p\n", pch);
/* Basic semicolon-separated paths */
pch = s_pNextPathA("C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, _countof(sz));
ok_str(sz, "C:\\TEST1");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok_str(sz, "C:\\TEST2");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok_str(sz, "C:\\TEST3");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok(pch == NULL, "pch was %p\n", pch);
/* Whitespace-only segment */
pch = s_pNextPathA("C:\\TEST1; ;C:\\TEST3", sz, _countof(sz));
ok_str(sz, "C:\\TEST1");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok(pch == NULL, "pch was %p\n", pch);
/* Empty string: no paths at all */
pch = s_pNextPathA("", sz, _countof(sz));
ok(pch == NULL, "empty string: pch was %p\n", pch);
/* Leading semicolons are skipped */
pch = s_pNextPathA(";;;C:\\TEST1", sz, _countof(sz));
ok_str(sz, "C:\\TEST1");
ok(pch != NULL, "leading semicolons: pch should not be NULL\n");
/* Trailing semicolon */
pch = s_pNextPathA("C:\\TEST1;", sz, _countof(sz));
ok_str(sz, "C:\\TEST1");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok(pch == NULL, "trailing semicolon: pch was %p\n", pch);
/* Only semicolons */
pch = s_pNextPathA(";;;", sz, _countof(sz));
ok(pch == NULL, "only semicolons: pch was %p\n", pch);
/* Path with surrounding spaces */
pch = s_pNextPathA(" C:\\TEST1 ;C:\\TEST2", sz, _countof(sz));
ok_str(sz, "C:\\TEST1");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok_str(sz, "C:\\TEST2");
/* Single path, no semicolon */
pch = s_pNextPathA("C:\\SINGLE", sz, _countof(sz));
ok_str(sz, "C:\\SINGLE");
pch = s_pNextPathA(pch, sz, _countof(sz));
ok(pch == NULL, "single path: pch was %p\n", pch);
/* cchDest = 0 */
sz[0] = '*';
sz[1] = ANSI_NULL;
pch = s_pNextPathA("C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, 0);
ok_str(pch, "C:\\TEST2;C:\\TEST3");
ok_str(sz, "*");
}
static void TEST_NextPathW(void)
{
PWSTR pch;
WCHAR sz[MAX_PATH];
/* NULL pszStart returns NULL */
pch = s_pNextPathW(NULL, sz, _countof(sz));
ok(pch == NULL, "pch was %p\n", pch);
/* Basic semicolon-separated paths */
pch = s_pNextPathW(L"C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST1");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST2");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST3");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok(pch == NULL, "pch was %p\n", pch);
/* Whitespace-only segment */
pch = s_pNextPathW(L"C:\\TEST1; ;C:\\TEST3", sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST1");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok(pch == NULL, "pch was %p\n", pch);
/* Empty string */
pch = s_pNextPathW(L"", sz, _countof(sz));
ok(pch == NULL, "empty string: pch was %p\n", pch);
/* Leading semicolons are skipped */
pch = s_pNextPathW(L";;;C:\\TEST1", sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST1");
ok(pch != NULL, "leading semicolons: pch should not be NULL\n");
/* Trailing semicolon */
pch = s_pNextPathW(L"C:\\TEST1;", sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST1");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok(pch == NULL, "trailing semicolon: pch was %p\n", pch);
/* Only semicolons */
pch = s_pNextPathW(L";;;", sz, _countof(sz));
ok(pch == NULL, "only semicolons: pch was %p\n", pch);
/* Path with surrounding spaces */
pch = s_pNextPathW(L" C:\\TEST1 ;C:\\TEST2", sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST1");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok_wstr(sz, L"C:\\TEST2");
/* Single path, no semicolon */
pch = s_pNextPathW(L"C:\\SINGLE", sz, _countof(sz));
ok_wstr(sz, L"C:\\SINGLE");
pch = s_pNextPathW(pch, sz, _countof(sz));
ok(pch == NULL, "single path: pch was %p\n", pch);
/* cchDest = 0 */
sz[0] = L'*';
sz[1] = UNICODE_NULL;
pch = s_pNextPathW(L"C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, 0);
ok_wstr(pch, L"C:\\TEST2;C:\\TEST3");
ok_wstr(sz, L"*");
}
START_TEST(NextPath)
{
HINSTANCE hSHLWAPI = GetModuleHandleA("shlwapi");
s_pNextPathA = (FN_NextPathA)GetProcAddress(hSHLWAPI, MAKEINTRESOURCEA(449));
s_pNextPathW = (FN_NextPathW)GetProcAddress(hSHLWAPI, MAKEINTRESOURCEA(450));
if (!s_pNextPathA || !s_pNextPathW)
{
skip("NextPath not found\n");
return;
}
TEST_NextPathA();
TEST_NextPathW();
}