reactos/rostests/apitests/browseui/SHExplorerParseCmdLine.c
Thomas Faber cccfe23541 [BROWSEUI]
- Add more tests for SHExplorerParseCmdLine. Patch by Edijs Kolesnikovičs
CORE-7627 #resolve

svn path=/trunk/; revision=62732
2014-04-13 05:41:19 +00:00

154 lines
5.6 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPLv2+ - See COPYING in the top level directory
* PURPOSE: Test for SHExplorerParseCmdLine
* PROGRAMMER: Thomas Faber <thomas.faber@reactos.org
*/
#include <apitest.h>
//#define UNICODE
#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:\\" },
{ L"/select,C:\\", TRUE, PIDL_IS_PATH, 0x00000240, NULL, L"C:\\" },
{ L"/e,::{20d04fe0-3aea-1069-a2d8-08002b30309d}", TRUE, PIDL_IS_PATH, 0x00000208, NULL, L"::{20d04fe0-3aea-1069-a2d8-08002b30309d}" },
{ L"::{645ff040-5081-101b-9f08-00aa002f954e}", TRUE, PIDL_IS_PATH, 0x00000200, NULL, L"::{645ff040-5081-101b-9f08-00aa002f954e}" },
{ L"/select,::{450d8fba-ad25-11d0-98a8-0800361b1103}", TRUE, PIDL_IS_PATH, 0x00000240, NULL, L"::{450d8fba-ad25-11d0-98a8-0800361b1103}" },
{ L"=", TRUE, PIDL_IS_PATH, 0x00000200, NULL, L"::{20d04fe0-3aea-1069-a2d8-08002b30309d}" },
/* TODO: needs a lot more testcases */
};
const int TestCount = sizeof(Tests) / sizeof(Tests[0]);
PWSTR CommandLine;
WCHAR OriginalCommandLine[1024];
int i;
CommandLine = GetCommandLineW();
StringCbCopyW(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);
}