Huw Davies : ole32/tests: Add tests to exercise the datacache's IDataObject ::GetData.

Alexandre Julliard julliard at winehq.org
Mon Nov 1 11:54:40 CDT 2010


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Oct 26 14:22:19 2010 +0100

ole32/tests: Add tests to exercise the datacache's IDataObject::GetData.

---

 dlls/ole32/tests/ole2.c |  104 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 103 insertions(+), 1 deletions(-)

diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index 7fadb7d..460a08f 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -69,6 +69,8 @@ static BOOL g_isRunning = TRUE;
 static BOOL g_failGetMiscStatus;
 static HRESULT g_QIFailsWith;
 
+static UINT cf_test_1, cf_test_2, cf_test_3;
+
 #define CHECK_EXPECTED_METHOD(method_name) \
     do { \
         trace("%s\n", method_name); \
@@ -1063,6 +1065,8 @@ static HRESULT WINAPI DataObject_QueryInterface(
             REFIID           riid,
             void**           ppvObject)
 {
+    CHECK_EXPECTED_METHOD("DataObject_QueryInterface");
+
     if (IsEqualIID(riid, &IID_IDataObject) || IsEqualIID(riid, &IID_IUnknown))
     {
         *ppvObject = iface;
@@ -1075,12 +1079,14 @@ static HRESULT WINAPI DataObject_QueryInterface(
 static ULONG WINAPI DataObject_AddRef(
             IDataObject*     iface)
 {
+    CHECK_EXPECTED_METHOD("DataObject_AddRef");
     return 2;
 }
 
 static ULONG WINAPI DataObject_Release(
             IDataObject*     iface)
 {
+    CHECK_EXPECTED_METHOD("DataObject_Release");
     return 1;
 }
 
@@ -1145,8 +1151,20 @@ static HRESULT WINAPI DataObject_DAdvise(
         IAdviseSink*     pAdvSink,
         DWORD*           pdwConnection)
 {
+    STGMEDIUM stgmedium;
+
     CHECK_EXPECTED_METHOD("DataObject_DAdvise");
     *pdwConnection = 1;
+
+    if(advf & ADVF_PRIMEFIRST)
+    {
+        ok(pformatetc->cfFormat == cf_test_2, "got %04x\n", pformatetc->cfFormat);
+        stgmedium.tymed = TYMED_HGLOBAL;
+        U(stgmedium).hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 4);
+        stgmedium.pUnkForRelease = NULL;
+        IAdviseSink_OnDataChange(pAdvSink, pformatetc, &stgmedium);
+    }
+
     return S_OK;
 }
 
@@ -1192,6 +1210,7 @@ static void test_data_cache(void)
     IPersistStorage *pPS;
     IViewObject *pViewObject;
     IOleCacheControl *pOleCacheControl;
+    IDataObject *pCacheDataObject;
     FORMATETC fmtetc;
     STGMEDIUM stgmedium;
     DWORD dwConnection;
@@ -1226,6 +1245,19 @@ static void test_data_cache(void)
         { "DataObject_GetData", 0 },
         { NULL, 0 }
     };
+    static const struct expected_method methods_cachethenrun[] =
+    {
+        { "DataObject_DAdvise", 0 },
+        { "DataObject_DAdvise", 0 },
+        { "DataObject_DAdvise", 0 },
+        { "DataObject_QueryGetData", 1 }, /* called by win9x and nt4 */
+        { "DataObject_DAdvise", 0 },
+        { "DataObject_DUnadvise", 0 },
+        { "DataObject_DUnadvise", 0 },
+        { "DataObject_DUnadvise", 0 },
+        { "DataObject_DUnadvise", 0 },
+        { NULL, 0 }
+    };
 
     GetSystemDirectory(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]));
 
@@ -1340,6 +1372,7 @@ static void test_data_cache(void)
     fmtetc.dwAspect = DVASPECT_ICON;
     hr = IOleCache_SetData(pOleCache, &fmtetc, &stgmedium, FALSE);
     ok_ole_success(hr, "IOleCache_SetData");
