[SHELL32_APITEST]
[reactos.git] / rostests / apitests / shell32 / SHParseDisplayName.cpp
1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for SHParseDisplayName
5 * PROGRAMMERS: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include "shelltest.h"
9 #include "apitest.h"
10 #include <ndk/umtypes.h>
11 #include <strsafe.h>
12
13 START_TEST(SHParseDisplayName)
14 {
15 HRESULT hr;
16 PIDLIST_ABSOLUTE pidl;
17 WCHAR systemDir[MAX_PATH];
18 WCHAR path[MAX_PATH];
19 WCHAR resultPath[MAX_PATH];
20 BOOL winv6 = LOBYTE(LOWORD(GetVersion())) >= 6;
21
22 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
23
24 GetSystemDirectoryW(systemDir, RTL_NUMBER_OF(systemDir));
25 SetCurrentDirectoryW(systemDir);
26
27 /* The code below relies on these properties */
28 ok(systemDir[1] == L':', "systemDir = %ls\n", systemDir);
29 ok(systemDir[2] == L'\\', "systemDir = %ls\n", systemDir);
30 ok(systemDir[wcslen(systemDir) - 1] != L'\\', "systemDir = %ls\n", systemDir);
31 ok(wcschr(systemDir + 3, L'\\') != NULL, "systemDir = %ls\n", systemDir);
32
33 /* NULL */
34 pidl = NULL;
35 StartSeh()
36 hr = SHParseDisplayName(NULL, NULL, &pidl, 0, NULL);
37 EndSeh(STATUS_SUCCESS);
38 ok(hr == E_OUTOFMEMORY || hr == E_INVALIDARG, "hr = %lx\n", hr);
39 ok(pidl == NULL, "pidl = %p\n", pidl);
40 if (pidl) CoTaskMemFree(pidl);
41
42 /* empty string */
43 pidl = NULL;
44 hr = SHParseDisplayName(L"", NULL, &pidl, 0, NULL);
45 ok(hr == S_OK, "hr = %lx\n", hr);
46 ok(pidl != NULL, "pidl = %p\n", pidl);
47 resultPath[0] = UNICODE_NULL;
48 SHGetPathFromIDListW(pidl, resultPath);
49 ok_wstr(resultPath, L"");
50 if (pidl) CoTaskMemFree(pidl);
51
52 /* C: */
53 path[0] = systemDir[0];
54 path[1] = L':';
55 path[2] = UNICODE_NULL;
56 pidl = NULL;
57 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
58 if (winv6)
59 {
60 /* Win7 accepts this and returns C:\ */
61 ok(hr == S_OK, "hr = %lx\n", hr);
62 ok(pidl != NULL, "pidl = %p\n", pidl);
63 resultPath[0] = UNICODE_NULL;
64 SHGetPathFromIDListW(pidl, resultPath);
65 path[2] = L'\\';
66 path[3] = UNICODE_NULL;
67 ok(!wcsicmp(resultPath, path), "Got %ls, expected %ls\n", resultPath, path);
68 }
69 else
70 {
71 /* Win2003 fails this */
72 ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
73 ok(pidl == NULL, "pidl = %p\n", pidl);
74 }
75 if (pidl) CoTaskMemFree(pidl);
76
77 /* C:\ */
78 path[0] = systemDir[0];
79 path[1] = L':';
80 path[2] = L'\\';
81 path[3] = UNICODE_NULL;
82 pidl = NULL;
83 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
84 ok(hr == S_OK, "hr = %lx\n", hr);
85 ok(pidl != NULL, "pidl = %p\n", pidl);
86 resultPath[0] = UNICODE_NULL;
87 SHGetPathFromIDListW(pidl, resultPath);
88 ok(!wcsicmp(resultPath, path), "Got %ls, expected %ls\n", resultPath, path);
89 if (pidl) CoTaskMemFree(pidl);
90
91 /* C:\\ */
92 path[0] = systemDir[0];
93 path[1] = L':';
94 path[2] = L'\\';
95 path[3] = L'\\';
96 path[4] = UNICODE_NULL;
97 pidl = NULL;
98 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
99 ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
100 ok(pidl == NULL, "pidl = %p\n", pidl);
101 if (pidl) CoTaskMemFree(pidl);
102
103 /* C:\ReactOS */
104 StringCbCopyW(path, sizeof(path), systemDir);
105 wcschr(path + 3, L'\\')[0] = UNICODE_NULL;
106 pidl = NULL;
107 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
108 ok(hr == S_OK, "hr = %lx\n", hr);
109 ok(pidl != NULL, "pidl = %p\n", pidl);
110 resultPath[0] = UNICODE_NULL;
111 SHGetPathFromIDListW(pidl, resultPath);
112 ok(!wcsicmp(resultPath, path), "Got %ls, expected %ls\n", resultPath, path);
113 if (pidl) CoTaskMemFree(pidl);
114
115 /* C:\ReactOS\ */
116 StringCbCopyW(path, sizeof(path), systemDir);
117 wcschr(path + 3, L'\\')[1] = UNICODE_NULL;
118 pidl = NULL;
119 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
120 ok(hr == S_OK, "hr = %lx\n", hr);
121 ok(pidl != NULL, "pidl = %p\n", pidl);
122 resultPath[0] = UNICODE_NULL;
123 SHGetPathFromIDListW(pidl, resultPath);
124 path[wcslen(path) - 1] = UNICODE_NULL;
125 ok(!wcsicmp(resultPath, path), "Got %ls, expected %ls\n", resultPath, path);
126 if (pidl) CoTaskMemFree(pidl);
127
128 /* C:\ReactOS\system32 */
129 StringCbCopyW(path, sizeof(path), systemDir);
130 pidl = NULL;
131 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
132 ok(hr == S_OK, "hr = %lx\n", hr);
133 ok(pidl != NULL, "pidl = %p\n", pidl);
134 resultPath[0] = UNICODE_NULL;
135 SHGetPathFromIDListW(pidl, resultPath);
136 ok(!wcsicmp(resultPath, path), "Got %ls, expected %ls\n", resultPath, path);
137 if (pidl) CoTaskMemFree(pidl);
138
139 /* C:ntoskrnl.exe */
140 path[0] = systemDir[0];
141 path[1] = L':';
142 path[2] = UNICODE_NULL;
143 StringCbCatW(path, sizeof(path), L"ntoskrnl.exe");
144 pidl = NULL;
145 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
146 ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
147 ok(pidl == NULL, "pidl = %p\n", pidl);
148 if (pidl) CoTaskMemFree(pidl);
149
150 /* ntoskrnl.exe */
151 StringCbCopyW(path, sizeof(path), L"ntoskrnl.exe");
152 pidl = NULL;
153 hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
154 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "hr = %lx\n", hr);
155 ok(pidl == NULL, "pidl = %p\n", pidl);
156 if (pidl) CoTaskMemFree(pidl);
157
158 CoUninitialize();
159 }