d3drm/tests: Port IDirect3DRMFrame tests to IDirect3DRMFrame3

André Hentschel nerv at dawncrow.de
Mon May 7 17:20:31 CDT 2012


---
 dlls/d3drm/tests/d3drm.c |  323 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 320 insertions(+), 3 deletions(-)

diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 6fdc2f7..cecd2f3 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -477,7 +477,7 @@ static void test_Frame(void)
     hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
     ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
     /* In some older version of d3drm, creating IDirect3DRMFrameArray object with GetChildren does not increment refcount of children frames */
-    ok((get_refcount((IUnknown*)pFrameC) == 3) || broken(get_refcount((IUnknown*)pFrameC) == 2), "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown*)pFrameC)); \
+    ok((get_refcount((IUnknown*)pFrameC) == 3) || broken(get_refcount((IUnknown*)pFrameC) == 2), "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown*)pFrameC));
     if (pArray)
     {
         count = IDirect3DRMFrameArray_GetSize(pArray);
@@ -485,9 +485,9 @@ static void test_Frame(void)
         hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmp);
         ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
         ok(pFrameTmp == pFrameC, "pFrameTmp = %p\n", pFrameTmp);
-        ok((get_refcount((IUnknown*)pFrameC) == 4) || broken(get_refcount((IUnknown*)pFrameC) == 3), "Invalid refcount. Expected 4 (or 3) got %d\n", get_refcount((IUnknown*)pFrameC)); \
+        ok((get_refcount((IUnknown*)pFrameC) == 4) || broken(get_refcount((IUnknown*)pFrameC) == 3), "Invalid refcount. Expected 4 (or 3) got %d\n", get_refcount((IUnknown*)pFrameC));
         IDirect3DRMFrame_Release(pFrameTmp);
-        ok((get_refcount((IUnknown*)pFrameC) == 3) || broken(get_refcount((IUnknown*)pFrameC) == 2), "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown*)pFrameC)); \
+        ok((get_refcount((IUnknown*)pFrameC) == 3) || broken(get_refcount((IUnknown*)pFrameC) == 2), "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown*)pFrameC));
         IDirect3DRMFrameArray_Release(pArray);
         CHECK_REFCOUNT(pFrameC, 2);
     }
@@ -701,6 +701,322 @@ static void test_Frame(void)
     IDirect3DRM_Release(pD3DRM);
 }
 
