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 #include "precomp.h" 22 23 static HWND hMainWnd, hEdit; 24 static HINSTANCE hinst; 25 static int killfocus_count; 26 27 static void test_invalid_init(void) 28 { 29 HRESULT hr; 30 IAutoComplete *ac; 31 IUnknown *acSource; 32 HWND edit_control; 33 34 /* AutoComplete instance */ 35 hr = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, 36 &IID_IAutoComplete, (void **)&ac); 37 if (hr == REGDB_E_CLASSNOTREG) 38 { 39 win_skip("CLSID_AutoComplete is not registered\n"); 40 return; 41 } 42 ok(hr == S_OK, "no IID_IAutoComplete (0x%08x)\n", hr); 43 44 /* AutoComplete source */ 45 hr = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER, 46 &IID_IACList, (void **)&acSource); 47 if (hr == REGDB_E_CLASSNOTREG) 48 { 49 win_skip("CLSID_ACLMulti is not registered\n"); 50 IAutoComplete_Release(ac); 51 return; 52 } 53 ok(hr == S_OK, "no IID_IACList (0x%08x)\n", hr); 54 55 edit_control = CreateWindowExA(0, "EDIT", "Some text", 0, 10, 10, 300, 300, 56 hMainWnd, NULL, hinst, NULL); 57 ok(edit_control != NULL, "Can't create edit control\n"); 58 59 /* The refcount of acSource would be incremented on older Windows. */ 60 hr = IAutoComplete_Init(ac, NULL, acSource, NULL, NULL); 61 ok(hr == E_INVALIDARG || 62 broken(hr == S_OK), /* Win2k/XP/Win2k3 */ 63 "Init returned 0x%08x\n", hr); 64 if (hr == E_INVALIDARG) 65 { 66 LONG ref; 67 68 IUnknown_AddRef(acSource); 69 ref = IUnknown_Release(acSource); 70 ok(ref == 1, "Expected AutoComplete source refcount to be 1, got %d\n", ref); 71 } 72 73 if (0) 74 { 75 /* Older Windows versions never check the window handle, while newer 76 * versions only check for NULL. Subsequent attempts to initialize the 77 * object after this call succeeds would fail, because initialization 78 * state is determined by whether a non-NULL window handle is stored. */ 79 hr = IAutoComplete_Init(ac, (HWND)0xdeadbeef, acSource, NULL, NULL); 80 ok(hr == S_OK, "Init returned 0x%08x\n", hr); 81 82 /* Tests crash on older Windows. */ 83 hr = IAutoComplete_Init(ac, NULL, NULL, NULL, NULL); 84 ok(hr == E_INVALIDARG, "Init returned 0x%08x\n", hr); 85 86 hr = IAutoComplete_Init(ac, edit_control, NULL, NULL, NULL); 87 ok(hr == E_INVALIDARG, "Init returned 0x%08x\n", hr); 88 } 89 90 /* bind to edit control */ 91 hr = IAutoComplete_Init(ac, edit_control, acSource, NULL, NULL); 92 ok(hr == S_OK, "Init returned 0x%08x\n", hr); 93 94 /* try invalid parameters after successful initialization .*/ 95 hr = IAutoComplete_Init(ac, NULL, NULL, NULL, NULL); 96 ok(hr == E_INVALIDARG || 97 hr == E_FAIL, /* Win2k/XP/Win2k3 */ 98 "Init returned 0x%08x\n", hr); 99 100 hr = IAutoComplete_Init(ac, NULL, acSource, NULL, NULL); 101 ok(hr == E_INVALIDARG || 102 hr == E_FAIL, /* Win2k/XP/Win2k3 */ 103 "Init returned 0x%08x\n", hr); 104 105 hr = IAutoComplete_Init(ac, edit_control, NULL, NULL, NULL); 106 ok(hr == E_INVALIDARG || 107 hr == E_FAIL, /* Win2k/XP/Win2k3 */ 108 "Init returned 0x%08x\n", hr); 109 110 /* try initializing twice on the same control */ 111 hr = IAutoComplete_Init(ac, edit_control, acSource, NULL, NULL); 112 ok(hr == E_FAIL, "Init returned 0x%08x\n", hr); 113 114 /* try initializing with a different control */ 115 hr = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL); 116 ok(hr == E_FAIL, "Init returned 0x%08x\n", hr); 117 118 DestroyWindow(edit_control); 119 120 /* try initializing with a different control after 121 * destroying the original initialization control */ 122 hr = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL); 123 ok(hr == E_UNEXPECTED || 124 hr == E_FAIL, /* Win2k/XP/Win2k3 */ 125 "Init returned 0x%08x\n", hr); 126 127 IUnknown_Release(acSource); 128 IAutoComplete_Release(ac); 129 } 130 static IAutoComplete *test_init(void) 131 { 132 HRESULT r; 133 IAutoComplete *ac; 134 IUnknown *acSource; 135 LONG_PTR user_data; 136 137 /* AutoComplete instance */ 138 r = CoCreateInstance(&CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, 139 &IID_IAutoComplete, (LPVOID*)&ac); 140 if (r == REGDB_E_CLASSNOTREG) 141 { 142 win_skip("CLSID_AutoComplete is not registered\n"); 143 return NULL; 144 } 145 ok(r == S_OK, "no IID_IAutoComplete (0x%08x)\n", r); 146 147 /* AutoComplete source */ 148 r = CoCreateInstance(&CLSID_ACLMulti, NULL, CLSCTX_INPROC_SERVER, 149 &IID_IACList, (LPVOID*)&acSource); 150 if (r == REGDB_E_CLASSNOTREG) 151 { 152 win_skip("CLSID_ACLMulti is not registered\n"); 153 IAutoComplete_Release(ac); 154 return NULL; 155 } 156 ok(r == S_OK, "no IID_IACList (0x%08x)\n", r); 157 158 user_data = GetWindowLongPtrA(hEdit, GWLP_USERDATA); 159 ok(user_data == 0, "Expected the edit control user data to be zero\n"); 160 161 /* bind to edit control */ 162 r = IAutoComplete_Init(ac, hEdit, acSource, NULL, NULL); 163 ok(r == S_OK, "Init returned 0x%08x\n", r); 164 165 user_data = GetWindowLongPtrA(hEdit, GWLP_USERDATA); 166 ok(user_data == 0, "Expected the edit control user data to be zero\n"); 167 168 IUnknown_Release(acSource); 169 170 return ac; 171 } 172 173 static void test_killfocus(void) 174 { 175 /* Test if WM_KILLFOCUS messages are handled properly by checking if 176 * the parent receives an EN_KILLFOCUS message. */ 177 SetFocus(hEdit); 178 killfocus_count = 0; 179 SetFocus(0); 180 ok(killfocus_count == 1, "Expected one EN_KILLFOCUS message, got: %d\n", killfocus_count); 181 } 182 183 static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 184 { 185 switch(msg) { 186 case WM_CREATE: 187 /* create edit control */ 188 hEdit = CreateWindowExA(0, "EDIT", "Some text", 0, 10, 10, 300, 300, 189 hWnd, NULL, hinst, NULL); 190 ok(hEdit != NULL, "Can't create edit control\n"); 191 break; 192 case WM_COMMAND: 193 if(HIWORD(wParam) == EN_KILLFOCUS) 194 killfocus_count++; 195 break; 196 } 197 return DefWindowProcA(hWnd, msg, wParam, lParam); 198 } 199 200 static void createMainWnd(void) 201 { 202 WNDCLASSA wc; 203 wc.style = CS_HREDRAW | CS_VREDRAW; 204 wc.cbClsExtra = 0; 205 wc.cbWndExtra = 0; 206 wc.hInstance = GetModuleHandleA(NULL); 207 wc.hIcon = NULL; 208 wc.hCursor = LoadCursorA(NULL, (LPSTR)IDC_IBEAM); 209 wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); 210 wc.lpszMenuName = NULL; 211 wc.lpszClassName = "MyTestWnd"; 212 wc.lpfnWndProc = MyWndProc; 213 RegisterClassA(&wc); 214 215 hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW, 216 CW_USEDEFAULT, CW_USEDEFAULT, 130, 105, NULL, NULL, GetModuleHandleA(NULL), 0); 217 } 218 219 START_TEST(autocomplete) 220 { 221 HRESULT r; 222 MSG msg; 223 IAutoComplete* ac; 224 225 r = CoInitialize(NULL); 226 ok(r == S_OK, "CoInitialize failed (0x%08x). Tests aborted.\n", r); 227 if (r != S_OK) 228 return; 229 230 createMainWnd(); 231 ok(hMainWnd != NULL, "Failed to create parent window. Tests aborted.\n"); 232 if (!hMainWnd) return; 233 234 test_invalid_init(); 235 ac = test_init(); 236 if (!ac) 237 goto cleanup; 238 test_killfocus(); 239 240 PostQuitMessage(0); 241 while(GetMessageA(&msg,0,0,0)) { 242 TranslateMessage(&msg); 243 DispatchMessageA(&msg); 244 } 245 246 IAutoComplete_Release(ac); 247 248 cleanup: 249 DestroyWindow(hEdit); 250 DestroyWindow(hMainWnd); 251 252 CoUninitialize(); 253 } 254