ReactOS  0.4.14-dev-583-g2a1ba2c
autocomplete.c
Go to the documentation of this file.
1 /*
2  * Tests for autocomplete
3  *
4  * Copyright 2008 Jan de Mooij
5  *
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.
10  *
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.
15  *
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
19  */
20 
21 #define COBJMACROS
22 
23 #include <stdarg.h>
24 
25 #include "windows.h"
26 #include "shobjidl.h"
27 #include "shlguid.h"
28 #include "shldisp.h"
29 #include "shlobj.h"
30 
31 #include "wine/heap.h"
32 #include "wine/test.h"
33 
36 static int killfocus_count;
37 
38 static void test_invalid_init(void)
39 {
40  HRESULT hr;
41  IAutoComplete *ac;
42  IUnknown *acSource;
43  HWND edit_control;
44 
45  /* AutoComplete instance */
46  hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,
47  &IID_IAutoComplete, (void **)&ac);
48  if (hr == REGDB_E_CLASSNOTREG)
49  {
50  win_skip("CLSID_AutoComplete is not registered\n");
51  return;
52  }
53  ok(hr == S_OK, "no IID_IAutoComplete (0x%08x)\n", hr);
54 
55  /* AutoComplete source */
56  hr = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER,
57  &IID_IACList, (void **)&acSource);
58  if (hr == REGDB_E_CLASSNOTREG)
59  {
60  win_skip("CLSID_ACLMulti is not registered\n");
61  IAutoComplete_Release(ac);
62  return;
63  }
64  ok(hr == S_OK, "no IID_IACList (0x%08x)\n", hr);
65 
66  edit_control = CreateWindowExA(0, "EDIT", "Some text", 0, 10, 10, 300, 300,
67  hMainWnd, NULL, hinst, NULL);
68  ok(edit_control != NULL, "Can't create edit control\n");
69 
70  /* The refcount of acSource would be incremented on older Windows. */
71  hr = IAutoComplete_Init(ac, NULL, acSource, NULL, NULL);
72  ok(hr == E_INVALIDARG ||
73  broken(hr == S_OK), /* Win2k/XP/Win2k3 */
74  "Init returned 0x%08x\n", hr);
75  if (hr == E_INVALIDARG)
76  {
77  LONG ref;
78 
79  IUnknown_AddRef(acSource);
80  ref = IUnknown_Release(acSource);
81  ok(ref == 1, "Expected AutoComplete source refcount to be 1, got %d\n", ref);
82  }
83 
84 if (0)
85 {
86  /* Older Windows versions never check the window handle, while newer
87  * versions only check for NULL. Subsequent attempts to initialize the
88  * object after this call succeeds would fail, because initialization
89  * state is determined by whether a non-NULL window handle is stored. */
90  hr = IAutoComplete_Init(ac, (HWND)0xdeadbeef, acSource, NULL, NULL);
91  ok(hr == S_OK, "Init returned 0x%08x\n", hr);
92 
93  /* Tests crash on older Windows. */
94  hr = IAutoComplete_Init(ac, NULL, NULL, NULL, NULL);
95  ok(hr == E_INVALIDARG, "Init returned 0x%08x\n", hr);
96 
97  hr = IAutoComplete_Init(ac, edit_control, NULL, NULL, NULL);
98  ok(hr == E_INVALIDARG, "Init returned 0x%08x\n", hr);
99 }
100 
101  /* bind to edit control */
102  hr = IAutoComplete_Init(ac, edit_control, acSource, NULL, NULL);
103  ok(hr == S_OK, "Init returned 0x%08x\n", hr);
104 
105  /* try invalid parameters after successful initialization .*/
106  hr = IAutoComplete_Init(ac, NULL, NULL, NULL, NULL);
107  ok(hr == E_INVALIDARG ||
108  hr == E_FAIL, /* Win2k/XP/Win2k3 */
109  "Init returned 0x%08x\n", hr);
110 
111  hr = IAutoComplete_Init(ac, NULL, acSource, NULL, NULL);
112  ok(hr == E_INVALIDARG ||
113  hr == E_FAIL, /* Win2k/XP/Win2k3 */
114  "Init returned 0x%08x\n", hr);
115 
116  hr = IAutoComplete_Init(ac, edit_control, NULL, NULL, NULL);
117  ok(hr == E_INVALIDARG ||
118  hr == E_FAIL, /* Win2k/XP/Win2k3 */
119  "Init returned 0x%08x\n", hr);
120 
121  /* try initializing twice on the same control */
122  hr = IAutoComplete_Init(ac, edit_control, acSource, NULL, NULL);
123  ok(hr == E_FAIL, "Init returned 0x%08x\n", hr);
124 
125  /* try initializing with a different control */
126  hr = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL);
127  ok(hr == E_FAIL, "Init returned 0x%08x\n", hr);
128 
129  DestroyWindow(edit_control);
130 
131  /* try initializing with a different control after
132  * destroying the original initialization control */
133  hr = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL);
134  ok(hr == E_UNEXPECTED ||
135  hr == E_FAIL, /* Win2k/XP/Win2k3 */
136  "Init returned 0x%08x\n", hr);
137 
138  IUnknown_Release(acSource);
139  IAutoComplete_Release(ac);
140 }
142 {
143  HRESULT r;
144  IAutoComplete *ac, *ac2;
145  IUnknown *acSource;
146  LONG_PTR user_data;
147 
148  /* AutoComplete instance */
149  r = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,
150  &IID_IAutoComplete, (LPVOID*)&ac);
151  if (r == REGDB_E_CLASSNOTREG)
152  {
153  win_skip("CLSID_AutoComplete is not registered\n");
154  return NULL;
155  }
156  ok(r == S_OK, "no IID_IAutoComplete (0x%08x)\n", r);
157 
158  /* AutoComplete source */
159  r = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER,
160  &IID_IACList, (LPVOID*)&acSource);
161  if (r == REGDB_E_CLASSNOTREG)
162  {
163  win_skip("CLSID_ACLMulti is not registered\n");
164  IAutoComplete_Release(ac);
165  return NULL;
166  }
167  ok(r == S_OK, "no IID_IACList (0x%08x)\n", r);
168 
169  user_data = GetWindowLongPtrA(hEdit, GWLP_USERDATA);
170  ok(user_data == 0, "Expected the edit control user data to be zero\n");
171 
172  /* bind to edit control */
173  r = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL);
174  ok(r == S_OK, "Init returned 0x%08x\n", r);
175 
176  user_data = GetWindowLongPtrA(hEdit, GWLP_USERDATA);
177  ok(user_data == 0, "Expected the edit control user data to be zero\n");
178 
179  /* bind a different object to the same edit control */
180  r = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER,
181  &IID_IAutoComplete, (LPVOID*)&ac2);
182  ok(r == S_OK, "no IID_IAutoComplete (0x%08x)\n", r);
183 
184  r = IAutoComplete_Init(ac2, hEdit, acSource, NULL, NULL);
185  ok(r == S_OK, "Init returned 0x%08x\n", r);
186  IAutoComplete_Release(ac2);
187 
188  IUnknown_Release(acSource);
189 
190  return ac;
191 }
192 
193 static void test_killfocus(void)
194 {
195  /* Test if WM_KILLFOCUS messages are handled properly by checking if
196  * the parent receives an EN_KILLFOCUS message. */
197  SetFocus(hEdit);
198  killfocus_count = 0;
199  SetFocus(0);
200  ok(killfocus_count == 1, "Expected one EN_KILLFOCUS message, got: %d\n", killfocus_count);
201 }
202 
204 {
205  switch(msg) {
206  case WM_CREATE:
207  /* create edit control */
208  hEdit = CreateWindowExA(0, "EDIT", "Some text", 0, 10, 10, 300, 300,
209  hWnd, NULL, hinst, NULL);
210  ok(hEdit != NULL, "Can't create edit control\n");
211  break;
212  case WM_COMMAND:
213  if(HIWORD(wParam) == EN_KILLFOCUS)
214  killfocus_count++;
215  break;
216  }
217  return DefWindowProcA(hWnd, msg, wParam, lParam);
218 }
219 
220 static void createMainWnd(void)
221 {
222  WNDCLASSA wc;
223  wc.style = CS_HREDRAW | CS_VREDRAW;
224  wc.cbClsExtra = 0;
225  wc.cbWndExtra = 0;
227  wc.hIcon = NULL;
230  wc.lpszMenuName = NULL;
231  wc.lpszClassName = "MyTestWnd";
232  wc.lpfnWndProc = MyWndProc;
233  RegisterClassA(&wc);
234 
235  hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW,
237 }
238 
240 static const WCHAR HijackerWndProc_txt[] = {'H','i','j','a','c','k','e','d',0};
242 {
243  switch(msg) {
244  case WM_GETTEXT:
245  {
247  memcpy((void*)lParam, HijackerWndProc_txt, len * sizeof(WCHAR));
248  return len;
249  }
250  case WM_GETTEXTLENGTH:
251  return ARRAY_SIZE(HijackerWndProc_txt) - 1;
252  }
254 }
255 
257 {
258  switch(msg) {
259  case EM_SETSEL:
260  lParam = wParam;
261  break;
262  case WM_SETTEXT:
264  break;
265  }
267 }
268 
270 {
272  IACList IACList_iface;
275  int data_len;
276  int cur;
280 };
281 
283 {
285 }
286 
288 {
289  struct string_enumerator *this = impl_from_IEnumString(iface);
291  *ppv = &this->IEnumString_iface;
292  else if (IsEqualGUID(riid, &IID_IACList))
293  *ppv = &this->IACList_iface;
294  else
295  {
296  *ppv = NULL;
297  return E_NOINTERFACE;
298  }
299 
300  IUnknown_AddRef(&this->IEnumString_iface);
301  return S_OK;
302 }
303 
305 {
306  struct string_enumerator *this = impl_from_IEnumString(iface);
307 
308  ULONG ref = InterlockedIncrement(&this->ref);
309 
310  return ref;
311 }
312 
314 {
315  struct string_enumerator *this = impl_from_IEnumString(iface);
316 
317  ULONG ref = InterlockedDecrement(&this->ref);
318 
319  if (!ref)
320  heap_free(this);
321 
322  return ref;
323 }
324 
326 {
327  struct string_enumerator *this = impl_from_IEnumString(iface);
328  int i, len;
329 
330  *num_returned = 0;
331  for (i = 0; i < num; i++)
332  {
333  if (this->cur >= this->data_len)
334  return S_FALSE;
335 
336  len = lstrlenW(this->data[this->cur]) + 1;
337 
338  strings[i] = CoTaskMemAlloc(len * sizeof(WCHAR));
339  memcpy(strings[i], this->data[this->cur], len * sizeof(WCHAR));
340 
341  (*num_returned)++;
342  this->cur++;
343  }
344 
345  return S_OK;
346 }
347 
349 {
350  struct string_enumerator *this = impl_from_IEnumString(iface);
351 
352  this->cur = 0;
353  this->num_resets++;
354 
355  return S_OK;
356 }
357 
359 {
360  struct string_enumerator *this = impl_from_IEnumString(iface);
361 
362  this->cur += num;
363 
364  return S_OK;
365 }
366 
368 {
369  *out = NULL;
370  return E_NOTIMPL;
371 }
372 
373 static IEnumStringVtbl string_enumerator_vtbl =
374 {
382 };
383 
384 static struct string_enumerator *impl_from_IACList(IACList *iface)
385 {
386  return CONTAINING_RECORD(iface, struct string_enumerator, IACList_iface);
387 }
388 
389 static HRESULT WINAPI aclist_QueryInterface(IACList *iface, REFIID riid, void **ppv)
390 {
392 }
393 
394 static ULONG WINAPI aclist_AddRef(IACList *iface)
395 {
397 }
398 
399 static ULONG WINAPI aclist_Release(IACList *iface)
400 {
402 }
403 
404 static HRESULT WINAPI aclist_Expand(IACList *iface, const WCHAR *expand)
405 {
406  struct string_enumerator *this = impl_from_IACList(iface);
407 
408  /* see what we get called with and how many times,
409  don't actually do any expansion of the strings */
410  memcpy(this->last_expand, expand, min((lstrlenW(expand) + 1)*sizeof(WCHAR), sizeof(this->last_expand)));
411  this->last_expand[ARRAY_SIZE(this->last_expand) - 1] = '\0';
412  this->num_expand++;
413 
414  return S_OK;
415 }
416 
417 static IACListVtbl aclist_vtbl =
418 {
423 };
424 
425 static HRESULT string_enumerator_create(void **ppv, WCHAR **suggestions, int count)
426 {
427  struct string_enumerator *object;
428 
429  object = heap_alloc_zero(sizeof(*object));
430  object->IEnumString_iface.lpVtbl = &string_enumerator_vtbl;
431  object->IACList_iface.lpVtbl = &aclist_vtbl;
432  object->ref = 1;
433  object->data = suggestions;
434  object->data_len = count;
435  object->cur = 0;
436 
437  *ppv = &object->IEnumString_iface;
438 
439  return S_OK;
440 }
441 
442 static void dispatch_messages(void)
443 {
444  MSG msg;
445  Sleep(33);
446  while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
447  {
450  }
451 }
452 
453 #define check_dropdown(acdropdown, hwnd_edit, list, list_num) check_dropdown_(__FILE__, __LINE__, acdropdown, hwnd_edit, list, list_num)
454 static void check_dropdown_(const char *file, UINT line, IAutoCompleteDropDown *acdropdown, HWND hwnd_edit, WCHAR **list, UINT list_num)
455 {
456  UINT i;
457  DWORD flags = 0;
458  LPWSTR str;
459  HRESULT hr;
460 
461  hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, &str);
462  ok_(file, line)(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
463  if (hr != S_OK) return;
464  if (list_num) ok_(file, line)(flags & ACDD_VISIBLE, "AutoComplete DropDown not visible\n");
465  else
466  {
467  ok_(file, line)(!(flags & ACDD_VISIBLE), "AutoComplete DropDown visible\n");
468  return;
469  }
470  ok_(file, line)(str == NULL, "Expected (null), got %s\n", wine_dbgstr_w(str));
471  if (str)
472  {
474  return;
475  }
476 
477  for (i = 0; i <= list_num; i++)
478  {
479  flags = 0;
480  SendMessageW(hwnd_edit, WM_KEYDOWN, VK_DOWN, 0);
481  SendMessageW(hwnd_edit, WM_KEYUP, VK_DOWN, 0xc0000000);
482  hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, &str);
483  ok_(file, line)(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
484  ok_(file, line)(flags & ACDD_VISIBLE, "AutoComplete DropDown not visible\n");
485  if (hr == S_OK)
486  {
487  if (i < list_num)
488  ok_(file, line)(str && !lstrcmpW(list[i], str), "Expected %s, got %s\n",
490  else
491  ok_(file, line)(str == NULL, "Expected (null), got %s\n", wine_dbgstr_w(str));
492  }
494  }
495 }
496 
497 static void test_aclist_expand(HWND hwnd_edit, void *enumerator, IAutoCompleteDropDown *acdropdown)
498 {
499  struct string_enumerator *obj = (struct string_enumerator*)enumerator;
500  static WCHAR str1[] = {'t','e','s','t',0};
501  static WCHAR str1a[] = {'t','e','s','t','\\',0};
502  static WCHAR str2[] = {'t','e','s','t','\\','f','o','o','\\','b','a','r','\\','b','a',0};
503  static WCHAR str2a[] = {'t','e','s','t','\\','f','o','o','\\','b','a','r','\\',0};
504  static WCHAR str2b[] = {'t','e','s','t','\\','f','o','o','\\','b','a','r','\\','b','a','z','_','b','b','q','\\',0};
505  HRESULT hr;
506  obj->num_resets = 0;
507 
508  ok(obj->num_expand == 0, "Expected 0 expansions, got %u\n", obj->num_expand);
509  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str1);
510  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1) - 1, ARRAY_SIZE(str1) - 1);
511  SendMessageW(hwnd_edit, WM_CHAR, '\\', 1);
513  ok(obj->num_expand == 1, "Expected 1 expansion, got %u\n", obj->num_expand);
514  ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
515  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
516  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str2);
517  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str2) - 1, ARRAY_SIZE(str2) - 1);
518  SendMessageW(hwnd_edit, WM_CHAR, 'z', 1);
520  ok(obj->num_expand == 2, "Expected 2 expansions, got %u\n", obj->num_expand);
521  ok(lstrcmpW(obj->last_expand, str2a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str2a), wine_dbgstr_w(obj->last_expand));
522  ok(obj->num_resets == 2, "Expected 2 resets, got %u\n", obj->num_resets);
523  SetFocus(hwnd_edit);
524  SendMessageW(hwnd_edit, WM_CHAR, '_', 1);
525  SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
526  SetFocus(0);
527  SetFocus(hwnd_edit);
528  SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
529  SendMessageW(hwnd_edit, WM_CHAR, 'q', 1);
531  ok(obj->num_expand == 2, "Expected 2 expansions, got %u\n", obj->num_expand);
532  ok(obj->num_resets == 2, "Expected 2 resets, got %u\n", obj->num_resets);
533  SendMessageW(hwnd_edit, WM_CHAR, '\\', 1);
535  ok(obj->num_expand == 3, "Expected 3 expansions, got %u\n", obj->num_expand);
536  ok(lstrcmpW(obj->last_expand, str2b) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str2b), wine_dbgstr_w(obj->last_expand));
537  ok(obj->num_resets == 3, "Expected 3 resets, got %u\n", obj->num_resets);
538  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1a) - 1, -1);
539  SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
540  SendMessageW(hwnd_edit, WM_CHAR, 'y', 1);
542  ok(obj->num_expand == 4, "Expected 4 expansions, got %u\n", obj->num_expand);
543  ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
544  ok(obj->num_resets == 4, "Expected 4 resets, got %u\n", obj->num_resets);
545  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1) - 1, -1);
546  SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
548  ok(obj->num_expand == 4, "Expected 4 expansions, got %u\n", obj->num_expand);
549  ok(obj->num_resets == 5, "Expected 5 resets, got %u\n", obj->num_resets);
550  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str1a);
551  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(str1a) - 1, ARRAY_SIZE(str1a) - 1);
552  SendMessageW(hwnd_edit, WM_CHAR, 'f', 1);
554  ok(obj->num_expand == 5, "Expected 5 expansions, got %u\n", obj->num_expand);
555  ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
556  ok(obj->num_resets == 6, "Expected 6 resets, got %u\n", obj->num_resets);
557  hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
558  ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
559  SendMessageW(hwnd_edit, WM_CHAR, 'o', 1);
561  ok(obj->num_expand == 6, "Expected 6 expansions, got %u\n", obj->num_expand);
562  ok(lstrcmpW(obj->last_expand, str1a) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1a), wine_dbgstr_w(obj->last_expand));
563  ok(obj->num_resets == 7, "Expected 7 resets, got %u\n", obj->num_resets);
564 }
565 
566 static void test_prefix_filtering(HWND hwnd_edit)
567 {
568  static WCHAR htt[] = {'h','t','t',0};
569  static WCHAR www[] = {'w','w','w','.',0};
570  static WCHAR str0[] = {'w','w','w','.','a','x',0};
571  static WCHAR str1[] = {'h','t','t','p','s',':','/','/','w','w','w','.','a','c',0};
572  static WCHAR str2[] = {'a','a',0};
573  static WCHAR str3[] = {'a','b',0};
574  static WCHAR str4[] = {'h','t','t','p',':','/','/','a','0',0};
575  static WCHAR str5[] = {'h','t','t','p','s',':','/','/','h','t','a',0};
576  static WCHAR str6[] = {'h','f','o','o',0};
577  static WCHAR str7[] = {'h','t','t','p',':','/','/','w','w','w','.','a','d','d',0};
578  static WCHAR str8[] = {'w','w','w','.','w','w','w','.','?',0};
579  static WCHAR str9[] = {'h','t','t','p',':','/','/','a','b','c','.','a','a','.','c','o','m',0};
580  static WCHAR str10[]= {'f','t','p',':','/','/','a','b','c',0};
581  static WCHAR str11[]= {'f','i','l','e',':','/','/','a','a',0};
582  static WCHAR str12[]= {'f','t','p',':','/','/','w','w','w','.','a','a',0};
583  static WCHAR *suggestions[] = { str0, str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12 };
584  static WCHAR *sorted1[] = { str4, str2, str3, str9, str1, str7, str0 };
585  static WCHAR *sorted2[] = { str3, str9 };
586  static WCHAR *sorted3[] = { str1, str7, str0 };
587  static WCHAR *sorted4[] = { str6, str5 };
588  static WCHAR *sorted5[] = { str5 };
589  static WCHAR *sorted6[] = { str4, str9 };
590  static WCHAR *sorted7[] = { str11, str10, str12 };
591  IUnknown *enumerator;
592  IAutoComplete2 *autocomplete;
593  IAutoCompleteDropDown *acdropdown;
594  WCHAR buffer[20];
595  HRESULT hr;
596 
597  hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, &IID_IAutoComplete2, (void**)&autocomplete);
598  ok(hr == S_OK, "CoCreateInstance failed: %x\n", hr);
599 
600  hr = IAutoComplete2_QueryInterface(autocomplete, &IID_IAutoCompleteDropDown, (LPVOID*)&acdropdown);
601  ok(hr == S_OK, "No IAutoCompleteDropDown interface: %x\n", hr);
602 
603  string_enumerator_create((void**)&enumerator, suggestions, ARRAY_SIZE(suggestions));
604 
605  hr = IAutoComplete2_SetOptions(autocomplete, ACO_FILTERPREFIXES | ACO_AUTOSUGGEST | ACO_AUTOAPPEND);
606  ok(hr == S_OK, "IAutoComplete2_SetOptions failed: %x\n", hr);
607  hr = IAutoComplete2_Init(autocomplete, hwnd_edit, enumerator, NULL, NULL);
608  ok(hr == S_OK, "IAutoComplete_Init failed: %x\n", hr);
609 
610  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
611  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
614  ok(lstrcmpW(str4 + 7, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str4 + 7), wine_dbgstr_w(buffer));
615  check_dropdown(acdropdown, hwnd_edit, sorted1, ARRAY_SIZE(sorted1));
616 
617  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
618  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
619  SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
622  ok(lstrcmpW(str3, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str3), wine_dbgstr_w(buffer));
623  check_dropdown(acdropdown, hwnd_edit, sorted2, ARRAY_SIZE(sorted2));
624  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
625  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
626  SendMessageW(hwnd_edit, WM_CHAR, 'b', 1);
627  SendMessageW(hwnd_edit, WM_CHAR, 'c', 1);
630  ok(lstrcmpW(str9 + 7, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str9 + 7), wine_dbgstr_w(buffer));
631 
632  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)www);
633  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(www) - 1, ARRAY_SIZE(www) - 1);
634  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
637  ok(lstrcmpW(str1 + 8, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str1 + 8), wine_dbgstr_w(buffer));
638  check_dropdown(acdropdown, hwnd_edit, sorted3, ARRAY_SIZE(sorted3));
639  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)www);
640  SendMessageW(hwnd_edit, EM_SETSEL, ARRAY_SIZE(www) - 1, ARRAY_SIZE(www) - 1);
641  SendMessageW(hwnd_edit, WM_CHAR, 'w', 1);
644  ok(lstrcmpW(str8, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str8), wine_dbgstr_w(buffer));
645 
646  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
647  SendMessageW(hwnd_edit, WM_CHAR, 'h', 1);
650  ok(lstrcmpW(str6, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str6), wine_dbgstr_w(buffer));
651  check_dropdown(acdropdown, hwnd_edit, sorted4, ARRAY_SIZE(sorted4));
652  SendMessageW(hwnd_edit, WM_CHAR, 't', 1);
654  ok(lstrcmpW(str5 + 8, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str5 + 8), wine_dbgstr_w(buffer));
655  check_dropdown(acdropdown, hwnd_edit, sorted5, ARRAY_SIZE(sorted5));
656  SendMessageW(hwnd_edit, WM_CHAR, 't', 1);
658  ok(lstrcmpW(htt, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(htt), wine_dbgstr_w(buffer));
659  check_dropdown(acdropdown, hwnd_edit, NULL, 0);
660  SendMessageW(hwnd_edit, WM_CHAR, 'p', 1);
661  SendMessageW(hwnd_edit, WM_CHAR, ':', 1);
662  SendMessageW(hwnd_edit, WM_CHAR, '/', 1);
663  SendMessageW(hwnd_edit, WM_CHAR, '/', 1);
664  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
667  ok(lstrcmpW(str4, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str4), wine_dbgstr_w(buffer));
668  check_dropdown(acdropdown, hwnd_edit, sorted6, ARRAY_SIZE(sorted6));
669  SendMessageW(hwnd_edit, EM_SETSEL, 0, 2);
670  SendMessageW(hwnd_edit, WM_CHAR, 'H', 1);
672  check_dropdown(acdropdown, hwnd_edit, NULL, 0);
673  SendMessageW(hwnd_edit, WM_CHAR, 't', 1);
675  check_dropdown(acdropdown, hwnd_edit, sorted6, ARRAY_SIZE(sorted6));
676 
677  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
678  SendMessageW(hwnd_edit, WM_CHAR, 'F', 1);
681  check_dropdown(acdropdown, hwnd_edit, sorted7, ARRAY_SIZE(sorted7));
682  SendMessageW(hwnd_edit, WM_CHAR, 'i', 1);
683  SendMessageW(hwnd_edit, WM_CHAR, 'L', 1);
685  check_dropdown(acdropdown, hwnd_edit, sorted7, 1);
686 
687  IAutoCompleteDropDown_Release(acdropdown);
688  IAutoComplete2_Release(autocomplete);
689  IUnknown_Release(enumerator);
690 }
691 
692 static void test_custom_source(void)
693 {
694  static WCHAR str_alpha[] = {'t','e','s','t','1',0};
695  static WCHAR str_alpha2[] = {'t','e','s','t','2',0};
696  static WCHAR str_beta[] = {'a','u','t','o',' ','c','o','m','p','l','e','t','e',0};
697  static WCHAR str_au[] = {'a','u',0};
698  static WCHAR str_aut[] = {'a','u','t',0};
699  static WCHAR *suggestions[] = { str_alpha, str_alpha2, str_beta };
700  struct string_enumerator *obj;
701  IUnknown *enumerator;
702  IAutoComplete2 *autocomplete;
703  IAutoCompleteDropDown *acdropdown;
704  HWND hwnd_edit;
705  DWORD flags = 0;
706  WCHAR buffer[20];
707  HRESULT hr;
708 
710 
711  hwnd_edit = CreateWindowA("Edit", "", WS_OVERLAPPED | WS_VISIBLE | WS_CHILD | WS_BORDER, 50, 5, 200, 20, hMainWnd, 0, NULL, 0);
712 
713  hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, &IID_IAutoComplete2, (void**)&autocomplete);
714  ok(hr == S_OK, "CoCreateInstance failed: %x\n", hr);
715 
716  hr = IAutoComplete2_QueryInterface(autocomplete, &IID_IAutoCompleteDropDown, (LPVOID*)&acdropdown);
717  ok(hr == S_OK, "No IAutoCompleteDropDown interface: %x\n", hr);
718 
719  string_enumerator_create((void**)&enumerator, suggestions, ARRAY_SIZE(suggestions));
720  obj = (struct string_enumerator*)enumerator;
721 
722  hr = IAutoComplete2_SetOptions(autocomplete, ACO_AUTOSUGGEST | ACO_AUTOAPPEND);
723  ok(hr == S_OK, "IAutoComplete2_SetOptions failed: %x\n", hr);
724  hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
725  ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
726  hr = IAutoComplete2_Init(autocomplete, hwnd_edit, enumerator, NULL, NULL);
727  ok(hr == S_OK, "IAutoComplete_Init failed: %x\n", hr);
728 
729  SetFocus(hwnd_edit);
730  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
731  SendMessageW(hwnd_edit, WM_CHAR, 'u', 1);
734  ok(lstrcmpW(str_beta, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_beta), wine_dbgstr_w(buffer));
735  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
736  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
737  SendMessageW(hwnd_edit, WM_CHAR, '\b', 1);
740  ok(buffer[0] == '\0', "Expected empty string, got %s\n", wine_dbgstr_w(buffer));
741  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
742  hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
743  ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
744  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
745  obj->num_resets = 0;
746 
747  /* hijack the window procedure */
751 
752  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
753  SendMessageW(hwnd_edit, WM_CHAR, 'u', 1);
757  ok(lstrcmpW(str_au, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_au), wine_dbgstr_w(buffer));
758  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
759  SendMessageW(hwnd_edit, EM_SETSEL, 0, -1);
760  SendMessageW(hwnd_edit, WM_CHAR, '\b', 1);
763  ok(buffer[0] == '\0', "Expected empty string, got %s\n", wine_dbgstr_w(buffer));
764  hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
765  ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
766 
768  SendMessageW(hwnd_edit, WM_CHAR, 'a', 1);
769  SendMessageW(hwnd_edit, WM_CHAR, 'u', 1);
773  ok(lstrcmpW(str_beta, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_beta), wine_dbgstr_w(buffer));
774  ok(obj->num_resets == 2, "Expected 2 resets, got %u\n", obj->num_resets);
775  /* end of hijacks */
776 
777  hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, NULL);
778  ok(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
779  ok(flags & ACDD_VISIBLE, "AutoComplete DropDown should be visible\n");
780  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str_au);
782  hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, NULL);
783  ok(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
784  ok(!(flags & ACDD_VISIBLE), "AutoComplete DropDown should have been hidden\n");
785  SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str_aut);
787  hr = IAutoCompleteDropDown_GetDropDownStatus(acdropdown, &flags, NULL);
788  ok(hr == S_OK, "IAutoCompleteDropDown_GetDropDownStatus failed: %x\n", hr);
789  ok(!(flags & ACDD_VISIBLE), "AutoComplete DropDown should be hidden\n");
791  ok(lstrcmpW(str_aut, buffer) == 0, "Expected %s, got %s\n", wine_dbgstr_w(str_aut), wine_dbgstr_w(buffer));
792 
793  test_aclist_expand(hwnd_edit, enumerator, acdropdown);
794  obj->num_resets = 0;
795 
796  hr = IAutoCompleteDropDown_ResetEnumerator(acdropdown);
797  ok(hr == S_OK, "IAutoCompleteDropDown_ResetEnumerator failed: %x\n", hr);
798  SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
800  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
801  SendMessageW(hwnd_edit, WM_CHAR, 'x', 1);
803  ok(obj->num_resets == 1, "Expected 1 reset, got %u\n", obj->num_resets);
804 
805  IAutoCompleteDropDown_Release(acdropdown);
806  IAutoComplete2_Release(autocomplete);
807  IUnknown_Release(enumerator);
808 
809  test_prefix_filtering(hwnd_edit);
810 
812  DestroyWindow(hwnd_edit);
813 }
814 
815 START_TEST(autocomplete)
816 {
817  HRESULT r;
818  MSG msg;
819  IAutoComplete* ac;
820  RECT win_rect;
821  POINT orig_pos;
822 
823  r = CoInitialize(NULL);
824  ok(r == S_OK, "CoInitialize failed (0x%08x). Tests aborted.\n", r);
825  if (r != S_OK)
826  return;
827 
828  createMainWnd();
829  ok(hMainWnd != NULL, "Failed to create parent window. Tests aborted.\n");
830  if (!hMainWnd) return;
831 
832  /* Move the cursor away from the dropdown listbox */
833  GetWindowRect(hMainWnd, &win_rect);
834  GetCursorPos(&orig_pos);
835  SetCursorPos(win_rect.left, win_rect.top);
836 
838  ac = test_init();
839  if (!ac)
840  goto cleanup;
841  test_killfocus();
842 
844 
845  PostQuitMessage(0);
846  while(GetMessageA(&msg,0,0,0)) {
849  }
850 
851  IAutoComplete_Release(ac);
852 
853 cleanup:
854  SetCursorPos(orig_pos.x, orig_pos.y);
857 
858  CoUninitialize();
859 }
static void createMainWnd(void)
Definition: autocomplete.c:220
#define WM_GETTEXTLENGTH
Definition: winuser.h:1601
static HRESULT WINAPI aclist_QueryInterface(IACList *iface, REFIID riid, void **ppv)
Definition: autocomplete.c:389
static HRESULT WINAPI string_enumerator_Next(IEnumString *iface, ULONG num, LPOLESTR *strings, ULONG *num_returned)
Definition: autocomplete.c:325
BOOL WINAPI TranslateMessage(_In_ const MSG *)
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define REFIID
Definition: guiddef.h:118
WCHAR last_expand[32]
Definition: autocomplete.c:279
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define E_NOINTERFACE
Definition: winerror.h:2364
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:420
long y
Definition: polytest.cpp:48
const GUID IID_IEnumString
#define WM_CHAR
Definition: winuser.h:1699
HRESULT hr
Definition: shlfolder.c:183
static void check_dropdown_(const char *file, UINT line, IAutoCompleteDropDown *acdropdown, HWND hwnd_edit, WCHAR **list, UINT list_num)
Definition: autocomplete.c:454
static struct string_enumerator * impl_from_IACList(IACList *iface)
Definition: autocomplete.c:384
long x
Definition: polytest.cpp:48
#define SW_HIDE
Definition: winuser.h:762
REFIID riid
Definition: precomp.h:44
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
GLuint GLuint GLsizei count
Definition: gl.h:1545
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WM_GETTEXT
Definition: winuser.h:1600
static IAutoComplete * test_init(void)
Definition: autocomplete.c:141
#define CALLBACK
Definition: compat.h:27
HWND hWnd
Definition: settings.c:17
REFIID LPVOID * ppv
Definition: atlbase.h:39
LONG top
Definition: windef.h:307
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
int cbClsExtra
Definition: winuser.h:3140
#define check_dropdown(acdropdown, hwnd_edit, list, list_num)
Definition: autocomplete.c:453
static struct string_enumerator * impl_from_IEnumString(IEnumString *iface)
Definition: autocomplete.c:282
#define CS_HREDRAW
Definition: winuser.h:648
LPCSTR lpszMenuName
Definition: winuser.h:3146
GLuint buffer
Definition: glext.h:5915
HWND WINAPI SetFocus(_In_opt_ HWND)
UINT_PTR WPARAM
Definition: windef.h:207
#define VK_DOWN
Definition: winuser.h:2202
HBRUSH hbrBackground
Definition: winuser.h:3145
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
char * LPSTR
Definition: xmlstorage.h:182
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2635
static LPOLESTR
Definition: stg_prop.c:27
#define lstrlenW
Definition: compat.h:415
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI DestroyWindow(_In_ HWND)
#define COLOR_WINDOW
Definition: winuser.h:908
static HINSTANCE hinst
Definition: autocomplete.c:35
Definition: send.c:47
WPARAM wParam
Definition: combotst.c:138
#define IDC_IBEAM
Definition: winuser.h:683
GLsizei GLsizei GLuint * obj
Definition: glext.h:6042
static LRESULT CALLBACK HijackerWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: autocomplete.c:241
static IACListVtbl aclist_vtbl
Definition: autocomplete.c:417
static void test_aclist_expand(HWND hwnd_edit, void *enumerator, IAutoCompleteDropDown *acdropdown)
Definition: autocomplete.c:497
int cbWndExtra
Definition: winuser.h:3141
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
#define EN_KILLFOCUS
Definition: winuser.h:2007
long LONG
Definition: pedump.c:60
GLenum GLint ref
Definition: glext.h:6028
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4290
HCURSOR hCursor
Definition: winuser.h:3144
#define CW_USEDEFAULT
Definition: winuser.h:225
#define S_FALSE
Definition: winerror.h:2357
#define GWLP_USERDATA
Definition: treelist.c:63
static void test_custom_source(void)
Definition: autocomplete.c:692
#define E_INVALIDARG
Definition: ddrawi.h:101
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
static ULONG WINAPI string_enumerator_Release(IEnumString *iface)
Definition: autocomplete.c:313
#define WM_KEYDOWN
Definition: winuser.h:1697
static LRESULT CALLBACK HijackerWndProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: autocomplete.c:256
LONG_PTR LPARAM
Definition: windef.h:208
Definition: parser.c:48
static ULONG WINAPI string_enumerator_AddRef(IEnumString *iface)
Definition: autocomplete.c:304
#define SW_SHOW
Definition: winuser.h:769
static BOOL expand(LPINT ac, LPTSTR **arg, LPCTSTR pattern)
Definition: misc.c:215
#define WM_SETTEXT
Definition: winuser.h:1599
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static HRESULT WINAPI string_enumerator_Reset(IEnumString *iface)
Definition: autocomplete.c:348
static HRESULT WINAPI aclist_Expand(IACList *iface, const WCHAR *expand)
Definition: autocomplete.c:404
#define GetWindowLongPtrA
Definition: winuser.h:4803
#define CS_VREDRAW
Definition: winuser.h:653
static IEnumStringVtbl string_enumerator_vtbl
Definition: autocomplete.c:373
static HRESULT WINAPI string_enumerator_Clone(IEnumString *iface, IEnumString **out)
Definition: autocomplete.c:367
static HWND hMainWnd
Definition: autocomplete.c:34
#define WS_OVERLAPPED
Definition: pedump.c:615
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static HRESULT WINAPI string_enumerator_QueryInterface(IEnumString *iface, REFIID riid, void **ppv)
Definition: autocomplete.c:287
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
#define EM_SETSEL
Definition: winuser.h:2000
#define WM_KEYUP
Definition: winuser.h:1698
BOOL WINAPI SetCursorPos(_In_ int, _In_ int)
Definition: cursoricon.c:2627
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint num
Definition: glext.h:9618
static WNDPROC HijackerWndProc_prev
Definition: autocomplete.c:239
static ULONG WINAPI aclist_AddRef(IACList *iface)
Definition: autocomplete.c:394
static const WCHAR HijackerWndProc_txt[]
Definition: autocomplete.c:240
static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: autocomplete.c:203
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLbitfield flags
Definition: glext.h:7161
GLsizei const GLchar *const * strings
Definition: glext.h:7622
#define InterlockedDecrement
Definition: armddk.h:52
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:821
Definition: _list.h:228
static HWND hEdit
Definition: autocomplete.c:34
#define WM_COMMAND
Definition: winuser.h:1722
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LPCSTR lpszClassName
Definition: winuser.h:3147
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2059
#define GWLP_WNDPROC
Definition: treelist.c:66
#define broken(x)
Definition: _sntprintf.h:21
UINT style
Definition: winuser.h:3138
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2881
START_TEST(autocomplete)
Definition: autocomplete.c:388
#define S_OK
Definition: intsafe.h:59
#define WS_BORDER
Definition: pedump.c:625
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:2696
#define InterlockedIncrement
Definition: armddk.h:53
HINSTANCE hInstance
Definition: winuser.h:3142
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ARRAY_SIZE(a)
Definition: main.h:24
static void dispatch_messages(void)
Definition: autocomplete.c:442
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99
static HRESULT string_enumerator_create(void **ppv, WCHAR **suggestions, int count)
Definition: autocomplete.c:425
static void test_invalid_init(void)
Definition: autocomplete.c:38
static void test_prefix_filtering(HWND hwnd_edit)
Definition: autocomplete.c:566
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
static int killfocus_count
Definition: autocomplete.c:36
#define min(a, b)
Definition: monoChain.cc:55
static HRESULT WINAPI string_enumerator_Skip(IEnumString *iface, ULONG num)
Definition: autocomplete.c:358
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define E_UNEXPECTED
Definition: winerror.h:2456
WNDPROC lpfnWndProc
Definition: winuser.h:3139
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
#define msg(x)
Definition: auth_time.c:54
#define WM_CREATE
Definition: winuser.h:1590
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define HIWORD(l)
Definition: typedefs.h:246
unsigned int ULONG
Definition: retypes.h:1
static ULONG WINAPI aclist_Release(IACList *iface)
Definition: autocomplete.c:399
char * cleanup(char *str)
Definition: wpickclick.c:99
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define SetWindowLongPtrW
Definition: winuser.h:5321
#define PM_REMOVE
Definition: winuser.h:1182
WCHAR * LPWSTR
Definition: xmlstorage.h:184
LONG_PTR LRESULT
Definition: windef.h:209
IEnumString IEnumString_iface
Definition: autocomplete.c:271
#define WS_VISIBLE
Definition: pedump.c:620
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define win_skip
Definition: test.h:150
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:404
LPARAM lParam
Definition: combotst.c:139
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
void * object
Definition: jmemsys.h:48
#define ok_(x1, x2)
Definition: atltest.h:61
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
static void test_killfocus(void)
Definition: autocomplete.c:193
HICON hIcon
Definition: winuser.h:3143
Definition: fci.c:126