[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:
Jérôme Gardou 2013-11-14 23:11:23 +00:00
parent 9f96a991c1
commit cd3af3c4c8
7 changed files with 258 additions and 7 deletions

View file

@ -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

View file

@ -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);
}

View 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);
}

View file

@ -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)
{

View file

@ -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");

View 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);
}

View file

@ -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 },