Reactos
at master 196 lines 6.9 kB view raw
1/* 2 * PROJECT: ReactOS api tests 3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory 4 * PURPOSE: Test for CMyComputer 5 * PROGRAMMER: Giannis Adamopoulos 6 */ 7 8#include "shelltest.h" 9 10#define NDEBUG 11#include <debug.h> 12#include <stdio.h> 13#include <shellutils.h> 14#include <versionhelpers.h> 15 16LPITEMIDLIST _CreateDummyPidl() 17{ 18 /* Create a tiny pidl with no contents */ 19 LPITEMIDLIST testpidl = (LPITEMIDLIST)SHAlloc(3 * sizeof(WORD)); 20 testpidl->mkid.cb = 2 * sizeof(WORD); 21 *(WORD*)((char*)testpidl + (int)(2 * sizeof(WORD))) = 0; 22 23 return testpidl; 24} 25 26VOID TestUninitialized() 27{ 28 CComPtr<IShellFolder> psf; 29 CComPtr<IEnumIDList> penum; 30 CComPtr<IDropTarget> pdt; 31 CComPtr<IContextMenu> pcm; 32 CComPtr<IShellView> psv; 33 LPITEMIDLIST retrievedPidl; 34 ULONG pceltFetched; 35 HRESULT hr; 36 37 /* Create a CFSFolder */ 38 hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf)); 39 ok(hr == S_OK, "hr = %lx\n", hr); 40 41 /* An uninitialized CFSFolder doesn't contain any items */ 42 hr = psf->EnumObjects(NULL, 0, &penum); 43 ok(hr == S_OK, "hr = %lx\n", hr); 44 hr = penum->Next(0, &retrievedPidl, &pceltFetched); 45 ok(hr == S_FALSE, "hr = %lx\n", hr); 46 hr = penum->Next(1, &retrievedPidl, &pceltFetched); 47 ok(hr == S_FALSE, "hr = %lx\n", hr); 48 49 /* It supports viewing */ 50 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt)); 51 ok(hr == S_OK, "hr = %lx\n", hr); 52 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm)); 53 ok(hr == S_OK, "hr = %lx\n", hr); 54 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv)); 55 ok(hr == S_OK, "hr = %lx\n", hr); 56 57 /* And its display name is ... "C:\Documents and Settings\<username>\Desktop" */ 58 STRRET strretName; 59 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 60 ok(hr == S_OK, "hr = %lx\n", hr); 61 ok(strretName.uType == STRRET_WSTR, "strretName.uType == %x\n", strretName.uType); 62 ok((wcsncmp(strretName.pOleStr, L"C:\\Documents and Settings\\", 26) == 0) || 63 (wcsncmp(strretName.pOleStr, L"C:\\Users\\", 9) == 0), 64 "wrong name, got: %S\n", strretName.pOleStr); 65 ok(wcscmp(strretName.pOleStr + wcslen(strretName.pOleStr) - 8, L"\\Desktop") == NULL, 66 "wrong name, got: %S\n", strretName.pOleStr); 67 68 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING|SHGDN_INFOLDER,&strretName); 69 ok(hr == E_INVALIDARG, "hr = %lx\n", hr); 70 71 72 73 74 /* Use Initialize method with a dummy pidl and test the still non initialized CFSFolder */ 75 CComPtr<IPersistFolder2> ppf2; 76 hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); 77 ok(hr == S_OK, "hr = %lx\n", hr); 78 79 LPITEMIDLIST testpidl = _CreateDummyPidl(); 80 81 hr = ppf2->Initialize(testpidl); 82 ok(hr == S_OK, "hr = %lx\n", hr); 83 84 CComHeapPtr<ITEMIDLIST> pidl; 85 hr = ppf2->GetCurFolder(&pidl); 86 ok(hr == S_OK, "hr = %lx\n", hr); 87 ok(pidl->mkid.cb == 2 * sizeof(WORD), "got wrong pidl size, cb = %x\n", pidl->mkid.cb); 88 89 /* methods that worked before, now fail */ 90 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 91 ok(hr == E_INVALIDARG || hr == E_FAIL, "hr = %lx\n", hr); 92 hr = psf->EnumObjects(NULL, 0, &penum); 93 ok(hr == E_INVALIDARG || hr == HRESULT_FROM_WIN32(ERROR_CANCELLED), "hr = %lx\n", hr); 94 95 /* The following continue to work though */ 96 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt)); 97 ok(hr == S_OK, "hr = %lx\n", hr); 98 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm)); 99 ok(hr == S_OK, "hr = %lx\n", hr); 100 hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv)); 101 ok(hr == S_OK, "hr = %lx\n", hr); 102 103} 104 105VOID TestInitialize() 106{ 107 HRESULT hr; 108 STRRET strretName; 109 110 /* Create a CFSFolder */ 111 CComPtr<IShellFolder> psf; 112 hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf)); 113 ok(hr == S_OK, "hr = %lx\n", hr); 114 115 CComPtr<IPersistFolder3> ppf3; 116 hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3)); 117 ok(hr == S_OK, "hr = %lx\n", hr); 118 119 LPITEMIDLIST testpidl = _CreateDummyPidl(); 120 PERSIST_FOLDER_TARGET_INFO pfti = {0}; 121 PERSIST_FOLDER_TARGET_INFO queriedPfti; 122 hr = ppf3->InitializeEx(NULL, NULL, NULL); 123 ok(hr == E_INVALIDARG || // Vista+ 124 hr == E_OUTOFMEMORY, // Win2k3 125 "hr = %lx\n", hr); 126 127 hr = ppf3->InitializeEx(NULL, NULL, &pfti); 128 ok(hr == E_INVALIDARG || // Vista+ 129 hr == E_OUTOFMEMORY, // Win2k3 130 "hr = %lx\n", hr); 131 132 wcscpy(pfti.szTargetParsingName, L"C:\\"); 133 hr = ppf3->InitializeEx(NULL, NULL, &pfti); 134 ok(hr == E_INVALIDARG || // Vista+ 135 hr == E_OUTOFMEMORY, // Win2k3 136 "hr = %lx\n", hr); 137 138 hr = ppf3->InitializeEx(NULL, testpidl, NULL); 139 ok(hr == S_OK, "hr = %lx\n", hr); 140 141 hr = ppf3->GetFolderTargetInfo(&queriedPfti); 142 ok(hr == E_FAIL || // Win7+ 143 hr == S_OK, // Win2k3-Vista 144 "hr = %lx\n", hr); 145 146 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 147 ok(hr == E_INVALIDARG || hr == E_FAIL, "hr = %lx\n", hr); 148 149 pfti.szTargetParsingName[0] = 0; 150 hr = ppf3->InitializeEx(NULL, testpidl, &pfti); 151 ok(hr == S_OK, "hr = %lx\n", hr); 152 153 hr = ppf3->GetFolderTargetInfo(&queriedPfti); 154 ok(hr == S_OK, "hr = %lx\n", hr); 155 ok(wcscmp(queriedPfti.szTargetParsingName, L"") == 0, "wrong name, got: %S\n", queriedPfti.szTargetParsingName); 156 157 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 158 ok(hr == E_INVALIDARG || hr == E_FAIL, "hr = %lx\n", hr); 159 160 wcscpy(pfti.szTargetParsingName, L"C:\\"); 161 hr = ppf3->InitializeEx(NULL, testpidl, &pfti); 162 ok(hr == S_OK, "hr = %lx\n", hr); 163 164 hr = ppf3->GetFolderTargetInfo(&queriedPfti); 165 ok(hr == S_OK, "hr = %lx\n", hr); 166 ok(wcscmp(queriedPfti.szTargetParsingName, L"C:\\") == 0, "wrong name, got: %S\n", queriedPfti.szTargetParsingName); 167 168 hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName); 169 ok(hr == S_OK, "hr = %lx\n", hr); 170 ok(strretName.uType == STRRET_WSTR, "strretName.uType == %x\n", strretName.uType); 171 ok(wcscmp(strretName.pOleStr, L"C:\\") == 0, "wrong name, got: %S\n", strretName.pOleStr); 172} 173 174VOID TestGetUIObjectOf() 175{ 176 HRESULT hr; 177 178 /* Create a CFSFolder */ 179 CComPtr<IShellFolder> psf; 180 hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf)); 181 ok(hr == S_OK, "hr = %lx\n", hr); 182 183 /* test 0 cidl for IDataObject */ 184 CComPtr<IDataObject> pdo; 185 hr = psf->GetUIObjectOf(NULL, 0, NULL, IID_NULL_PPV_ARG(IDataObject, &pdo)); 186 ok(hr == E_INVALIDARG, "hr = %lx\n", hr); 187} 188 189START_TEST(CFSFolder) 190{ 191 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 192 193 TestUninitialized(); 194 TestInitialize(); 195 TestGetUIObjectOf(); 196}