+static void test_Frame3(void)
+{
+    HRESULT hr;
+    LPDIRECT3DRM pD3DRM;
+    LPDIRECT3DRM3 pD3DRM3;
+    LPDIRECT3DRMFRAME3 pFrameC;
+    LPDIRECT3DRMFRAME3 pFrameP1;
+    LPDIRECT3DRMFRAME3 pFrameP2;
+    LPDIRECT3DRMFRAME3 pFrameTmp;
+    LPDIRECT3DRMFRAME pFrameTmpC;
+    LPDIRECT3DRMFRAMEARRAY pArray;
+    LPDIRECT3DRMMESHBUILDER3 pMeshBuilder;
+    LPDIRECT3DRMVISUAL pVisual1;
+    LPDIRECT3DRMVISUAL pVisualTmp;
+    LPDIRECT3DRMVISUALARRAY pVisualArray;
+    LPDIRECT3DRMLIGHT pLight1;
+    LPDIRECT3DRMLIGHT pLightTmp;
+    LPDIRECT3DRMLIGHTARRAY pLightArray;
+    DWORD count;
+
+    hr = pDirect3DRMCreate(&pD3DRM);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    hr = IDirect3DRM_QueryInterface(pD3DRM, &IID_IDirect3DRM3, (LPVOID*)&pD3DRM3);
+    if (FAILED(hr))
+    {
+        win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
+        IDirect3DRM_Release(pD3DRM);
+        return;
+    }
+
+    hr = IDirect3DRM3_CreateFrame(pD3DRM3, NULL, &pFrameC);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame3 interface (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 1);
+
+    hr = IDirect3DRMFrame3_GetParent(pFrameC, NULL);
+    ok(hr == D3DRMERR_BADVALUE, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr);
+    pFrameTmp = (void*)0xdeadbeef;
+    hr = IDirect3DRMFrame3_GetParent(pFrameC, &pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+    CHECK_REFCOUNT(pFrameC, 1);
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameC, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    ok(pArray != NULL, "pArray = %p\n", pArray);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 0, "count = %u\n", count);
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, (LPDIRECT3DRMFRAME*)&pFrameTmp);
+        ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
+        ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+        IDirect3DRMFrameArray_Release(pArray);
+    }
+
+    hr = IDirect3DRM3_CreateFrame(pD3DRM3, NULL, &pFrameP1);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
+
+    /* GetParent with NULL pointer */
+    hr = IDirect3DRMFrame3_GetParent(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 1);
+
+    /* [Add/Delete]Child with NULL pointer */
+    hr = IDirect3DRMFrame3_AddChild(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 1);
+
+    hr = IDirect3DRMFrame3_DeleteChild(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 1);
+
+    /* Add child to first parent */
+    pFrameTmp = (void*)0xdeadbeef;
+    hr = IDirect3DRMFrame3_GetParent(pFrameP1, &pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+
+    hr = IDirect3DRMFrame3_AddChild(pFrameP1, pFrameC);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 1);
+    CHECK_REFCOUNT(pFrameC, 2);
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameP1, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 3);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 1, "count = %u\n", count);
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmpC);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pFrameTmpC != (LPDIRECT3DRMFRAME)pFrameC, "pFrameTmpC = %p\n", pFrameTmpC);
+        CHECK_REFCOUNT(pFrameC, 4);
+        IDirect3DRMFrame_Release(pFrameTmpC);
+        IDirect3DRMFrameArray_Release(pArray);
+        CHECK_REFCOUNT(pFrameC, 2);
+    }
+
+    pFrameTmp = (void*)0xdeadbeef;
+    hr = IDirect3DRMFrame3_GetParent(pFrameC, &pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
+    CHECK_REFCOUNT(pFrameP1, 2);
+
+    /* Add child to second parent */
+    hr = IDirect3DRM3_CreateFrame(pD3DRM3, NULL, &pFrameP2);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
+
+    hr = IDirect3DRMFrame3_AddChild(pFrameP2, pFrameC);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 2);
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameP2, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 1, "count = %u\n", count);
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmpC);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pFrameTmpC != (LPDIRECT3DRMFRAME)pFrameC, "pFrameTmpC = %p\n", pFrameTmpC);
+        IDirect3DRMFrame_Release(pFrameTmpC);
+        IDirect3DRMFrameArray_Release(pArray);
+    }
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameP1, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 0, "count = %u\n", count);
+        pFrameTmp = (void*)0xdeadbeef;
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmpC);
+        ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
+        ok(pFrameTmpC == NULL, "pFrameTmpC = %p\n", pFrameTmpC);
+        IDirect3DRMFrameArray_Release(pArray);
+    }
+
+    pFrameTmp = (void*)0xdeadbeef;
+    hr = IDirect3DRMFrame3_GetParent(pFrameC, &pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
+    CHECK_REFCOUNT(pFrameP2, 2);
+    CHECK_REFCOUNT(pFrameC, 2);
+
+    /* Add child again */
+    hr = IDirect3DRMFrame3_AddChild(pFrameP2, pFrameC);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 2);
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameP2, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 1, "count = %u\n", count);
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmpC);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pFrameTmpC != (LPDIRECT3DRMFRAME)pFrameC, "pFrameTmpC = %p\n", pFrameTmpC);
+        IDirect3DRMFrame_Release(pFrameTmpC);
+        IDirect3DRMFrameArray_Release(pArray);
+    }
+
+    /* Delete child */
+    hr = IDirect3DRMFrame3_DeleteChild(pFrameP2, pFrameC);
+    ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 1);
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameP2, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 0, "count = %u\n", count);
+        pFrameTmp = (void*)0xdeadbeef;
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmpC);
+        ok(hr == D3DRMERR_BADVALUE, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr);
+        ok(pFrameTmpC == NULL, "pFrameTmpC = %p\n", pFrameTmpC);
+        IDirect3DRMFrameArray_Release(pArray);
+    }
+
+    pFrameTmp = (void*)0xdeadbeef;
+    hr = IDirect3DRMFrame3_GetParent(pFrameC, &pFrameTmp);
+    ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
+    ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
+
+    /* Add two children */
+    hr = IDirect3DRMFrame3_AddChild(pFrameP2, pFrameC);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameC, 2);
+
+    hr = IDirect3DRMFrame3_AddChild(pFrameP2, pFrameP1);
+    ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+
+    pArray = NULL;
+    hr = IDirect3DRMFrame3_GetChildren(pFrameP2, &pArray);
+    ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
+    if (pArray)
+    {
+        count = IDirect3DRMFrameArray_GetSize(pArray);
+        ok(count == 2, "count = %u\n", count);
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 0, &pFrameTmpC);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pFrameTmpC != (LPDIRECT3DRMFRAME)pFrameC, "pFrameTmpC = %p\n", pFrameTmpC);
+        IDirect3DRMFrame_Release(pFrameTmpC);
+        hr = IDirect3DRMFrameArray_GetElement(pArray, 1, &pFrameTmpC);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pFrameTmpC != (LPDIRECT3DRMFRAME)pFrameP1, "pFrameTmpC = %p\n", pFrameTmpC);
+        IDirect3DRMFrame_Release(pFrameTmpC);
+        IDirect3DRMFrameArray_Release(pArray);
+    }
+
+    /* [Add/Delete]Visual with NULL pointer */
+    if (0) /* crashes on native */
+    {
+        hr = IDirect3DRMFrame3_AddVisual(pFrameP1, NULL);
+        ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+        CHECK_REFCOUNT(pFrameP1, 3);
+
+        hr = IDirect3DRMFrame3_DeleteVisual(pFrameP1, NULL);
+        ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+        CHECK_REFCOUNT(pFrameP1, 3);
+    }
+
+    /* Create Visual */
+    hr = IDirect3DRM3_CreateMeshBuilder(pD3DRM3, &pMeshBuilder);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
+    pVisual1 = (LPDIRECT3DRMVISUAL)pMeshBuilder;
+
+    /* Add Visual to first parent */
+    hr = IDirect3DRMFrame3_AddVisual(pFrameP1, (LPUNKNOWN)pVisual1);
+    ok(hr == D3DRM_OK, "Cannot add visual (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+    CHECK_REFCOUNT(pVisual1, 2);
+
+    pVisualArray = NULL;
+    count = 1;
+    hr = IDirect3DRMFrame3_GetVisuals(pFrameP1, &count, (LPUNKNOWN*)&pVisualArray);
+    todo_wine ok(hr == D3DRM_OK, "Cannot get visuals (hr = %x)\n", hr);
+    if (0) /* crashes on native */
+    {
+        count = IDirect3DRMVisualArray_GetSize(pVisualArray);
+        ok(count == 1, "count = %u\n", count);
+        hr = IDirect3DRMVisualArray_GetElement(pVisualArray, 0, &pVisualTmp);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pVisualTmp == pVisual1, "pVisualTmp = %p\n", pVisualTmp);
+        IDirect3DRMVisual_Release(pVisualTmp);
+        IDirect3DRMVisualArray_Release(pVisualArray);
+    }
+
+    /* Delete Visual */
+    hr = IDirect3DRMFrame3_DeleteVisual(pFrameP1, (LPUNKNOWN)pVisual1);
+    ok(hr == D3DRM_OK, "Cannot delete visual (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+    IDirect3DRMMeshBuilder_Release(pMeshBuilder);
+
+    /* [Add/Delete]Light with NULL pointer */
+    hr = IDirect3DRMFrame3_AddLight(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+
+    hr = IDirect3DRMFrame3_DeleteLight(pFrameP1, NULL);
+    ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+
+    /* Create Light */
+    hr = IDirect3DRM3_CreateLightRGB(pD3DRM3, D3DRMLIGHT_SPOT, 0.1, 0.2, 0.3, &pLight1);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMLight interface (hr = %x)\n", hr);
+
+    /* Add Light to first parent */
+    hr = IDirect3DRMFrame3_AddLight(pFrameP1, pLight1);
+    ok(hr == D3DRM_OK, "Cannot add light (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+    CHECK_REFCOUNT(pLight1, 2);
+
+    pLightArray = NULL;
+    hr = IDirect3DRMFrame3_GetLights(pFrameP1, &pLightArray);
+    todo_wine ok(hr == D3DRM_OK, "Cannot get lights (hr = %x)\n", hr);
+    if (pLightArray)
+    {
+        count = IDirect3DRMLightArray_GetSize(pLightArray);
+        ok(count == 1, "count = %u\n", count);
+        hr = IDirect3DRMLightArray_GetElement(pLightArray, 0, &pLightTmp);
+        ok(hr == D3DRM_OK, "Cannot get element (hr = %x)\n", hr);
+        ok(pLightTmp == pLight1, "pLightTmp = %p\n", pLightTmp);
+        IDirect3DRMLight_Release(pLightTmp);
+        IDirect3DRMLightArray_Release(pLightArray);
+    }
+
+    /* Delete Light */
+    hr = IDirect3DRMFrame3_DeleteLight(pFrameP1, pLight1);
+    ok(hr == D3DRM_OK, "Cannot delete light (hr = %x)\n", hr);
+    CHECK_REFCOUNT(pFrameP1, 3);
+    IDirect3DRMLight_Release(pLight1);
+
+    /* Cleanup */
+    IDirect3DRMFrame3_Release(pFrameP2);
+    CHECK_REFCOUNT(pFrameC, 2);
+    CHECK_REFCOUNT(pFrameP1, 3);
+
+    IDirect3DRMFrame3_Release(pFrameC);
+    IDirect3DRMFrame3_Release(pFrameP1);
+
+    IDirect3DRM3_Release(pD3DRM3);
+    IDirect3DRM3_Release(pD3DRM);
+}
+
 static void test_Light(void)
 {
     HRESULT hr;
@@ -784,6 +1100,7 @@ START_TEST(d3drm)
     test_MeshBuilder();
     test_MeshBuilder3();
     test_Frame();
+    test_Frame3();
     test_Light();
     test_d3drm_load();
 
-- 

Best Regards, André Hentschel


More information about the wine-patches mailing list