[PATCH 1/2] ddraw/tests: Add some IDirect3DViewport interface tests (try 2)

Stefan Dösinger stefan at codeweavers.com
Thu Feb 2 07:57:05 CST 2012


Try 2: Fixed some issues Henri pointed out.

These tests are a side product of the depth blit tests. They confirm the current
behavior. I also have refcounting tests and fixes for AddViewport, DeleteViewport and
SetCurrentViewport. I'll send them after Wine 1.4 because I don't know any app that
needs them.
---
 dlls/ddraw/tests/ddraw1.c |   94 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw2.c |   89 ++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw4.c |   88 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 271 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 233d013..7f3af14 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -15,6 +15,7 @@
  * 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 "wine/test.h"
 #include "d3d.h"
@@ -815,6 +816,98 @@ static void test_coop_level_threaded(void)
     destroy_window_thread(&p);
 }
 
+static ULONG get_refcount(IUnknown *test_iface)
+{
+    IUnknown_AddRef(test_iface);
+    return IUnknown_Release(test_iface);
+}
+
+static void test_viewport_interfaces(void)
+{
+    IDirectDraw *ddraw;
+    IDirect3D *d3d;
+    HRESULT hr;
+    LONG ref;
+    IDirect3DViewport *viewport;
+    IDirect3DViewport2 *viewport2;
+    IDirect3DViewport3 *viewport3;
+    IDirectDrawGammaControl *gamma;
+    IUnknown *unknown;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create ddraw object, skipping test.\n");
+        return;
+    }
+    hr = IDirectDraw_QueryInterface(ddraw, &IID_IDirect3D, (void **)&d3d);
+    ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to get d3d interface, hr %#x.\n", hr);
+    if (FAILED(hr))
+    {
+        skip("Direct3D not available, skipping tests\n");
+        IDirectDraw_Release(ddraw);
+        return;
+    }
+    ref = get_refcount((IUnknown *)d3d);
+    ok(ref == 2, "IDirect3D refcount is %d\n", ref);
+
+    hr = IDirect3D_CreateViewport(d3d, &viewport, NULL);
+    ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
+    ref = get_refcount((IUnknown *)viewport);
+    ok(ref == 1, "Initial IDirect3DViewport refcount is %d\n", ref);
+    ref = get_refcount((IUnknown *)d3d);
+    ok(ref == 2, "IDirect3D refcount is %d\n", ref);
+
+    /* E_FAIL return values are returned by Winetestbot Windows NT machines. While not supporting
+     * newer interfaces is legitimate for old ddraw versions, E_FAIL violates Microsoft's rules
+     * for QueryInterface, hence the broken() */
+    gamma = (IDirectDrawGammaControl *)0xdeadbeef;
+    hr = IDirect3DViewport_QueryInterface(viewport, &IID_IDirectDrawGammaControl, (void **)&gamma);
+    ok(hr == E_NOINTERFACE || broken(hr == E_FAIL), "Got unexpected hr %#x.\n", hr);
+    ok(gamma == NULL, "Interface not set to NULL by failed QI call: %p\n", gamma);
+    if (SUCCEEDED(hr)) IDirectDrawGammaControl_Release(gamma);
+    /* NULL iid: Segfaults */
+
+    hr = IDirect3DViewport_QueryInterface(viewport, &IID_IDirect3DViewport2, (void **)&viewport2);
+    ok(SUCCEEDED(hr) || hr == E_NOINTERFACE || broken(hr == E_FAIL),
+            "Failed to QI IDirect3DViewport2, hr %#x.\n", hr);
+    if (viewport2)
+    {
+        ref = get_refcount((IUnknown *)viewport);
+        ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
+        ref = get_refcount((IUnknown *)viewport2);
+        ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
+        IDirect3DViewport2_Release(viewport2);
+        viewport2 = NULL;
+    }
+
+    hr = IDirect3DViewport_QueryInterface(viewport, &IID_IDirect3DViewport3, (void **)&viewport3);
+    ok(SUCCEEDED(hr) || hr == E_NOINTERFACE || broken(hr == E_FAIL),
+            "Failed to QI IDirect3DViewport3, hr %#x.\n", hr);
+    if (viewport3)
+    {
+        ref = get_refcount((IUnknown *)viewport);
+        ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
+        ref = get_refcount((IUnknown *)viewport3);
+        ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
+        IDirect3DViewport3_Release(viewport3);
+    }
+
+    hr = IDirect3DViewport_QueryInterface(viewport, &IID_IUnknown, (void **)&unknown);
+    ok(SUCCEEDED(hr), "Failed to QI IUnknown, hr %#x.\n", hr);
+    if (unknown)
+    {
+        ref = get_refcount((IUnknown *)viewport);
+        ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
+        ref = get_refcount(unknown);
+        ok(ref == 2, "IUnknown refcount is %d\n", ref);
+        IUnknown_Release(unknown);
+    }
+
+    IDirect3DViewport_Release(viewport);
+    IDirect3D_Release(d3d);
+    IDirectDraw_Release(ddraw);
+}
+
 START_TEST(ddraw1)
 {
     test_coop_level_create_device_window();
@@ -822,4 +915,5 @@ START_TEST(ddraw1)
     test_coop_level_d3d_state();
     test_surface_interface_mismatch();
     test_coop_level_threaded();
+    test_viewport_interfaces();
 }
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index c84e5e9..fc66534 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -15,6 +15,7 @@
  * 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 "wine/test.h"
 #include "d3d.h"
