[PATCH 3/3] d3drm/tests: Split tests between different versions, initially adding frame QueryInterface tests.
Aaryaman Vasishta
jem456.vasishta at gmail.com
Fri Apr 3 07:25:32 CDT 2015
---
dlls/d3drm/tests/Makefile.in | 3 +
dlls/d3drm/tests/d3drm1.c | 182 +++++++++++++++++++++++++++++++++++++++++
dlls/d3drm/tests/d3drm2.c | 191 +++++++++++++++++++++++++++++++++++++++++++
dlls/d3drm/tests/d3drm3.c | 191 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 567 insertions(+)
create mode 100644 dlls/d3drm/tests/d3drm1.c
create mode 100644 dlls/d3drm/tests/d3drm2.c
create mode 100644 dlls/d3drm/tests/d3drm3.c
diff --git a/dlls/d3drm/tests/Makefile.in b/dlls/d3drm/tests/Makefile.in
index 4b39989..f271d8d 100644
--- a/dlls/d3drm/tests/Makefile.in
+++ b/dlls/d3drm/tests/Makefile.in
@@ -3,4 +3,7 @@ IMPORTS = dxguid uuid d3drm ddraw user32
C_SRCS = \
d3drm.c \
+ d3drm1.c \
+ d3drm2.c \
+ d3drm3.c \
vector.c
diff --git a/dlls/d3drm/tests/d3drm1.c b/dlls/d3drm/tests/d3drm1.c
new file mode 100644
index 0000000..8047f84
--- /dev/null
+++ b/dlls/d3drm/tests/d3drm1.c
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2010, 2012 Christian Costa
+ * Copyright 2012 André Hentschel
+ * Copyright 2011-2014 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+#include <d3d.h>
+#include <d3drm.h>
+#include <d3drmwin.h>
+
+#include "wine/test.h"
+
+static ULONG get_refcount(IUnknown *object)
+{
+ IUnknown_AddRef(object);
+ return IUnknown_Release(object);
+}
+
+struct qi_test
+{
+ REFIID iid;
+ REFIID refcount_iid;
+ HRESULT hr;
+ BOOL refcount_todo;
+};
+
+static void test_qi(const char *test_name, IUnknown *base_iface,
+ REFIID refcount_iid, const struct qi_test *tests, UINT entry_count)
+{
+ ULONG refcount, expected_refcount;
+ IUnknown *iface1, *iface2;
+ HRESULT hr;
+ UINT i, j;
+
+ for (i = 0; i < entry_count; ++i)
+ {
+ hr = IUnknown_QueryInterface(base_iface, tests[i].iid, (void **)&iface1);
+ ok(hr == tests[i].hr, "Got hr %#x for test \"%s\" %u.\n", hr, test_name, i);
+ if (SUCCEEDED(hr))
+ {
+ for (j = 0; j < entry_count; ++j)
+ {
+ hr = IUnknown_QueryInterface(iface1, tests[j].iid, (void **)&iface2);
+ ok(hr == tests[j].hr, "Got hr %#x for test \"%s\" %u, %u.\n", hr, test_name, i, j);
+ if (SUCCEEDED(hr))
+ {
+ expected_refcount = 0;
+ if (IsEqualGUID(refcount_iid, tests[j].refcount_iid))
+ ++expected_refcount;
+ if (IsEqualGUID(tests[i].refcount_iid, tests[j].refcount_iid))
+ ++expected_refcount;
+ refcount = IUnknown_Release(iface2);
+ if (tests[i].refcount_todo || tests[j].refcount_todo)
+ todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+ refcount, test_name, i, j, expected_refcount);
+ else
+ ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+ refcount, test_name, i, j, expected_refcount);
+ }
+ }
+
+ expected_refcount = 0;
+ if (IsEqualGUID(refcount_iid, tests[i].refcount_iid))
+ ++expected_refcount;
+ refcount = IUnknown_Release(iface1);
+ if (tests[i].refcount_todo)
+ todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+ refcount, test_name, i, expected_refcount);
+ else
+ ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+ refcount, test_name, i, expected_refcount);
+ }
+ }
+}
+
+static void test_frame_qi(void)
+{
+ static const struct qi_test tests[] =
+ {
+ { &IID_IDirect3DRMFrame3, &IID_IDirect3DRMFrame, S_OK, FALSE },
+ { &IID_IDirect3DRMFrame2, &IID_IDirect3DRMFrame, S_OK, FALSE },
+ { &IID_IDirect3DRMFrame, &IID_IDirect3DRMFrame, S_OK, FALSE },
+ { &IID_IDirect3DRM, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDevice, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMObject, &IID_IDirect3DRMFrame, S_OK, FALSE },
+ { &IID_IDirect3DRMDevice2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDevice3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewport, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewport2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRM3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRM2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMVisual, &IID_IDirect3DRMFrame, S_OK, FALSE },
+ { &IID_IDirect3DRMMesh, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFace, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFace2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMLight, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMWrap, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMaterial, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMaterial2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimation, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimation2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationSet, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationSet2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMObjectArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDeviceArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewportArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFrameArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMVisualArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMLightArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMPickedArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFaceArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMUserVisual, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMShadow, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMShadow2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMInterpolator, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMProgressiveMesh, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMPicked2Array, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMClippedVisual, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawClipper, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface4, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw4, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DLight, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IUnknown, &IID_IDirect3DRMFrame, S_OK, FALSE },
+ };
+ HRESULT hr;
+ IDirect3DRM *d3drm;
+ IDirect3DRMFrame *frame;
+
+ hr = Direct3DRMCreate(&d3drm);
+ ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+ hr = IDirect3DRM_CreateFrame(d3drm, NULL, &frame);
+ ok(hr == D3DRM_OK, "Failed to create frame (hr = %x)\n", hr);
+
+ test_qi("frame_qi", (IUnknown *)frame, &IID_IDirect3DRMFrame, tests, sizeof(tests) / sizeof(*tests));
+
+ IDirect3DRMFrame_Release(frame);
+ IDirect3DRM_Release(d3drm);
+}
+
+START_TEST(d3drm1)
+{
+ test_frame_qi();
+}
diff --git a/dlls/d3drm/tests/d3drm2.c b/dlls/d3drm/tests/d3drm2.c
new file mode 100644
index 0000000..182c82b
--- /dev/null
+++ b/dlls/d3drm/tests/d3drm2.c
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2010, 2012 Christian Costa
+ * Copyright 2012 André Hentschel
+ * Copyright 2011-2014 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+#include <d3d.h>
+#include <d3drm.h>
+#include <d3drmwin.h>
+
+#include "wine/test.h"
+
+static ULONG get_refcount(IUnknown *object)
+{
+ IUnknown_AddRef(object);
+ return IUnknown_Release(object);
+}
+
+struct qi_test
+{
+ REFIID iid;
+ REFIID refcount_iid;
+ HRESULT hr;
+ BOOL refcount_todo;
+};
+
+static void test_qi(const char *test_name, IUnknown *base_iface,
+ REFIID refcount_iid, const struct qi_test *tests, UINT entry_count)
+{
+ ULONG refcount, expected_refcount;
+ IUnknown *iface1, *iface2;
+ HRESULT hr;
+ UINT i, j;
+
+ for (i = 0; i < entry_count; ++i)
+ {
+ hr = IUnknown_QueryInterface(base_iface, tests[i].iid, (void **)&iface1);
+ ok(hr == tests[i].hr, "Got hr %#x for test \"%s\" %u.\n", hr, test_name, i);
+ if (SUCCEEDED(hr))
+ {
+ for (j = 0; j < entry_count; ++j)
+ {
+ hr = IUnknown_QueryInterface(iface1, tests[j].iid, (void **)&iface2);
+ ok(hr == tests[j].hr, "Got hr %#x for test \"%s\" %u, %u.\n", hr, test_name, i, j);
+ if (SUCCEEDED(hr))
+ {
+ expected_refcount = 0;
+ if (IsEqualGUID(refcount_iid, tests[j].refcount_iid))
+ ++expected_refcount;
+ if (IsEqualGUID(tests[i].refcount_iid, tests[j].refcount_iid))
+ ++expected_refcount;
+ refcount = IUnknown_Release(iface2);
+ if (tests[i].refcount_todo || tests[j].refcount_todo)
+ todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+ refcount, test_name, i, j, expected_refcount);
+ else
+ ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+ refcount, test_name, i, j, expected_refcount);
+ }
+ }
+
+ expected_refcount = 0;
+ if (IsEqualGUID(refcount_iid, tests[i].refcount_iid))
+ ++expected_refcount;
+ refcount = IUnknown_Release(iface1);
+ if (tests[i].refcount_todo)
+ todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+ refcount, test_name, i, expected_refcount);
+ else
+ ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+ refcount, test_name, i, expected_refcount);
+ }
+ }
+}
+
+static void test_frame_qi(void)
+{
+ static const struct qi_test tests[] =
+ {
+ { &IID_IDirect3DRMFrame3, &IID_IDirect3DRMFrame2, S_OK, FALSE },
+ { &IID_IDirect3DRMFrame2, &IID_IDirect3DRMFrame2, S_OK, FALSE },
+ { &IID_IDirect3DRMFrame, &IID_IDirect3DRMFrame2, S_OK, FALSE },
+ { &IID_IDirect3DRM, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDevice, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMObject, &IID_IDirect3DRMFrame2, S_OK, FALSE },
+ { &IID_IDirect3DRMDevice2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDevice3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewport, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewport2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRM3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRM2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMVisual, &IID_IDirect3DRMFrame2, S_OK, FALSE },
+ { &IID_IDirect3DRMMesh, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFace, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFace2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMLight, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMWrap, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMaterial, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMaterial2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimation, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimation2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationSet, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationSet2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMObjectArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDeviceArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewportArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFrameArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMVisualArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMLightArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMPickedArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFaceArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMUserVisual, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMShadow, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMShadow2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMInterpolator, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMProgressiveMesh, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMPicked2Array, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMClippedVisual, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawClipper, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface4, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw4, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DLight, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IUnknown, &IID_IDirect3DRMFrame2, S_OK, FALSE },
+ };
+ HRESULT hr;
+ IDirect3DRM *d3drm;
+ IDirect3DRM2 *d3drm2;
+ IDirect3DRMFrame2 *frame2;
+
+ hr = Direct3DRMCreate(&d3drm);
+ ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+ if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM2, (void **)&d3drm2)))
+ {
+ win_skip("Cannot get IDirect3DRM2 interface (hr = %x), skipping tests\n", hr);
+ IDirect3DRM_Release(d3drm);
+ return;
+ }
+
+ hr = IDirect3DRM2_CreateFrame(d3drm2, NULL, &frame2);
+ ok(hr == D3DRM_OK, "Failed to create frame (hr = %x)\n", hr);
+
+ test_qi("frame_qi", (IUnknown *)frame2, &IID_IDirect3DRMFrame2, tests, sizeof(tests) / sizeof(*tests));
+
+ IDirect3DRMFrame2_Release(frame2);
+ IDirect3DRM2_Release(d3drm2);
+ IDirect3DRM_Release(d3drm);
+}
+
+START_TEST(d3drm2)
+{
+ test_frame_qi();
+}
diff --git a/dlls/d3drm/tests/d3drm3.c b/dlls/d3drm/tests/d3drm3.c
new file mode 100644
index 0000000..d8a8780
--- /dev/null
+++ b/dlls/d3drm/tests/d3drm3.c
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2010, 2012 Christian Costa
+ * Copyright 2012 André Hentschel
+ * Copyright 2011-2014 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+#include <d3d.h>
+#include <d3drm.h>
+#include <d3drmwin.h>
+
+#include "wine/test.h"
+
+static ULONG get_refcount(IUnknown *object)
+{
+ IUnknown_AddRef(object);
+ return IUnknown_Release(object);
+}
+
+struct qi_test
+{
+ REFIID iid;
+ REFIID refcount_iid;
+ HRESULT hr;
+ BOOL refcount_todo;
+};
+
+static void test_qi(const char *test_name, IUnknown *base_iface,
+ REFIID refcount_iid, const struct qi_test *tests, UINT entry_count)
+{
+ ULONG refcount, expected_refcount;
+ IUnknown *iface1, *iface2;
+ HRESULT hr;
+ UINT i, j;
+
+ for (i = 0; i < entry_count; ++i)
+ {
+ hr = IUnknown_QueryInterface(base_iface, tests[i].iid, (void **)&iface1);
+ ok(hr == tests[i].hr, "Got hr %#x for test \"%s\" %u.\n", hr, test_name, i);
+ if (SUCCEEDED(hr))
+ {
+ for (j = 0; j < entry_count; ++j)
+ {
+ hr = IUnknown_QueryInterface(iface1, tests[j].iid, (void **)&iface2);
+ ok(hr == tests[j].hr, "Got hr %#x for test \"%s\" %u, %u.\n", hr, test_name, i, j);
+ if (SUCCEEDED(hr))
+ {
+ expected_refcount = 0;
+ if (IsEqualGUID(refcount_iid, tests[j].refcount_iid))
+ ++expected_refcount;
+ if (IsEqualGUID(tests[i].refcount_iid, tests[j].refcount_iid))
+ ++expected_refcount;
+ refcount = IUnknown_Release(iface2);
+ if (tests[i].refcount_todo || tests[j].refcount_todo)
+ todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+ refcount, test_name, i, j, expected_refcount);
+ else
+ ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+ refcount, test_name, i, j, expected_refcount);
+ }
+ }
+
+ expected_refcount = 0;
+ if (IsEqualGUID(refcount_iid, tests[i].refcount_iid))
+ ++expected_refcount;
+ refcount = IUnknown_Release(iface1);
+ if (tests[i].refcount_todo)
+ todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+ refcount, test_name, i, expected_refcount);
+ else
+ ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+ refcount, test_name, i, expected_refcount);
+ }
+ }
+}
+
+static void test_frame_qi(void)
+{
+ static const struct qi_test tests[] =
+ {
+ { &IID_IDirect3DRMFrame3, &IID_IDirect3DRMFrame3, S_OK, FALSE },
+ { &IID_IDirect3DRMFrame2, &IID_IDirect3DRMFrame3, S_OK, FALSE },
+ { &IID_IDirect3DRMFrame, &IID_IDirect3DRMFrame3, S_OK, FALSE },
+ { &IID_IDirect3DRM, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDevice, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMObject, &IID_IDirect3DRMFrame3, S_OK, FALSE },
+ { &IID_IDirect3DRMDevice2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDevice3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewport, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewport2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRM3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRM2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMVisual, &IID_IDirect3DRMFrame3, S_OK, FALSE },
+ { &IID_IDirect3DRMMesh, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMeshBuilder3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFace, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFace2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMLight, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMTexture3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMWrap, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMaterial, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMMaterial2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimation, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimation2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationSet, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationSet2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMObjectArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMDeviceArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMViewportArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFrameArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMVisualArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMLightArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMPickedArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMFaceArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMAnimationArray, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMUserVisual, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMShadow, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMShadow2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMInterpolator, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMProgressiveMesh, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMPicked2Array, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DRMClippedVisual, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawClipper, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface4, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDrawSurface, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DDevice, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3D, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw7, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw4, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw3, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw2, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirectDraw, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IDirect3DLight, NULL, CLASS_E_CLASSNOTAVAILABLE, FALSE },
+ { &IID_IUnknown, &IID_IDirect3DRMFrame3, S_OK, FALSE },
+ };
+ HRESULT hr;
+ IDirect3DRM *d3drm;
+ IDirect3DRM3 *d3drm3;
+ IDirect3DRMFrame3 *frame3;
+
+ hr = Direct3DRMCreate(&d3drm);
+ ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+ if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM3, (void **)&d3drm3)))
+ {
+ win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
+ IDirect3DRM_Release(d3drm);
+ return;
+ }
+
+ hr = IDirect3DRM3_CreateFrame(d3drm3, NULL, &frame3);
+ ok(hr == D3DRM_OK, "Failed to create frame (hr = %x)\n", hr);
+
+ test_qi("frame_qi", (IUnknown *)frame3, &IID_IDirect3DRMFrame3, tests, sizeof(tests) / sizeof(*tests));
+
+ IDirect3DRMFrame3_Release(frame3);
+ IDirect3DRM3_Release(d3drm3);
+ IDirect3DRM_Release(d3drm);
+}
+
+START_TEST(d3drm3)
+{
+ test_frame_qi();
+}
--
1.9.3 (Apple Git-50)
More information about the wine-patches
mailing list