2 * Path tests for kernelbase.dll
4 * Copyright 2017 Michael Müller
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/test.h"
32 HRESULT (WINAPI
*pPathCchAddBackslash
)(WCHAR
*out
, SIZE_T size
);
33 HRESULT (WINAPI
*pPathCchAddBackslashEx
)(WCHAR
*out
, SIZE_T size
, WCHAR
**endptr
, SIZE_T
*remaining
);
34 HRESULT (WINAPI
*pPathCchCombineEx
)(WCHAR
*out
, SIZE_T size
, const WCHAR
*path1
, const WCHAR
*path2
, DWORD flags
);
45 {"C:\\", "a", "C:\\a" },
46 {"C:\\b", "..\\a", "C:\\a" },
47 {"C:", "a", "C:\\a" },
48 {"C:\\", ".", "C:\\" },
49 {"C:\\", "..", "C:\\" },
50 {"\\a", "b", "\\a\\b" },
52 /* normal UNC paths */
53 {"\\\\192.168.1.1\\test", "a", "\\\\192.168.1.1\\test\\a" },
54 {"\\\\192.168.1.1\\test", "..", "\\\\192.168.1.1" },
57 {"\\\\?\\C:\\", "a", "C:\\a" },
58 {"\\\\?\\C:\\", "..", "C:\\" },
61 {"\\\\?\\UNC\\192.168.1.1\\test", "a", "\\\\192.168.1.1\\test\\a" },
62 {"\\\\?\\UNC\\192.168.1.1\\test", "..", "\\\\192.168.1.1" },
65 static void test_PathCchCombineEx(void)
67 WCHAR expected
[MAX_PATH
] = {'C',':','\\','a',0};
68 WCHAR p1
[MAX_PATH
] = {'C',':','\\',0};
69 WCHAR p2
[MAX_PATH
] = {'a',0};
70 WCHAR output
[MAX_PATH
];
74 if (!pPathCchCombineEx
)
76 skip("PathCchCombineEx() is not available.\n");
80 hr
= pPathCchCombineEx(NULL
, 2, p1
, p2
, 0);
81 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
83 memset(output
, 0xff, sizeof(output
));
84 hr
= pPathCchCombineEx(output
, 0, p1
, p2
, 0);
85 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
86 ok(output
[0] == 0xffff, "Expected output buffer to be unchanged\n");
88 memset(output
, 0xff, sizeof(output
));
89 hr
= pPathCchCombineEx(output
, 1, p1
, p2
, 0);
90 ok(hr
== STRSAFE_E_INSUFFICIENT_BUFFER
, "Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", hr
);
91 ok(output
[0] == 0, "Expected output buffer to contain NULL string\n");
93 memset(output
, 0xff, sizeof(output
));
94 hr
= pPathCchCombineEx(output
, 4, p1
, p2
, 0);
95 ok(hr
== STRSAFE_E_INSUFFICIENT_BUFFER
, "Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", hr
);
96 ok(output
[0] == 0x0, "Expected output buffer to contain NULL string\n");
98 memset(output
, 0xff, sizeof(output
));
99 hr
= pPathCchCombineEx(output
, 5, p1
, p2
, 0);
100 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
101 ok(!lstrcmpW(output
, expected
),
102 "Combination of %s + %s returned %s, expected %s\n",
103 wine_dbgstr_w(p1
), wine_dbgstr_w(p2
), wine_dbgstr_w(output
), wine_dbgstr_w(expected
));
105 for (i
= 0; i
< ARRAY_SIZE(combine_test
); i
++)
107 MultiByteToWideChar(CP_ACP
, 0, combine_test
[i
].path1
, -1, p1
, MAX_PATH
);
108 MultiByteToWideChar(CP_ACP
, 0, combine_test
[i
].path2
, -1, p2
, MAX_PATH
);
109 MultiByteToWideChar(CP_ACP
, 0, combine_test
[i
].result
, -1, expected
, MAX_PATH
);
111 hr
= pPathCchCombineEx(output
, MAX_PATH
, p1
, p2
, 0);
112 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
113 ok(!lstrcmpW(output
, expected
), "Combining %s with %s returned %s, expected %s\n",
114 wine_dbgstr_w(p1
), wine_dbgstr_w(p2
), wine_dbgstr_w(output
), wine_dbgstr_w(expected
));
118 struct addbackslash_test
127 static const struct addbackslash_test addbackslash_tests
[] =
129 { "C:", "C:\\", S_OK
, MAX_PATH
, MAX_PATH
- 3 },
130 { "a.txt", "a.txt\\", S_OK
, MAX_PATH
, MAX_PATH
- 6 },
131 { "a/b", "a/b\\", S_OK
, MAX_PATH
, MAX_PATH
- 4 },
133 { "C:\\", "C:\\", S_FALSE
, MAX_PATH
, MAX_PATH
- 3 },
134 { "C:\\", "C:\\", S_FALSE
, 4, 1 },
136 { "C:", "C:", STRSAFE_E_INSUFFICIENT_BUFFER
, 2, 0 },
137 { "C:", "C:", STRSAFE_E_INSUFFICIENT_BUFFER
, 3, 1 },
138 { "C:\\", "C:\\", STRSAFE_E_INSUFFICIENT_BUFFER
, 2, 0 },
139 { "C:\\", "C:\\", STRSAFE_E_INSUFFICIENT_BUFFER
, 3, 0 },
140 { "C:\\", "C:\\", STRSAFE_E_INSUFFICIENT_BUFFER
, 0, 0 },
141 { "C:", "C:", STRSAFE_E_INSUFFICIENT_BUFFER
, 0, 0 },
144 static void test_PathCchAddBackslash(void)
146 WCHAR pathW
[MAX_PATH
];
150 if (!pPathCchAddBackslash
)
152 win_skip("PathCchAddBackslash() is not available.\n");
157 hr
= pPathCchAddBackslash(pathW
, 0);
158 ok(hr
== STRSAFE_E_INSUFFICIENT_BUFFER
, "Unexpected hr %#x.\n", hr
);
159 ok(pathW
[0] == 0, "Unexpected path.\n");
162 hr
= pPathCchAddBackslash(pathW
, 1);
163 ok(hr
== S_FALSE
, "Unexpected hr %#x.\n", hr
);
164 ok(pathW
[0] == 0, "Unexpected path.\n");
167 hr
= pPathCchAddBackslash(pathW
, 2);
168 ok(hr
== S_FALSE
, "Unexpected hr %#x.\n", hr
);
169 ok(pathW
[0] == 0, "Unexpected path.\n");
171 for (i
= 0; i
< ARRAY_SIZE(addbackslash_tests
); i
++)
173 const struct addbackslash_test
*test
= &addbackslash_tests
[i
];
176 MultiByteToWideChar(CP_ACP
, 0, test
->path
, -1, pathW
, ARRAY_SIZE(pathW
));
177 hr
= pPathCchAddBackslash(pathW
, test
->size
);
178 ok(hr
== test
->hr
, "%u: unexpected return value %#x.\n", i
, hr
);
180 WideCharToMultiByte(CP_ACP
, 0, pathW
, -1, path
, ARRAY_SIZE(path
), NULL
, NULL
);
181 ok(!strcmp(path
, test
->result
), "%u: unexpected resulting path %s.\n", i
, path
);
185 static void test_PathCchAddBackslashEx(void)
187 WCHAR pathW
[MAX_PATH
];
193 if (!pPathCchAddBackslashEx
)
195 win_skip("PathCchAddBackslashEx() is not available.\n");
200 hr
= pPathCchAddBackslashEx(pathW
, 0, NULL
, NULL
);
201 ok(hr
== STRSAFE_E_INSUFFICIENT_BUFFER
, "Unexpected hr %#x.\n", hr
);
202 ok(pathW
[0] == 0, "Unexpected path.\n");
205 ptrW
= (void *)0xdeadbeef;
207 hr
= pPathCchAddBackslashEx(pathW
, 1, &ptrW
, &remaining
);
208 ok(hr
== S_FALSE
, "Unexpected hr %#x.\n", hr
);
209 ok(pathW
[0] == 0, "Unexpected path.\n");
210 ok(ptrW
== pathW
, "Unexpected endptr %p.\n", ptrW
);
211 ok(remaining
== 1, "Unexpected remaining size.\n");
214 hr
= pPathCchAddBackslashEx(pathW
, 2, NULL
, NULL
);
215 ok(hr
== S_FALSE
, "Unexpected hr %#x.\n", hr
);
216 ok(pathW
[0] == 0, "Unexpected path.\n");
218 for (i
= 0; i
< ARRAY_SIZE(addbackslash_tests
); i
++)
220 const struct addbackslash_test
*test
= &addbackslash_tests
[i
];
223 MultiByteToWideChar(CP_ACP
, 0, test
->path
, -1, pathW
, ARRAY_SIZE(pathW
));
224 hr
= pPathCchAddBackslashEx(pathW
, test
->size
, NULL
, NULL
);
225 ok(hr
== test
->hr
, "%u: unexpected return value %#x.\n", i
, hr
);
227 WideCharToMultiByte(CP_ACP
, 0, pathW
, -1, path
, ARRAY_SIZE(path
), NULL
, NULL
);
228 ok(!strcmp(path
, test
->result
), "%u: unexpected resulting path %s.\n", i
, path
);
230 ptrW
= (void *)0xdeadbeef;
232 MultiByteToWideChar(CP_ACP
, 0, test
->path
, -1, pathW
, ARRAY_SIZE(pathW
));
233 hr
= pPathCchAddBackslashEx(pathW
, test
->size
, &ptrW
, &remaining
);
234 ok(hr
== test
->hr
, "%u: unexpected return value %#x.\n", i
, hr
);
237 ok(ptrW
== (pathW
+ lstrlenW(pathW
)), "%u: unexpected end pointer.\n", i
);
238 ok(remaining
== test
->remaining
, "%u: unexpected remaining buffer length.\n", i
);
242 ok(ptrW
== NULL
, "%u: unexpecred end pointer.\n", i
);
243 ok(remaining
== 0, "%u: unexpected remaining buffer length.\n", i
);
250 HMODULE hmod
= LoadLibraryA("kernelbase.dll");
252 pPathCchCombineEx
= (void *)GetProcAddress(hmod
, "PathCchCombineEx");
253 pPathCchAddBackslash
= (void *)GetProcAddress(hmod
, "PathCchAddBackslash");
254 pPathCchAddBackslashEx
= (void *)GetProcAddress(hmod
, "PathCchAddBackslashEx");
256 test_PathCchCombineEx();
257 test_PathCchAddBackslash();
258 test_PathCchAddBackslashEx();