Huw Davies : ole32/tests: Add some tests for stream data.

Alexandre Julliard julliard at winehq.org
Tue Mar 31 12:19:23 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Mar 31 12:07:14 2009 +0100

ole32/tests: Add some tests for stream data.

---

 dlls/ole32/tests/clipboard.c |   75 +++++++++++++++++++++++++++++++++++------
 1 files changed, 64 insertions(+), 11 deletions(-)

diff --git a/dlls/ole32/tests/clipboard.c b/dlls/ole32/tests/clipboard.c
index f0296ac..1918b2c 100644
--- a/dlls/ole32/tests/clipboard.c
+++ b/dlls/ole32/tests/clipboard.c
@@ -21,6 +21,7 @@
 #define COBJMACROS
 
 #include <stdarg.h>
+#include <stdio.h>
 
 #include "windef.h"
 #include "winbase.h"
@@ -37,6 +38,15 @@
         (fe).lindex=-1;\
         };
 
+static inline char *dump_fmtetc(FORMATETC *fmt)
+{
+    static char buf[100];
+
+    snprintf(buf, sizeof(buf), "cf %04x ptd %p aspect %x lindex %d tymed %x",
+             fmt->cfFormat, fmt->ptd, fmt->dwAspect, fmt->lindex, fmt->tymed);
+    return buf;
+}
+
 typedef struct DataObjectImpl {
     const IDataObjectVtbl *lpVtbl;
     LONG ref;
@@ -61,9 +71,10 @@ typedef struct EnumFormatImpl {
 
 static BOOL expect_DataObjectImpl_QueryGetData = TRUE;
 static ULONG DataObjectImpl_GetData_calls = 0;
+static ULONG DataObjectImpl_GetDataHere_calls = 0;
 static ULONG DataObjectImpl_EnumFormatEtc_calls = 0;
 
-static UINT cf_stream, cf_storage, cf_another, cf_onemore;
+static UINT cf_stream, cf_storage, cf_global, cf_another, cf_onemore;
 
 static HRESULT EnumFormatImpl_Create(FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc);
 
@@ -216,6 +227,8 @@ static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pfor
     UINT i;
     BOOL foundFormat = FALSE;
 
+    trace("getdata: %s\n", dump_fmtetc(pformatetc));
+
     DataObjectImpl_GetData_calls++;
 
     if(pformatetc->lindex != -1)
@@ -231,7 +244,7 @@ static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pfor
                 pmedium->pUnkForRelease = (LPUNKNOWN)iface;
                 IUnknown_AddRef(pmedium->pUnkForRelease);
 
-                if(pformatetc->cfFormat == CF_TEXT)
+                if(pformatetc->cfFormat == CF_TEXT || pformatetc->cfFormat == cf_global)
                     U(*pmedium).hGlobal = This->text;
                 else if(pformatetc->cfFormat == cf_stream)
                     U(*pmedium).pstm = This->stm;
@@ -247,7 +260,9 @@ static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pfor
 
 static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
 {
-    ok(0, "unexpected call\n");
+    trace("getdatahere: %s\n", dump_fmtetc(pformatetc));
+    DataObjectImpl_GetDataHere_calls++;
+
     return E_NOTIMPL;
 }
 
@@ -257,6 +272,7 @@ static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject* iface, FORMATETC
     UINT i;
     BOOL foundFormat = FALSE;
 
+    trace("querygetdata: %s\n", dump_fmtetc(pformatetc));
     if (!expect_DataObjectImpl_QueryGetData)
         ok(0, "unexpected call to DataObjectImpl_QueryGetData\n");
 
@@ -357,11 +373,12 @@ static HRESULT DataObjectImpl_CreateText(LPCSTR text, LPDATAOBJECT *lplpdataobj)
     return S_OK;
 }
 
+const char *cmpl_stm_data = "complex stream";
+const char *cmpl_text_data = "complex text";
+
 static HRESULT DataObjectImpl_CreateComplex(LPDATAOBJECT *lplpdataobj)
 {
     DataObjectImpl *obj;
-    const char *stm_data = "complex stream";
-    const char *text_data = "complex text";
     ILockBytes *lbs;
     static const WCHAR devname[] = {'m','y','d','e','v',0};
     DEVMODEW dm;
@@ -369,17 +386,17 @@ static HRESULT DataObjectImpl_CreateComplex(LPDATAOBJECT *lplpdataobj)
     obj = HeapAlloc(GetProcessHeap(), 0, sizeof(DataObjectImpl));
     obj->lpVtbl = &VT_DataObjectImpl;
     obj->ref = 1;
-    obj->text = GlobalAlloc(GMEM_MOVEABLE, strlen(text_data) + 1);
-    strcpy(GlobalLock(obj->text), text_data);
+    obj->text = GlobalAlloc(GMEM_MOVEABLE, strlen(cmpl_text_data) + 1);
+    strcpy(GlobalLock(obj->text), cmpl_text_data);
     GlobalUnlock(obj->text);
     CreateStreamOnHGlobal(NULL, TRUE, &obj->stm);
-    IStream_Write(obj->stm, stm_data, strlen(stm_data), NULL);
+    IStream_Write(obj->stm, cmpl_stm_data, strlen(cmpl_stm_data), NULL);
 
     CreateILockBytesOnHGlobal(NULL, TRUE, &lbs);
     StgCreateDocfileOnILockBytes(lbs, STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &obj->stg);
     ILockBytes_Release(lbs);
 
-    obj->fmtetc_cnt = 5;
+    obj->fmtetc_cnt = 8;
     /* zeroing here since FORMATETC has a hole in it, and it's confusing to have this uninitialised. */
     obj->fmtetc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, obj->fmtetc_cnt*sizeof(FORMATETC));
     InitFormatEtc(obj->fmtetc[0], CF_TEXT, TYMED_HGLOBAL);
@@ -399,8 +416,11 @@ static HRESULT DataObjectImpl_CreateComplex(LPDATAOBJECT *lplpdataobj)
     lstrcpyW((WCHAR*)obj->fmtetc[3].ptd->tdData, devname);
     memcpy(obj->fmtetc[3].ptd->tdData + sizeof(devname), &dm, dm.dmSize + dm.dmDriverExtra);
 
-    InitFormatEtc(obj->fmtetc[4], cf_stream, 0xfffff);
-    obj->fmtetc[4].dwAspect = DVASPECT_ICON;
+    InitFormatEtc(obj->fmtetc[4], cf_global, TYMED_HGLOBAL);
+    InitFormatEtc(obj->fmtetc[5], cf_another, TYMED_HGLOBAL);
+    InitFormatEtc(obj->fmtetc[6], cf_another, 0xfffff);
+    InitFormatEtc(obj->fmtetc[7], cf_another, 0xfffff);
+    obj->fmtetc[7].dwAspect = DVASPECT_ICON;
 
     *lplpdataobj = (LPDATAOBJECT)obj;
     return S_OK;
@@ -533,6 +553,7 @@ static void test_enum_fmtetc(IDataObject *src)
         ok(src != NULL, "shouldn't be here\n");
         hr = IEnumFORMATETC_Next(src_enum, 1, &src_fmt, NULL);
         ok(hr == S_OK, "%d: got %08x\n", count, hr);
+        trace("%d: cf %04x aspect %x tymed %x\n", count, fmt.cfFormat, fmt.dwAspect, fmt.tymed);
         ok(fmt.cfFormat == src_fmt.cfFormat, "%d: %04x %04x\n", count, fmt.cfFormat, src_fmt.cfFormat);
         ok(fmt.dwAspect == src_fmt.dwAspect, "%d: %08x %08x\n", count, fmt.dwAspect, src_fmt.dwAspect);
         ok(fmt.lindex == src_fmt.lindex, "%d: %08x %08x\n", count, fmt.lindex, src_fmt.lindex);
@@ -673,6 +694,36 @@ static void test_cf_dataobject(IDataObject *data)
                 }
             }
         }
