Module: wine Branch: master Commit: 87a4516bd9f5914133522288a9bf8cf8ff510dfd URL: http://source.winehq.org/git/wine.git/?a=commit;h=87a4516bd9f5914133522288a9...
Author: Rob Shearman rob@codeweavers.com Date: Tue Mar 27 18:20:29 2007 +0100
ole32: Add some more tests for MkParseDisplayName.
---
dlls/ole32/tests/moniker.c | 151 +++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 150 insertions(+), 1 deletions(-)
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index 06c5698..d71cb26 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -29,6 +29,7 @@ #include "winbase.h" #include "objbase.h" #include "comcat.h" +#include "olectl.h"
#include "wine/test.h"
@@ -666,6 +667,55 @@ static void test_ROT(void) IRunningObjectTable_Release(pROT); }
+static HRESULT WINAPI ParseDisplayName_QueryInterface(IParseDisplayName *iface, REFIID riid, void **ppv) +{ + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IParseDisplayName)) + { + *ppv = iface; + IUnknown_AddRef(iface); + return S_OK; + } + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI ParseDisplayName_AddRef(IParseDisplayName *iface) +{ + return 2; +} + +static ULONG WINAPI ParseDisplayName_Release(IParseDisplayName *iface) +{ + return 1; +} + +static LPCWSTR expected_display_name; + +static HRESULT WINAPI ParseDisplayName_ParseDisplayName(IParseDisplayName *iface, + IBindCtx *pbc, + LPOLESTR pszDisplayName, + ULONG *pchEaten, + IMoniker **ppmkOut) +{ + char display_nameA[256]; + WideCharToMultiByte(CP_ACP, 0, pszDisplayName, -1, display_nameA, sizeof(display_nameA), NULL, NULL); + ok(!lstrcmpW(pszDisplayName, expected_display_name), "unexpected display name "%s"\n", display_nameA); + ok(pszDisplayName == expected_display_name, "pszDisplayName should be the same pointer as passed into MkParseDisplayName\n"); + *pchEaten = lstrlenW(pszDisplayName); + return CreateAntiMoniker(ppmkOut); +} + +static const IParseDisplayNameVtbl ParseDisplayName_Vtbl = +{ + ParseDisplayName_QueryInterface, + ParseDisplayName_AddRef, + ParseDisplayName_Release, + ParseDisplayName_ParseDisplayName +}; + +static IParseDisplayName ParseDisplayName = { &ParseDisplayName_Vtbl }; + static int count_moniker_matches(IBindCtx * pbc, IEnumMoniker * spEM) { IMoniker * spMoniker; @@ -708,19 +758,118 @@ static void test_MkParseDisplayName(void) DWORD pdwReg1=0; DWORD grflags=0; DWORD pdwReg2=0; + DWORD moniker_type; IRunningObjectTable * pprot=NULL;
/* CLSID of My Computer */ static const WCHAR wszDisplayName[] = {'c','l','s','i','d',':', '2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8','-','0','8','0','0','2','B','3','0','3','0','9','D',':',0}; + static const WCHAR wszDisplayNameClsid[] = {'c','l','s','i','d',':',0}; + static const WCHAR wszNonExistantProgId[] = {'N','o','n','E','x','i','s','t','a','n','t','P','r','o','g','I','d',':',0}; + static const WCHAR wszDisplayNameRunning[] = {'W','i','n','e','T','e','s','t','R','u','n','n','i','n','g',0}; + static const WCHAR wszDisplayNameProgId1[] = {'S','t','d','F','o','n','t',':',0}; + static const WCHAR wszDisplayNameProgId2[] = {'@','S','t','d','F','o','n','t',0}; + static const WCHAR wszDisplayNameProgIdFail[] = {'S','t','d','F','o','n','t',0}; + char szDisplayNameFile[256]; + WCHAR wszDisplayNameFile[256];
hr = CreateBindCtx(0, &pbc); ok_ole_success(hr, CreateBindCtx);
+ hr = MkParseDisplayName(pbc, wszNonExistantProgId, &eaten, &pmk); + todo_wine { ok(hr == MK_E_CANTOPENFILE, "MkParseDisplayName should have failed with MK_E_CANTOPENFILE instead of 0x%08x\n", hr); } + + /* no special handling of "clsid:" without the string form of the clsid + * following */ + hr = MkParseDisplayName(pbc, wszDisplayNameClsid, &eaten, &pmk); + todo_wine { ok(hr == MK_E_CANTOPENFILE, "MkParseDisplayName should have failed with MK_E_CANTOPENFILE instead of 0x%08x\n", hr); } + + /* shows clsid has higher precedence than a running object */ + hr = CreateFileMoniker(wszDisplayName, &pmk); + ok_ole_success(hr, CreateFileMoniker); + hr = IBindCtx_GetRunningObjectTable(pbc, &pprot); + ok_ole_success(hr, IBindCtx_GetRunningObjectTable); + hr = IRunningObjectTable_Register(pprot, 0, (IUnknown *)&Test_ClassFactory, pmk, &pdwReg1); + ok_ole_success(hr, IRunningObjectTable_Register); + IMoniker_Release(pmk); + pmk = NULL; + hr = MkParseDisplayName(pbc, wszDisplayName, &eaten, &pmk); + todo_wine { ok_ole_success(hr, MkParseDisplayName); } + if (pmk) + { + IMoniker_IsSystemMoniker(pmk, &moniker_type); + ok(moniker_type == MKSYS_CLASSMONIKER, "moniker_type was %d instead of MKSYS_CLASSMONIKER\n", moniker_type); + IMoniker_Release(pmk); + } + hr = IRunningObjectTable_Revoke(pprot, pdwReg1); + ok_ole_success(hr, IRunningObjectTable_Revoke); + IRunningObjectTable_Release(pprot); + + hr = CreateFileMoniker(wszDisplayNameRunning, &pmk); + ok_ole_success(hr, CreateFileMoniker); + hr = IBindCtx_GetRunningObjectTable(pbc, &pprot); + ok_ole_success(hr, IBindCtx_GetRunningObjectTable); + hr = IRunningObjectTable_Register(pprot, 0, (IUnknown *)&Test_ClassFactory, pmk, &pdwReg1); + ok_ole_success(hr, IRunningObjectTable_Register); + IMoniker_Release(pmk); + pmk = NULL; + hr = MkParseDisplayName(pbc, wszDisplayNameRunning, &eaten, &pmk); + todo_wine { ok_ole_success(hr, MkParseDisplayName); } + if (pmk) + { + IMoniker_IsSystemMoniker(pmk, &moniker_type); + ok(moniker_type == MKSYS_FILEMONIKER, "moniker_type was %d instead of MKSYS_FILEMONIKER\n", moniker_type); + IMoniker_Release(pmk); + } + hr = IRunningObjectTable_Revoke(pprot, pdwReg1); + ok_ole_success(hr, IRunningObjectTable_Revoke); + IRunningObjectTable_Release(pprot); + + hr = CoRegisterClassObject(&CLSID_StdFont, (IUnknown *)&ParseDisplayName, CLSCTX_INPROC_SERVER, REGCLS_MULTI_SEPARATE, &pdwReg1); + ok_ole_success(hr, CoRegisterClassObject); + + expected_display_name = wszDisplayNameProgId1; + hr = MkParseDisplayName(pbc, wszDisplayNameProgId1, &eaten, &pmk); + todo_wine { ok_ole_success(hr, MkParseDisplayName); } + if (pmk) + { + IMoniker_IsSystemMoniker(pmk, &moniker_type); + ok(moniker_type == MKSYS_ANTIMONIKER, "moniker_type was %d instead of MKSYS_ANTIMONIKER\n", moniker_type); + IMoniker_Release(pmk); + } + + expected_display_name = wszDisplayNameProgId2; + hr = MkParseDisplayName(pbc, wszDisplayNameProgId2, &eaten, &pmk); + todo_wine { ok_ole_success(hr, MkParseDisplayName); } + if (pmk) + { + IMoniker_IsSystemMoniker(pmk, &moniker_type); + ok(moniker_type == MKSYS_ANTIMONIKER, "moniker_type was %d instead of MKSYS_ANTIMONIKER\n", moniker_type); + IMoniker_Release(pmk); + } + + hr = MkParseDisplayName(pbc, wszDisplayNameProgIdFail, &eaten, &pmk); + todo_wine { ok(hr == MK_E_CANTOPENFILE, "MkParseDisplayName with ProgId without marker should fail with MK_E_CANTOPENFILE instead of 0x%08x\n", hr); } + + hr = CoRevokeClassObject(pdwReg1); + ok_ole_success(hr, CoRevokeClassObject); + + GetSystemDirectoryA(szDisplayNameFile, sizeof(szDisplayNameFile)); + strcat(szDisplayNameFile, "\kernel32.dll"); + MultiByteToWideChar(CP_ACP, 0, szDisplayNameFile, -1, wszDisplayNameFile, sizeof(wszDisplayNameFile)/sizeof(wszDisplayNameFile[0])); + hr = MkParseDisplayName(pbc, wszDisplayNameFile, &eaten, &pmk); + todo_wine { ok_ole_success(hr, MkParseDisplayName); } + if (pmk) + { + IMoniker_IsSystemMoniker(pmk, &moniker_type); + ok(moniker_type == MKSYS_FILEMONIKER, "moniker_type was %d instead of MKSYS_FILEMONIKER\n", moniker_type); + IMoniker_Release(pmk); + } + hr = MkParseDisplayName(pbc, wszDisplayName, &eaten, &pmk); todo_wine { ok_ole_success(hr, MkParseDisplayName); }
- if (object) + if (pmk) { hr = IMoniker_BindToObject(pmk, pbc, NULL, &IID_IUnknown, (LPVOID*)&object); ok_ole_success(hr, IMoniker_BindToObject);