1 /*
2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Test for SHEnumClassesOfCategories
5 * COPYRIGHT: Copyright 2019 Serge Gautherie <reactos-git_serge_171003@gautherie.fr>
6 */
7
8 /*
9 TODO, if they make sense:
10 * Test more than 1 Implemented/Required.
11 And maybe not "matching" ones.
12 * Check pEnumGUID after S_OK cases.
13 */
14
15 #include <apitest.h>
16
17 #include <shlobj.h>
18 #include <atlbase.h>
19
20 typedef HRESULT (WINAPI *SHENUMCLASSESOFCATEGORIES)(ULONG cImplemented, CATID *pImplemented, ULONG cRequired, CATID *pRequired, IEnumGUID **out);
21
22 static SHENUMCLASSESOFCATEGORIES pSHEnumClassesOfCategories;
23
START_TEST(SHEnumClassesOfCategories)24 START_TEST(SHEnumClassesOfCategories)
25 {
26 HRESULT hr;
27 HMODULE hbrowseui;
28 CATID CategoryImplemented, CategoryRequired;
29 CComPtr<IEnumGUID> pEnumGUID;
30
31 // Set up.
32
33 hbrowseui = LoadLibraryA("browseui.dll");
34 ok(hbrowseui != NULL, "LoadLibraryA() failed\n");
35 if (!hbrowseui)
36 {
37 skip("No dll\n");
38 return;
39 }
40
41 pSHEnumClassesOfCategories = (SHENUMCLASSESOFCATEGORIES)GetProcAddress(hbrowseui, MAKEINTRESOURCEA(136));
42 ok(pSHEnumClassesOfCategories != NULL, "GetProcAddress() failed\n");
43 if (!pSHEnumClassesOfCategories)
44 {
45 skip("No function, as on NT 6.1+\n");
46 return;
47 }
48
49 // Test (mostly) invalid arguments.
50
51 // Implemented, '(ULONG)-1, NULL'.
52 // Keep this odd case, as ReactOS used to "implement" it.
53
54 // hr = pSHEnumClassesOfCategories((ULONG)-1, NULL, 0, NULL, NULL);
55 // ok_long(hr, E_INVALIDARG);
56 hr = pSHEnumClassesOfCategories((ULONG)-1, NULL, 0, NULL, &pEnumGUID);
57 ok_long(hr, E_INVALIDARG);
58
59 CategoryRequired = CATID_DeskBand;
60 // hr = pSHEnumClassesOfCategories((ULONG)-1, NULL, 1, &CategoryRequired, NULL);
61 // ok_long(hr, E_INVALIDARG);
62 hr = pSHEnumClassesOfCategories((ULONG)-1, NULL, 1, &CategoryRequired, &pEnumGUID);
63 ok_long(hr, E_INVALIDARG);
64
65 // Implemented, '0, NULL'.
66
67 // hr = pSHEnumClassesOfCategories(0, NULL, 0, NULL, NULL);
68 // ok_long(hr, E_INVALIDARG);
69 hr = pSHEnumClassesOfCategories(0, NULL, 0, NULL, &pEnumGUID);
70 ok_long(hr, E_INVALIDARG);
71
72 // CategoryRequired = CATID_DeskBand;
73 // hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, NULL);
74 // ok_long(hr, E_INVALIDARG);
75 // The following case duplicates a later one.
76 // hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, &pEnumGUID);
77 // ok_long(hr, S_OK);
78 // ok(CategoryRequired == CATID_DeskBand, "CategoryRequired was modified\n");
79 // pEnumGUID = NULL;
80
81 // Implemented, '0, &CategoryImplemented'.
82
83 CategoryImplemented = CATID_DeskBand;
84 // hr = pSHEnumClassesOfCategories(0, &CategoryImplemented, 0, NULL, NULL);
85 // ok_long(hr, E_INVALIDARG);
86 hr = pSHEnumClassesOfCategories(0, &CategoryImplemented, 0, NULL, &pEnumGUID);
87 ok_long(hr, E_INVALIDARG);
88
89 CategoryRequired = CATID_DeskBand;
90 // hr = pSHEnumClassesOfCategories(0, &CategoryImplemented, 1, &CategoryRequired, NULL);
91 // ok_long(hr, E_INVALIDARG);
92 hr = pSHEnumClassesOfCategories(0, &CategoryImplemented, 1, &CategoryRequired, &pEnumGUID);
93 ok_long(hr, S_OK);
94 ok(CategoryImplemented == CATID_DeskBand, "CategoryImplemented was modified\n");
95 ok(CategoryRequired == CATID_DeskBand, "CategoryRequired was modified\n");
96 pEnumGUID = NULL;
97
98 CategoryRequired = CATID_InfoBand;
99 // hr = pSHEnumClassesOfCategories(0, &CategoryImplemented, 1, &CategoryRequired, NULL);
100 // ok_long(hr, E_INVALIDARG);
101 hr = pSHEnumClassesOfCategories(0, &CategoryImplemented, 1, &CategoryRequired, &pEnumGUID);
102 ok_long(hr, S_OK);
103 ok(CategoryImplemented == CATID_DeskBand, "CategoryImplemented was modified\n");
104 ok(CategoryRequired == CATID_InfoBand, "CategoryRequired was modified\n");
105 pEnumGUID = NULL;
106
107 // Implemented, '1, NULL'.
108
109 // hr = pSHEnumClassesOfCategories(1, NULL, 0, NULL, NULL);
110 // ok_long(hr, E_INVALIDARG);
111 hr = pSHEnumClassesOfCategories(1, NULL, 0, NULL, &pEnumGUID);
112 ok_long(hr, E_INVALIDARG);
113
114 CategoryRequired = CATID_DeskBand;
115 // hr = pSHEnumClassesOfCategories(1, NULL, 1, &CategoryRequired, NULL);
116 // ok_long(hr, E_INVALIDARG);
117 hr = pSHEnumClassesOfCategories(1, NULL, 1, &CategoryRequired, &pEnumGUID);
118 ok_long(hr, E_INVALIDARG);
119
120 // Required, '0, &CategoryRequired'.
121
122 CategoryRequired = CATID_DeskBand;
123
124 CategoryImplemented = CATID_DeskBand;
125 // hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, &CategoryRequired, NULL);
126 // ok_long(hr, E_INVALIDARG);
127 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, &CategoryRequired, &pEnumGUID);
128 ok_long(hr, S_OK);
129 ok(CategoryImplemented == CATID_DeskBand, "CategoryImplemented was modified\n");
130 ok(CategoryRequired == CATID_DeskBand, "CategoryRequired was modified\n");
131 pEnumGUID = NULL;
132
133 CategoryImplemented = CATID_InfoBand;
134 // hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, &CategoryRequired, NULL);
135 // ok_long(hr, E_INVALIDARG);
136 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, &CategoryRequired, &pEnumGUID);
137 ok_long(hr, S_OK);
138 ok(CategoryImplemented == CATID_InfoBand, "CategoryImplemented was modified\n");
139 ok(CategoryRequired == CATID_DeskBand, "CategoryRequired was modified\n");
140 pEnumGUID = NULL;
141
142 // Required, '1, NULL'.
143
144 // hr = pSHEnumClassesOfCategories(0, NULL, 1, NULL, NULL);
145 // ok_long(hr, E_INVALIDARG);
146 hr = pSHEnumClassesOfCategories(0, NULL, 1, NULL, &pEnumGUID);
147 ok_long(hr, E_INVALIDARG);
148
149 CategoryImplemented = CATID_DeskBand;
150 // hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 1, NULL, NULL);
151 // ok_long(hr, E_INVALIDARG);
152 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 1, NULL, &pEnumGUID);
153 ok_long(hr, E_INVALIDARG);
154
155 // Out, 'NULL'.
156 // Previous similar checks are commented out, for usual use.
157
158 CategoryImplemented = CATID_DeskBand;
159 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, NULL, NULL);
160 ok_long(hr, E_INVALIDARG);
161
162 CategoryRequired = CATID_DeskBand;
163 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 1, &CategoryRequired, NULL);
164 ok_long(hr, E_INVALIDARG);
165
166 // Test success.
167 // CATID_* from sdk/include/psdk/shlguid.h.
168 // See also modules/rostests/winetests/shlwapi/clsid.c.
169
170 // Each CATID, as Implemented.
171
172 CategoryImplemented = CATID_BrowsableShellExt;
173 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, NULL, &pEnumGUID);
174 ok_long(hr, S_OK);
175 ok(CategoryImplemented == CATID_BrowsableShellExt, "CategoryImplemented was modified\n");
176 pEnumGUID = NULL;
177
178 CategoryImplemented = CATID_BrowseInPlace;
179 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, NULL, &pEnumGUID);
180 ok_long(hr, S_OK);
181 ok(CategoryImplemented == CATID_BrowseInPlace, "CategoryImplemented was modified\n");
182 pEnumGUID = NULL;
183
184 CategoryImplemented = CATID_DeskBand;
185 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, NULL, &pEnumGUID);
186 ok_long(hr, S_OK);
187 ok(CategoryImplemented == CATID_DeskBand, "CategoryImplemented was modified\n");
188 pEnumGUID = NULL;
189
190 CategoryImplemented = CATID_InfoBand;
191 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, NULL, &pEnumGUID);
192 ok_long(hr, S_OK);
193 ok(CategoryImplemented == CATID_InfoBand, "CategoryImplemented was modified\n");
194 pEnumGUID = NULL;
195
196 CategoryImplemented = CATID_CommBand;
197 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 0, NULL, &pEnumGUID);
198 ok_long(hr, S_OK);
199 ok(CategoryImplemented == CATID_CommBand, "CategoryImplemented was modified\n");
200 pEnumGUID = NULL;
201
202 // Each CATID, as Required.
203
204 CategoryRequired = CATID_BrowsableShellExt;
205 hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, &pEnumGUID);
206 ok_long(hr, S_OK);
207 ok(CategoryRequired == CATID_BrowsableShellExt, "CategoryRequired was modified\n");
208 pEnumGUID = NULL;
209
210 CategoryRequired = CATID_BrowseInPlace;
211 hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, &pEnumGUID);
212 ok_long(hr, S_OK);
213 ok(CategoryRequired == CATID_BrowseInPlace, "CategoryRequired was modified\n");
214 pEnumGUID = NULL;
215
216 CategoryRequired = CATID_DeskBand;
217 hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, &pEnumGUID);
218 ok_long(hr, S_OK);
219 ok(CategoryRequired == CATID_DeskBand, "CategoryRequired was modified\n");
220 pEnumGUID = NULL;
221
222 CategoryRequired = CATID_InfoBand;
223 hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, &pEnumGUID);
224 ok_long(hr, S_OK);
225 ok(CategoryRequired == CATID_InfoBand, "CategoryRequired was modified\n");
226 pEnumGUID = NULL;
227
228 CategoryRequired = CATID_CommBand;
229 hr = pSHEnumClassesOfCategories(0, NULL, 1, &CategoryRequired, &pEnumGUID);
230 ok_long(hr, S_OK);
231 ok(CategoryRequired == CATID_CommBand, "CategoryRequired was modified\n");
232 pEnumGUID = NULL;
233
234 // Same CATID, as Implemented and Required.
235
236 CategoryImplemented = CATID_DeskBand;
237 CategoryRequired = CATID_DeskBand;
238 hr = pSHEnumClassesOfCategories(1, &CategoryImplemented, 1, &CategoryRequired, &pEnumGUID);
239 ok_long(hr, S_OK);
240 ok(CategoryImplemented == CATID_DeskBand, "CategoryImplemented was modified\n");
241 ok(CategoryRequired == CATID_DeskBand, "CategoryRequired was modified\n");
242 pEnumGUID = NULL;
243
244 // Clean up.
245
246 ok(FreeLibrary(hbrowseui) != 0, "FreeLibrary() failed\n");
247 }
248