+    ReleaseStgMedium(&stgmedium);
 
     hr = IViewObject_Freeze(pViewObject, DVASPECT_ICON, -1, NULL, &dwFreeze);
     todo_wine {
@@ -1467,8 +1500,73 @@ static void test_data_cache(void)
     CHECK_NO_EXTRA_METHODS();
     }
 
-    IStorage_Release(pStorage);
+    hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IOleCache2, (LPVOID *)&pOleCache);
+    ok_ole_success(hr, "CreateDataCache");
+
+    expected_method_list = methods_cachethenrun;
+
+    hr = IOleCache_QueryInterface(pOleCache, &IID_IDataObject, (LPVOID *)&pCacheDataObject);
+    ok_ole_success(hr, "IOleCache_QueryInterface(IID_IDataObject)");
+    hr = IOleCache_QueryInterface(pOleCache, &IID_IOleCacheControl, (LPVOID *)&pOleCacheControl);
+    ok_ole_success(hr, "IOleCache_QueryInterface(IID_IOleCacheControl)");
+
+    fmtetc.cfFormat = CF_METAFILEPICT;
+    fmtetc.dwAspect = DVASPECT_CONTENT;
+    fmtetc.tymed = TYMED_MFPICT;
+
+    hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
+    ok_ole_success(hr, "IOleCache_Cache");
+
+    hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
+    ok(hr == OLE_E_BLANK, "got %08x\n", hr);
+
+    fmtetc.cfFormat = cf_test_1;
+    fmtetc.dwAspect = DVASPECT_CONTENT;
+    fmtetc.tymed = TYMED_HGLOBAL;
+
+    hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
+    ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, "got %08x\n", hr);
+
+    hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
+    ok(hr == OLE_E_BLANK, "got %08x\n", hr);
+
+    fmtetc.cfFormat = cf_test_2;
+    hr = IOleCache_Cache(pOleCache, &fmtetc, ADVF_PRIMEFIRST, &dwConnection);
+    ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, "got %08x\n", hr);
+
+    hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
+    ok(hr == OLE_E_BLANK, "got %08x\n", hr);
+
+    hr = IOleCacheControl_OnRun(pOleCacheControl, &DataObject);
+todo_wine
+    ok_ole_success(hr, "IOleCacheControl_OnRun");
+
+    fmtetc.cfFormat = cf_test_3;
+    hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
+    ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, "got %08x\n", hr);
+
+    fmtetc.cfFormat = cf_test_1;
+    hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
+    ok(hr == OLE_E_BLANK, "got %08x\n", hr);
+
+    fmtetc.cfFormat = cf_test_2;
+    hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
+todo_wine
+    ok(hr == S_OK, "got %08x\n", hr);
     ReleaseStgMedium(&stgmedium);
+
+    fmtetc.cfFormat = cf_test_3;
+    hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
+    ok(hr == OLE_E_BLANK, "got %08x\n", hr);
+
+    IOleCacheControl_Release(pOleCacheControl);
+    IDataObject_Release(pCacheDataObject);
+    IOleCache_Release(pOleCache);
+
+todo_wine
+    CHECK_NO_EXTRA_METHODS();
+
+    IStorage_Release(pStorage);
 }
 
 static void test_default_handler(void)
@@ -1758,6 +1856,10 @@ START_TEST(ole2)
     STATSTG statstg;
     HRESULT hr;
 
+    cf_test_1 = RegisterClipboardFormatA("cf_winetest_1");
+    cf_test_2 = RegisterClipboardFormatA("cf_winetest_2");
+    cf_test_3 = RegisterClipboardFormatA("cf_winetest_3");
+
     CoInitialize(NULL);
 
     hr = CoRegisterClassObject(&CLSID_Equation3, (IUnknown *)&OleObjectCF, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);




More information about the wine-cvs mailing list