[BROWSEUI_APITEST]
authorThomas Faber <thomas.faber@reactos.org>
Fri, 25 Jan 2013 23:24:46 +0000 (23:24 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Fri, 25 Jan 2013 23:24:46 +0000 (23:24 +0000)
- Add a test for SHExplorerParseCmdLine.
CORE-5568

svn path=/trunk/; revision=58218

rostests/apitests/CMakeLists.txt
rostests/apitests/browseui/CMakeLists.txt [new file with mode: 0644]
rostests/apitests/browseui/SHExplorerParseCmdLine.c [new file with mode: 0644]
rostests/apitests/browseui/testlist.c [new file with mode: 0644]

index 6ccdeee..1c0a6d8 100644 (file)
@@ -2,6 +2,7 @@
 add_library(apitest apitest.c)
 
 add_subdirectory(advapi32)
+add_subdirectory(browseui)
 add_subdirectory(crt)
 add_subdirectory(dciman32)
 add_subdirectory(gdi32)
diff --git a/rostests/apitests/browseui/CMakeLists.txt b/rostests/apitests/browseui/CMakeLists.txt
new file mode 100644 (file)
index 0000000..d8cb019
--- /dev/null
@@ -0,0 +1,10 @@
+
+list(APPEND SOURCE
+    SHExplorerParseCmdLine.c
+    testlist.c)
+
+add_executable(browseui_apitest ${SOURCE})
+target_link_libraries(browseui_apitest wine)
+set_module_type(browseui_apitest win32cui)
+add_importlibs(browseui_apitest browseui shell32 msvcrt kernel32 ntdll)
+add_cd_file(TARGET browseui_apitest DESTINATION reactos/bin FOR all)
diff --git a/rostests/apitests/browseui/SHExplorerParseCmdLine.c b/rostests/apitests/browseui/SHExplorerParseCmdLine.c
new file mode 100644 (file)
index 0000000..59fb9bb
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Test for SHExplorerParseCmdLine
+ * PROGRAMMER:      Thomas Faber
+ */
+
+#define UNICODE
+#include <wine/test.h>
+#include <strsafe.h>
+#include <shlobj.h>
+
+#define UNKNOWN_SIZE 0x100
+
+typedef struct _EXPLORER_INFO
+{
+    PWSTR FileName;
+    PIDLIST_ABSOLUTE pidl;
+    DWORD dwFlags; /* TODO: make some constants */
+    ULONG Unknown[UNKNOWN_SIZE]; /* TODO: find out more */
+} EXPLORER_INFO, *PEXPLORER_INFO;
+
+PVOID
+WINAPI
+SHExplorerParseCmdLine(
+    _Out_ PEXPLORER_INFO Info);
+
+#define PIDL_IS_UNTOUCHED -1
+#define PIDL_IS_NULL -2
+#define PIDL_IS_PATH -3
+
+#define InvalidPointer ((PVOID)0x5555555555555555ULL)
+
+static
+VOID
+TestCommandLine(
+    _In_ INT ExpectedRet,
+    _In_ INT ExpectedCsidl,
+    _In_ DWORD ExpectedFlags,
+    _In_ PCWSTR ExpectedFileName,
+    _In_ PCWSTR PidlPath)
+{
+    EXPLORER_INFO Info;
+    PVOID Ret;
+    ULONG i;
+
+    FillMemory(&Info, sizeof(Info), 0x55);
+    Info.dwFlags = 0x00000000;
+    Ret = SHExplorerParseCmdLine(&Info);
+
+    if (ExpectedRet == -1)
+        ok(Ret == Info.pidl, "Ret = %p, expected %p\n", Ret, Info.pidl);
+    else
+        ok(Ret == (PVOID)ExpectedRet, "Ret = %p, expected %p\n", Ret, (PVOID)ExpectedRet);
+
+    if (ExpectedFileName == NULL)
+        ok(Info.FileName == InvalidPointer, "FileName = %p\n", Info.FileName);
+    else
+    {
+        ok(Info.FileName != NULL && Info.FileName != InvalidPointer, "FileName = %p\n", Info.FileName);
+        if (Info.FileName != NULL && Info.FileName != InvalidPointer)
+        {
+            ok(!wcscmp(Info.FileName, ExpectedFileName), "FileName = %ls, expected %ls\n", Info.FileName, ExpectedFileName);
+            LocalFree(Info.FileName);
+        }
+    }
+
+    if (ExpectedCsidl == PIDL_IS_UNTOUCHED)
+        ok(Info.pidl == InvalidPointer, "pidl = %p\n", Info.pidl);
+    else if (ExpectedCsidl == PIDL_IS_NULL)
+        ok(Info.pidl == NULL, "pidl = %p\n", Info.pidl);
+    else
+    {
+        PIDLIST_ABSOLUTE ExpectedPidl;
+        HRESULT hr;
+
+        ok(Info.pidl != NULL, "pidl = %p\n", Info.pidl);
+        if (Info.pidl != NULL && Info.pidl != InvalidPointer)
+        {
+            if (ExpectedCsidl == PIDL_IS_PATH)
+            {
+                ExpectedPidl = SHSimpleIDListFromPath(PidlPath);
+                hr = ExpectedPidl == NULL ? E_FAIL : S_OK;
+                ok(ExpectedPidl != NULL, "SHSimpleIDListFromPath failed\n");
+            }
+            else
+            {
+                hr = SHGetFolderLocation(NULL, ExpectedCsidl, NULL, 0, &ExpectedPidl);
+                ok(hr == S_OK, "SHGetFolderLocation returned %08lx\n", hr);
+            }
+            if (SUCCEEDED(hr))
+            {
+                ok(ILIsEqual(Info.pidl, ExpectedPidl), "Unexpected pidl value\n");
+                ILFree(ExpectedPidl);
+            }
+            ILFree(Info.pidl);
+        }
+    }
+
+    ok(Info.dwFlags == ExpectedFlags, "dwFlags = %08lx, expected %08lx\n", Info.dwFlags, ExpectedFlags);
+    for (i = 0; i < sizeof(Info.Unknown) / sizeof(Info.Unknown[0]); i++)
+        ok(Info.Unknown[i] == 0x55555555, "Unknown[%lu] = %08lx\n", i, Info.Unknown[i]);
+}
+
+START_TEST(SHExplorerParseCmdLine)
+{
+    struct
+    {
+        PCWSTR CommandLine;
+        INT ExpectedRet;
+        INT ExpectedCsidl;
+        DWORD ExpectedFlags;
+        PCWSTR ExpectedFileName;
+        PCWSTR PidlPath;
+    } Tests[] =
+    {
+        { L"",            -1, CSIDL_MYDOCUMENTS, 0x00000009 },
+        { L"/e",        TRUE, PIDL_IS_UNTOUCHED, 0x00000008 },
+        { L"/n",        TRUE, PIDL_IS_UNTOUCHED, 0x00004001 },
+        { L"/x",        TRUE,      PIDL_IS_NULL, 0x02000000, L"/x" },
+        { L"-e",        TRUE,      PIDL_IS_NULL, 0x02000000, L"-e" },
+        { L"C:\\",      TRUE,      PIDL_IS_PATH, 0x00000200, NULL, L"C:\\" },
+        { L"/e,C:\\",   TRUE,      PIDL_IS_PATH, 0x00000208, NULL, L"C:\\" },
+        /* TODO: needs a lot more testcases */
+    };
+    const int TestCount = sizeof(Tests) / sizeof(Tests[0]);
+    PWSTR CommandLine;
+    WCHAR OriginalCommandLine[1024];
+    int i;
+
+    CommandLine = GetCommandLine();
+    (VOID)StringCbCopy(OriginalCommandLine, sizeof(OriginalCommandLine), CommandLine);
+
+    for (i = 0; i < TestCount; i++)
+    {
+        wcscpy(CommandLine, L"browseui_apitest.exe ");
+        wcscat(CommandLine, Tests[i].CommandLine);
+        trace("Command line: %ls\n", CommandLine);
+        TestCommandLine(Tests[i].ExpectedRet,
+                        Tests[i].ExpectedCsidl,
+                        Tests[i].ExpectedFlags,
+                        Tests[i].ExpectedFileName,
+                        Tests[i].PidlPath);
+    }
+
+    wcscpy(CommandLine, OriginalCommandLine);
+}
diff --git a/rostests/apitests/browseui/testlist.c b/rostests/apitests/browseui/testlist.c
new file mode 100644 (file)
index 0000000..6a47ca4
--- /dev/null
@@ -0,0 +1,16 @@
+#define WIN32_LEAN_AND_MEAN
+#define __ROS_LONG64__
+#include <windows.h>
+
+#define STANDALONE
+#include "wine/test.h"
+
+extern void func_SHExplorerParseCmdLine(void);
+
+const struct test winetest_testlist[] =
+{
+    { "SHExplorerParseCmdLine", func_SHExplorerParseCmdLine },
+
+    { 0, 0 }
+};
+