mirror of
https://github.com/reactos/reactos.git
synced 2025-06-20 07:36:05 +00:00
[SHELL32_APITEST] Show that our current SHCreateFileExtractIconW is incorrect.
CORE-14082
This commit is contained in:
parent
a69393205a
commit
7fe78f2779
1 changed files with 123 additions and 69 deletions
|
@ -2,7 +2,7 @@
|
||||||
* PROJECT: ReactOS API tests
|
* PROJECT: ReactOS API tests
|
||||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||||
* PURPOSE: Test for SHCreateFileExtractIconW
|
* PURPOSE: Test for SHCreateFileExtractIconW
|
||||||
* COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
|
* COPYRIGHT: Copyright 2017,2018 Mark Jansen (mark.jansen@reactos.org)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "shelltest.h"
|
#include "shelltest.h"
|
||||||
|
@ -35,6 +35,22 @@ static TestData IconTests[] =
|
||||||
{ NULL, FILE_ATTRIBUTE_DIRECTORY },
|
{ NULL, FILE_ATTRIBUTE_DIRECTORY },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TestIID
|
||||||
|
{
|
||||||
|
const GUID* IID;
|
||||||
|
HRESULT ExpectedCreate;
|
||||||
|
HRESULT ExpectedQueryInterface;
|
||||||
|
};
|
||||||
|
|
||||||
|
static TestIID InterfaceTests[] =
|
||||||
|
{
|
||||||
|
{ &IID_IDefaultExtractIconInit, E_NOINTERFACE, E_NOINTERFACE },
|
||||||
|
{ &IID_IExtractIconW, S_OK, S_OK },
|
||||||
|
{ &IID_IExtractIconA, S_OK, S_OK },
|
||||||
|
{ &IID_IPersist, E_NOINTERFACE, E_NOINTERFACE },
|
||||||
|
{ &IID_IPersistFile, E_NOINTERFACE, E_NOINTERFACE },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static void ExtractOneBitmap(HBITMAP hbm, CComHeapPtr<BYTE>& data, DWORD& size)
|
static void ExtractOneBitmap(HBITMAP hbm, CComHeapPtr<BYTE>& data, DWORD& size)
|
||||||
{
|
{
|
||||||
|
@ -81,6 +97,9 @@ START_TEST(SHCreateFileExtractIconW)
|
||||||
HICON myIcon;
|
HICON myIcon;
|
||||||
pSHCreateFileExtractIconW = (HRESULT (__stdcall *)(LPCWSTR, DWORD, REFIID, void **))GetProcAddress(shell32, "SHCreateFileExtractIconW");
|
pSHCreateFileExtractIconW = (HRESULT (__stdcall *)(LPCWSTR, DWORD, REFIID, void **))GetProcAddress(shell32, "SHCreateFileExtractIconW");
|
||||||
|
|
||||||
|
/* Show that icons returned are always the same */
|
||||||
|
UINT tryFlags[4] = { 0, GIL_FORSHORTCUT, GIL_OPENICON };
|
||||||
|
|
||||||
CoInitialize(NULL);
|
CoInitialize(NULL);
|
||||||
|
|
||||||
GetModuleFileNameW(NULL, CurrentModule, _countof(CurrentModule));
|
GetModuleFileNameW(NULL, CurrentModule, _countof(CurrentModule));
|
||||||
|
@ -101,6 +120,24 @@ START_TEST(SHCreateFileExtractIconW)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (size_t n = 0; n < _countof(InterfaceTests); ++n)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
CComPtr<IUnknown> spUnknown;
|
||||||
|
HRESULT hr = pSHCreateFileExtractIconW(L"test.txt", FILE_ATTRIBUTE_NORMAL, *InterfaceTests[n].IID, (void**)&spUnknown);
|
||||||
|
ok(hr == InterfaceTests[n].ExpectedCreate, "Expected hr to be 0x%lx, was 0x%lx for %u\n", InterfaceTests[n].ExpectedCreate, hr, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
CComPtr<IUnknown> spUnknown, spUnknown2;
|
||||||
|
HRESULT hr = pSHCreateFileExtractIconW(L"test.txt", FILE_ATTRIBUTE_NORMAL, IID_PPV_ARG(IUnknown, &spUnknown));
|
||||||
|
ok(hr == S_OK, "Expected hr to be S_OK, was 0x%lx for %u\n", hr, n);
|
||||||
|
|
||||||
|
hr = spUnknown->QueryInterface(*InterfaceTests[n].IID, (void**)&spUnknown2);
|
||||||
|
ok(hr == InterfaceTests[n].ExpectedQueryInterface, "Expected hr to be 0x%lx, was 0x%lx for %u\n", InterfaceTests[n].ExpectedQueryInterface, hr, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t n = 0; n < _countof(IconTests); ++n)
|
for (size_t n = 0; n < _countof(IconTests); ++n)
|
||||||
{
|
{
|
||||||
TestData& cur = IconTests[n];
|
TestData& cur = IconTests[n];
|
||||||
|
@ -119,17 +156,30 @@ START_TEST(SHCreateFileExtractIconW)
|
||||||
if (!SUCCEEDED(hr))
|
if (!SUCCEEDED(hr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Show that GIL_DEFAULTICON does not work. */
|
||||||
|
{
|
||||||
int ilIndex = -1;
|
int ilIndex = -1;
|
||||||
UINT wFlags = 0xdeaddead;
|
UINT wFlags = 0xdeaddead;
|
||||||
WCHAR Buffer[MAX_PATH];
|
WCHAR Buffer[MAX_PATH];
|
||||||
|
|
||||||
hr = spExtract->GetIconLocation(0, Buffer, _countof(Buffer), &ilIndex, &wFlags);
|
hr = spExtract->GetIconLocation(GIL_DEFAULTICON, Buffer, _countof(Buffer), &ilIndex, &wFlags);
|
||||||
ok(hr == S_OK, "Expected hr to be S_OK, was 0x%lx for %S(%lx)\n", hr, cur.Name, cur.dwFlags);
|
ok(hr == S_FALSE, "Expected hr to be S_FALSE, was 0x%lx for %S(0x%lx)\n", hr, cur.Name, cur.dwFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (UINT idFlags = 0; idFlags < _countof(tryFlags); ++idFlags)
|
||||||
|
{
|
||||||
|
int ilIndex = -1;
|
||||||
|
UINT wFlags = 0xdeaddead;
|
||||||
|
WCHAR Buffer[MAX_PATH];
|
||||||
|
|
||||||
|
hr = spExtract->GetIconLocation(tryFlags[idFlags], Buffer, _countof(Buffer), &ilIndex, &wFlags);
|
||||||
|
ok(hr == S_OK, "Expected hr to be S_OK, was 0x%lx for %S(0x%lx,0x%x)\n", hr, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
if (!SUCCEEDED(hr))
|
if (!SUCCEEDED(hr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ok(wFlags & (GIL_NOTFILENAME|GIL_PERCLASS), "Expected GIL_NOTFILENAME|GIL_PERCLASS to be set for %S(%lx)\n", cur.Name, cur.dwFlags);
|
ok(wFlags & (GIL_NOTFILENAME|GIL_PERCLASS), "Expected GIL_NOTFILENAME|GIL_PERCLASS to be set for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
ok(!wcscmp(Buffer, L"*"), "Expected '*', was '%S' for %S(%lx)\n", Buffer, cur.Name, cur.dwFlags);
|
ok(!wcscmp(Buffer, L"*"), "Expected '*', was '%S' for %S(0x%lx,0x%x)\n", Buffer, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
|
|
||||||
HICON ico;
|
HICON ico;
|
||||||
hr = spExtract->Extract(Buffer, ilIndex, &ico, NULL, 0);
|
hr = spExtract->Extract(Buffer, ilIndex, &ico, NULL, 0);
|
||||||
|
@ -148,26 +198,29 @@ START_TEST(SHCreateFileExtractIconW)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SHFILEINFOW shfi;
|
SHFILEINFOW shfi;
|
||||||
ULONG_PTR firet = SHGetFileInfoW(cur.Name, cur.dwFlags, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON);
|
ULONG_PTR firet = SHGetFileInfoW(cur.Name, cur.dwFlags, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SYSICONINDEX);
|
||||||
|
|
||||||
if (!firet)
|
if (!firet)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
ok(shfi.iIcon == ilIndex, "Expected ilIndex to be 0%x, was 0x%x for %S(0x%lx,0x%x)\n", shfi.iIcon, ilIndex, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
|
|
||||||
|
|
||||||
CComHeapPtr<BYTE> colorDataRef, maskDataRef;
|
CComHeapPtr<BYTE> colorDataRef, maskDataRef;
|
||||||
DWORD colorSizeRef = 0, maskSizeRef = 0;
|
DWORD colorSizeRef = 0, maskSizeRef = 0;
|
||||||
GetIconData(shfi.hIcon, colorDataRef, colorSizeRef, maskDataRef, maskSizeRef);
|
GetIconData(shfi.hIcon, colorDataRef, colorSizeRef, maskDataRef, maskSizeRef);
|
||||||
|
|
||||||
ok(colorSizeRef == colorSize, "Expected %lu, was %lu for %S(%lx)\n", colorSizeRef, colorSize, cur.Name, cur.dwFlags);
|
ok(colorSizeRef == colorSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", colorSizeRef, colorSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
ok(maskSizeRef == maskSize, "Expected %lu, was %lu for %S(%lx)\n", maskSizeRef, maskSize, cur.Name, cur.dwFlags);
|
ok(maskSizeRef == maskSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", maskSizeRef, maskSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
|
|
||||||
if (colorSizeRef == colorSize)
|
if (colorSizeRef == colorSize)
|
||||||
{
|
{
|
||||||
ok(!memcmp(colorData, colorDataRef, colorSize), "Expected equal colorData for %S(%lx)\n", cur.Name, cur.dwFlags);
|
ok(!memcmp(colorData, colorDataRef, colorSize), "Expected equal colorData for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maskSizeRef == maskSize)
|
if (maskSizeRef == maskSize)
|
||||||
{
|
{
|
||||||
ok(!memcmp(maskData, maskDataRef, maskSize), "Expected equal maskData for %S(%lx)\n", cur.Name, cur.dwFlags);
|
ok(!memcmp(maskData, maskDataRef, maskSize), "Expected equal maskData for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useMyIcon)
|
if (useMyIcon)
|
||||||
|
@ -177,27 +230,28 @@ START_TEST(SHCreateFileExtractIconW)
|
||||||
colorSizeRef = maskSizeRef = 0;
|
colorSizeRef = maskSizeRef = 0;
|
||||||
GetIconData(myIcon, colorDataRef, colorSizeRef, maskDataRef, maskSizeRef);
|
GetIconData(myIcon, colorDataRef, colorSizeRef, maskDataRef, maskSizeRef);
|
||||||
|
|
||||||
ok(colorSizeRef == colorSize, "Expected %lu, was %lu for %S(%lx)\n", colorSizeRef, colorSize, cur.Name, cur.dwFlags);
|
ok(colorSizeRef == colorSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", colorSizeRef, colorSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
ok(maskSizeRef == maskSize, "Expected %lu, was %lu for %S(%lx)\n", maskSizeRef, maskSize, cur.Name, cur.dwFlags);
|
ok(maskSizeRef == maskSize, "Expected %lu, was %lu for %S(0x%lx,0x%x)\n", maskSizeRef, maskSize, cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
|
|
||||||
if (colorSizeRef == colorSize)
|
if (colorSizeRef == colorSize)
|
||||||
{
|
{
|
||||||
/* In case requested filetype does not match, the exe icon is not used! */
|
/* In case requested filetype does not match, the exe icon is not used! */
|
||||||
if (cur.dwFlags == FILE_ATTRIBUTE_DIRECTORY)
|
if (cur.dwFlags == FILE_ATTRIBUTE_DIRECTORY)
|
||||||
{
|
{
|
||||||
ok(memcmp(colorData, colorDataRef, colorSize), "Expected colorData to be changed for %S(%lx)\n", cur.Name, cur.dwFlags);
|
ok(memcmp(colorData, colorDataRef, colorSize), "Expected colorData to be changed for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ok(!memcmp(colorData, colorDataRef, colorSize), "Expected equal colorData for %S(%lx)\n", cur.Name, cur.dwFlags);
|
ok(!memcmp(colorData, colorDataRef, colorSize), "Expected equal colorData for %S(0x%lx,0x%x)\n", cur.Name, cur.dwFlags, tryFlags[idFlags]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mask is not reliable for some reason
|
// Mask is not reliable for some reason
|
||||||
//if (maskSizeRef == maskSize)
|
//if (maskSizeRef == maskSize)
|
||||||
//{
|
//{
|
||||||
// ok(!memcmp(maskData, maskDataRef, maskSize), "Expected equal maskData for %S(%lx)\n", cur.Name, cur.dwFlags);
|
// ok(!memcmp(maskData, maskDataRef, maskSize), "Expected equal maskData for %S(0x%lx,0x%lx)\n", cur.Name, cur.dwFlags);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue