[SHLWAPI_WINETEST] Sync with Wine Staging 1.9.4. CORE-10912
[reactos.git] / rostests / winetests / shlwapi / url.c
index 18fc820..354d9c8 100644 (file)
@@ -315,6 +315,45 @@ static const TEST_URL_ESCAPE TEST_ESCAPE[] = {
     {"ftp\x1f\1end/", 0, 0, S_OK, "ftp%1F%01end/"}
 };
 
+typedef struct _TEST_URL_ESCAPEW {
+    const WCHAR url[INTERNET_MAX_URL_LENGTH];
+    DWORD flags;
+    HRESULT expectret;
+    const WCHAR expecturl[INTERNET_MAX_URL_LENGTH];
+    const WCHAR win7url[INTERNET_MAX_URL_LENGTH];  /* <= Win7 */
+    const WCHAR vistaurl[INTERNET_MAX_URL_LENGTH]; /* <= Vista/2k8 */
+} TEST_URL_ESCAPEW;
+
+static const TEST_URL_ESCAPEW TEST_ESCAPEW[] = {
+    {{' ','<','>','"',0},  URL_ESCAPE_AS_UTF8, S_OK, {'%','2','0','%','3','C','%','3','E','%','2','2',0}},
+    {{'{','}','|','\\',0}, URL_ESCAPE_AS_UTF8, S_OK, {'%','7','B','%','7','D','%','7','C','%','5','C',0}},
+    {{'^',']','[','`',0},  URL_ESCAPE_AS_UTF8, S_OK, {'%','5','E','%','5','D','%','5','B','%','6','0',0}},
+    {{'&','/','?','#',0},  URL_ESCAPE_AS_UTF8, S_OK, {'%','2','6','/','?','#',0}},
+    {{'M','a','s','s',0},  URL_ESCAPE_AS_UTF8, S_OK, {'M','a','s','s',0}},
+
+    /* broken < Win8/10 */
+
+    {{'M','a',0xdf,0},  URL_ESCAPE_AS_UTF8, S_OK, {'M','a','%','C','3','%','9','F',0},
+                                                  {'M','a','%','D','F',0}},
+    /* 0x2070E */
+    {{0xd841,0xdf0e,0}, URL_ESCAPE_AS_UTF8, S_OK, {'%','F','0','%','A','0','%','9','C','%','8','E',0},
+                                                  {'%','E','F','%','B','F','%','B','D','%','E','F','%','B','F','%','B','D',0},
+                                                  {0xd841,0xdf0e,0}},
+    /* 0x27A3E */
+    {{0xd85e,0xde3e,0}, URL_ESCAPE_AS_UTF8, S_OK, {'%','F','0','%','A','7','%','A','8','%','B','E',0},
+                                                  {'%','E','F','%','B','F','%','B','D','%','E','F','%','B','F','%','B','D',0},
+                                                  {0xd85e,0xde3e,0}},
+
+    {{0xd85e,0},        URL_ESCAPE_AS_UTF8, S_OK, {'%','E','F','%','B','F','%','B','D',0},
+                                                  {0xd85e,0}},
+    {{0xd85e,0x41},     URL_ESCAPE_AS_UTF8, S_OK, {'%','E','F','%','B','F','%','B','D','A',0},
+                                                  {0xd85e,'A',0}},
+    {{0xdc00,0},        URL_ESCAPE_AS_UTF8, S_OK, {'%','E','F','%','B','F','%','B','D',0},
+                                                  {0xdc00,0}},
+    {{0xffff,0},        URL_ESCAPE_AS_UTF8, S_OK, {'%','E','F','%','B','F','%','B','F',0},
+                                                  {0xffff,0}},
+};
+
 /* ################ */
 
 typedef struct _TEST_URL_COMBINE {
@@ -885,6 +924,15 @@ static void test_UrlEscapeA(void)
     ok(size == 34, "got %d, expected %d\n", size, 34);
     ok(empty_string[0] == 127, "String has changed, empty_string[0] = %d\n", empty_string[0]);
 
+    size = 1;
+    empty_string[0] = 127;
+    ret = pUrlEscapeA("/woningplan/woonkamer basis.swf", empty_string, &size, URL_ESCAPE_AS_UTF8);
+    ok(ret == E_NOTIMPL || broken(ret == E_POINTER), /* < Win7/Win2k8 */
+        "got %x, expected %x\n", ret, E_NOTIMPL);
+    ok(size == 1 || broken(size == 34), /* < Win7/Win2k8 */
+        "got %d, expected %d\n", size, 1);
+    ok(empty_string[0] == 127, "String has changed, empty_string[0] = %d\n", empty_string[0]);
+
     for(i=0; i<sizeof(TEST_ESCAPE)/sizeof(TEST_ESCAPE[0]); i++) {
         CHAR ret_url[INTERNET_MAX_URL_LENGTH];
 
@@ -948,6 +996,21 @@ static void test_UrlEscapeW(void)
         FreeWideString(urlW);
         FreeWideString(expected_urlW);
     }
+
+    for(i=0; i<sizeof(TEST_ESCAPEW)/sizeof(TEST_ESCAPEW[0]); i++) {
+        WCHAR ret_url[INTERNET_MAX_URL_LENGTH];
+
+        size = INTERNET_MAX_URL_LENGTH;
+        ret = pUrlEscapeW(TEST_ESCAPEW[i].url, ret_url, &size, TEST_ESCAPEW[i].flags);
+        ok(ret == TEST_ESCAPEW[i].expectret, "UrlEscapeW returned 0x%08x instead of 0x%08x for \"%s\"\n",
+           ret, TEST_ESCAPEW[i].expectret, wine_dbgstr_w(TEST_ESCAPEW[i].url));
+        ok(!lstrcmpW(ret_url, TEST_ESCAPEW[i].expecturl) ||
+           broken(!lstrcmpW(ret_url, TEST_ESCAPEW[i].vistaurl)) ||
+           broken(!lstrcmpW(ret_url, TEST_ESCAPEW[i].win7url)),
+            "Expected \"%s\" or \"%s\" or \"%s\", but got \"%s\" for \"%s\"\n",
+            wine_dbgstr_w(TEST_ESCAPEW[i].expecturl), wine_dbgstr_w(TEST_ESCAPEW[i].vistaurl),
+            wine_dbgstr_w(TEST_ESCAPEW[i].win7url), wine_dbgstr_w(ret_url), wine_dbgstr_w(TEST_ESCAPEW[i].url));
+    }
 }
 
 /* ########################### */