Andrew Eikum : shell32/tests: Add tests to show relative known folder paths match SHGetKnownFolderPath.
Alexandre Julliard
julliard at winehq.org
Thu May 27 16:02:11 CDT 2021
Module: wine
Branch: master
Commit: 73c08fb638938ac6f903ad91d5ef2c93ae18a971
URL: https://source.winehq.org/git/wine.git/?a=commit;h=73c08fb638938ac6f903ad91d5ef2c93ae18a971
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Thu May 27 13:38:16 2021 -0500
shell32/tests: Add tests to show relative known folder paths match SHGetKnownFolderPath.
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/shell32/tests/shellpath.c | 64 ++++++++++++++++++++++++++++++++++++++++--
1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c
index 4c9b9693983..62fa68eb20a 100644
--- a/dlls/shell32/tests/shellpath.c
+++ b/dlls/shell32/tests/shellpath.c
@@ -291,6 +291,18 @@ static const char *getFolderName(int folder)
}
}
+static LPWSTR wcscasestr( LPCWSTR str, LPCWSTR sub )
+{
+ while (*str)
+ {
+ const WCHAR *p1 = str, *p2 = sub;
+ while (*p1 && *p2 && towlower(*p1) == towlower(*p2)) { p1++; p2++; }
+ if (!*p2) return (WCHAR *)str;
+ str++;
+ }
+ return NULL;
+}
+
/* Standard CSIDL values (and their flags) uses only two less-significant bytes */
#define NO_CSIDL 0x10000
#define WINE_ATTRIBUTES_OPTIONAL 0x20000
@@ -1964,10 +1976,11 @@ static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId
HRESULT hr;
int csidl, expectedCsidl, ret;
KNOWNFOLDER_DEFINITION kfd;
- IKnownFolder *folder;
+ IKnownFolder *folder, *kf_parent;
WCHAR sName[1024];
BOOL found = FALSE;
unsigned int i;
+ WCHAR *ikf_path, *gkfp_path, *ikf_parent_path;
for (i = 0; i < ARRAY_SIZE(known_folders); ++i)
{
@@ -2019,10 +2032,57 @@ static void check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId
ok_(__FILE__, known_folder->line)(!(kfd.kfdFlags & (~known_folder->definitionFlags)), "invalid known folder flags for %s: 0x%08x expected, but 0x%08x retrieved\n", known_folder->sFolderId, known_folder->definitionFlags, kfd.kfdFlags);
+ gkfp_path = NULL;
+ hr = pSHGetKnownFolderPath(folderId, KF_FLAG_DEFAULT, NULL, &gkfp_path);
+ if(SUCCEEDED(hr))
+ {
+ ikf_path = NULL;
+ hr = IKnownFolder_GetPath(folder, KF_FLAG_DEFAULT, &ikf_path);
+ ok_(__FILE__, known_folder->line)(hr == S_OK, "IKnownFolder::GetPath failed: 0x%08x\n", hr);
+ ok_(__FILE__, known_folder->line)(ikf_path != NULL, "SHGetKnownFolderPath gave NULL path\n");
+
+ /* IKnownFolder::GetPath and SHGetKnownFolderPath should be the same */
+ ok_(__FILE__, known_folder->line)(lstrcmpW(gkfp_path, ikf_path) == 0, "Got different paths: %s vs %s\n",
+ debugstr_w(gkfp_path), debugstr_w(ikf_path));
+
+ if(kfd.pszRelativePath)
+ {
+ /* RelativePath should be a substring of the path */
+ ok_(__FILE__, known_folder->line)(wcscasestr(ikf_path, kfd.pszRelativePath) != NULL,
+ "KNOWNFOLDER_DEFINITION.pszRelativePath %s is not a substring of full path %s\n",
+ debugstr_w(kfd.pszRelativePath), debugstr_w(ikf_path));
+
+ hr = IKnownFolderManager_GetFolder(mgr, &kfd.fidParent, &kf_parent);
+ ok_(__FILE__, known_folder->line)(hr == S_OK, "IKnownFolderManager::GetFolder(parent) failed: 0x%08x\n", hr);
+
+ if(SUCCEEDED(hr))
+ {
+ ikf_parent_path = NULL;
+ hr = IKnownFolder_GetPath(kf_parent, KF_FLAG_DEFAULT, &ikf_parent_path);
+ ok_(__FILE__, known_folder->line)(hr == S_OK, "IKnownFolder::GetPath(parent) failed: 0x%08x\n", hr);
+
+ /* Parent path + pszRelativePath should give the full path */
+ ok_(__FILE__, known_folder->line)(memcmp(ikf_parent_path, ikf_path, lstrlenW(ikf_parent_path) * sizeof(WCHAR)) == 0,
+ "Full path %s does not start with parent path %s\n",
+ debugstr_w(ikf_path), debugstr_w(ikf_parent_path));
+ ok_(__FILE__, known_folder->line)(*(ikf_path + lstrlenW(ikf_parent_path)) == '\\',
+ "Missing slash\n");
+ ok_(__FILE__, known_folder->line)(wcsicmp(kfd.pszRelativePath, ikf_path + lstrlenW(ikf_parent_path) + 1) == 0,
+ "Full path %s does not end with relative path %s\n",
+ debugstr_w(ikf_path), debugstr_w(kfd.pszRelativePath));
+
+ CoTaskMemFree(ikf_parent_path);
+ IKnownFolder_Release(kf_parent);
+ }
+ }
+
+ CoTaskMemFree(ikf_path);
+ CoTaskMemFree(gkfp_path);
+ }
FreeKnownFolderDefinitionFields(&kfd);
}
- IKnownFolder_Release(folder);
+ IKnownFolder_Release(folder);
}
break;
More information about the wine-cvs
mailing list