/* * Unit test of the IShellFolder functions. * * Copyright 2004 Vitaliy Margolen * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #define COBJMACROS #include "windef.h" #include "winbase.h" #include "wtypes.h" #include "shellapi.h" #include "shlguid.h" #include "shlobj.h" #include "shobjidl.h" #include "wine/unicode.h" #include "wine/test.h" IMalloc *ppM; /* creates a file with the specified name for tests */ void CreateTestFile(CHAR *name) { HANDLE file; DWORD written; file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if (file != INVALID_HANDLE_VALUE) { WriteFile(file, name, strlen(name), &written, NULL); WriteFile(file, "\n", strlen("\n"), &written, NULL); CloseHandle(file); } } /* initializes the tests */ void CreateFilesFolders(void) { CreateDirectoryA(".\\testdir", NULL); CreateDirectoryA(".\\testdir\\test.txt", NULL); CreateTestFile (".\\testdir\\test1.txt "); CreateTestFile (".\\testdir\\test2.txt "); CreateTestFile (".\\testdir\\test3.txt "); CreateDirectoryA(".\\testdir\\testdir2 ", NULL); } /* cleans after tests */ void Cleanup(void) { DeleteFileA(".\\testdir\\test1.txt"); DeleteFileA(".\\testdir\\test2.txt"); DeleteFileA(".\\testdir\\test3.txt"); RemoveDirectoryA(".\\testdir\\test.txt"); RemoveDirectoryA(".\\testdir\\testdir2"); RemoveDirectoryA(".\\testdir"); } /* perform test */ void test_EnumObjects(IShellFolder *iFolder) { IEnumIDList *iEnumList; ITEMIDLIST *newPIDL, *(idlArr [5]); ULONG NumPIDLs; int i=0, j; HRESULT nResult; static const WORD iResults [5][5] = { { 0,-1,-1,-1,-1}, { 1, 0,-1,-1,-1}, { 1, 1, 0,-1,-1}, { 1, 1, 1, 0,-1}, { 1, 1, 1, 1, 0} }; if SUCCEEDED(IShellFolder_EnumObjects(iFolder, NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &iEnumList)) { while (IEnumIDList_Next(iEnumList, 1, &newPIDL, &NumPIDLs) == S_OK) { idlArr[i++] = newPIDL; } /* This fails on windows */ /* IEnumIDList_Release(iEnumList); */ /* Sort them first in case of wrong order from system */ for (i=0;i<5;i++) for (j=0;j<5;j++) if ((SHORT)IShellFolder_CompareIDs(iFolder, 0, idlArr[i], idlArr[j]) < 0) { newPIDL = idlArr[i]; idlArr[i] = idlArr[j]; idlArr[j] = newPIDL; } for (i=0;i<5;i++) for (j=0;j<5;j++) { nResult = IShellFolder_CompareIDs(iFolder, 0, idlArr[i], idlArr[j]); ok(nResult == iResults[i][j], "Got %lx expected [%d]-[%d]=%x\n", nResult, i, j, iResults[i][j]); } for (i=0;i<5;i++) IMalloc_Free(ppM, idlArr[i]); } } START_TEST(shlfolder) { ITEMIDLIST *newPIDL; IShellFolder *IDesktopFolder, *testIShellFolder; WCHAR cCurrDirW [MAX_PATH]; static const WCHAR cTestDirW[] = {'\\','t','e','s','t','d','i','r',0}; GetCurrentDirectoryW(MAX_PATH, cCurrDirW); strcatW(cCurrDirW, cTestDirW); if(!SUCCEEDED(SHGetMalloc(&ppM))) return; CreateFilesFolders(); if(!SUCCEEDED(SHGetDesktopFolder(&IDesktopFolder))) return; if (SUCCEEDED(IShellFolder_ParseDisplayName(IDesktopFolder, NULL, NULL, cCurrDirW, NULL, &newPIDL, 0))) { if (SUCCEEDED(IShellFolder_BindToObject(IDesktopFolder, newPIDL, NULL, (REFIID)&IID_IShellFolder, (LPVOID *)&testIShellFolder))) { test_EnumObjects(testIShellFolder); /* This fails on windows */ /* IShellFolder_Release(newIShellFolder); */ IMalloc_Free(ppM, newPIDL); } } Cleanup(); }