[PATCH] comctl32/tests: Use actual text width for ideal button size tests.

Nikolay Sivov nsivov at codeweavers.com
Tue Dec 11 06:24:24 CST 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

This should fix test failures running on testbot VMs.

 dlls/comctl32/tests/button.c | 112 ++++++++++++++++++-----------------
 1 file changed, 58 insertions(+), 54 deletions(-)

diff --git a/dlls/comctl32/tests/button.c b/dlls/comctl32/tests/button.c
index 09ec4a1c0a..ce673af261 100644
--- a/dlls/comctl32/tests/button.c
+++ b/dlls/comctl32/tests/button.c
@@ -1421,21 +1421,21 @@ static void test_state(void)
 
 static void test_bcm_get_ideal_size(void)
 {
-    static const WCHAR text2_w[] = {'t', 'e', 'x', 't', '\n', 't', 'e', 'x', 't', 0};
-    static const WCHAR text_w[] = {'t', 'e', 'x', 't', 0};
+    static const char *button_text2 = "WWWW\nWWWW";
+    static const char *button_text = "WWWW";
     static const DWORD imagelist_aligns[] = {BUTTON_IMAGELIST_ALIGN_LEFT, BUTTON_IMAGELIST_ALIGN_RIGHT,
                                              BUTTON_IMAGELIST_ALIGN_TOP, BUTTON_IMAGELIST_ALIGN_BOTTOM,
                                              BUTTON_IMAGELIST_ALIGN_CENTER};
     static const DWORD aligns[] = {0,         BS_TOP,     BS_LEFT,        BS_RIGHT,   BS_BOTTOM,
                                    BS_CENTER, BS_VCENTER, BS_RIGHTBUTTON, WS_EX_RIGHT};
     DWORD default_style = WS_TABSTOP | WS_POPUP | WS_VISIBLE;
-    LONG client_width = 200, client_height = 200;
-    LONG width, height, line_count;
+    const LONG client_width = 400, client_height = 200;
+    LONG image_width, height, line_count, text_width;
+    HFONT hfont, prev_font;
     DWORD style, type;
     BOOL ret;
     HWND hwnd;
     HDC hdc;
-    HFONT hfont;
     LOGFONTA lf;
     TEXTMETRICA tm;
     SIZE size;
@@ -1444,11 +1444,12 @@ static void test_bcm_get_ideal_size(void)
     HICON hicon;
     HIMAGELIST himl;
     BUTTON_IMAGELIST biml = {0};
+    RECT rect;
     INT i, j;
 
     /* Check for NULL pointer handling */
-    hwnd = CreateWindowW(WC_BUTTONW, text_w, BS_PUSHBUTTON | default_style, 0, 0, client_width, client_height, NULL,
-                         NULL, 0, NULL);
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_PUSHBUTTON | default_style, 0, 0, client_width, client_height,
+        NULL, NULL, 0, NULL);
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, 0);
     ok(!ret, "Expect BCM_GETIDEALSIZE message to return false.\n");
 
@@ -1458,22 +1459,27 @@ static void test_bcm_get_ideal_size(void)
     lf.lfHeight = 20;
     lstrcpyA(lf.lfFaceName, "Tahoma");
     hfont = CreateFontIndirectA(&lf);
+    ok(hfont != NULL, "Failed to create test font.\n");
 
     /* Get tmHeight */
     hdc = GetDC(hwnd);
+    prev_font = SelectObject(hdc, hfont);
     GetTextMetricsA(hdc, &tm);
+    SelectObject(hdc, prev_font);
+    DrawTextA(hdc, button_text, -1, &rect, DT_CALCRECT);
+    text_width = rect.right - rect.left;
     ReleaseDC(hwnd, hdc);
     DestroyWindow(hwnd);
 
