mirror of
https://github.com/reactos/reactos.git
synced 2025-05-30 22:49:12 +00:00
[USER32_APITEST]
- Add tests for LookupIconIdFromDirectoryEx - Add a workaround in GetIconInfo tests for a ReactOS bug in EnumDisplaySettings - Add tests for EnumDisplaySettings demonstrating the bug. - Add some traces to better follow the test run svn path=/trunk/; revision=60994
This commit is contained in:
parent
9f96a991c1
commit
cd3af3c4c8
7 changed files with 258 additions and 7 deletions
|
@ -7,12 +7,14 @@ list(APPEND SOURCE
|
|||
DestroyCursorIcon.c
|
||||
DrawIconEx.c
|
||||
desktop.c
|
||||
EnumDisplaySettings.c
|
||||
GetIconInfo.c
|
||||
GetKeyState.c
|
||||
GetPeekMessage.c
|
||||
GetSystemMetrics.c
|
||||
InitializeLpkHooks.c
|
||||
LoadImage.c
|
||||
LookupIconIdFromDirectoryEx.c
|
||||
RealGetWindowClass.c
|
||||
ScrollDC.c
|
||||
ScrollWindowEx.c
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include <apitest.h>
|
||||
|
||||
#include <winuser.h>
|
||||
#include <wingdi.h>
|
||||
|
||||
START_TEST(CreateIconFromResourceEx)
|
||||
{
|
||||
|
@ -9,7 +10,9 @@ START_TEST(CreateIconFromResourceEx)
|
|||
HMODULE hMod;
|
||||
HRSRC hResource; // handle to FindResource
|
||||
HRSRC hMem; // handle to LoadResource
|
||||
BYTE *lpResource; // pointer to resource data
|
||||
BYTE *lpResource; // pointer to resource data
|
||||
DWORD err;
|
||||
int wResId;
|
||||
|
||||
hMod = GetModuleHandle(NULL);
|
||||
ok(hMod != NULL, "\n");
|
||||
|
@ -43,6 +46,47 @@ START_TEST(CreateIconFromResourceEx)
|
|||
ok(DestroyCursor(hcur1), "\n");
|
||||
ok(DestroyCursor(hcur2), "\n");
|
||||
ok(DestroyCursor(hcur2), "\n");
|
||||
|
||||
|
||||
/* See what happens if we ask for an icon on a cursor resource (directory) */
|
||||
SetLastError(0x0badf00d);
|
||||
hcur1 = CreateIconFromResourceEx(lpResource, SizeofResource(hMod, hResource), TRUE, 0x00030000, 0, 0, 0);
|
||||
ok(hcur1 == NULL, "\n");
|
||||
err = GetLastError();
|
||||
ok(err == 0x0badf00d, "err: %lu\n", err);
|
||||
|
||||
/* Same tests, but for cursor resource (not directory) */
|
||||
wResId = LookupIconIdFromDirectoryEx(lpResource, FALSE, 0, 0, 0);
|
||||
ok(wResId != 0, "\n");
|
||||
FreeResource(hResource);
|
||||
|
||||
hResource = FindResourceA(hMod, MAKEINTRESOURCEA(wResId), RT_CURSOR);
|
||||
ok(hResource != NULL, "\n");
|
||||
|
||||
hMem = LoadResource(hMod, hResource);
|
||||
ok(hMem != NULL, "\n");
|
||||
|
||||
lpResource = LockResource(hMem);
|
||||
ok(lpResource != NULL, "\n");
|
||||
|
||||
/* MSDN states that LR_SHARED permits to not load twice the same cursor again.
|
||||
* But CreateIconFromResourceEx still returns two different handles */
|
||||
hcur2 = CreateIconFromResourceEx(lpResource, SizeofResource(hMod, hResource), FALSE, 0x00030000, 0, 0, LR_SHARED);
|
||||
ok(hcur2 != NULL, "\n");
|
||||
ok(hcur2 != hcur1, "\n");
|
||||
hcur1 = CreateIconFromResourceEx(lpResource, SizeofResource(hMod, hResource), FALSE, 0x00030000, 0, 0, LR_SHARED);
|
||||
ok(hcur1 != NULL, "\n");
|
||||
ok(hcur2 != hcur1, "\n");
|
||||
|
||||
/* Try to destroy them multiple times (see DestroyCursor test) */
|
||||
ok(DestroyCursor(hcur1), "\n");
|
||||
ok(DestroyCursor(hcur1), "\n");
|
||||
ok(DestroyCursor(hcur2), "\n");
|
||||
ok(DestroyCursor(hcur2), "\n");
|
||||
|
||||
/* See what happens if we ask for an icon on a cursor resource (no directory) */
|
||||
SetLastError(0x0badf00d);
|
||||
hcur1 = CreateIconFromResourceEx(lpResource, SizeofResource(hMod, hResource), TRUE, 0x00030000, 0, 0, 0);
|
||||
ok(hcur1 == NULL, "\n");
|
||||
err = GetLastError();
|
||||
ok(err == 0x0badf00d, "err: %lu\n", err);
|
||||
}
|
60
rostests/apitests/user32/EnumDisplaySettings.c
Normal file
60
rostests/apitests/user32/EnumDisplaySettings.c
Normal file
|
@ -0,0 +1,60 @@
|
|||
#include <apitest.h>
|
||||
|
||||
#include <wingdi.h>
|
||||
#include <winuser.h>
|
||||
|
||||
#define SIZEOF_DEVMODEW_300 188
|
||||
#define SIZEOF_DEVMODEW_400 212
|
||||
#define SIZEOF_DEVMODEW_500 220
|
||||
|
||||
START_TEST(EnumDisplaySettings)
|
||||
{
|
||||
DEVMODEW dm;
|
||||
HDC icDisplay;
|
||||
|
||||
/* TODO: test with a printer driver */
|
||||
|
||||
icDisplay = CreateICW(L"DISPLAY", NULL, NULL, NULL);
|
||||
ok(icDisplay != NULL, "\n");
|
||||
|
||||
dm.dmDriverExtra = 0x7777;
|
||||
|
||||
/* Try ridiculous size */
|
||||
dm.dmSize = 0x8888;
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
ok(dm.dmBitsPerPel == GetDeviceCaps(icDisplay, BITSPIXEL), "%lu, should be %d.\n", dm.dmBitsPerPel, GetDeviceCaps(icDisplay, BITSPIXEL));
|
||||
ok(dm.dmSize == SIZEOF_DEVMODEW_300, "%d\n", dm.dmSize);
|
||||
ok(dm.dmDriverExtra == 0, "%d\n", dm.dmDriverExtra);
|
||||
|
||||
/* Try a tiny size */
|
||||
dm.dmSize = 4;
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
ok(dm.dmBitsPerPel == GetDeviceCaps(icDisplay, BITSPIXEL), "%lu, should be %d.\n", dm.dmBitsPerPel, GetDeviceCaps(icDisplay, BITSPIXEL));
|
||||
ok(dm.dmSize == SIZEOF_DEVMODEW_300, "%d\n", dm.dmSize);
|
||||
|
||||
/* Something in between */
|
||||
dm.dmSize = (SIZEOF_DEVMODEW_300 + SIZEOF_DEVMODEW_400) / 2 ;
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
ok(dm.dmBitsPerPel == GetDeviceCaps(icDisplay, BITSPIXEL), "%lu, should be %d.\n", dm.dmBitsPerPel, GetDeviceCaps(icDisplay, BITSPIXEL));
|
||||
ok(dm.dmSize == SIZEOF_DEVMODEW_300, "%d\n", dm.dmSize);
|
||||
|
||||
/* WINVER < 0x0400 */
|
||||
dm.dmSize = SIZEOF_DEVMODEW_300;
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
ok(dm.dmBitsPerPel == GetDeviceCaps(icDisplay, BITSPIXEL), "%lu, should be %d.\n", dm.dmBitsPerPel, GetDeviceCaps(icDisplay, BITSPIXEL));
|
||||
ok(dm.dmSize == SIZEOF_DEVMODEW_300, "%d\n", dm.dmSize);
|
||||
|
||||
/* WINVER < 0x0500 */
|
||||
dm.dmSize = SIZEOF_DEVMODEW_400;
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
ok(dm.dmBitsPerPel == GetDeviceCaps(icDisplay, BITSPIXEL), "%lu, should be %d.\n", dm.dmBitsPerPel, GetDeviceCaps(icDisplay, BITSPIXEL));
|
||||
ok(dm.dmSize == SIZEOF_DEVMODEW_300, "%d\n", dm.dmSize);
|
||||
|
||||
/* "Modern" windows */
|
||||
dm.dmSize = SIZEOF_DEVMODEW_500;
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
ok(dm.dmBitsPerPel == GetDeviceCaps(icDisplay, BITSPIXEL), "%lu, should be %d.\n", dm.dmBitsPerPel, GetDeviceCaps(icDisplay, BITSPIXEL));
|
||||
ok(dm.dmSize == SIZEOF_DEVMODEW_300, "%d\n", dm.dmSize);
|
||||
|
||||
DeleteDC(icDisplay);
|
||||
}
|
|
@ -99,7 +99,7 @@ Test_GetIconInfo(BOOL fIcon, DWORD screen_bpp)
|
|||
ok(bitmap.bmHeight == 16, "\n");
|
||||
ok(bitmap.bmWidthBytes == 8 * bitmap.bmBitsPixel / 8, "\n");
|
||||
ok(bitmap.bmPlanes == 1, "\n");
|
||||
ok(bitmap.bmBitsPixel == screen_bpp, "\n");
|
||||
ok(bitmap.bmBitsPixel == screen_bpp, "%d\n", bitmap.bmBitsPixel);
|
||||
ok(bitmap.bmBits == NULL, "\n");
|
||||
DeleteObject(iconinfo2.hbmMask);
|
||||
DeleteObject(iconinfo2.hbmColor);
|
||||
|
@ -152,13 +152,20 @@ START_TEST(GetIconInfo)
|
|||
DWORD data[] = {0, 0, 0, 0, 0, 0};
|
||||
DWORD bpp, screenbpp, creationbpp;
|
||||
DEVMODEW dm;
|
||||
|
||||
dm.dmSize = sizeof(dm);
|
||||
dm.dmDriverExtra = 0;
|
||||
|
||||
/* Test icons behaviour regarding display settings */
|
||||
EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm);
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
screenbpp = dm.dmBitsPerPel;
|
||||
|
||||
Test_GetIconInfo(0, screenbpp);
|
||||
Test_GetIconInfo(1, screenbpp);
|
||||
trace("Icon default size: %dx%d.\n", GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));
|
||||
trace("Cursor default size: %dx%d.\n", GetSystemMetrics(SM_CXCURSOR), GetSystemMetrics(SM_CYCURSOR));
|
||||
|
||||
trace("Screen bpp: %lu.\n", screenbpp);
|
||||
Test_GetIconInfo(FALSE, screenbpp);
|
||||
Test_GetIconInfo(TRUE, screenbpp);
|
||||
|
||||
hcursor = LoadCursor(GetModuleHandle(NULL), "TESTCURSOR");
|
||||
ok(hcursor != 0, "should not fail, error %ld\n", GetLastError());
|
||||
|
@ -192,6 +199,7 @@ START_TEST(GetIconInfo)
|
|||
skip("Unable to change bpp to %lu.\n", creationbpp);
|
||||
continue;
|
||||
}
|
||||
trace("starting with creationbpp = %lu\n", creationbpp);
|
||||
hcursor = LoadImage(GetModuleHandle(NULL),
|
||||
MAKEINTRESOURCE(IDI_TEST),
|
||||
IMAGE_ICON,
|
||||
|
@ -203,6 +211,7 @@ START_TEST(GetIconInfo)
|
|||
/* If we reverse the loop here (32->16 bpp), then hbmColor.bmBitsPixel is always 32 */
|
||||
for(bpp = 16; bpp <=32; bpp += 8)
|
||||
{
|
||||
trace("testing resetting to %lu\n", bpp);
|
||||
dm.dmBitsPerPel = bpp;
|
||||
if(ChangeDisplaySettingsExW(NULL, &dm, NULL, 0, NULL) != DISP_CHANGE_SUCCESSFUL)
|
||||
{
|
||||
|
|
|
@ -35,7 +35,7 @@ START_TEST(LoadImage)
|
|||
hCopy = CopyIcon(arg);
|
||||
ok(hCopy != NULL, "\n");
|
||||
ok(DestroyIcon(hCopy), "\n");
|
||||
|
||||
|
||||
hCopy = CopyImage(arg, IMAGE_CURSOR, 0, 0, 0);
|
||||
ok(hCopy != NULL, "\n");
|
||||
ok(DestroyIcon(hCopy), "\n");
|
||||
|
|
132
rostests/apitests/user32/LookupIconIdFromDirectoryEx.c
Normal file
132
rostests/apitests/user32/LookupIconIdFromDirectoryEx.c
Normal file
|
@ -0,0 +1,132 @@
|
|||
|
||||
#include <apitest.h>
|
||||
|
||||
#include <wingdi.h>
|
||||
#include <winuser.h>
|
||||
|
||||
#include "resource.h"
|
||||
|
||||
START_TEST(LookupIconIdFromDirectoryEx)
|
||||
{
|
||||
HRSRC hResource;
|
||||
HGLOBAL hMem;
|
||||
HMODULE hMod;
|
||||
int wResId;
|
||||
DEVMODEW dm;
|
||||
DWORD dwOrigBpp;
|
||||
UINT i;
|
||||
BYTE* lpResource;
|
||||
|
||||
/* This tests assumes that default icon size is 32x32 */
|
||||
|
||||
struct
|
||||
{
|
||||
DWORD bpp;
|
||||
int wResId;
|
||||
int cxDesired;
|
||||
int cyDesired;
|
||||
UINT flags;
|
||||
}
|
||||
TestData[] =
|
||||
{
|
||||
{8, 1, 0, 0, 0},
|
||||
{8, 1, 48, 48, 0},
|
||||
{8, 2, 32, 32, 0},
|
||||
{8, 3, 24, 24, 0},
|
||||
{8, 4, 16, 16, 0},
|
||||
{8, 1, 0, 0, LR_MONOCHROME},
|
||||
{8, 1, 48, 48, LR_MONOCHROME},
|
||||
{8, 2, 32, 32, LR_MONOCHROME},
|
||||
{8, 3, 24, 24, LR_MONOCHROME},
|
||||
{8, 4, 16, 16, LR_MONOCHROME},
|
||||
{8, 2, 0, 0, LR_DEFAULTSIZE},
|
||||
{8, 1, 48, 48, LR_DEFAULTSIZE},
|
||||
/* Non exact sizes */
|
||||
{8, 1, 41, 41, 0},
|
||||
{8, 1, 40, 40, 0},
|
||||
/* Non square sizes */
|
||||
{8, 1, 16, 48, 0},
|
||||
{8, 1, 48, 16, 0},
|
||||
{16, 5, 0, 0, 0},
|
||||
{16, 5, 48, 48, 0},
|
||||
{16, 6, 32, 32, 0},
|
||||
{16, 7, 24, 24, 0},
|
||||
{16, 1, 0, 0, LR_MONOCHROME},
|
||||
{16, 1, 48, 48, LR_MONOCHROME},
|
||||
{16, 2, 32, 32, LR_MONOCHROME},
|
||||
{16, 3, 24, 24, LR_MONOCHROME},
|
||||
{16, 4, 16, 16, LR_MONOCHROME},
|
||||
{16, 6, 0, 0, LR_DEFAULTSIZE},
|
||||
{16, 5, 48, 48, LR_DEFAULTSIZE},
|
||||
{24, 5, 0, 0, 0},
|
||||
{24, 5, 48, 48, 0},
|
||||
{24, 6, 32, 32, 0},
|
||||
{24, 7, 24, 24, 0},
|
||||
{24, 8, 16, 16, 0},
|
||||
{16, 8, 16, 16, 0},
|
||||
{24, 1, 0, 0, LR_MONOCHROME},
|
||||
{24, 1, 48, 48, LR_MONOCHROME},
|
||||
{24, 2, 32, 32, LR_MONOCHROME},
|
||||
{24, 3, 24, 24, LR_MONOCHROME},
|
||||
{24, 4, 16, 16, LR_MONOCHROME},
|
||||
{24, 6, 0, 0, LR_DEFAULTSIZE},
|
||||
{24, 5, 48, 48, LR_DEFAULTSIZE},
|
||||
{32, 9, 0, 0, 0},
|
||||
{32, 9, 48, 48, 0},
|
||||
{32, 10, 32, 32, 0},
|
||||
{32, 11, 24, 24, 0},
|
||||
{32, 12, 16, 16, 0},
|
||||
{32, 1, 0, 0, LR_MONOCHROME},
|
||||
{32, 1, 48, 48, LR_MONOCHROME},
|
||||
{32, 2, 32, 32, LR_MONOCHROME},
|
||||
{32, 3, 24, 24, LR_MONOCHROME},
|
||||
{32, 4, 16, 16, LR_MONOCHROME},
|
||||
{32, 10, 0, 0, LR_DEFAULTSIZE},
|
||||
{32, 9, 48, 48, LR_DEFAULTSIZE},
|
||||
};
|
||||
|
||||
hMod = GetModuleHandle(NULL);
|
||||
ok(hMod != NULL, "\n");
|
||||
/* Find our cursor directory resource */
|
||||
hResource = FindResourceA(hMod,
|
||||
MAKEINTRESOURCE(IDI_TEST),
|
||||
RT_GROUP_ICON);
|
||||
ok(hResource != NULL, "\n");
|
||||
|
||||
hMem = LoadResource(hMod, hResource);
|
||||
ok(hMem != NULL, "\n");
|
||||
|
||||
lpResource = LockResource(hMem);
|
||||
ok(lpResource != NULL, "\n");
|
||||
|
||||
dm.dmSize = sizeof(dm);
|
||||
dm.dmDriverExtra = 0;
|
||||
|
||||
ok(EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm), "\n");
|
||||
|
||||
dwOrigBpp = dm.dmBitsPerPel;
|
||||
|
||||
for (i = 0; i < sizeof(TestData)/sizeof(TestData[0]); i++)
|
||||
{
|
||||
dm.dmBitsPerPel = TestData[i].bpp;
|
||||
if (ChangeDisplaySettingsExW(NULL, &dm, NULL, 0, NULL) != DISP_CHANGE_SUCCESSFUL)
|
||||
{
|
||||
skip("Unable to change bpp to %lu.\n", dm.dmBitsPerPel);
|
||||
continue;
|
||||
}
|
||||
wResId = LookupIconIdFromDirectoryEx(lpResource, TRUE, TestData[i].cxDesired, TestData[i].cyDesired, TestData[i].flags);
|
||||
ok(wResId == TestData[i].wResId, "Got %d, expected %d for %dx%dx%lu, flags %x.\n",
|
||||
wResId,
|
||||
TestData[i].wResId,
|
||||
TestData[i].cxDesired,
|
||||
TestData[i].cyDesired,
|
||||
TestData[i].bpp,
|
||||
TestData[i].flags);
|
||||
}
|
||||
|
||||
/* Restore */
|
||||
dm.dmBitsPerPel = dwOrigBpp;
|
||||
ok(ChangeDisplaySettingsExW(NULL, &dm, NULL, 0, NULL) == DISP_CHANGE_SUCCESSFUL, "\n");
|
||||
|
||||
FreeResource(hMem);
|
||||
}
|
|
@ -9,12 +9,14 @@ extern void func_DeferWindowPos(void);
|
|||
extern void func_DestroyCursorIcon(void);
|
||||
extern void func_DrawIconEx(void);
|
||||
extern void func_desktop(void);
|
||||
extern void func_EnumDisplaySettings(void);
|
||||
extern void func_GetIconInfo(void);
|
||||
extern void func_GetKeyState(void);
|
||||
extern void func_GetPeekMessage(void);
|
||||
extern void func_GetSystemMetrics(void);
|
||||
extern void func_InitializeLpkHooks(void);
|
||||
extern void func_LoadImage(void);
|
||||
extern void func_LookupIconIdFromDirectoryEx(void);
|
||||
extern void func_RealGetWindowClass(void);
|
||||
extern void func_ScrollDC(void);
|
||||
extern void func_ScrollWindowEx(void);
|
||||
|
@ -33,12 +35,14 @@ const struct test winetest_testlist[] =
|
|||
{ "DestroyCursorIcon", func_DestroyCursorIcon },
|
||||
{ "DrawIconEx", func_DrawIconEx },
|
||||
{ "desktop", func_desktop },
|
||||
{ "EnumDisplaySettings", func_EnumDisplaySettings },
|
||||
{ "GetIconInfo", func_GetIconInfo },
|
||||
{ "GetKeyState", func_GetKeyState },
|
||||
{ "GetPeekMessage", func_GetPeekMessage },
|
||||
{ "GetSystemMetrics", func_GetSystemMetrics },
|
||||
{ "InitializeLpkHooks", func_InitializeLpkHooks },
|
||||
{ "LoadImage", func_LoadImage },
|
||||
{ "LookupIconIdFromDirectoryEx", func_LookupIconIdFromDirectoryEx },
|
||||
{ "RealGetWindowClass", func_RealGetWindowClass },
|
||||
{ "ScrollDC", func_ScrollDC },
|
||||
{ "ScrollWindowEx", func_ScrollWindowEx },
|
||||
|
|
Loading…
Reference in a new issue