@@ -1178,6 +1179,93 @@ done:
     if (ddraw) IDirectDraw2_Release(ddraw);
 }
 
+static ULONG get_refcount(IUnknown *test_iface)
+{
+    IUnknown_AddRef(test_iface);
+    return IUnknown_Release(test_iface);
+}
+
+static void test_viewport_interfaces(void)
+{
+    IDirectDraw2 *ddraw;
+    IDirect3D2 *d3d;
+    HRESULT hr;
+    LONG ref, old_d3d_ref;
+    IDirect3DViewport *viewport;
+    IDirect3DViewport2 *viewport2;
+    IDirect3DViewport3 *viewport3;
+    IDirectDrawGammaControl *gamma;
+    IUnknown *unknown;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create ddraw object, skipping test.\n");
+        return;
+    }
+
+    hr = IDirectDraw2_QueryInterface(ddraw, &IID_IDirect3D2, (void **)&d3d);
+    ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to get d3d interface, hr %#x.\n", hr);
+    if (FAILED(hr))
+    {
+        skip("Direct3D not available, skipping tests\n");
+        IDirectDraw2_Release(ddraw);
+        return;
+    }
+    old_d3d_ref = get_refcount((IUnknown *)d3d);
+
+    hr = IDirect3D2_CreateViewport(d3d, &viewport2, NULL);
+    ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
+    ref = get_refcount((IUnknown *)viewport2);
+    ok(ref == 1, "Initial IDirect3DViewport2 refcount is %d\n", ref);
+    ref = get_refcount((IUnknown *)d3d);
+    ok(ref == old_d3d_ref, "IDirect3D2 refcount is %d\n", ref);
+
+    gamma = (IDirectDrawGammaControl *)0xdeadbeef;
+    hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IDirectDrawGammaControl, (void **)&gamma);
+    ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr);
+    ok(gamma == NULL, "Interface not set to NULL by failed QI call: %p\n", gamma);
+    if (SUCCEEDED(hr)) IDirectDrawGammaControl_Release(gamma);
+    /* NULL iid: Segfaults */
+
+    hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IDirect3DViewport, (void **)&viewport);
+    ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport, hr %#x.\n", hr);
+    if (viewport)
+    {
+        ref = get_refcount((IUnknown *)viewport);
+        ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
+        ref = get_refcount((IUnknown *)viewport2);
+        ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
+        IDirect3DViewport_Release(viewport);
+        viewport = NULL;
+    }
+
+    hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IDirect3DViewport3, (void **)&viewport3);
+    ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to QI IDirect3DViewport3, hr %#x.\n", hr);
+    if (viewport3)
+    {
+        ref = get_refcount((IUnknown *)viewport2);
+        ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
+        ref = get_refcount((IUnknown *)viewport3);
+        ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
+        IDirect3DViewport3_Release(viewport3);
+    }
+
+    hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IUnknown, (void **)&unknown);
+    ok(SUCCEEDED(hr), "Failed to QI IUnknown, hr %#x.\n", hr);
+    if (unknown)
+    {
+        ref = get_refcount((IUnknown *)viewport2);
+        ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
+        ref = get_refcount(unknown);
+        ok(ref == 2, "IUnknown refcount is %d\n", ref);
+        IUnknown_Release(unknown);
+    }
+
+    IDirect3DViewport2_Release(viewport2);
+    IDirect3D2_Release(d3d);
+    IDirectDraw2_Release(ddraw);
+}
+
 START_TEST(ddraw2)
 {
     test_coop_level_create_device_window();
@@ -1187,4 +1275,5 @@ START_TEST(ddraw2)
     test_coop_level_threaded();
     test_depth_blit();
     test_texture_load_ckey();
+    test_viewport_interfaces();
 }
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 6e7490b..33b2066 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -15,6 +15,7 @@
  * 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 "wine/test.h"
 #include <limits.h>
