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

This commit is contained in:
Huw Davies 2010-10-26 14:22:19 +01:00 committed by Alexandre Julliard
parent 6ec621e835
commit ad326999ec
1 changed files with 103 additions and 1 deletions

View File

@ -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);