Reactos
at master 76 lines 3.3 kB view raw
1/* 2 * PROJECT: ReactOS API tests 3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) 4 * PURPOSE: Test for SHGetFileInfo 5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me> 6 */ 7 8#include "shelltest.h" 9#include <shellutils.h> 10 11#define UNIQUEEXT L"ABC123XYZ" 12#define my_ok_all_flags(val, flags) ok_eq_hex((val) & (flags), (flags)) 13 14static DWORD_PTR SHGFI(PCWSTR Path, SHFILEINFOW &Info, UINT Flags, UINT Attributes = 0) 15{ 16 return SHGetFileInfoW(Path, Attributes, &Info, sizeof(Info), Flags); 17} 18 19static DWORD_PTR SHGFI(LPCITEMIDLIST Pidl, SHFILEINFOW &Info, UINT Flags, UINT Attributes = 0) 20{ 21 return SHGFI((PCWSTR)Pidl, Info, Flags | SHGFI_PIDL, Attributes); 22} 23 24START_TEST(SHGetFileInfo) 25{ 26 CCoInit ComInit; 27 LPITEMIDLIST pidl; 28 SHFILEINFOW info; 29 UINT flags; 30 WCHAR buf[MAX_PATH]; 31 32 ok_int(SHGFI((PCWSTR)NULL, info, 0), FALSE); 33 ok_int(SHGFI((PCWSTR)NULL, info, SHGFI_DISPLAYNAME), FALSE); 34 ok_int(SHGFI((PCWSTR)NULL, info, SHGFI_TYPENAME), FALSE); 35 ok_int(SHGFI((PCWSTR)NULL, info, SHGFI_ICONLOCATION), FALSE); 36 ok_int(SHGFI((PCWSTR)NULL, info, SHGFI_SYSICONINDEX), FALSE); 37 ok_int(SHGFI(UNIQUEEXT, info, SHGFI_USEFILEATTRIBUTES), TRUE); // Success when asking for no info 38 ok_int(SHGetFileInfoW(UNIQUEEXT, 0, NULL, 0, SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES), FALSE); // NULL pointer 39 ok_int(SHGFI(UNIQUEEXT, info, SHGFI_EXETYPE | SHGFI_USEFILEATTRIBUTES), TRUE); // Invalid combination, returns TRUE! 40 41 GetModuleFileNameW(NULL, buf, _countof(buf)); 42 ok_int(LOWORD(SHGFI(buf, info, SHGFI_EXETYPE)), 0x4550); // 'PE' 43 44 flags = SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES | SHGFI_ATTRIBUTES; 45 ZeroMemory(&info, sizeof(info)); 46 info.dwAttributes = ~SFGAO_VALIDATE; 47 ok_int(SHGFI(UNIQUEEXT, info, flags | SHGFI_ATTR_SPECIFIED), TRUE); 48 ok_ptr(StrStrIW(info.szTypeName, UNIQUEEXT), NULL); // A file without extension (not "EXT File") 49 my_ok_all_flags(info.dwAttributes, SFGAO_FILESYSTEM | SFGAO_STREAM); 50 51 ZeroMemory(&info, sizeof(info)); 52 info.dwAttributes = ~SFGAO_VALIDATE; 53 ok_int(SHGFI(UNIQUEEXT, info, flags | SHGFI_ATTR_SPECIFIED, FILE_ATTRIBUTE_DIRECTORY), TRUE); 54 ok_ptr(StrStrIW(info.szTypeName, UNIQUEEXT), NULL); // A directory (not "EXT File") 55 my_ok_all_flags(info.dwAttributes, SFGAO_FILESYSTEM | SFGAO_FOLDER); 56 57 ZeroMemory(&info, sizeof(info)); 58 info.dwAttributes = ~SFGAO_VALIDATE; 59 ok_int(SHGFI(L"." UNIQUEEXT, info, flags | SHGFI_ATTR_SPECIFIED), TRUE); 60 ok_bool_true(StrStrIW(info.szTypeName, UNIQUEEXT) != NULL, ".ext is treated as extension"); 61 my_ok_all_flags(info.dwAttributes, SFGAO_FILESYSTEM | SFGAO_STREAM); 62 63 info.dwAttributes = ~SFGAO_VALIDATE; 64 ok_int(SHGFI(L"c:", info, flags | SHGFI_ATTR_SPECIFIED), LOBYTE(GetVersion()) >= 6); 65 my_ok_all_flags(info.dwAttributes, SFGAO_FILESYSTEM | SFGAO_FILESYSANCESTOR); 66 67 info.dwAttributes = ~SFGAO_VALIDATE; 68 ok_int(SHGFI(L"c:\\", info, flags | SHGFI_ATTR_SPECIFIED), TRUE); 69 my_ok_all_flags(info.dwAttributes, SFGAO_FILESYSTEM | SFGAO_FILESYSANCESTOR); 70 71 pidl = SHSimpleIDListFromPath(L"c:\\foo"); 72 info.iIcon = -1; 73 ok_int(SHGFI(pidl, info, SHGFI_SYSICONINDEX) > TRUE, TRUE); 74 ok_int(info.iIcon != -1, TRUE); 75 ILFree(pidl); 76}