-    /* XP and 2003 doesn't support command links, getting ideal size with button having only text just return client size on these platforms */
-    hwnd = CreateWindowA(WC_BUTTONA, "test", BS_DEFCOMMANDLINK | default_style, 0, 0, client_width, client_height, NULL,
+    /* XP and 2003 doesn't support command links, getting ideal size with button having only text returns client size on these platforms. */
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_DEFCOMMANDLINK | default_style, 0, 0, client_width, client_height, NULL,
                          NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)TRUE);
     ZeroMemory(&size, sizeof(size));
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
-    if (size.cx == client_width && size.cy == client_width)
+    if (size.cx == client_width && size.cy == client_height)
     {
         /* on XP and 2003, buttons with image are not supported */
         win_skip("Skipping further tests on XP and 2003\n");
@@ -1482,14 +1488,14 @@ static void test_bcm_get_ideal_size(void)
 
     /* Tests for image placements */
     /* Prepare bitmap */
-    width = 48;
+    image_width = 48;
     height = 48;
     hdc = GetDC(0);
-    hmask = CreateCompatibleBitmap(hdc, width, height);
-    hbmp = CreateCompatibleBitmap(hdc, width, height);
+    hmask = CreateCompatibleBitmap(hdc, image_width, height);
+    hbmp = CreateCompatibleBitmap(hdc, image_width, height);
 
     /* Only bitmap for push button, ideal size should be enough for image and text */
-    hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_DEFPUSHBUTTON | BS_BITMAP | default_style, 0, 0, client_width,
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_DEFPUSHBUTTON | BS_BITMAP | default_style, 0, 0, client_width,
                          client_height, NULL, NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbmp);
@@ -1498,9 +1504,9 @@ static void test_bcm_get_ideal_size(void)
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
     /* Ideal size contains text rect even show bitmap only */
-    ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
-       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, width + 4 * tm.tmMaxCharWidth, size.cy,
-       max(height, tm.tmHeight));
+    ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
+            "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, image_width + text_width,
+            size.cy, max(height, tm.tmHeight));
     DestroyWindow(hwnd);
 
     /* Image alignments when button has bitmap and text*/
@@ -1508,7 +1514,7 @@ static void test_bcm_get_ideal_size(void)
         for (j = 0; j < ARRAY_SIZE(aligns); j++)
         {
             style = BS_DEFPUSHBUTTON | default_style | aligns[i] | aligns[j];
-            hwnd = CreateWindowA(WC_BUTTONA, "WWWW", style, 0, 0, client_width, client_height, NULL, NULL, 0, NULL);
+            hwnd = CreateWindowA(WC_BUTTONA, button_text, style, 0, 0, client_width, client_height, NULL, NULL, 0, NULL);
             ok(hwnd != NULL, "Expect hwnd not NULL\n");
             SendMessageA(hwnd, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbmp);
             SendMessageA(hwnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)TRUE);
@@ -1517,25 +1523,25 @@ static void test_bcm_get_ideal_size(void)
             ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
             if (!(style & (BS_CENTER | BS_VCENTER)) || ((style & BS_CENTER) && (style & BS_CENTER) != BS_CENTER)
                 || !(style & BS_VCENTER) || (style & BS_VCENTER) == BS_VCENTER)
-                ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
+                ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
                    "Style: 0x%08x expect ideal cx %d >= %d and ideal cy %d >= %d\n", style, size.cx,
-                   width + 4 * tm.tmMaxCharWidth, size.cy, max(height, tm.tmHeight));
+                   image_width + text_width, size.cy, max(height, tm.tmHeight));
             else
-                ok((size.cx >= max(4 * tm.tmMaxCharWidth, height) && size.cy >= height + tm.tmHeight),
+                ok((size.cx >= max(text_width, height) && size.cy >= height + tm.tmHeight),
                    "Style: 0x%08x expect ideal cx %d >= %d and ideal cy %d >= %d\n", style, size.cx,
-                   max(4 * tm.tmMaxCharWidth, height), size.cy, height + tm.tmHeight);
+                   max(text_width, height), size.cy, height + tm.tmHeight);
             DestroyWindow(hwnd);
         }
 
     /* Image list alignments */
-    himl = pImageList_Create(width, height, ILC_COLOR, 1, 1);
+    himl = pImageList_Create(image_width, height, ILC_COLOR, 1, 1);
     pImageList_Add(himl, hbmp, 0);
     biml.himl = himl;
     for (i = 0; i < ARRAY_SIZE(imagelist_aligns); i++)
     {
         biml.uAlign = imagelist_aligns[i];
-        hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_DEFPUSHBUTTON | default_style, 0, 0, client_width, client_height,
-                             NULL, NULL, 0, NULL);
+        hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_DEFPUSHBUTTON | default_style, 0, 0, client_width,
+            client_height, NULL, NULL, 0, NULL);
         ok(hwnd != NULL, "Expect hwnd not NULL\n");
         SendMessageA(hwnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)TRUE);
         SendMessageA(hwnd, BCM_SETIMAGELIST, 0, (LPARAM)&biml);