@@ -1309,6 +1310,92 @@ static void test_texture_load_ckey(void)
     IDirectDraw4_Release(ddraw);
 }
 
+static ULONG get_refcount(IUnknown *test_iface)
+{
+    IUnknown_AddRef(test_iface);
+    return IUnknown_Release(test_iface);
+}
+
+static void test_viewport_interfaces(void)
+{
+    IDirectDraw4 *ddraw;
+    IDirect3D3 *d3d;
+    HRESULT hr, old_d3d_ref;
+    LONG ref;
+    IDirect3DViewport *viewport;
+    IDirect3DViewport2 *viewport2;
+    IDirect3DViewport3 *viewport3;
+    IDirectDrawGammaControl *gamma;
+    IUnknown *unknown;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create ddraw object, skipping test.\n");
+        return;
+    }
+    hr = IDirectDraw4_QueryInterface(ddraw, &IID_IDirect3D3, (void **)&d3d);
+    ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to get d3d interface, hr %#x.\n", hr);
+    if (FAILED(hr))
+    {
+        skip("Direct3D not available, skipping tests\n");
+        IDirectDraw4_Release(ddraw);
+        return;
+    }
+    old_d3d_ref = get_refcount((IUnknown *)d3d);
+
+    hr = IDirect3D3_CreateViewport(d3d, &viewport3, NULL);
+    ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
+    ref = get_refcount((IUnknown *)viewport3);
+    ok(ref == 1, "Initial IDirect3DViewport3 refcount is %d\n", ref);
+    ref = get_refcount((IUnknown *)d3d);
+    ok(ref == old_d3d_ref, "IDirect3D3 refcount is %d\n", ref);
+
+    gamma = (IDirectDrawGammaControl *)0xdeadbeef;
+    hr = IDirect3DViewport2_QueryInterface(viewport3, &IID_IDirectDrawGammaControl, (void **)&gamma);
+    ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr);
+    ok(gamma == NULL, "Interface not set to NULL by failed QI call: %p\n", gamma);
+    if (SUCCEEDED(hr)) IDirectDrawGammaControl_Release(gamma);
+    /* NULL iid: Segfaults */
+
+    hr = IDirect3DViewport3_QueryInterface(viewport3, &IID_IDirect3DViewport, (void **)&viewport);
+    ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport, hr %#x.\n", hr);
+    if (viewport)
+    {
+        ref = get_refcount((IUnknown *)viewport);
+        ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
+        ref = get_refcount((IUnknown *)viewport3);
+        ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
+        IDirect3DViewport_Release(viewport);
+        viewport = NULL;
+    }
+
+    hr = IDirect3DViewport3_QueryInterface(viewport3, &IID_IDirect3DViewport3, (void **)&viewport2);
+    ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport3, hr %#x.\n", hr);
+    if (viewport2)
+    {
+        ref = get_refcount((IUnknown *)viewport2);
+        ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
+        ref = get_refcount((IUnknown *)viewport3);
+        ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
+        IDirect3DViewport3_Release(viewport2);
+    }
+
+    hr = IDirect3DViewport3_QueryInterface(viewport3, &IID_IUnknown, (void **)&unknown);
+    ok(SUCCEEDED(hr), "Failed to QI IUnknown, hr %#x.\n", hr);
+    if (unknown)
+    {
+        ref = get_refcount((IUnknown *)viewport3);
+        ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
+        ref = get_refcount(unknown);
+        ok(ref == 2, "IUnknown refcount is %d\n", ref);
+        IUnknown_Release(unknown);
+    }
+
+    IDirect3DViewport3_Release(viewport3);
+    IDirect3D3_Release(d3d);
+    IDirectDraw4_Release(ddraw);
+}
+
 START_TEST(ddraw4)
 {
     test_process_vertices();
@@ -1319,4 +1406,5 @@ START_TEST(ddraw4)
     test_coop_level_threaded();
     test_depth_blit();
     test_texture_load_ckey();
+    test_viewport_interfaces();
 }
-- 
1.7.3.4




More information about the wine-patches mailing list