Rob Shearman : ole32: Add some more tests for MkParseDisplayName.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 28 06:41:55 CDT 2007
Module: wine
Branch: master
Commit: 87a4516bd9f5914133522288a9bf8cf8ff510dfd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=87a4516bd9f5914133522288a9bf8cf8ff510dfd
Author: Rob Shearman <rob at 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);
More information about the wine-cvs
mailing list