ReactOS 0.4.17-dev-357-ga8f14ff
NextPath.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Tests for NextPathA/W
5 * COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include <apitest.h>
9#include <shlwapi.h>
10
13
16
17static void TEST_NextPathA(void)
18{
19 PSTR pch;
20 CHAR sz[MAX_PATH];
21
22 /* NULL pszStart returns NULL */
23 pch = s_pNextPathA(NULL, sz, _countof(sz));
24 ok(pch == NULL, "pch was %p\n", pch);
25
26 /* Basic semicolon-separated paths */
27 pch = s_pNextPathA("C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, _countof(sz));
28 ok_str(sz, "C:\\TEST1");
29 pch = s_pNextPathA(pch, sz, _countof(sz));
30 ok_str(sz, "C:\\TEST2");
31 pch = s_pNextPathA(pch, sz, _countof(sz));
32 ok_str(sz, "C:\\TEST3");
33 pch = s_pNextPathA(pch, sz, _countof(sz));
34 ok(pch == NULL, "pch was %p\n", pch);
35
36 /* Whitespace-only segment */
37 pch = s_pNextPathA("C:\\TEST1; ;C:\\TEST3", sz, _countof(sz));
38 ok_str(sz, "C:\\TEST1");
39 pch = s_pNextPathA(pch, sz, _countof(sz));
40 ok(pch == NULL, "pch was %p\n", pch);
41
42 /* Empty string: no paths at all */
43 pch = s_pNextPathA("", sz, _countof(sz));
44 ok(pch == NULL, "empty string: pch was %p\n", pch);
45
46 /* Leading semicolons are skipped */
47 pch = s_pNextPathA(";;;C:\\TEST1", sz, _countof(sz));
48 ok_str(sz, "C:\\TEST1");
49 ok(pch != NULL, "leading semicolons: pch should not be NULL\n");
50
51 /* Trailing semicolon */
52 pch = s_pNextPathA("C:\\TEST1;", sz, _countof(sz));
53 ok_str(sz, "C:\\TEST1");
54 pch = s_pNextPathA(pch, sz, _countof(sz));
55 ok(pch == NULL, "trailing semicolon: pch was %p\n", pch);
56
57 /* Only semicolons */
58 pch = s_pNextPathA(";;;", sz, _countof(sz));
59 ok(pch == NULL, "only semicolons: pch was %p\n", pch);
60
61 /* Path with surrounding spaces */
62 pch = s_pNextPathA(" C:\\TEST1 ;C:\\TEST2", sz, _countof(sz));
63 ok_str(sz, "C:\\TEST1");
64 pch = s_pNextPathA(pch, sz, _countof(sz));
65 ok_str(sz, "C:\\TEST2");
66
67 /* Single path, no semicolon */
68 pch = s_pNextPathA("C:\\SINGLE", sz, _countof(sz));
69 ok_str(sz, "C:\\SINGLE");
70 pch = s_pNextPathA(pch, sz, _countof(sz));
71 ok(pch == NULL, "single path: pch was %p\n", pch);
72
73 /* cchDest = 0 */
74 sz[0] = '*';
75 sz[1] = ANSI_NULL;
76 pch = s_pNextPathA("C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, 0);
77 ok_str(pch, "C:\\TEST2;C:\\TEST3");
78 ok_str(sz, "*");
79}
80
81static void TEST_NextPathW(void)
82{
83 PWSTR pch;
84 WCHAR sz[MAX_PATH];
85
86 /* NULL pszStart returns NULL */
87 pch = s_pNextPathW(NULL, sz, _countof(sz));
88 ok(pch == NULL, "pch was %p\n", pch);
89
90 /* Basic semicolon-separated paths */
91 pch = s_pNextPathW(L"C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, _countof(sz));
92 ok_wstr(sz, L"C:\\TEST1");
93 pch = s_pNextPathW(pch, sz, _countof(sz));
94 ok_wstr(sz, L"C:\\TEST2");
95 pch = s_pNextPathW(pch, sz, _countof(sz));
96 ok_wstr(sz, L"C:\\TEST3");
97 pch = s_pNextPathW(pch, sz, _countof(sz));
98 ok(pch == NULL, "pch was %p\n", pch);
99
100 /* Whitespace-only segment */
101 pch = s_pNextPathW(L"C:\\TEST1; ;C:\\TEST3", sz, _countof(sz));
102 ok_wstr(sz, L"C:\\TEST1");
103 pch = s_pNextPathW(pch, sz, _countof(sz));
104 ok(pch == NULL, "pch was %p\n", pch);
105
106 /* Empty string */
107 pch = s_pNextPathW(L"", sz, _countof(sz));
108 ok(pch == NULL, "empty string: pch was %p\n", pch);
109
110 /* Leading semicolons are skipped */
111 pch = s_pNextPathW(L";;;C:\\TEST1", sz, _countof(sz));
112 ok_wstr(sz, L"C:\\TEST1");
113 ok(pch != NULL, "leading semicolons: pch should not be NULL\n");
114
115 /* Trailing semicolon */
116 pch = s_pNextPathW(L"C:\\TEST1;", sz, _countof(sz));
117 ok_wstr(sz, L"C:\\TEST1");
118 pch = s_pNextPathW(pch, sz, _countof(sz));
119 ok(pch == NULL, "trailing semicolon: pch was %p\n", pch);
120
121 /* Only semicolons */
122 pch = s_pNextPathW(L";;;", sz, _countof(sz));
123 ok(pch == NULL, "only semicolons: pch was %p\n", pch);
124
125 /* Path with surrounding spaces */
126 pch = s_pNextPathW(L" C:\\TEST1 ;C:\\TEST2", sz, _countof(sz));
127 ok_wstr(sz, L"C:\\TEST1");
128 pch = s_pNextPathW(pch, sz, _countof(sz));
129 ok_wstr(sz, L"C:\\TEST2");
130
131 /* Single path, no semicolon */
132 pch = s_pNextPathW(L"C:\\SINGLE", sz, _countof(sz));
133 ok_wstr(sz, L"C:\\SINGLE");
134 pch = s_pNextPathW(pch, sz, _countof(sz));
135 ok(pch == NULL, "single path: pch was %p\n", pch);
136
137 /* cchDest = 0 */
138 sz[0] = L'*';
139 sz[1] = UNICODE_NULL;
140 pch = s_pNextPathW(L"C:\\TEST1;C:\\TEST2;C:\\TEST3", sz, 0);
141 ok_wstr(pch, L"C:\\TEST2;C:\\TEST3");
142 ok_wstr(sz, L"*");
143}
144
146{
147 HINSTANCE hSHLWAPI = GetModuleHandleA("shlwapi");
150 if (!s_pNextPathA || !s_pNextPathW)
151 {
152 skip("NextPath not found\n");
153 return;
154 }
155
158}
PWSTR(WINAPI * FN_NextPathW)(PCWSTR, PWSTR, UINT)
Definition: NextPath.c:12
static FN_NextPathW s_pNextPathW
Definition: NextPath.c:15
static void TEST_NextPathW(void)
Definition: NextPath.c:81
PSTR(WINAPI * FN_NextPathA)(PCSTR, PSTR, UINT)
Definition: NextPath.c:11
static FN_NextPathA s_pNextPathA
Definition: NextPath.c:14
static void TEST_NextPathA(void)
Definition: NextPath.c:17
#define ok_str(x, y)
Definition: atltest.h:127
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define ok_wstr(x, y)
Definition: atltest.h:130
#define START_TEST(x)
Definition: atltest.h:75
#define NULL
Definition: types.h:112
#define GetProcAddress(x, y)
Definition: compat.h:753
#define MAX_PATH
Definition: compat.h:34
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define L(x)
Definition: resources.c:13
#define pch(ap)
Definition: match.c:418
unsigned int UINT
Definition: ndis.h:50
#define UNICODE_NULL
#define ANSI_NULL
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
#define NextPath
Definition: shlwapi_undoc.h:83
#define _countof(array)
Definition: sndvol32.h:70
uint16_t * PWSTR
Definition: typedefs.h:56
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
const char * PCSTR
Definition: typedefs.h:52
#define WINAPI
Definition: msvc.h:6
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581