Huw Davies : ole32/tests: Tests for a flushed clipboard.

Alexandre Julliard julliard at winehq.org
Thu Apr 16 14:34:52 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Apr 16 12:35:31 2009 +0100

ole32/tests: Tests for a flushed clipboard.

---

 dlls/ole32/tests/clipboard.c |  145 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 143 insertions(+), 2 deletions(-)

diff --git a/dlls/ole32/tests/clipboard.c b/dlls/ole32/tests/clipboard.c
index c3db7b2..ed47c8b 100644
--- a/dlls/ole32/tests/clipboard.c
+++ b/dlls/ole32/tests/clipboard.c
@@ -19,6 +19,7 @@
  */
 
 #define COBJMACROS
+#define NONAMELESSUNION
 
 #include <stdarg.h>
 #include <stdio.h>
@@ -255,7 +256,7 @@ static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pfor
                     IStream_AddRef(This->stm);
                     U(*pmedium).pstm = This->stm;
                 }
-                else if(pformatetc->cfFormat == cf_storage)
+                else if(pformatetc->cfFormat == cf_storage || pformatetc->cfFormat == cf_another)
                 {
                     pmedium->tymed = TYMED_ISTORAGE;
                     IStorage_AddRef(This->stg);
@@ -386,12 +387,12 @@ static HRESULT DataObjectImpl_CreateText(LPCSTR text, LPDATAOBJECT *lplpdataobj)
 
 const char *cmpl_stm_data = "complex stream";
 const char *cmpl_text_data = "complex text";
+const WCHAR devname[] = {'m','y','d','e','v',0};
 
 static HRESULT DataObjectImpl_CreateComplex(LPDATAOBJECT *lplpdataobj)
 {
     DataObjectImpl *obj;
     ILockBytes *lbs;
-    static const WCHAR devname[] = {'m','y','d','e','v',0};
     DEVMODEW dm;
 
     obj = HeapAlloc(GetProcessHeap(), 0, sizeof(DataObjectImpl));
@@ -1007,8 +1008,148 @@ static void test_consumer_refs(void)
     OleUninitialize();
 }
 
+static void test_flushed_getdata(void)
+{
+    HRESULT hr;
+    IDataObject *src, *get;
+    FORMATETC fmt;
+    STGMEDIUM med;
+    STATSTG stat;
+    DEVMODEW dm;
+
+    OleInitialize(NULL);
+
+    hr = DataObjectImpl_CreateComplex(&src);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = OleSetClipboard(src);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = OleFlushClipboard();
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    hr = OleGetClipboard(&get);
+    ok(hr == S_OK, "got %08x\n", hr);
+
+    /* global format -> global & stream */
+
+    InitFormatEtc(fmt, CF_TEXT, TYMED_HGLOBAL);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, CF_TEXT, TYMED_ISTREAM);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, CF_TEXT, TYMED_ISTORAGE);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == E_FAIL, "got %08x\n", hr);
+
+    InitFormatEtc(fmt, CF_TEXT, 0xffff);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    /* stream format -> global & stream */
+
+    InitFormatEtc(fmt, cf_stream, TYMED_ISTREAM);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, cf_stream, TYMED_ISTORAGE);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == E_FAIL, "got %08x\n", hr);
+
+    InitFormatEtc(fmt, cf_stream, TYMED_HGLOBAL);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, cf_stream, 0xffff);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    /* storage format -> global, stream & storage */
+
+    InitFormatEtc(fmt, cf_storage, TYMED_ISTORAGE);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed);
+    hr = IStorage_Stat(med.u.pstg, &stat, STATFLAG_NONAME);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(stat.grfMode == (STGM_SHARE_EXCLUSIVE | STGM_READWRITE), "got %08x\n", stat.grfMode);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, cf_storage, TYMED_ISTREAM);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTREAM, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, cf_storage, TYMED_HGLOBAL);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, cf_storage, TYMED_HGLOBAL | TYMED_ISTREAM);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_HGLOBAL, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    InitFormatEtc(fmt, cf_storage, 0xffff);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    /* complex format with target device */
+
+    InitFormatEtc(fmt, cf_another, 0xffff);
+    hr = IDataObject_GetData(get, &fmt, &med);
+    todo_wine ok(hr == DV_E_FORMATETC, "got %08x\n", hr);
+
+    InitFormatEtc(fmt, cf_another, 0xffff);
+    memset(&dm, 0, sizeof(dm));
+    dm.dmSize = sizeof(dm);
+    dm.dmDriverExtra = 0;
+    lstrcpyW(dm.dmDeviceName, devname);
+    fmt.ptd = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(DVTARGETDEVICE, tdData) + sizeof(devname) + dm.dmSize + dm.dmDriverExtra);
+    fmt.ptd->tdSize = FIELD_OFFSET(DVTARGETDEVICE, tdData) + sizeof(devname) + dm.dmSize + dm.dmDriverExtra;
+    fmt.ptd->tdDriverNameOffset = FIELD_OFFSET(DVTARGETDEVICE, tdData);
+    fmt.ptd->tdDeviceNameOffset = 0;
+    fmt.ptd->tdPortNameOffset   = 0;
+    fmt.ptd->tdExtDevmodeOffset = fmt.ptd->tdDriverNameOffset + sizeof(devname);
+    lstrcpyW((WCHAR*)fmt.ptd->tdData, devname);
+    memcpy(fmt.ptd->tdData + sizeof(devname), &dm, dm.dmSize + dm.dmDriverExtra);
+
+    hr = IDataObject_GetData(get, &fmt, &med);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(med.tymed == TYMED_ISTORAGE, "got %x\n", med.tymed);
+    ReleaseStgMedium(&med);
+
+    HeapFree(GetProcessHeap(), 0, fmt.ptd);
+
+
+    IDataObject_Release(get);
+    IDataObject_Release(src);
+    OleUninitialize();
+}
+
 START_TEST(clipboard)
 {
     test_set_clipboard();
     test_consumer_refs();
+    test_flushed_getdata();
 }




More information about the wine-cvs mailing list