4 * Copyright 2015 Nikolay Sivov for CodeWeavers
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.
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.
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
23 #include "wine/test.h"
29 static HRESULT WINAPI
enumverbs_QueryInterface(IEnumOLEVERB
*iface
, REFIID riid
, void **ppv
)
31 if (IsEqualIID(riid
, &IID_IEnumOLEVERB
) || IsEqualIID(riid
, &IID_IUnknown
)) {
33 IEnumOLEVERB_AddRef(iface
);
41 static ULONG WINAPI
enumverbs_AddRef(IEnumOLEVERB
*iface
)
46 static ULONG WINAPI
enumverbs_Release(IEnumOLEVERB
*iface
)
52 static const WCHAR verbW
[] = {'v','e','r','b',0};
53 static HRESULT WINAPI
enumverbs_Next(IEnumOLEVERB
*iface
, ULONG count
, OLEVERB
*verbs
, ULONG
*fetched
)
55 ok(count
== 1, "got %u\n", count
);
56 ok(fetched
== NULL
, "got %p\n", fetched
);
57 ok(g_enumpos
== 0 || g_enumpos
== 1, "got pos %d\n", g_enumpos
);
59 if (g_enumpos
++ == 0) {
61 verbs
->lpszVerbName
= CoTaskMemAlloc(sizeof(verbW
));
62 lstrcpyW(verbs
->lpszVerbName
, verbW
);
63 verbs
->fuFlags
= MF_ENABLED
;
64 verbs
->grfAttribs
= OLEVERBATTRIB_ONCONTAINERMENU
;
65 if (fetched
) *fetched
= 1;
72 static HRESULT WINAPI
enumverbs_Skip(IEnumOLEVERB
*iface
, ULONG count
)
74 ok(0, "unexpected call\n");
78 static HRESULT WINAPI
enumverbs_Reset(IEnumOLEVERB
*iface
)
80 ok(0, "unexpected call\n");
84 static HRESULT WINAPI
enumverbs_Clone(IEnumOLEVERB
*iface
, IEnumOLEVERB
**ppenum
)
86 ok(0, "unexpected call\n");
90 static IEnumOLEVERBVtbl enumverbsvtbl
= {
91 enumverbs_QueryInterface
,
100 static IEnumOLEVERB enumverbs
= { &enumverbsvtbl
};
102 static HRESULT WINAPI
oleobject_QueryInterface(IOleObject
*iface
, REFIID riid
, void **ppv
)
104 if (IsEqualIID(riid
, &IID_IUnknown
) || IsEqualIID(riid
, &IID_IOleObject
)) {
106 IOleObject_AddRef(iface
);
111 return E_NOINTERFACE
;
114 static ULONG WINAPI
oleobject_AddRef(IOleObject
*iface
)
119 static ULONG WINAPI
oleobject_Release(IOleObject
*iface
)
124 static HRESULT WINAPI
oleobject_SetClientSite(IOleObject
*iface
, IOleClientSite
*site
)
126 ok(0, "unexpected call\n");
130 static HRESULT WINAPI
oleobject_GetClientSite(IOleObject
*iface
, IOleClientSite
**site
)
132 ok(0, "unexpected call\n");
136 static HRESULT WINAPI
oleobject_SetHostNames(IOleObject
*iface
, LPCOLESTR containerapp
,
137 LPCOLESTR containerObj
)
139 ok(0, "unexpected call\n");
143 static HRESULT WINAPI
oleobject_Close(IOleObject
*iface
, DWORD saveopt
)
145 ok(0, "unexpected call\n");
149 static HRESULT WINAPI
oleobject_SetMoniker(IOleObject
*iface
, DWORD whichmoniker
, IMoniker
*mk
)
151 ok(0, "unexpected call\n");
155 static HRESULT WINAPI
oleobject_GetMoniker(IOleObject
*iface
, DWORD assign
, DWORD whichmoniker
,
158 ok(0, "unexpected call\n");
162 static HRESULT WINAPI
oleobject_InitFromData(IOleObject
*iface
, IDataObject
*dataobject
,
163 BOOL creation
, DWORD reserved
)
165 ok(0, "unexpected call\n");
169 static HRESULT WINAPI
oleobject_GetClipboardData(IOleObject
*iface
, DWORD reserved
, IDataObject
**dataobject
)
171 ok(0, "unexpected call\n");
175 static HRESULT WINAPI
oleobject_DoVerb(IOleObject
*iface
, LONG verb
, MSG
*msg
, IOleClientSite
*activesite
,
176 LONG index
, HWND hwndParent
, LPCRECT rect
)
178 ok(0, "unexpected call\n");
182 static BOOL g_enumverbsfail
;
183 static HRESULT WINAPI
oleobject_EnumVerbs(IOleObject
*iface
, IEnumOLEVERB
**enumverb
)
185 if (g_enumverbsfail
) {
189 *enumverb
= &enumverbs
;
193 static HRESULT WINAPI
oleobject_Update(IOleObject
*iface
)
195 ok(0, "unexpected call\n");
199 static HRESULT WINAPI
oleobject_IsUpToDate(IOleObject
*iface
)
201 ok(0, "unexpected call\n");
205 static HRESULT WINAPI
oleobject_GetUserClassID(IOleObject
*iface
, CLSID
*clsid
)
207 ok(0, "unexpected call\n");
211 static const WCHAR testW
[] = {'t','e','s','t',0};
212 static HRESULT WINAPI
oleobject_GetUserType(IOleObject
*iface
, DWORD formoftype
,
215 ok(formoftype
== USERCLASSTYPE_SHORT
, "got %d\n", formoftype
);
216 *usertype
= CoTaskMemAlloc(sizeof(testW
));
217 lstrcpyW(*usertype
, testW
);
221 static HRESULT WINAPI
oleobject_SetExtent(IOleObject
*iface
, DWORD aspect
, SIZEL
*size
)
223 ok(0, "unexpected call\n");
227 static HRESULT WINAPI
oleobject_GetExtent(IOleObject
*iface
, DWORD aspect
, SIZEL
*size
)
229 ok(0, "unexpected call\n");
233 static HRESULT WINAPI
oleobject_Advise(IOleObject
*iface
, IAdviseSink
*sink
, DWORD
*connection
)
235 ok(0, "unexpected call\n");
239 static HRESULT WINAPI
oleobject_Unadvise(IOleObject
*iface
, DWORD connection
)
241 ok(0, "unexpected call\n");
245 static HRESULT WINAPI
oleobject_EnumAdvise(IOleObject
*iface
, IEnumSTATDATA
**enumadvise
)
247 ok(0, "unexpected call\n");
251 static HRESULT WINAPI
oleobject_GetMiscStatus(IOleObject
*iface
, DWORD aspect
, DWORD
*status
)
253 ok(0, "unexpected call\n");
257 static HRESULT WINAPI
oleobject_SetColorScheme(IOleObject
*iface
, LOGPALETTE
*pal
)
259 ok(0, "unexpected call\n");
263 static IOleObjectVtbl oleobjectvtbl
= {
264 oleobject_QueryInterface
,
267 oleobject_SetClientSite
,
268 oleobject_GetClientSite
,
269 oleobject_SetHostNames
,
271 oleobject_SetMoniker
,
272 oleobject_GetMoniker
,
273 oleobject_InitFromData
,
274 oleobject_GetClipboardData
,
278 oleobject_IsUpToDate
,
279 oleobject_GetUserClassID
,
280 oleobject_GetUserType
,
285 oleobject_EnumAdvise
,
286 oleobject_GetMiscStatus
,
287 oleobject_SetColorScheme
290 static IOleObject oleobject
= { &oleobjectvtbl
};
292 static void test_OleUIAddVerbMenu(void)
294 HMENU hMenu
, verbmenu
;
300 ret
= OleUIAddVerbMenuW(NULL
, NULL
, NULL
, 0, 0, 0, FALSE
, 0, NULL
);
301 ok(!ret
, "got %d\n", ret
);
303 verbmenu
= (HMENU
)0xdeadbeef;
304 ret
= OleUIAddVerbMenuW(NULL
, NULL
, NULL
, 0, 0, 0, FALSE
, 0, &verbmenu
);
305 ok(!ret
, "got %d\n", ret
);
306 ok(verbmenu
== NULL
, "got %p\n", verbmenu
);
309 ret
= OleUIAddVerbMenuW(&oleobject
, NULL
, NULL
, 0, 0, 0, FALSE
, 0, NULL
);
310 ok(!ret
, "got %d\n", ret
);
312 hMenu
= CreatePopupMenu();
314 memset(&info
, 0, sizeof(info
));
315 info
.cbSize
= sizeof(info
);
316 ret
= InsertMenuItemW(hMenu
, 0, TRUE
, &info
);
317 ok(ret
, "got %d\n", ret
);
319 count
= GetMenuItemCount(hMenu
);
320 ok(count
== 1, "got %d\n", count
);
323 ret
= OleUIAddVerbMenuW(&oleobject
, NULL
, hMenu
, 0, 0, 0, FALSE
, 0, NULL
);
324 ok(!ret
, "got %d\n", ret
);
326 count
= GetMenuItemCount(hMenu
);
327 ok(count
== 1, "got %d\n", count
);
329 ret
= InsertMenuItemW(hMenu
, 0, TRUE
, &info
);
330 ok(ret
, "got %d\n", ret
);
332 count
= GetMenuItemCount(hMenu
);
333 ok(count
== 2, "got %d\n", count
);
335 verbmenu
= (HMENU
)0xdeadbeef;
337 ret
= OleUIAddVerbMenuW(&oleobject
, NULL
, hMenu
, 1, 0, 0, FALSE
, 0, &verbmenu
);
338 ok(ret
, "got %d\n", ret
);
339 ok(verbmenu
== NULL
, "got %p\n", verbmenu
);
341 count
= GetMenuItemCount(hMenu
);
342 ok(count
== 2, "got %d\n", count
);
344 /* object doesn't support EnumVerbs() */
345 g_enumverbsfail
= TRUE
;
347 verbmenu
= (HMENU
)0xdeadbeef;
348 ret
= OleUIAddVerbMenuW(&oleobject
, NULL
, hMenu
, 2, 0, 0, FALSE
, 0, &verbmenu
);
349 ok(!ret
, "got %d\n", ret
);
350 ok(verbmenu
== NULL
, "got %p\n", verbmenu
);
351 g_enumverbsfail
= FALSE
;
353 /* added disabled item */
354 memset(&info
, 0, sizeof(info
));
355 info
.cbSize
= sizeof(info
);
356 info
.fMask
= MIIM_STATE
|MIIM_SUBMENU
;
357 ret
= GetMenuItemInfoW(hMenu
, 2, TRUE
, &info
);
358 ok(ret
, "got %d\n", ret
);
359 ok(info
.fState
& MFS_DISABLED
, "got state 0x%08x\n", info
.fState
);
360 ok(info
.hSubMenu
== NULL
, "got submenu %p\n", info
.hSubMenu
);
362 count
= GetMenuItemCount(hMenu
);
363 ok(count
== 3, "got %d\n", count
);
365 /* now without object */
366 verbmenu
= (HMENU
)0xdeadbeef;
367 ret
= OleUIAddVerbMenuW(NULL
, testW
, hMenu
, 3, 42, 0, FALSE
, 0, &verbmenu
);
368 ok(!ret
, "got %d\n", ret
);
369 ok(verbmenu
== NULL
, "got %p\n", verbmenu
);
371 memset(&info
, 0, sizeof(info
));
372 info
.cbSize
= sizeof(info
);
373 info
.fMask
= MIIM_STATE
|MIIM_ID
|MIIM_STRING
|MIIM_SUBMENU
;
374 info
.dwTypeData
= buffW
;
375 info
.cch
= sizeof(buffW
)/sizeof(WCHAR
);
376 ret
= GetMenuItemInfoW(hMenu
, 3, TRUE
, &info
);
377 ok(ret
, "got %d\n", ret
);
378 ok(info
.fState
== MF_GRAYED
, "got state 0x%08x\n", info
.fState
);
379 ok(info
.wID
== 42, "got id %d\n", info
.wID
);
380 ok(info
.hSubMenu
== NULL
, "got submenu %p\n", info
.hSubMenu
);
382 count
= GetMenuItemCount(hMenu
);
383 ok(count
== 4, "got %d\n", count
);
385 verbmenu
= (HMENU
)0xdeadbeef;
387 ret
= OleUIAddVerbMenuW(&oleobject
, NULL
, hMenu
, 4, 0, 0, FALSE
, 0, &verbmenu
);
388 ok(ret
, "got %d\n", ret
);
389 ok(verbmenu
== NULL
, "got %p\n", verbmenu
);
391 /* check newly added item */
392 memset(&info
, 0, sizeof(info
));
393 info
.cbSize
= sizeof(info
);
394 info
.fMask
= MIIM_STRING
|MIIM_STATE
|MIIM_SUBMENU
;
395 info
.dwTypeData
= buffW
;
396 info
.cch
= sizeof(buffW
)/sizeof(WCHAR
);
397 ret
= GetMenuItemInfoW(hMenu
, 4, TRUE
, &info
);
398 ok(ret
, "got %d\n", ret
);
399 /* item string has a form of '<verb> <usertype> <Object>', where Object is localized */
400 ok(!memcmp(buffW
, verbW
, sizeof(verbW
) - sizeof(WCHAR
)), "str %s\n", wine_dbgstr_w(buffW
));
401 ok(info
.fState
== 0, "got state 0x%08x\n", info
.fState
);
402 ok(info
.hSubMenu
== NULL
, "got submenu %p\n", info
.hSubMenu
);
404 count
= GetMenuItemCount(hMenu
);
405 ok(count
== 5, "got %d\n", count
);
412 test_OleUIAddVerbMenu();