@@ -1543,16 +1549,16 @@ static void test_bcm_get_ideal_size(void)
         ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
         ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
         if (biml.uAlign == BUTTON_IMAGELIST_ALIGN_TOP || biml.uAlign == BUTTON_IMAGELIST_ALIGN_BOTTOM)
-            ok((size.cx >= max(4 * tm.tmMaxCharWidth, height) && size.cy >= height + tm.tmHeight),
+            ok((size.cx >= max(text_width, height) && size.cy >= height + tm.tmHeight),
                "Align:%d expect ideal cx %d >= %d and ideal cy %d >= %d\n", biml.uAlign, size.cx,
-               max(4 * tm.tmMaxCharWidth, height), size.cy, height + tm.tmHeight);
+               max(text_width, height), size.cy, height + tm.tmHeight);
         else if (biml.uAlign == BUTTON_IMAGELIST_ALIGN_LEFT || biml.uAlign == BUTTON_IMAGELIST_ALIGN_RIGHT)
-            ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
+            ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
                "Align:%d expect ideal cx %d >= %d and ideal cy %d >= %d\n", biml.uAlign, size.cx,
-               width + 4 * tm.tmMaxCharWidth, size.cy, max(height, tm.tmHeight));
+               image_width + text_width, size.cy, max(height, tm.tmHeight));
         else
-            ok(size.cx >= width && size.cy >= height, "Align:%d expect ideal cx %d >= %d and ideal cy %d >= %d\n",
-               biml.uAlign, size.cx, width, size.cy, height);
+            ok(size.cx >= image_width && size.cy >= height, "Align:%d expect ideal cx %d >= %d and ideal cy %d >= %d\n",
+               biml.uAlign, size.cx, image_width, size.cy, height);
         DestroyWindow(hwnd);
     }
 
@@ -1565,7 +1571,7 @@ static void test_bcm_get_ideal_size(void)
     hicon = CreateIconIndirect(&icon_info);
 
     /* Only icon, ideal size should be enough for image and text */
-    hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_DEFPUSHBUTTON | BS_ICON | default_style, 0, 0, client_width,
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_DEFPUSHBUTTON | BS_ICON | default_style, 0, 0, client_width,
                          client_height, NULL, NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hicon);
@@ -1574,44 +1580,44 @@ static void test_bcm_get_ideal_size(void)
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
     /* Ideal size contains text rect even show icons only */
-    ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
-       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, width + 4 * tm.tmMaxCharWidth, size.cy,
+    ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
+       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, image_width + text_width, size.cy,
        max(height, tm.tmHeight));
     DestroyWindow(hwnd);
 
     /* Show icon and text */
-    hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_DEFPUSHBUTTON | default_style, 0, 0, client_width, client_height, NULL,
-                         NULL, 0, NULL);
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_DEFPUSHBUTTON | default_style, 0, 0, client_width,
+        client_height, NULL, NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hicon);
     SendMessageA(hwnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)TRUE);
     ZeroMemory(&size, sizeof(size));
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
-    ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
-       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, width + 4 * tm.tmMaxCharWidth, size.cy,
+    ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
+       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, image_width + text_width, size.cy,
        max(height, tm.tmHeight));
     DestroyWindow(hwnd);
 
     /* Checkbox */
     /* Both bitmap and text for checkbox, ideal size is only enough for text because it doesn't support image(but not image list)*/
