[PATCH 1/5] dxgi/tests: Introduce check_interface() function.

Józef Kucia jkucia at codeweavers.com
Tue Jan 23 11:15:15 CST 2018


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/dxgi/tests/device.c | 62 +++++++++++++++++++++++++++++-------------------
 1 file changed, 38 insertions(+), 24 deletions(-)

diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index 899a06383ae0..dfbbab42f5ea 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -39,6 +39,35 @@ static ULONG get_refcount(IUnknown *iface)
     return IUnknown_Release(iface);
 }
 
+#define check_interface(a, b, c, d) check_interface_(__LINE__, a, b, c, d)
+static HRESULT check_interface_(unsigned int line, void *iface, REFIID iid,
+        BOOL supported, BOOL is_broken)
+{
+    HRESULT hr, expected_hr, broken_hr;
+    IUnknown *unknown = iface, *out;
+
+    if (supported)
+    {
+        expected_hr = S_OK;
+        broken_hr = E_NOINTERFACE;
+    }
+    else
+    {
+        expected_hr = E_NOINTERFACE;
+        broken_hr = S_OK;
+    }
+
+    out = (IUnknown *)0xdeadbeef;
+    hr = IUnknown_QueryInterface(unknown, iid, (void **)&out);
+    ok_(__FILE__, line)(hr == expected_hr || broken(is_broken && hr == broken_hr),
+            "Got hr %#x, expected %#x.\n", hr, expected_hr);
+    if (SUCCEEDED(hr))
+        IUnknown_Release(out);
+    else
+        ok_(__FILE__, line)(!out, "Got unexpected pointer %p.\n", out);
+    return hr;
+}
+
 #define MODE_DESC_IGNORE_RESOLUTION        0x00000001u
 #define MODE_DESC_IGNORE_REFRESH_RATE      0x00000002u
 #define MODE_DESC_IGNORE_FORMAT            0x00000004u
@@ -458,8 +487,6 @@ static void test_create_surface(void)
     DXGI_SURFACE_DESC desc;
     IDXGISurface *surface;
     IDXGIDevice *device;
-    IUnknown *surface1;
-    IUnknown *texture;
     ULONG refcount;
     HRESULT hr;
 
@@ -478,19 +505,11 @@ static void test_create_surface(void)
     hr = IDXGIDevice_CreateSurface(device, &desc, 1, DXGI_USAGE_RENDER_TARGET_OUTPUT, NULL, &surface);
     ok(SUCCEEDED(hr), "Failed to create a dxgi surface, hr %#x\n", hr);
 
-    hr = IDXGISurface_QueryInterface(surface, &IID_ID3D10Texture2D, (void **)&texture);
-    ok(SUCCEEDED(hr), "Surface should implement ID3D10Texture2D\n");
-    IUnknown_Release(texture);
-
-    hr = IDXGISurface_QueryInterface(surface, &IID_ID3D11Texture2D, (void **)&texture);
-    ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
-            "Surface should implement ID3D11Texture2D.\n");
-    if (SUCCEEDED(hr)) IUnknown_Release(texture);
-
-    hr = IDXGISurface_QueryInterface(surface, &IID_IDXGISurface1, (void **)&surface1);
-    ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE) /* Not available on all Windows versions. */,
-            "Surface should implement IDXGISurface1.\n");
-    if (SUCCEEDED(hr)) IUnknown_Release(surface1);
+    check_interface(surface, &IID_ID3D10Texture2D, TRUE, FALSE);
+    /* Not available on all Windows versions. */
+    check_interface(surface, &IID_ID3D11Texture2D, TRUE, TRUE);
+    /* Not available on all Windows versions. */
+    check_interface(surface, &IID_IDXGISurface1, TRUE, TRUE);
 
     IDXGISurface_Release(surface);
     refcount = IDXGIDevice_Release(device);
@@ -2341,7 +2360,6 @@ done:
 
 static void test_create_factory(void)
 {
-    IDXGIFactory1 *factory;
     IUnknown *iface;
     ULONG refcount;
     HRESULT hr;
@@ -2359,12 +2377,9 @@ static void test_create_factory(void)
     ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIObject, hr %#x.\n", hr);
     IUnknown_Release(iface);
 
-    factory = (void *)0xdeadbeef;
     hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&iface);
     ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory, hr %#x.\n", hr);
-    hr = IUnknown_QueryInterface(iface, &IID_IDXGIFactory1, (void **)&factory);
-    ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr);
-    ok(!factory, "Got unexpected factory %p.\n", factory);
+    check_interface(iface, &IID_IDXGIFactory1, FALSE, FALSE);
     IUnknown_Release(iface);
 
     iface = (void *)0xdeadbeef;
@@ -2403,10 +2418,9 @@ static void test_create_factory(void)
 
     hr = pCreateDXGIFactory1(&IID_IDXGIFactory, (void **)&iface);
     ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory, hr %#x.\n", hr);
-    hr = IUnknown_QueryInterface(iface, &IID_IDXGIFactory1, (void **)&factory);
-    ok(SUCCEEDED(hr), "Failed to query IDXGIFactory1 interface, hr %#x.\n", hr);
-    IDXGIFactory1_Release(factory);
-    IUnknown_Release(iface);
+    check_interface(iface, &IID_IDXGIFactory1, TRUE, FALSE);
+    refcount = IUnknown_Release(iface);
+    ok(!refcount, "Factory has %u references left.\n", refcount);
 
     hr = pCreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&iface);
     ok(SUCCEEDED(hr), "Failed to create factory with IID_IDXGIFactory1, hr %#x.\n", hr);
-- 
2.13.6




More information about the wine-devel mailing list