Author: akhaldi
Date: Sat Feb 28 11:57:37 2015
New Revision: 66495
URL: 
http://svn.reactos.org/svn/reactos?rev=66495&view=rev
Log:
[DPLAYX_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246
Modified:
    trunk/rostests/winetests/dplayx/dplayx.c
Modified: trunk/rostests/winetests/dplayx/dplayx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dplayx/dplayx.c…
==============================================================================
--- trunk/rostests/winetests/dplayx/dplayx.c    [iso-8859-1] (original)
+++ trunk/rostests/winetests/dplayx/dplayx.c    [iso-8859-1] Sat Feb 28 11:57:37 2015
@@ -72,6 +72,13 @@
     UINT dpidSize;
 } CallbackData, *lpCallbackData;
+struct provider_data
+{
+    int call_count;
+    GUID *guid_ptr[10];
+    GUID guid_data[10];
+    BOOL ret_value;
+};
 static LPSTR get_temp_buffer(void)
 {
@@ -685,7 +692,7 @@
     }
     hr = IDirectPlayX_InitializeConnection( pDP, pAddress, 0 );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
     HeapFree( GetProcessHeap(), 0, pAddress );
@@ -743,10 +750,117 @@
     if ( hr == DP_OK )
         IDirectPlayX_Release( pDP );
     hr = DirectPlayCreate( (LPGUID) &DPSPGUID_TCPIP, &pDP, NULL );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
     if ( hr == DP_OK )
         IDirectPlayX_Release( pDP );
+}
+
+static BOOL CALLBACK callback_providersA(GUID* guid, char *name, DWORD major, DWORD
minor, void *arg)
+{
+    struct provider_data *prov = arg;
+
+    if (!prov) return TRUE;
+
+    if (prov->call_count < sizeof(prov->guid_data) /
sizeof(prov->guid_data[0]))
+    {
+        prov->guid_ptr[prov->call_count] = guid;
+        prov->guid_data[prov->call_count] = *guid;
+
+        prov->call_count++;
+    }
+
+    if (prov->ret_value) /* Only trace when looping all providers */
+        trace("Provider #%d '%s' (%d.%d)\n", prov->call_count, name,
major, minor);
+    return prov->ret_value;
+}
+
+static BOOL CALLBACK callback_providersW(GUID* guid, WCHAR *name, DWORD major, DWORD
minor, void *arg)
+{
+    struct provider_data *prov = arg;
+
+    if (!prov) return TRUE;
+
+    if (prov->call_count < sizeof(prov->guid_data) /
sizeof(prov->guid_data[0]))
+    {
+        prov->guid_ptr[prov->call_count] = guid;
+        prov->guid_data[prov->call_count] = *guid;
+
+        prov->call_count++;
+    }
+
+    return prov->ret_value;
+}
+
+static void test_EnumerateProviders(void)
+{
+    HRESULT hr;
+    int i;
+    struct provider_data arg;
+
+    memset(&arg, 0, sizeof(arg));
+    arg.ret_value = TRUE;
+
+    hr = DirectPlayEnumerateA(callback_providersA, NULL);
+    ok(SUCCEEDED(hr), "DirectPlayEnumerateA failed\n");
+
+    SetLastError(0xdeadbeef);
+    hr = DirectPlayEnumerateA(NULL, &arg);
+    ok(FAILED(hr), "DirectPlayEnumerateA expected to fail\n");
+    ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got 0x%x\n",
GetLastError());
+
+    SetLastError(0xdeadbeef);
+    hr = DirectPlayEnumerateA(NULL, NULL);
+    ok(FAILED(hr), "DirectPlayEnumerateA expected to fail\n");
+    ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got 0x%x\n",
GetLastError());
+
+    hr = DirectPlayEnumerateA(callback_providersA, &arg);
+    ok(SUCCEEDED(hr), "DirectPlayEnumerateA failed\n");
+    ok(arg.call_count > 0, "Expected at least one valid provider\n");
+    trace("Found %d providers\n", arg.call_count);
+
+    /* The returned GUID values must have persisted after enumeration (bug 37185) */
+    for(i = 0; i < arg.call_count; i++)
+    {
+        ok(IsEqualGUID(arg.guid_ptr[i], &arg.guid_data[i]), "#%d Expected equal
GUID values\n", i);
+    }
+
+    memset(&arg, 0, sizeof(arg));
+    arg.ret_value = FALSE;
+    hr = DirectPlayEnumerateA(callback_providersA, &arg);
+    ok(SUCCEEDED(hr), "DirectPlayEnumerateA failed\n");
+    ok(arg.call_count == 1, "Expected 1, got %d\n", arg.call_count);
+
+    hr = DirectPlayEnumerateW(callback_providersW, NULL);
+    ok(SUCCEEDED(hr), "DirectPlayEnumerateW failed\n");
+
+    SetLastError(0xdeadbeef);
+    hr = DirectPlayEnumerateW(NULL, &arg);
+    ok(FAILED(hr), "DirectPlayEnumerateW expected to fail\n");
+    ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got 0x%x\n",
GetLastError());
+
+    SetLastError(0xdeadbeef);
+    hr = DirectPlayEnumerateW(NULL, NULL);
+    ok(FAILED(hr), "DirectPlayEnumerateW expected to fail\n");
+    ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got 0x%x\n",
GetLastError());
+
+    memset(&arg, 0, sizeof(arg));
+    arg.ret_value = TRUE;
+    hr = DirectPlayEnumerateW(callback_providersW, &arg);
+    ok(SUCCEEDED(hr), "DirectPlayEnumerateW failed\n");
+    ok(arg.call_count > 0, "Expected at least one valid provider\n");
+
+    /* The returned GUID values must have persisted after enumeration (bug 37185) */
+    for(i = 0; i < arg.call_count; i++)
+    {
+        ok(IsEqualGUID(arg.guid_ptr[i], &arg.guid_data[i]), "#%d Expected equal
GUID values\n", i);
+    }
+
+    memset(&arg, 0, sizeof(arg));
+    arg.ret_value = FALSE;
+    hr = DirectPlayEnumerateW(callback_providersW, &arg);
+    ok(SUCCEEDED(hr), "DirectPlayEnumerateW failed\n");
+    ok(arg.call_count == 1, "Expected 1, got %d\n", arg.call_count);
 }
 /* EnumConnections */
