Reactos
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}