ReactOS 0.4.16-dev-122-g325d74c
autocomplete.c
Go to the documentation of this file.
1/* Unit tests for autocomplete
2 *
3 * Copyright 2007 Mikolaj Zalewski
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#define COBJMACROS
21
22#include <stdarg.h>
23
24#include <initguid.h>
25#include <windows.h>
26#include <shlobj.h>
27#include <shldisp.h>
28#include <shlwapi.h>
29#include <shlguid.h>
30
31#include "wine/test.h"
32
33#define ole_ok(exp) \
34{ \
35 HRESULT res = (exp); \
36 if (res != S_OK) \
37 ok(FALSE, #exp " failed: %x\n", res); \
38}
39
41{
42 int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
43 LPWSTR wstr = CoTaskMemAlloc((size + 1)*sizeof(WCHAR));
44 MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, size+1);
45 return wstr;
46}
47
48typedef struct
49{
57 const char **data;
58} TestACL;
59
60extern IEnumStringVtbl TestACLVtbl;
61extern IACListVtbl TestACL_ACListVtbl;
62
64{
65 return CONTAINING_RECORD(iface, TestACL, IEnumString_iface);
66}
67
68static TestACL *impl_from_IACList(IACList *iface)
69{
70 return CONTAINING_RECORD(iface, TestACL, IACList_iface);
71}
72
73static TestACL *TestACL_Constructor(int limit, const char **strings)
74{
76 ZeroMemory(This, sizeof(*This));
77 This->IEnumString_iface.lpVtbl = &TestACLVtbl;
78 This->IACList_iface.lpVtbl = &TestACL_ACListVtbl;
79 This->ref = 1;
80 This->expret = S_OK;
81 This->limit = limit;
82 This->data = strings;
83 return This;
84}
85
87{
89 trace("ACL(%p): addref (%d)\n", This, This->ref+1);
90 return InterlockedIncrement(&This->ref);
91}
92
94{
96 ULONG res;
97
99 trace("ACL(%p): release (%d)\n", This, res);
100 return res;
101}
102
104{
106 *ppvOut = NULL;
108 {
109 *ppvOut = iface;
110 }
111 else if (IsEqualGUID(iid, &IID_IACList))
112 {
113 *ppvOut = &This->IACList_iface;
114 }
115
116 if (*ppvOut)
117 {
118 IEnumString_AddRef(iface);
119 return S_OK;
120 }
121
122 if (!IsEqualGUID(iid, &IID_IEnumACString))
123 trace("unknown interface queried\n");
124 return E_NOINTERFACE;
125}
126
127static HRESULT STDMETHODCALLTYPE TestACL_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched)
128{
130 ULONG i;
131
132 trace("ACL(%p): read %d item(s)\n", This, celt);
133 for (i = 0; i < celt; i++)
134 {
135 if (This->pos >= This->limit)
136 break;
137 rgelt[i] = strdup_AtoW(This->data[This->pos]);
138 This->pos++;
139 }
140
141 if (pceltFetched)
142 *pceltFetched = i;
143 if (i == celt)
144 return S_OK;
145 return S_FALSE;
146}
147
149{
150 ok(FALSE, "Unexpected call to TestACL_Skip\n");
151 return E_NOTIMPL;
152}
153
155{
156 ok(FALSE, "Unexpected call to TestACL_Clone\n");
157 return E_OUTOFMEMORY;
158}
159
161{
163 trace("ACL(%p): Reset\n", This);
164 This->pos = 0;
165 return S_OK;
166}
167
168static HRESULT STDMETHODCALLTYPE TestACL_Expand(IACList *iface, LPCOLESTR str)
169{
171 trace("ACL(%p): Expand\n", This);
172 This->expcount++;
173 return This->expret;
174}
175
176IEnumStringVtbl TestACLVtbl =
177{
181
186};
187
189{
191 return TestACL_AddRef(&This->IEnumString_iface);
192}
193
195{
197 return TestACL_Release(&This->IEnumString_iface);
198}
199
201{
203 return TestACL_QueryInterface(&This->IEnumString_iface, iid, ppvout);
204}
205
207{
211
213};
214
215#define expect_str(obj, str) \
216{ \
217 ole_ok(IEnumString_Next(obj, 1, &wstr, &i)); \
218 ok(i == 1, "Expected i == 1, got %d\n", i); \
219 ok(str[0] == wstr[0], "String mismatch\n"); \
220 CoTaskMemFree(wstr); \
221}
222
223#define expect_end(obj) \
224 ok(IEnumString_Next(obj, 1, &wstr, &i) == S_FALSE, "Unexpected return from Next\n");
225
226static void test_ACLMulti(void)
227{
228 const char *strings1[] = {"a", "c", "e"};
229 const char *strings2[] = {"a", "b", "d"};
230 WCHAR exp[] = {'A','B','C',0};
232 IEnumACString *unk;
233 HRESULT hr;
234 TestACL *acl1, *acl2;
235 IACList *acl;
236 IObjMgr *mgr;
237 LPWSTR wstr;
238 LPWSTR wstrtab[15];
239 LPVOID tmp;
240 ULONG ref;
241 UINT i;
242
243 hr = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC, &IID_IEnumString, (void**)&obj);
244 ok(hr == S_OK, "failed to create ACLMulti instance, 0x%08x\n", hr);
245 if (hr != S_OK) return;
246
247 hr = IEnumString_QueryInterface(obj, &IID_IACList, (void**)&acl);
248 ok(hr == S_OK, "got 0x%08x\n", hr);
249 hr = IEnumString_QueryInterface(obj, &IID_IACList2, &tmp);
250 ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
251 hr = IEnumString_QueryInterface(obj, &IID_IObjMgr, (void**)&mgr);
252 ok(hr == S_OK, "got 0x%08x\n", hr);
253
254 hr = IEnumString_QueryInterface(obj, &IID_IEnumACString, (LPVOID*)&unk);
255 if (hr == E_NOINTERFACE)
256 todo_wine win_skip("IEnumACString is not supported, skipping tests\n");
257 else
258 {
259 ok(hr == S_OK, "QueryInterface(IID_IEnumACString) failed: %x\n", hr);
260 if (unk != NULL)
261 IEnumACString_Release(unk);
262 }
263
264 i = -1;
265 hr = IEnumString_Next(obj, 1, (LPOLESTR *)&tmp, &i);
266 ok(hr == S_FALSE, "got 0x%08x\n", hr);
267 ok(i == 0, "Unexpected fetched value %d\n", i);
268 hr = IEnumString_Next(obj, 44, (LPOLESTR *)&tmp, &i);
269 ok(hr == S_FALSE, "got 0x%08x\n", hr);
270 hr = IEnumString_Skip(obj, 1);
271 ok(hr == E_NOTIMPL, "got 0x%08x\n", hr);
272 hr = IEnumString_Clone(obj, (IEnumString **)&tmp);
273 ok(hr == E_OUTOFMEMORY, "got 0x%08x\n", hr);
274 hr = IACList_Expand(acl, exp);
275 ok(hr == S_OK, "got 0x%08x\n", hr);
276
277 acl1 = TestACL_Constructor(3, strings1);
278 acl2 = TestACL_Constructor(3, strings2);
279 hr = IObjMgr_Append(mgr, (IUnknown *)&acl1->IACList_iface);
280 ok(hr == S_OK, "got 0x%08x\n", hr);
281 hr = IObjMgr_Append(mgr, (IUnknown *)&acl2->IACList_iface);
282 ok(hr == S_OK, "got 0x%08x\n", hr);
283 hr = IObjMgr_Append(mgr, NULL);
284 ok(hr == E_FAIL, "got 0x%08x\n", hr);
285 expect_str(obj, "a");
286 expect_str(obj, "c");
287 expect_str(obj, "e");
288 expect_str(obj, "a");
289 expect_str(obj, "b");
290 expect_str(obj, "d");
292
293 hr = IEnumString_Reset(obj);
294 ok(hr == S_OK, "got 0x%08x\n", hr);
295 ok(acl1->pos == 0, "acl1 not reset\n");
296 ok(acl2->pos == 0, "acl2 not reset\n");
297
298 hr = IACList_Expand(acl, exp);
299 ok(hr == S_OK, "got 0x%08x\n", hr);
300 ok(acl1->expcount == 1, "expcount - expected 1, got %d\n", acl1->expcount);
301 ok(acl2->expcount == 0 /* XP */ || acl2->expcount == 1 /* Vista */,
302 "expcount - expected 0 or 1, got %d\n", acl2->expcount);
303
304 hr = IEnumString_Next(obj, 15, wstrtab, &i);
305 ok(hr == S_OK, "got 0x%08x\n", hr);
306 ok(i == 1, "Expected i == 1, got %d\n", i);
307 CoTaskMemFree(wstrtab[0]);
308
309 hr = IEnumString_Next(obj, 15, wstrtab, &i);
310 ok(hr == S_OK, "got 0x%08x\n", hr);
311 CoTaskMemFree(wstrtab[0]);
312
313 hr = IEnumString_Next(obj, 15, wstrtab, &i);
314 ok(hr == S_OK, "got 0x%08x\n", hr);
315 CoTaskMemFree(wstrtab[0]);
316
317 hr = IEnumString_Next(obj, 15, wstrtab, &i);
318 ok(hr == S_OK, "got 0x%08x\n", hr);
319 CoTaskMemFree(wstrtab[0]);
320
321 hr = IACList_Expand(acl, exp);
322 ok(hr == S_OK, "got 0x%08x\n", hr);
323 ok(acl1->expcount == 2, "expcount - expected 1, got %d\n", acl1->expcount);
324 ok(acl2->expcount == 0 /* XP */ || acl2->expcount == 2 /* Vista */,
325 "expcount - expected 0 or 2, got %d\n", acl2->expcount);
326 acl1->expret = S_FALSE;
327 hr = IACList_Expand(acl, exp);
328 ok(hr == S_OK, "got 0x%08x\n", hr);
329 ok(acl1->expcount == 3, "expcount - expected 1, got %d\n", acl1->expcount);
330 ok(acl2->expcount == 1 /* XP */ || acl2->expcount == 3 /* Vista */,
331 "expcount - expected 0 or 3, got %d\n", acl2->expcount);
332 acl1->expret = E_NOTIMPL;
333 hr = IACList_Expand(acl, exp);
334 ok(hr == S_OK, "got 0x%08x\n", hr);
335 ok(acl1->expcount == 4, "expcount - expected 1, got %d\n", acl1->expcount);
336 ok(acl2->expcount == 2 /* XP */ || acl2->expcount == 4 /* Vista */,
337 "expcount - expected 0 or 4, got %d\n", acl2->expcount);
338 acl2->expret = E_OUTOFMEMORY;
339 hr = IACList_Expand(acl, exp);
340 ok(hr == E_OUTOFMEMORY, "got 0x%08x\n", hr);
341 acl2->expret = E_FAIL;
342 hr = IACList_Expand(acl, exp);
343 ok(hr == E_FAIL, "got 0x%08x\n", hr);
344
345 hr = IObjMgr_Remove(mgr, (IUnknown *)&acl1->IACList_iface);
346 ok(hr == S_OK, "got 0x%08x\n", hr);
347
348 ok(acl1->ref == 1, "acl1 not released\n");
350 IEnumString_Reset(obj);
351 expect_str(obj, "a");
352 expect_str(obj, "b");
353 expect_str(obj, "d");
355
356 IEnumString_Release(obj);
357 IACList_Release(acl);
358 ref = IObjMgr_Release(mgr);
359 ok(ref == 0, "Unexpected references\n");
360 ok(acl1->ref == 1, "acl1 not released\n");
361 ok(acl2->ref == 1, "acl2 not released\n");
362
363 CoTaskMemFree(acl1);
364 CoTaskMemFree(acl2);
365}
366
367static void test_ACListISF(void)
368{
369 IEnumString *enumstring;
370 IACList *list, *list2;
371 HRESULT hr;
372
373 hr = CoCreateInstance(&CLSID_ACListISF, NULL, CLSCTX_INPROC, &IID_IACList, (void**)&list);
374 ok(hr == S_OK, "failed to create ACListISF instance, 0x%08x\n", hr);
375
376 hr = IACList_QueryInterface(list, &IID_IEnumString, (void**)&enumstring);
377 ok(hr == S_OK, "got 0x%08x\n", hr);
378
379 hr = IEnumString_QueryInterface(enumstring, &IID_IACList, (void**)&list2);
380 ok(hr == S_OK, "got 0x%08x\n", hr);
381 ok(list == list2, "got %p, %p\n", list, list2);
382 IACList_Release(list2);
383
384 IEnumString_Release(enumstring);
386}
387
388START_TEST(autocomplete)
389{
391
394
396}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
const GUID IID_IUnknown
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
static HRESULT STDMETHODCALLTYPE TestACL_ACList_QueryInterface(IACList *iface, REFIID iid, LPVOID *ppvout)
Definition: autocomplete.c:200
static void test_ACLMulti(void)
Definition: autocomplete.c:226
static ULONG STDMETHODCALLTYPE TestACL_ACList_Release(IACList *iface)
Definition: autocomplete.c:194
static HRESULT STDMETHODCALLTYPE TestACL_Clone(IEnumString *iface, IEnumString **out)
Definition: autocomplete.c:154
#define expect_end(obj)
Definition: autocomplete.c:223
static LPWSTR strdup_AtoW(LPCSTR str)
Definition: autocomplete.c:40
#define expect_str(obj, str)
Definition: autocomplete.c:215
IEnumStringVtbl TestACLVtbl
Definition: autocomplete.c:176
static ULONG STDMETHODCALLTYPE TestACL_ACList_AddRef(IACList *iface)
Definition: autocomplete.c:188
static TestACL * TestACL_Constructor(int limit, const char **strings)
Definition: autocomplete.c:73
static TestACL * impl_from_IACList(IACList *iface)
Definition: autocomplete.c:68
static HRESULT STDMETHODCALLTYPE TestACL_Skip(IEnumString *iface, ULONG celt)
Definition: autocomplete.c:148
IACListVtbl TestACL_ACListVtbl
Definition: autocomplete.c:206
static HRESULT STDMETHODCALLTYPE TestACL_Reset(IEnumString *iface)
Definition: autocomplete.c:160
static HRESULT STDMETHODCALLTYPE TestACL_QueryInterface(IEnumString *iface, REFIID iid, LPVOID *ppvOut)
Definition: autocomplete.c:103
static HRESULT STDMETHODCALLTYPE TestACL_Expand(IACList *iface, LPCOLESTR str)
Definition: autocomplete.c:168
static ULONG STDMETHODCALLTYPE TestACL_Release(IEnumString *iface)
Definition: autocomplete.c:93
static HRESULT STDMETHODCALLTYPE TestACL_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched)
Definition: autocomplete.c:127
static void test_ACListISF(void)
Definition: autocomplete.c:367
static TestACL * impl_from_IEnumString(IEnumString *iface)
Definition: autocomplete.c:63
static ULONG STDMETHODCALLTYPE TestACL_AddRef(IEnumString *iface)
Definition: autocomplete.c:86
Definition: list.h:37
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
GLsizeiptr size
Definition: glext.h:5919
GLuint res
Definition: glext.h:9613
GLsizei const GLchar *const * strings
Definition: glext.h:7622
GLint limit
Definition: glext.h:10326
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
#define S_OK
Definition: intsafe.h:52
#define todo_wine
Definition: custom.c:89
static LPOLESTR
Definition: stg_prop.c:27
DWORD exp
Definition: msg.c:16058
unsigned int UINT
Definition: ndis.h:50
const GUID IID_IEnumString
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
static FILE * out
Definition: regtests2xml.c:44
#define list
Definition: rosglue.h:35
const WCHAR * str
#define win_skip
Definition: test.h:163
HRESULT hr
Definition: shlfolder.c:183
#define IObjMgr_Append(p, a)
Definition: shlobj.h:760
#define IObjMgr_Remove(p, a)
Definition: shlobj.h:761
#define IACList_Expand(p, a)
Definition: shlobj.h:807
#define IACList_Release(p)
Definition: shlobj.h:805
#define IACList_QueryInterface(p, a, b)
Definition: shlobj.h:803
#define IObjMgr_Release(p)
Definition: shlobj.h:758
IEnumString IEnumString_iface
Definition: autocomplete.c:50
LONG ref
Definition: autocomplete.c:52
HRESULT expret
Definition: autocomplete.c:53
IACList IACList_iface
Definition: autocomplete.c:51
INT limit
Definition: autocomplete.c:56
INT expcount
Definition: autocomplete.c:54
const char ** data
Definition: autocomplete.c:57
Definition: send.c:48
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define ZeroMemory
Definition: winbase.h:1712
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184