Module: wine Branch: master Commit: f6e0e1815b8be1ba502550f3ccdfca1dbf20573c URL: http://source.winehq.org/git/wine.git/?a=commit;h=f6e0e1815b8be1ba502550f3cc...
Author: Stefan Dösinger stefan@codeweavers.com Date: Mon Mar 10 23:43:11 2014 +0100
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 5a2dba1..3b1f8d4 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 1218a21..b4570af 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);