From f6e0e1815b8be1ba502550f3ccdfca1dbf20573c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Mon, 10 Mar 2014 23:43:11 +0100 Subject: [PATCH] ddraw/tests: Show that a failing SetPrivateData call does not clear the old contents. --- dlls/ddraw/tests/ddraw4.c | 17 +++++++++++++++++ dlls/ddraw/tests/ddraw7.c | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 5a2dba1245e..3b1f8d453d6 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -6072,6 +6072,23 @@ static void test_private_data(void) sizeof(ddraw) * 2, DDSPD_IUNKNOWNPOINTER); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + /* Note that with a size != 0 and size != sizeof(IUnknown *) and + * DDSPD_IUNKNOWNPOINTER set SetPrivateData in ddraw4 and ddraw7 + * erases the old content and returns an error. This behavior has + * been fixed in d3d8 and d3d9. Unless an application is found + * that depends on this we don't care about this behavior. */ + hr = IDirectDrawSurface4_SetPrivateData(surface, &IID_IDirect3D, ddraw, + sizeof(ddraw), DDSPD_IUNKNOWNPOINTER); + ok(SUCCEEDED(hr), "Failed to set private data, hr %#x.\n", hr); + hr = IDirectDrawSurface4_SetPrivateData(surface, &IID_IDirect3D, ddraw, + 0, DDSPD_IUNKNOWNPOINTER); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + size = sizeof(ptr); + hr = IDirectDrawSurface4_GetPrivateData(surface, &IID_IDirect3D, &ptr, &size); + ok(SUCCEEDED(hr), "Failed to get private data, hr %#x.\n", hr); + hr = IDirectDrawSurface4_FreePrivateData(surface, &IID_IDirect3D); + ok(SUCCEEDED(hr), "Failed to free private data, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)ddraw); hr = IDirectDrawSurface4_SetPrivateData(surface, &IID_IDirect3D, ddraw, sizeof(ddraw), DDSPD_IUNKNOWNPOINTER); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 1218a21ad99..b4570af4814 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -5927,6 +5927,23 @@ static void test_private_data(void) sizeof(ddraw) * 2, DDSPD_IUNKNOWNPOINTER); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + /* Note that with a size != 0 and size != sizeof(IUnknown *) and + * DDSPD_IUNKNOWNPOINTER set SetPrivateData in ddraw4 and ddraw7 + * erases the old content and returns an error. This behavior has + * been fixed in d3d8 and d3d9. Unless an application is found + * that depends on this we don't care about this behavior. */ + hr = IDirectDrawSurface7_SetPrivateData(surface, &IID_IDirect3D, ddraw, + sizeof(ddraw), DDSPD_IUNKNOWNPOINTER); + ok(SUCCEEDED(hr), "Failed to set private data, hr %#x.\n", hr); + hr = IDirectDrawSurface7_SetPrivateData(surface, &IID_IDirect3D, ddraw, + 0, DDSPD_IUNKNOWNPOINTER); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); + size = sizeof(ptr); + hr = IDirectDrawSurface7_GetPrivateData(surface, &IID_IDirect3D, &ptr, &size); + ok(SUCCEEDED(hr), "Failed to get private data, hr %#x.\n", hr); + hr = IDirectDrawSurface7_FreePrivateData(surface, &IID_IDirect3D); + ok(SUCCEEDED(hr), "Failed to free private data, hr %#x.\n", hr); + refcount = get_refcount((IUnknown *)ddraw); hr = IDirectDrawSurface7_SetPrivateData(surface, &IID_IDirect3D, ddraw, sizeof(ddraw), DDSPD_IUNKNOWNPOINTER);