[USER32_APITEST]
authorJérôme Gardou <jerome.gardou@reactos.org>
Thu, 14 Nov 2013 23:11:23 +0000 (23:11 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Thu, 14 Nov 2013 23:11:23 +0000 (23:11 +0000)
 - 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

rostests/apitests/user32/CMakeLists.txt
rostests/apitests/user32/CreateIconFromResourceEx.c
rostests/apitests/user32/EnumDisplaySettings.c [new file with mode: 0644]
rostests/apitests/user32/GetIconInfo.c
rostests/apitests/user32/LoadImage.c
rostests/apitests/user32/LookupIconIdFromDirectoryEx.c [new file with mode: 0644]
rostests/apitests/user32/testlist.c

index f23bd29..db507f8 100644 (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
index b0e7251..4c5d7b7 100644 (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);
 }
\ No newline at end of file
diff --git a/rostests/apitests/user32/EnumDisplaySettings.c b/rostests/apitests/user32/EnumDisplaySettings.c
new file mode 100644 (file)
index 0000000..5c99548
--- /dev/null
@@ -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);
+}
index 9186ad5..6a36ad1 100644 (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)
             {
index 2e308bc..f59f601 100644 (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");
diff --git a/rostests/apitests/user32/LookupIconIdFromDirectoryEx.c b/rostests/apitests/user32/LookupIconIdFromDirectoryEx.c
new file mode 100644 (file)
index 0000000..218da48
--- /dev/null
@@ -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);
+}
\ No newline at end of file
index 26cb810..77ed471 100644 (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 },