-    hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_AUTOCHECKBOX | default_style, 0, 0, client_width, client_height, NULL,
-                         NULL, 0, NULL);
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_AUTOCHECKBOX | default_style, 0, 0, client_width, client_height,
+        NULL, NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbmp);
     SendMessageA(hwnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)TRUE);
     ZeroMemory(&size, sizeof(size));
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
-    ok((size.cx <= width + 4 * tm.tmMaxCharWidth && size.cx >= 4 * tm.tmMaxCharWidth
-        && size.cy <= max(height, tm.tmHeight) && size.cy >= tm.tmHeight),
+    ok((size.cx <= image_width + text_width && size.cx >= text_width && size.cy <= max(height, tm.tmHeight)
+        && size.cy >= tm.tmHeight),
        "Expect ideal cx %d within range (%d, %d ) and ideal cy %d within range (%d, %d )\n", size.cx,
-       4 * tm.tmMaxCharWidth, width + 4 * tm.tmMaxCharWidth, size.cy, tm.tmHeight, max(height, tm.tmHeight));
+       text_width, image_width + text_width, size.cy, tm.tmHeight, max(height, tm.tmHeight));
     DestroyWindow(hwnd);
 
     /* Both image list and text for checkbox, ideal size should have enough for image list and text */
     biml.uAlign = BUTTON_IMAGELIST_ALIGN_LEFT;
-    hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_AUTOCHECKBOX | BS_BITMAP | default_style, 0, 0, client_width,
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_AUTOCHECKBOX | BS_BITMAP | default_style, 0, 0, client_width,
                          client_height, NULL, NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, BCM_SETIMAGELIST, 0, (LPARAM)&biml);
@@ -1619,13 +1625,13 @@ static void test_bcm_get_ideal_size(void)
     ZeroMemory(&size, sizeof(size));
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
-    ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
-       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, width + 4 * tm.tmMaxCharWidth, size.cy,
+    ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
+       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, image_width + text_width, size.cy,
        max(height, tm.tmHeight));
     DestroyWindow(hwnd);
 
     /* Only bitmap for checkbox, ideal size should have enough for image and text */
-    hwnd = CreateWindowA(WC_BUTTONA, "WWWW", BS_AUTOCHECKBOX | BS_BITMAP | default_style, 0, 0, client_width,
+    hwnd = CreateWindowA(WC_BUTTONA, button_text, BS_AUTOCHECKBOX | BS_BITMAP | default_style, 0, 0, client_width,
                          client_height, NULL, NULL, 0, NULL);
     ok(hwnd != NULL, "Expect hwnd not NULL\n");
     SendMessageA(hwnd, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbmp);
@@ -1633,8 +1639,8 @@ static void test_bcm_get_ideal_size(void)
     ZeroMemory(&size, sizeof(size));
     ret = SendMessageA(hwnd, BCM_GETIDEALSIZE, 0, (LPARAM)&size);
     ok(ret, "Expect BCM_GETIDEALSIZE message to return true\n");
-    ok((size.cx >= width + 4 * tm.tmMaxCharWidth && size.cy >= max(height, tm.tmHeight)),
-       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, width + 4 * tm.tmMaxCharWidth, size.cy,
+    ok((size.cx >= image_width + text_width && size.cy >= max(height, tm.tmHeight)),
+       "Expect ideal cx %d >= %d and ideal cy %d >= %d\n", size.cx, image_width + text_width, size.cy,
        max(height, tm.tmHeight));
     DestroyWindow(hwnd);
 
@@ -1673,7 +1679,7 @@ static void test_bcm_get_ideal_size(void)
             style = line_count > 1 ? type | BS_MULTILINE : type;
             style |= default_style;
 
-            hwnd = CreateWindowW(WC_BUTTONW, (line_count == 2 ? text2_w : text_w), style, 0, 0, client_width,
+            hwnd = CreateWindowA(WC_BUTTONA, (line_count == 2 ? button_text2 : button_text), style, 0, 0, client_width,
                                  client_height, NULL, NULL, 0, NULL);
             ok(hwnd != NULL, "Expect hwnd not NULL\n");
             SendMessageA(hwnd, WM_SETFONT, (WPARAM)hfont, (LPARAM)TRUE);
@@ -1696,11 +1702,9 @@ static void test_bcm_get_ideal_size(void)
             }
             else
             {
-                width = 0;
                 height = line_count == 2 ? 2 * tm.tmHeight : tm.tmHeight;
-                ok(size.cx >= width && size.cy >= height,
-                   "Style 0x%08x expect ideal cx %d >= %d and ideal cy %d >= %d\n", style, size.cx, width, size.cy,
-                   height);
+                ok(size.cx >= 0 && size.cy >= height, "Style 0x%08x expect ideal cx %d >= 0 and ideal cy %d >= %d\n",
+                    style, size.cx, size.cy, height);
             }
             DestroyWindow(hwnd);
         }
-- 
2.19.2




More information about the wine-devel mailing list