Rob Shearman : ole32: Add some tests for IBindCtx.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 6 16:13:23 CST 2007


Module: wine
Branch: master
Commit: a4187777086e560e11b5223eedbd2b74d6d5bb47
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a4187777086e560e11b5223eedbd2b74d6d5bb47

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Mar  6 17:59:33 2007 +0000

ole32: Add some tests for IBindCtx.

---

 dlls/ole32/tests/moniker.c |  123 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 123 insertions(+), 0 deletions(-)

diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index f603f72..861fc33 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -139,6 +139,45 @@ static const IClassFactoryVtbl TestClassFactory_Vtbl =
 
 static IClassFactory Test_ClassFactory = { &TestClassFactory_Vtbl };
 
+typedef struct
+{
+    const IUnknownVtbl *lpVtbl;
+    ULONG refs;
+} HeapUnknown;
+
+static HRESULT WINAPI HeapUnknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+    if (IsEqualIID(riid, &IID_IUnknown))
+    {
+        IUnknown_AddRef(iface);
+        *ppv = (LPVOID)iface;
+        return S_OK;
+    }
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI HeapUnknown_AddRef(IUnknown *iface)
+{
+    HeapUnknown *This = (HeapUnknown *)iface;
+    return InterlockedIncrement((LONG*)&This->refs);
+}
+
+static ULONG WINAPI HeapUnknown_Release(IUnknown *iface)
+{
+    HeapUnknown *This = (HeapUnknown *)iface;
+    ULONG refs = InterlockedDecrement((LONG*)&This->refs);
+    if (!refs) HeapFree(GetProcessHeap(), 0, This);
+    return refs;
+}
+
+static const IUnknownVtbl HeapUnknown_Vtbl =
+{
+    HeapUnknown_QueryInterface,
+    HeapUnknown_AddRef,
+    HeapUnknown_Release
+};
+
 static HRESULT WINAPI
 MonikerNoROTData_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
 {
@@ -1397,6 +1436,88 @@ static void test_generic_composite_moniker(void)
     IMoniker_Release(moniker);
 }
 
+static void test_bind_context(void)
+{
+    HRESULT hr;
+    IBindCtx *pBindCtx;
+    IEnumString *pEnumString;
+    BIND_OPTS2 bind_opts;
+    HeapUnknown *unknown;
+    HeapUnknown *unknown2;
+    ULONG refs;
+    static const WCHAR wszParamName[] = {'G','e','m','m','a',0};
+
+    hr = CreateBindCtx(0xdeadbeef, &pBindCtx);
+    todo_wine
+    ok(hr == E_INVALIDARG, "CreateBindCtx with reserved value non-zero should have returned E_INVALIDARG instead of 0x%08x\n", hr);
+
+    hr = CreateBindCtx(0, &pBindCtx);
+    ok_ole_success(hr, "CreateBindCtx");
+
+    bind_opts.cbStruct = -1;
+    hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
+    todo_wine {
+    ok_ole_success(hr, "IBindCtx_GetBindOptions");
+    ok(bind_opts.cbStruct == sizeof(bind_opts), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
+    }
+
+    bind_opts.cbStruct = sizeof(bind_opts);
+    hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
+    ok_ole_success(hr, "IBindCtx_GetBindOptions");
+    ok(bind_opts.cbStruct == sizeof(bind_opts), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct);
+    ok(bind_opts.grfFlags == 0, "bind_opts.grfFlags was 0x%x instead of 0\n", bind_opts.grfFlags);
+    ok(bind_opts.grfMode == STGM_READWRITE, "bind_opts.grfMode was 0x%x instead of STGM_READWRITE\n", bind_opts.grfMode);
+    ok(bind_opts.dwTickCountDeadline == 0, "bind_opts.dwTickCountDeadline was %d instead of 0\n", bind_opts.dwTickCountDeadline);
+    ok(bind_opts.dwTrackFlags == 0, "bind_opts.dwTrackFlags was 0x%x instead of 0\n", bind_opts.dwTrackFlags);
+    ok(bind_opts.dwClassContext == (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER),
+        "bind_opts.dwClassContext should have been 0x15 instead of 0x%x\n", bind_opts.dwClassContext);
+    if (bind_opts.locale != GetThreadLocale())  /* should be removed once wine is fixed */
+    {
+        todo_wine
+        ok(bind_opts.locale == GetThreadLocale(), "bind_opts.locale should have been 0x%x instead of 0x%x\n", GetThreadLocale(), bind_opts.locale);
+    }
+    else
+        ok(bind_opts.locale == GetThreadLocale(), "bind_opts.locale should have been 0x%x instead of 0x%x\n", GetThreadLocale(), bind_opts.locale);
+
+    ok(bind_opts.pServerInfo == NULL, "bind_opts.pServerInfo should have been NULL instead of %p\n", bind_opts.pServerInfo);
+
+    bind_opts.cbStruct = -1;
+    hr = IBindCtx_SetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts);
+    ok(hr == E_INVALIDARG, "IBindCtx_SetBindOptions with bad cbStruct should have returned E_INVALIDARG instead of 0x%08x\n", hr);
+
+    hr = IBindCtx_RegisterObjectParam(pBindCtx, (WCHAR *)wszParamName, NULL);
+    ok(hr == E_INVALIDARG, "IBindCtx_RegisterObjectParam should have returned E_INVALIDARG instead of 0x%08x\n", hr);
+
+    unknown = (HeapUnknown *)HeapAlloc(GetProcessHeap(), 0, sizeof(*unknown));
+    unknown->lpVtbl = &HeapUnknown_Vtbl;
+    unknown->refs = 1;
+    hr = IBindCtx_RegisterObjectParam(pBindCtx, (WCHAR *)wszParamName, (IUnknown *)&unknown->lpVtbl);
+    ok_ole_success(hr, "IBindCtx_RegisterObjectParam");
+
+    hr = IBindCtx_EnumObjectParam(pBindCtx, &pEnumString);
+    ok(hr == E_NOTIMPL, "IBindCtx_EnumObjectParam should have returned E_NOTIMPL instead of 0x%08x\n", hr);
+    todo_wine
+    ok(!pEnumString, "pEnumString should be NULL\n");
+
+    hr = IBindCtx_RegisterObjectBound(pBindCtx, NULL);
+    todo_wine
+    ok_ole_success(hr, "IBindCtx_RegisterObjectBound(NULL)");
+
+    unknown2 = (HeapUnknown *)HeapAlloc(GetProcessHeap(), 0, sizeof(*unknown));
+    unknown2->lpVtbl = &HeapUnknown_Vtbl;
+    unknown2->refs = 1;
+    hr = IBindCtx_RegisterObjectBound(pBindCtx, (IUnknown *)&unknown2->lpVtbl);
+    ok_ole_success(hr, "IBindCtx_RegisterObjectBound");
+
+    IBindCtx_Release(pBindCtx);
+
+    refs = IUnknown_Release((IUnknown *)&unknown->lpVtbl);
+    ok(!refs, "object param should have been destroyed, instead of having %d refs\n", refs);
+
+    refs = IUnknown_Release((IUnknown *)&unknown2->lpVtbl);
+    ok(!refs, "bound object should have been destroyed, instead of having %d refs\n", refs);
+}
+
 START_TEST(moniker)
 {
     CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
@@ -1411,5 +1532,7 @@ START_TEST(moniker)
 
     /* FIXME: test moniker creation funcs and parsing other moniker formats */
 
+    test_bind_context();
+
     CoUninitialize();
 }




More information about the wine-cvs mailing list