Zac Brown wrote:
Add tests for SHGetNewLinkInfo[AW]
Tests pass on Windows 2000, Windows XP and Windows Server 2003.
Changes:
- Add initial tests for SHGetNewLinkInfo[AW] to shell32/tests/shellord.c
- Add shell32/tests/shellord.c
- Update shell32/tests/Makefile.in
dlls/shell32/tests/Makefile.in | 1 + dlls/shell32/tests/shellord.c | 379 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 380 insertions(+), 0 deletions(-) create mode 100644 dlls/shell32/tests/shellord.c
diff --git a/dlls/shell32/tests/Makefile.in b/dlls/shell32/tests/Makefile.in index 088499f..316dd72 100644 --- a/dlls/shell32/tests/Makefile.in +++ b/dlls/shell32/tests/Makefile.in @@ -8,6 +8,7 @@ IMPORTS = uuid shell32 ole32 oleaut32 user32 advapi32 kernel32 CTESTS = \ generated.c \ shelllink.c \
- shellord.c \ shellpath.c \ shfldr_special.c \ shlexec.c \
diff --git a/dlls/shell32/tests/shellord.c b/dlls/shell32/tests/shellord.c new file mode 100644 index 0000000..f5ae1bd --- /dev/null +++ b/dlls/shell32/tests/shellord.c @@ -0,0 +1,379 @@ +/*
- Unit tests for shellord.c
- Copyright 2008 Google (Zac Brown)
- 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
- */
+#define COBJMACROS
+#include <stdio.h>
+#include <windows.h> +#include "shlguid.h" +#include "shobjidl.h" +#include "shlobj.h" +#include "wine/test.h"
+#include "shell32_test.h"
+static BOOL (WINAPI *pSHGetNewLinkInfoA) (LPCSTR pszLinkTo,
LPCSTR pszDir,
LPSTR pszName,
BOOL *pfMustCopy,
UINT uFlags);
+static LPITEMIDLIST (WINAPI *pSHSimpleIDListFromPath) (LPCSTR lpszPath);
+typedef struct +{
- UINT flags;
- const char* expected_str_1;
- const char* expected_str_2;
- const char* expected_str_3;
- BOOL use_full_path;
- BOOL todo_str_check;
- BOOL skip_crash;
+} getlink_test_t, *lp_getlink_test_t;
+static const getlink_test_t getlink_tests[] = {
- {
0,
"testfile.lnk",
"testfile.lnk",
"testfile.txt.lnk",
TRUE,
TRUE,
FALSE
- },
- {
SHGNLI_PIDL,
"testfile.lnk",
"testfile.lnk",
"testfile.txt.lnk",
TRUE,
TRUE,
FALSE
- },
- {
SHGNLI_NOUNIQUE,
"testfile.lnk",
"testfile.lnk",
"testfile.txt.lnk",
FALSE,
TRUE,
FALSE
- },
- {
SHGNLI_PREFIXNAME,
"Shortcut to testfile.lnk",
"Shortcut to testfile.lnk",
"Shortcut to testfile.txt.lnk",
TRUE,
TRUE,
TRUE
- },
- {
SHGNLI_NOLNK,
"testfile",
"testfile.lnk",
"testfile.txt (2)",
TRUE,
TRUE,
FALSE
- },
- {
SHGNLI_PIDL | SHGNLI_NOUNIQUE,
"testfile.lnk",
"testfile.lnk",
"testfile.txt.lnk",
FALSE,
TRUE,
FALSE
- },
- {
SHGNLI_PIDL | SHGNLI_PREFIXNAME,
"Shortcut to testfile.lnk",
"Shortcut to testfile.lnk",
"Shortcut to testfile.txt.lnk",
TRUE,
TRUE,
TRUE
- },
- {
SHGNLI_PIDL | SHGNLI_NOLNK,
"testfile",
"testfile.lnk",
"testfile.txt (2)",
TRUE,
TRUE,
TRUE
- },
- {
SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME,
"Shortcut () to testfile.lnk",
"Shortcut () to testfile.lnk",
"Shortcut () to testfile.txt.lnk",
FALSE,
TRUE,
FALSE
- },
- {
SHGNLI_NOUNIQUE | SHGNLI_NOLNK,
"testfile",
"testfile.lnk",
"testfile.txt",
FALSE,
TRUE,
FALSE
- },
- {
SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
"Shortcut to testfile",
"Shortcut to testfile.lnk",
"Shortcut to testfile.txt",
TRUE,
TRUE,
TRUE
- },
- {
SHGNLI_PIDL | SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME,
"Shortcut () to testfile.lnk",
"Shortcut () to testfile.lnk",
"Shortcut () to testfile.txt.lnk",
FALSE,
TRUE,
FALSE
- },
- {
SHGNLI_PIDL | SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
"Shortcut to testfile",
"Shortcut to testfile.lnk",
"Shortcut to testfile.txt",
TRUE,
TRUE,
TRUE
- },
- {
SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
"Shortcut () to testfile",
"Shortcut () to testfile.lnk",
"Shortcut () to testfile.txt",
FALSE,
TRUE,
FALSE
- },
- {
SHGNLI_PIDL | SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
"Shortcut () to testfile",
"Shortcut () to testfile.lnk",
"Shortcut () to testfile.txt",
FALSE,
TRUE,
FALSE
- }
+};
+static void test_SHGetNewLinkInfo (void) +{
- FILE *testfile_handle;
- LPCSTR testfile_name = "testfile.txt";
- LPSTR shortcut_pidl, shortcut_ptr;
- CHAR shortcut_target[MAX_PATH];
- CHAR shortcut_dir[MAX_PATH];
- CHAR shortcut_name[MAX_PATH];
- WCHAR shortcut_targetW[MAX_PATH];
- UINT flags;
- BOOL ret;
- unsigned int index;
- BOOL pfMustCopy;
- lp_getlink_test_t test_ptr;
- CHAR tmp_buf1[MAX_PATH];
- CHAR tmp_buf2[MAX_PATH];
- CHAR tmp_buf3[MAX_PATH];
- testfile_handle = fopen (testfile_name, "w");
- if (!testfile_handle || !GetCurrentDirectory (sizeof(shortcut_dir), shortcut_dir) ||
!GetFullPathName (testfile_name, sizeof(shortcut_target), shortcut_target, NULL))
- {
skip ("Failed to create a test file or get the current working directory.\n");
goto cleanup;
- }
- ok (fclose(testfile_handle) == 0, "Could not close testfile.txt.\n");
- MultiByteToWideChar(CP_ACP, 0, shortcut_target, -1, shortcut_targetW, MAX_PATH);
- /* Get the PIDL of the path */
- shortcut_pidl = (LPSTR)pSHSimpleIDListFromPath ((LPCVOID)shortcut_targetW);
- ok (shortcut_pidl != NULL, "SHSimpleIDListFromPath failed.\n");
- if (shortcut_pidl == NULL)
goto cleanup;
- for (index = 0; index < sizeof(getlink_tests)/sizeof(getlink_tests[0]); index++)
- {
test_ptr = &getlink_tests[index];
flags = getlink_tests[index].flags;
if (flags & SHGNLI_PIDL)
shortcut_ptr = shortcut_pidl;
else
shortcut_ptr = shortcut_target;
/* Test with all NULL/0 values except for pfMustCopy */
ret = SHGetNewLinkInfoA (NULL, NULL, NULL, &pfMustCopy, flags);
ok (ret == FALSE, "Expected return value of FALSE.\n");
todo_wine ok(pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
/* Test with valid target, NULL shortcut directory and name buffers */
if (test_ptr->skip_crash == FALSE)
{
ret = SHGetNewLinkInfoA (shortcut_ptr, NULL, NULL, &pfMustCopy, flags);
ok (ret == FALSE, "Expected return value of FALSE.\n");
todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
}
/* Test with valid shortcut directory, NULL target and name buffers */
ret = SHGetNewLinkInfoA (NULL, shortcut_dir, NULL, &pfMustCopy, flags);
ok (ret == FALSE, "Expected return value of FALSE.\n");
todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
/* Test with valid shortcut name and NULL target, shortcut directory buffers */
ret = SHGetNewLinkInfoA (NULL, NULL, shortcut_name, &pfMustCopy, flags);
ok (ret == FALSE, "Expected return value of FALSE.\n");
todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
/* Test with valid shortcut directory and name, NULL shortcut target buffer */
ret = SHGetNewLinkInfoA (NULL, shortcut_dir, shortcut_name, &pfMustCopy, flags);
ok (ret == FALSE, "Expected return value of FALSE.\n");
todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
/* Test with valid shortcut target and name, NULL shortcut directory buffer */
if (test_ptr->skip_crash == FALSE)
{
memset (shortcut_name, 0, MAX_PATH);
ret = SHGetNewLinkInfoA (shortcut_ptr, NULL, shortcut_name, &pfMustCopy, flags);
todo_wine
{
ok (ret == TRUE, "Expected return value of TRUE.\n");
ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
}
lstrcpyA (tmp_buf1, test_ptr->expected_str_1);
lstrcpyA (tmp_buf2, test_ptr->expected_str_2);
lstrcpyA (tmp_buf3, test_ptr->expected_str_3);
if (test_ptr->todo_str_check)
{
todo_wine
ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
lstrcmpA (shortcut_name, tmp_buf3) == 0,
"Returned shortcut did not match expected, got: %s\n",
shortcut_name);
}
else
{
ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
lstrcmpA (shortcut_name, tmp_buf3) == 0,
"Returned shortcut did not match expected, got: %s\n",
shortcut_name);
}
}
/* Test with valid shortcut directory, target, name buffers */
memset (shortcut_name, 0, MAX_PATH);
ret = SHGetNewLinkInfoA (shortcut_ptr, shortcut_dir, shortcut_name, &pfMustCopy, flags);
todo_wine
{
ok (ret == TRUE, "Expected return value of TRUE.\n");
ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
}
if (test_ptr->use_full_path == TRUE && shortcut_dir != NULL)
{
lstrcpyA (tmp_buf1, shortcut_dir);
lstrcatA (tmp_buf1, "\\");
lstrcpyA (tmp_buf2, tmp_buf1);
lstrcpyA (tmp_buf3, tmp_buf1);
lstrcatA (tmp_buf1, test_ptr->expected_str_1);
lstrcatA (tmp_buf2, test_ptr->expected_str_2);
lstrcatA (tmp_buf3, test_ptr->expected_str_3);
}
else
{
lstrcpyA (tmp_buf1, test_ptr->expected_str_1);
lstrcpyA (tmp_buf2, test_ptr->expected_str_2);
lstrcpyA (tmp_buf3, test_ptr->expected_str_3);
}
if (test_ptr->todo_str_check)
{
todo_wine
ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
lstrcmpA (shortcut_name, tmp_buf3) == 0,
"Returned shortcut did not match expected, got: %s\n",
shortcut_name);
}
else
{
ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
lstrcmpA (shortcut_name, tmp_buf3) == 0,
"Returned shortcut did not match expected, got: %s\n",
shortcut_name);
}
- }
- cleanup:
- ret = DeleteFileA (shortcut_target);
- ok (ret == TRUE, "Failed to delete %s\n", shortcut_target);
+}
+START_TEST(shellord) +{
- HRESULT r;
- HMODULE hmod = GetModuleHandleA("shell32.dll");
- pSHGetNewLinkInfoA = (void *) GetProcAddress(hmod, (LPSTR)179);
- pSHSimpleIDListFromPath = (void *) GetProcAddress(hmod, (LPSTR)162);
- if (!pSHSimpleIDListFromPath)
- {
skip("Unable to get process address for SHSimpleIDListFromPath.\n");
return;
- }
- if (!pSHGetNewLinkInfoA)
- {
skip("Unable to get process address for SHGetNewLinkInfoA.\n");
return;
- }
- r = CoInitialize(NULL);
- ok (SUCCEEDED(r), "CoInitialize failed (0x%08x)\n", r);
- if (!SUCCEEDED(r))
return;
- test_SHGetNewLinkInfo();
- CoUninitialize();
+}
Ignore this patch, will resend a fixed one later.