+        else if(cf == cf_stream)
+        {
+            HGLOBAL h;
+            void *ptr;
+            DWORD size;
+
+            DataObjectImpl_GetDataHere_calls = 0;
+            h = GetClipboardData(cf);
+            ok(DataObjectImpl_GetDataHere_calls == 1, "got %d\n", DataObjectImpl_GetDataHere_calls);
+            ptr = GlobalLock(h);
+            size = GlobalSize(h);
+            ok(size == strlen(cmpl_stm_data), "expected %d got %d\n", strlen(cmpl_stm_data), size);
+            ok(!memcmp(ptr, cmpl_stm_data, size), "mismatch\n");
+            GlobalUnlock(h);
+        }
+        else if(cf == cf_global)
+        {
+            HGLOBAL h;
+            void *ptr;
+            DWORD size;
+
+            DataObjectImpl_GetDataHere_calls = 0;
+            h = GetClipboardData(cf);
+            ok(DataObjectImpl_GetDataHere_calls == 0, "got %d\n", DataObjectImpl_GetDataHere_calls);
+            ptr = GlobalLock(h);
+            size = GlobalSize(h);
+            ok(size == strlen(cmpl_text_data) + 1, "expected %d got %d\n", strlen(cmpl_text_data) + 1, size);
+            ok(!memcmp(ptr, cmpl_text_data, size), "mismatch\n");
+            GlobalUnlock(h);
+        }
     } while(cf);
     CloseClipboard();
     ok(found_dataobject, "didn't find cf_dataobject\n");
@@ -688,6 +739,7 @@ static void test_set_clipboard(void)
 
     cf_stream = RegisterClipboardFormatA("stream format");
     cf_storage = RegisterClipboardFormatA("storage format");
+    cf_global = RegisterClipboardFormatA("global format");
     cf_another = RegisterClipboardFormatA("another format");
     cf_onemore = RegisterClipboardFormatA("one more format");
 
@@ -779,6 +831,7 @@ static void test_set_clipboard(void)
     ok(h == NULL, "got %p\n", h);
     CloseClipboard();
 
+    trace("setting complex\n");
     hr = OleSetClipboard(data_cmpl);
     ok(hr == S_OK, "failed to set clipboard to complex data, hr = 0x%08x\n", hr);
     test_cf_dataobject(data_cmpl);




More information about the wine-cvs mailing list