Andrew Nguyen : ddraw: Simplify and test DirectDrawEnumerateA.

Alexandre Julliard julliard at winehq.org
Fri Oct 9 09:24:10 CDT 2009


Module: wine
Branch: master
Commit: 4c61c2ff639cd17d197e340a087fddfe5415dbee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4c61c2ff639cd17d197e340a087fddfe5415dbee

Author: Andrew Nguyen <arethusa26 at gmail.com>
Date:   Thu Oct  8 09:03:49 2009 -0500

ddraw: Simplify and test DirectDrawEnumerateA.

---

 dlls/ddraw/main.c             |    6 ++--
 dlls/ddraw/tests/ddrawmodes.c |   75 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 78 insertions(+), 3 deletions(-)

diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index b7eed02..647ea2f 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -368,7 +368,7 @@ HRESULT WINAPI
 DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback,
                      LPVOID Context)
 {
-    BOOL stop = FALSE;
+    TRACE("(%p, %p)\n", Callback, Context);
 
     TRACE(" Enumerating default DirectDraw HAL interface\n");
     /* We only have one driver */
@@ -377,11 +377,11 @@ DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback,
         static CHAR driver_desc[] = "DirectDraw HAL",
         driver_name[] = "display";
 
-        stop = !Callback(NULL, driver_desc, driver_name, Context);
+        Callback(NULL, driver_desc, driver_name, Context);
     }
     __EXCEPT_PAGE_FAULT
     {
-        return E_INVALIDARG;
+        return DDERR_INVALIDPARAMS;
     }
     __ENDTRY
 
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index f5245d0..013862b 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -38,6 +38,14 @@ static int modes_cnt;
 static int modes_size;
 static LPDDSURFACEDESC modes;
 
+static HRESULT (WINAPI *pDirectDrawEnumerateA)(LPDDENUMCALLBACKA,LPVOID);
+
+static void init_function_pointers(void)
+{
+    HMODULE hmod = GetModuleHandleA("ddraw.dll");
+    pDirectDrawEnumerateA = (void*)GetProcAddress(hmod, "DirectDrawEnumerateA");
+}
+
 static void createwindow(void)
 {
     wc.style = CS_HREDRAW | CS_VREDRAW;
@@ -88,6 +96,68 @@ static void releasedirectdraw(void)
 	}
 }
 
+static BOOL WINAPI crash_callbackA(GUID *lpGUID, LPSTR lpDriverDescription,
+                                  LPSTR lpDriverName, LPVOID lpContext)
+{
+    *(volatile char*)0 = 2;
+    return TRUE;
+}
+
+static BOOL WINAPI test_nullcontext_callbackA(GUID *lpGUID, LPSTR lpDriverDescription,
+                                              LPSTR lpDriverName, LPVOID lpContext)
+{
+    trace("test_nullcontext_callbackA: %p %s %s %p\n",
+          lpGUID, lpDriverDescription, lpDriverName, lpContext);
+
+    ok(!lpContext, "Expected NULL lpContext\n");
+
+    return TRUE;
+}
+
+static BOOL WINAPI test_context_callbackA(GUID *lpGUID, LPSTR lpDriverDescription,
+                                          LPSTR lpDriverName, LPVOID lpContext)
+{
+    trace("test_context_callbackA: %p %s %s %p\n",
+          lpGUID, lpDriverDescription, lpDriverName, lpContext);
+
+    ok(lpContext == (LPVOID)0xdeadbeef, "Expected non-NULL lpContext\n");
+
+    return TRUE;
+}
+
+static void test_DirectDrawEnumerateA(void)
+{
+    HRESULT ret;
+
+    if (!pDirectDrawEnumerateA)
+    {
+        win_skip("DirectDrawEnumerateA is not available\n");
+        return;
+    }
+
+    /* Test with NULL callback parameter. */
+    ret = pDirectDrawEnumerateA(NULL, NULL);
+    ok(ret == DDERR_INVALIDPARAMS, "Expected DDERR_INVALIDPARAMS, got %d\n", ret);
+
+    /* Test with invalid callback parameter. */
+    ret = pDirectDrawEnumerateA((LPDDENUMCALLBACKA)0xdeadbeef, NULL);
+    ok(ret == DDERR_INVALIDPARAMS, "Expected DDERR_INVALIDPARAMS, got %d\n", ret);
+
+    /* Test with callback that crashes. */
+    ret = pDirectDrawEnumerateA(crash_callbackA, NULL);
+    ok(ret == DDERR_INVALIDPARAMS, "Expected DDERR_INVALIDPARAMS, got %d\n", ret);
+
+    /* Test with valid callback parameter and NULL context parameter. */
+    trace("Calling DirectDrawEnumerateA with test_nullcontext_callbackA callback and NULL context.\n");
+    ret = pDirectDrawEnumerateA(test_nullcontext_callbackA, NULL);
+    ok(ret == DD_OK, "Expected DD_OK, got %d\n", ret);
+
+    /* Test with valid callback parameter and valid context parameter. */
+    trace("Calling DirectDrawEnumerateA with test_context_callbackA callback and non-NULL context.\n");
+    ret = pDirectDrawEnumerateA(test_context_callbackA, (LPVOID)0xdeadbeef);
+    ok(ret == DD_OK, "Expected DD_OK, got %d\n", ret);
+}
+
 static void adddisplaymode(LPDDSURFACEDESC lpddsd)
 {
     if (!modes)
@@ -409,9 +479,14 @@ static void testddraw3(void)
 
 START_TEST(ddrawmodes)
 {
+    init_function_pointers();
+
     createwindow();
     if (!createdirectdraw())
         return;
+
+    test_DirectDrawEnumerateA();
+
     enumdisplaymodes();
     if (winetest_interactive)
         testdisplaymodes();




More information about the wine-cvs mailing list