@@ -915,9 +1029,9 @@
     if( IsEqualGUID(lpguidSP, &DPSPGUID_TCPIP) )
     {
         hr = IDirectPlayX_InitializeConnection( pDP, lpConnection, 0 );
-        todo_wine checkHR( DP_OK, hr );
+        checkHR( DP_OK, hr );
         hr = IDirectPlayX_InitializeConnection( pDP, lpConnection, 0 );
-        todo_wine checkHR( DPERR_ALREADYINITIALIZED, hr );
+        checkHR( DPERR_ALREADYINITIALIZED, hr );
     }
     return TRUE;
@@ -976,7 +1090,7 @@
     {
         hr = IDirectPlayX_GetCaps( pDP, &dpcaps, dwFlags );
-        todo_wine checkHR( DP_OK, hr );
+        checkHR( DP_OK, hr );
         if ( hr == DP_OK )
@@ -1085,7 +1199,7 @@
     /* Uninitialized  dpsd */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
     dpsd_server.dwSize = sizeof(DPSESSIONDESC2);
@@ -1095,7 +1209,7 @@
     /* Regular operation */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
     /* Opening twice */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
@@ -1698,12 +1812,16 @@
     checkHR( DPERR_INVALIDPARAMS, hr );
     hr = IDirectPlayX_GetSessionDesc( pDP[0], NULL, NULL );
     checkHR( DPERR_INVALIDPARAM, hr );
+if(0)
+{
+    /* Crashes under Win7 */
     hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], NULL );
     checkHR( DPERR_INVALIDPARAM, hr );
     dwDataSize=-1;
     hr = IDirectPlayX_GetSessionDesc( pDP[0], lpData[0], &dwDataSize );
     checkHR( DPERR_INVALIDPARAMS, hr );
     check( -1, dwDataSize );
+}
     /* Get: Insufficient buffer size */
     dwDataSize=0;
@@ -2498,10 +2616,14 @@
     checkHR( DPERR_INVALIDPLAYER, hr );
     check( 1024, dwDataSize );
+if(0)
+{
+    /* Crashes under Win7 */
     dwDataSize = -1;
     hr = IDirectPlayX_GetPlayerName( pDP[0], dpid[0], lpData, &dwDataSize );
     checkHR( DPERR_INVALIDPARAMS, hr );
     check( -1, dwDataSize );
+}
     hr = IDirectPlayX_GetPlayerName( pDP[0], dpid[0], lpData, NULL );
     checkHR( DPERR_INVALIDPARAMS, hr );
@@ -5789,6 +5911,9 @@
     check( -1, dwNumBytes );
     /* - Remote players */
+if(0)
+{
+    /* Crash under Win7 */
     dwNumMsgs = dwNumBytes = -1;
     hr = IDirectPlayX_GetMessageQueue( pDP[0], 0, dpid[3],
                                        DPMESSAGEQUEUE_RECEIVE,
@@ -5796,6 +5921,7 @@
     checkHR( DPERR_INVALIDPLAYER, hr ); /* Player 3 is remote */
     check( -1, dwNumMsgs );
     check( -1, dwNumBytes );
+}
     dwNumMsgs = dwNumBytes = -1;
     hr = IDirectPlayX_GetMessageQueue( pDP[0], dpid[3], 0,
@@ -6532,6 +6658,7 @@
     test_COM();
     test_COM_dplobby();
+    test_EnumerateProviders();
     if (!winetest_interactive)
     {