diff --git a/modules/rostests/apitests/zipfldr/EnumParentDir.cpp b/modules/rostests/apitests/zipfldr/EnumParentDir.cpp index 8eec80e3436..71f0352dad4 100644 --- a/modules/rostests/apitests/zipfldr/EnumParentDir.cpp +++ b/modules/rostests/apitests/zipfldr/EnumParentDir.cpp @@ -2,7 +2,7 @@ * PROJECT: ReactOS api tests * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: Test the result of enumerating over a folder with a zip in it - * COPYRIGHT: Copyright 2020 Mark Jansen (mark.jansen@reactos.org) + * COPYRIGHT: Copyright 2020-2023 Mark Jansen (mark.jansen@reactos.org) */ #include "precomp.h" @@ -50,31 +50,37 @@ void FindExpectedFile(FileInfo* Array, size_t len, IShellFolder* pFolder, PCUITE } } -static void test_EnumDirFiles(const WCHAR* TestFolder) +const SFGAOF BaseFileAttributes = SFGAO_FILESYSTEM; +const SFGAOF BaseFolderAttributes = SFGAO_FILESYSTEM | SFGAO_FOLDER; +FileInfo ExpectedFiles[] = { + { L"test.txt", BaseFileAttributes, false }, + { L"TMP0.zip", BaseFileAttributes, false}, // 2k3 Shows this as a file, newer shows this as a folder + { L"ASUBFLD", BaseFolderAttributes | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR, false }, +}; +BOOL FoundZipfldr = FALSE; + +static void +test_EnumDirFiles(const WCHAR *TestFolder, BOOL EnumFolders) { CComPtr spFolder; if (!InitializeShellFolder(TestFolder, spFolder)) return; CComPtr spEnum; - ok_int(zipfldr_loaded(), FALSE); - HRESULT hr = spFolder->EnumObjects(NULL, SHCONTF_NONFOLDERS, &spEnum); + ok_int(zipfldr_loaded(), FoundZipfldr); + HRESULT hr = spFolder->EnumObjects(NULL, EnumFolders ? SHCONTF_FOLDERS : SHCONTF_NONFOLDERS, &spEnum); ok_hr(hr, S_OK); if (!SUCCEEDED(hr)) return; - ok_int(zipfldr_loaded(), FALSE); + ok_int(zipfldr_loaded(), FoundZipfldr); - SFGAOF BaseAttributes = SFGAO_FILESYSTEM; - FileInfo ExpectedFiles[] = { - { L"test.txt", BaseAttributes, false }, - }; - - ULONG totalFetched = 0; do { CComHeapPtr child; ULONG celtFetched = 0; + ok_int(zipfldr_loaded(), FoundZipfldr); hr = spEnum->Next(1, &child, &celtFetched); + ok_int(zipfldr_loaded(), FoundZipfldr); if (hr != S_OK) break; ok_int(celtFetched, 1); @@ -85,89 +91,32 @@ static void test_EnumDirFiles(const WCHAR* TestFolder) SFGAOF ExpectedAttributes; FindExpectedFile(ExpectedFiles, RTL_NUMBER_OF(ExpectedFiles), spFolder, child, ExpectedName, ExpectedAttributes); - totalFetched++; - + ok_int(zipfldr_loaded(), FoundZipfldr); ok_displayname(spFolder, child, SHGDN_NORMAL, ExpectedName); + ok_int(zipfldr_loaded(), FoundZipfldr); SFGAOF Attributes = SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; hr = spFolder->GetAttributesOf(1, &child, &Attributes); + + if (!wcsicmp(ExpectedName, L"TMP0.zip")) + { + // We allow both .zip files being a 'file' (2k3) or a 'folder' (win10) + if (Attributes & SFGAO_FOLDER) + ExpectedAttributes |= SFGAO_FOLDER; + // Only at this point (after calling GetAttributesOf) it will load zipfldr + FoundZipfldr = TRUE; + trace("Found zip (%S)\n", ExpectedName); + } + ok_int(zipfldr_loaded(), FoundZipfldr); + /* Just keep the ones we are interested in */ Attributes &= (SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR); ok_hr(hr, S_OK); ok_hex(Attributes, ExpectedAttributes); } while (true); - ok_int(totalFetched, RTL_NUMBER_OF(ExpectedFiles)); - ok_hr(hr, S_FALSE); - ok_int(zipfldr_loaded(), FALSE); -} - -static void test_EnumDirDirs(const WCHAR* TestFolder) -{ - CComPtr spFolder; - if (!InitializeShellFolder(TestFolder, spFolder)) - return; - - CComPtr spEnum; - ok_int(zipfldr_loaded(), FALSE); - HRESULT hr = spFolder->EnumObjects(NULL, SHCONTF_FOLDERS, &spEnum); - ok_hr(hr, S_OK); - if (!SUCCEEDED(hr)) - return; - - ok_int(zipfldr_loaded(), FALSE); - - SFGAOF BaseAttributes = SFGAO_FILESYSTEM | SFGAO_FOLDER; - FileInfo ExpectedFiles[] = { - { L"TMP0.zip", BaseAttributes, false}, - { L"ASUBFLD", BaseAttributes | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR, false }, - }; - - bool bFoundZipfldr = false; - - ULONG totalFetched = 0; - do - { - CComHeapPtr child; - ULONG celtFetched = 0; - ok_int(zipfldr_loaded(), bFoundZipfldr ? TRUE : FALSE); - hr = spEnum->Next(1, &child, &celtFetched); - if (hr != S_OK) - break; - ok_int(celtFetched, 1); - if (celtFetched != 1) - break; - - ok_int(zipfldr_loaded(), bFoundZipfldr ? TRUE : FALSE); - - LPCWSTR ExpectedName; - SFGAOF ExpectedAttributes; - FindExpectedFile(ExpectedFiles, RTL_NUMBER_OF(ExpectedFiles), spFolder, child, ExpectedName, ExpectedAttributes); - - totalFetched++; - - ok_displayname(spFolder, child, SHGDN_NORMAL, ExpectedName); - trace("Current: %S\n", ExpectedName); - - SFGAOF Attributes = SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; - hr = spFolder->GetAttributesOf(1, &child, &Attributes); - if ((ExpectedAttributes & SFGAO_FILESYSANCESTOR)) - { - ok_int(zipfldr_loaded(), bFoundZipfldr ? TRUE : FALSE); - } - else - { - ok_int(zipfldr_loaded(), TRUE); - bFoundZipfldr = true; - } - /* Just keep the ones we are interested in */ - Attributes &= (SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR); - ok_hr(hr, S_OK); - ok_hex(Attributes, ExpectedAttributes); - } while (true); - - ok_int(totalFetched, RTL_NUMBER_OF(ExpectedFiles)); ok_hr(hr, S_FALSE); + ok_int(zipfldr_loaded(), FoundZipfldr); } @@ -179,6 +128,8 @@ START_TEST(EnumParentDir) if (!SUCCEEDED(hr)) return; + ok_int(zipfldr_loaded(), FALSE); + WCHAR TestFolder[MAX_PATH], TestFile[MAX_PATH], SubFolder[MAX_PATH]; GetTempPathW(_countof(TestFolder), TestFolder); PathAppendW(TestFolder, L"ZipDir"); @@ -204,8 +155,17 @@ START_TEST(EnumParentDir) CreateDirectoryW(SubFolder, NULL); - test_EnumDirFiles(TestFolder); - test_EnumDirDirs(TestFolder); + winetest_push_context("Files"); + test_EnumDirFiles(TestFolder, FALSE); + winetest_pop_context(); + winetest_push_context("Folders"); + test_EnumDirFiles(TestFolder, TRUE); + winetest_pop_context(); + + for (size_t n = 0; n < RTL_NUMBER_OF(ExpectedFiles); ++n) + { + ok(ExpectedFiles[n].Found, "Did not find %S\n", ExpectedFiles[n].Name); + } RemoveDirectoryW(SubFolder);