mirror of
https://github.com/reactos/reactos.git
synced 2024-09-03 17:19:20 +00:00
![Doug Lyons](/assets/img/avatar_default.png)
Improve shell32:ExtractIconEx tests by updating it and adding more test files and 1 new icon file. JIRA issue: ROSTESTS-381 Add new ROS.ico file which has both a normal icon and a PNG one. Update testing to test for count of icons in file and separately extract the 0th one. Add tests for sysicon.ico, explorer.exe and the new ROS.ico files.
125 lines
3.1 KiB
C++
125 lines
3.1 KiB
C++
/*
|
|
* PROJECT: ReactOS API Tests
|
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
|
* PURPOSE: Tests for ExtractIconEx routine
|
|
* COPYRIGHT: Copyright 2019 George Bișoc (george.bisoc@reactos.org)
|
|
* Copyright 2023 Doug Lyons (douglyons@douglyons.com)
|
|
*/
|
|
|
|
#include "shelltest.h"
|
|
#include <stdio.h>
|
|
|
|
typedef struct
|
|
{
|
|
PCWSTR pszFilePath;
|
|
UINT nIcons;
|
|
} EXTRACTICONTESTS;
|
|
|
|
BOOL FileExists(LPCSTR FileName)
|
|
{
|
|
FILE *fp = NULL;
|
|
bool exists = FALSE;
|
|
|
|
fp = fopen(FileName, "r");
|
|
if (fp != NULL)
|
|
{
|
|
exists = TRUE;
|
|
fclose(fp);
|
|
}
|
|
return exists;
|
|
}
|
|
|
|
BOOL ResourceToFile(INT i, LPCSTR FileName)
|
|
{
|
|
FILE *fout;
|
|
HGLOBAL hData;
|
|
HRSRC hRes;
|
|
LPVOID lpResLock;
|
|
UINT iSize;
|
|
|
|
if (FileExists(FileName))
|
|
{
|
|
skip("'%s' already exists. Exiting now\n", FileName);
|
|
return FALSE;
|
|
}
|
|
|
|
hRes = FindResourceW(NULL, MAKEINTRESOURCEW(i), MAKEINTRESOURCEW(RT_RCDATA));
|
|
if (hRes == NULL)
|
|
{
|
|
skip("Could not locate resource (%d). Exiting now\n", i);
|
|
return FALSE;
|
|
}
|
|
|
|
iSize = SizeofResource(NULL, hRes);
|
|
|
|
hData = LoadResource(NULL, hRes);
|
|
if (hData == NULL)
|
|
{
|
|
skip("Could not load resource (%d). Exiting now\n", i);
|
|
return FALSE;
|
|
}
|
|
|
|
// Lock the resource into global memory.
|
|
lpResLock = LockResource(hData);
|
|
if (lpResLock == NULL)
|
|
{
|
|
skip("Could not lock resource (%d). Exiting now\n", i);
|
|
return FALSE;
|
|
}
|
|
|
|
fout = fopen(FileName, "wb");
|
|
fwrite(lpResLock, iSize, 1, fout);
|
|
fclose(fout);
|
|
return TRUE;
|
|
}
|
|
|
|
EXTRACTICONTESTS IconTests[] =
|
|
{
|
|
/* Executable file with icon */
|
|
{L"%SystemRoot%\\System32\\cmd.exe", 1},
|
|
|
|
/* Executable file without icon */
|
|
{L"%SystemRoot%\\System32\\autochk.exe", 0},
|
|
|
|
/* Non-existing files */
|
|
{L"%SystemRoot%\\non-existent-file.sdf", 0},
|
|
|
|
/* Multiple icons in the same EXE file (18 icons) */
|
|
{L"%SystemRoot%\\explorer.exe", 18},
|
|
|
|
/* Multiple icons in the same ICO file (6 icons)
|
|
* Per MS: If the file is an .ico file, the return value is 1. */
|
|
{L"sysicon.ico", 1},
|
|
|
|
/* ICO file with both normal and PNG icons */
|
|
{L"ROS.ico", 0}
|
|
};
|
|
|
|
START_TEST(ExtractIconEx)
|
|
{
|
|
UINT i, nReturnedIcons, nExtractedIcons;
|
|
CHAR FileName[2][13] = { "ROS.ico", "sysicon.ico" };
|
|
|
|
if (!ResourceToFile(2, FileName[0]))
|
|
return;
|
|
if (!ResourceToFile(3, FileName[1]))
|
|
return;
|
|
|
|
/* Check count of icons returned */
|
|
for (i = 0; i < _countof(IconTests); ++i)
|
|
{
|
|
nReturnedIcons = ExtractIconExW(IconTests[i].pszFilePath, -1, NULL, NULL, 0);
|
|
ok(nReturnedIcons == IconTests[i].nIcons, "ExtractIconExW(%u): Expects %u icons, got %u\n", i, IconTests[i].nIcons, nReturnedIcons);
|
|
}
|
|
|
|
/* Check if the 0th icon can be extracted successfully */
|
|
for (i = 0; i < _countof(IconTests); ++i)
|
|
{
|
|
nExtractedIcons = ExtractIconExW(IconTests[i].pszFilePath, 0, NULL, NULL, 1);
|
|
ok(nExtractedIcons == IconTests[i].nIcons, "ExtractIconExW(%u): Expects %u icons, got %u\n", i, IconTests[i].nIcons, nExtractedIcons);
|
|
}
|
|
|
|
DeleteFileA(FileName[0]);
|
|
DeleteFileA(FileName[1]);
|
|
}
|