shell32: Add test for localized filenames in desktop.ini.
authorVincent Povirk <vincent@codeweavers.com>
Tue, 2 Dec 2008 22:12:08 +0000 (16:12 -0600)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 5 Dec 2008 10:59:44 +0000 (11:59 +0100)
dlls/shell32/tests/Makefile.in
dlls/shell32/tests/rsrc.rc [new file with mode: 0644]
dlls/shell32/tests/shlfolder.c

index 0fc8d748d7d752db8f34fc6cbe2e9de1ffba37ae..dd0587cf103e431ce29202c97e754a38af01da73 100644 (file)
@@ -18,6 +18,8 @@ CTESTS = \
        string.c \
        systray.c
 
+RC_SRCS = rsrc.rc
+
 @MAKE_TEST_RULES@
 
 @DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/shell32/tests/rsrc.rc b/dlls/shell32/tests/rsrc.rc
new file mode 100644 (file)
index 0000000..00c949b
--- /dev/null
@@ -0,0 +1,28 @@
+/* String resource for shlfolder test.
+ *
+ * Copyright 2008 Vincent Povirk for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "windef.h"
+#include "winuser.h"
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+  1 "Folder Name Resource"
+}
index 30768b035dfd3e0d58f828a142fe14edf08e78e8..f374070c4d21eb57c98686ed6edaf816bc81af0f 100644 (file)
@@ -1488,6 +1488,123 @@ static void testSHGetFolderPathAndSubDirA(void)
     RemoveDirectoryA(testpath);
 }
 
+static const char *wine_dbgstr_w(LPCWSTR str)
+{
+    static char buf[512];
+    if (!str)
+        return "(null)";
+    WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
+    return buf;
+}
+
+static void test_LocalizedNames(void)
+{
+    static char cCurrDirA[MAX_PATH];
+    WCHAR cCurrDirW[MAX_PATH], tempbufW[25];
+    IShellFolder *IDesktopFolder, *testIShellFolder;
+    ITEMIDLIST *newPIDL;
+    int len;
+    HRESULT hr;
+    static char resourcefile[MAX_PATH];
+    DWORD res;
+    HANDLE file;
+    STRRET strret;
+
+    static const char desktopini_contents1[] =
+        "[.ShellClassInfo]\r\n"
+        "LocalizedResourceName=@";
+    static const char desktopini_contents2[] =
+        ",-1\r\n";
+    static WCHAR foldernameW[] = {'t','e','s','t','f','o','l','d','e','r',0};
+    static const WCHAR folderdisplayW[] = {'F','o','l','d','e','r',' ','N','a','m','e',' ','R','e','s','o','u','r','c','e',0};
+
+    /* create folder with desktop.ini and localized name in GetModuleFileNameA(NULL) */
+    CreateDirectoryA(".\\testfolder", NULL);
+
+    SetFileAttributesA(".\\testfolder", GetFileAttributesA(".\\testfolder")|FILE_ATTRIBUTE_SYSTEM);
+
+    GetModuleFileNameA(NULL, resourcefile, MAX_PATH);
+
+    file = CreateFileA(".\\testfolder\\desktop.ini", GENERIC_WRITE, 0, NULL,
+                         CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+    ok(file != INVALID_HANDLE_VALUE, "CreateFileA failed %i\n", GetLastError());
+    ok(WriteFile(file, desktopini_contents1, strlen(desktopini_contents1), &res, NULL) &&
+       WriteFile(file, resourcefile, strlen(resourcefile), &res, NULL) &&
+       WriteFile(file, desktopini_contents2, strlen(desktopini_contents2), &res, NULL),
+       "WriteFile failed %i\n", GetLastError());
+    CloseHandle(file);
+
+    /* get IShellFolder for parent */
+    GetCurrentDirectoryA(MAX_PATH, cCurrDirA);
+    len = lstrlenA(cCurrDirA);
+
+    if (len == 0) {
+        trace("GetCurrentDirectoryA returned empty string. Skipping test_LocalizedNames\n");
+        goto cleanup;
+    }
+    if(cCurrDirA[len-1] == '\\')
+        cCurrDirA[len-1] = 0;
+
+    MultiByteToWideChar(CP_ACP, 0, cCurrDirA, -1, cCurrDirW, MAX_PATH);
+
+    hr = SHGetDesktopFolder(&IDesktopFolder);
+    ok(hr == S_OK, "SHGetDesktopfolder failed %08x\n", hr);
+
+    hr = IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cCurrDirW, NULL, &newPIDL, 0);
+    ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr);
+
+    hr = IShellFolder_BindToObject(IDesktopFolder, newPIDL, NULL, (REFIID)&IID_IShellFolder, (LPVOID *)&testIShellFolder);
+    ok(hr == S_OK, "BindToObject failed %08x\n", hr);
+
+    IMalloc_Free(ppM, newPIDL);
+
+    /* windows reads the display name from the resource */
+    hr = IShellFolder_ParseDisplayName(testIShellFolder, NULL, NULL, foldernameW, NULL, &newPIDL, 0);
+    ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr);
+
+    hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER, &strret);
+    ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr);
+
+    if (SUCCEEDED(hr) && pStrRetToBufW)
+    {
+        hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR));
+        ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr);
+        todo_wine ok (!lstrcmpiW(tempbufW, folderdisplayW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW));
+    }
+
+    /* editing name is also read from the resource */
+    hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER|SHGDN_FOREDITING, &strret);
+    ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr);
+
+    if (SUCCEEDED(hr) && pStrRetToBufW)
+    {
+        hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR));
+        ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr);
+        todo_wine ok (!lstrcmpiW(tempbufW, folderdisplayW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW));
+    }
+
+    /* parsing name is unchanged */
+    hr = IShellFolder_GetDisplayNameOf(testIShellFolder, newPIDL, SHGDN_INFOLDER|SHGDN_FORPARSING, &strret);
+    ok(hr == S_OK, "ParseDisplayName failed %08x\n", hr);
+
+    if (SUCCEEDED(hr) && pStrRetToBufW)
+    {
+        hr = pStrRetToBufW(&strret, newPIDL, tempbufW, sizeof(tempbufW)/sizeof(WCHAR));
+        ok (SUCCEEDED(hr), "StrRetToBufW failed! hr = %08x\n", hr);
+        ok (!lstrcmpiW(tempbufW, foldernameW), "GetDisplayNameOf returned %s\n", wine_dbgstr_w(tempbufW));
+    }
+
+    IShellFolder_Release(IDesktopFolder);
+    IShellFolder_Release(testIShellFolder);
+
+    IMalloc_Free(ppM, newPIDL);
+
+cleanup:
+    DeleteFileA(".\\testfolder\\desktop.ini");
+    SetFileAttributesA(".\\testfolder", GetFileAttributesA(".\\testfolder")&~FILE_ATTRIBUTE_SYSTEM);
+    RemoveDirectoryA(".\\testfolder");
+}
+
 
 START_TEST(shlfolder)
 {
@@ -1509,6 +1626,7 @@ START_TEST(shlfolder)
         testSHGetFolderPathAndSubDirA();
     else
         skip("SHGetFolderPathAndSubDirA not present\n");
+    test_LocalizedNames();
 
     OleUninitialize();
 }