[PATCH 1/4 v5] riched20/tests: Rewrite tests for ITextServices_TxGetNaturalSize().

Huw Davies huw at codeweavers.com
Thu Jun 7 03:53:47 CDT 2018


On Wed, Jun 06, 2018 at 05:24:13PM +0800, Jactry Zeng wrote:
> Superseded patch 146570.
> 
> ChangeLog:
> v5:
> - Use DrawTextW for calculating expected values;
> - Simplify format setting with EM_SETCHARFORMAT.
> 
> Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
> ---
>  dlls/riched20/tests/txtsrv.c | 125 +++++++++++++++++------------------
>  1 file changed, 61 insertions(+), 64 deletions(-)
> 
> diff --git a/dlls/riched20/tests/txtsrv.c b/dlls/riched20/tests/txtsrv.c
> index 88b5adf13c..6e61392dc5 100644
> --- a/dlls/riched20/tests/txtsrv.c
> +++ b/dlls/riched20/tests/txtsrv.c
> @@ -697,81 +697,78 @@ static void test_TxSetText(void)
>      ITextHost_Release(host);
>  }
>  
> +#define CHECK_TXGETNATURALSIZE(res,width,height,hdc,string) \
> +    _check_txgetnaturalsize(res, width, height, hdc, string, __LINE__)
> +static void _check_txgetnaturalsize(HRESULT res, LONG width, LONG height, HDC hdc, LPCWSTR string, int line)
> +{
> +    RECT rect;
> +    LONG expected_width, expected_height;
> +
> +    GetClientRect(WindowFromDC(hdc), &rect);
> +    DrawTextW(hdc, string, -1, &rect, DT_LEFT | DT_CALCRECT | DT_NOCLIP | DT_EDITCONTROL | DT_WORDBREAK);

Why can't you use GetTextExtentPointW() here?  This would avoid the
GetClientRect() call too.

> +    expected_width = rect.right - rect.left;
> +    expected_height = rect.bottom - rect.top;
> +    ok_(__FILE__,line)(res == S_OK, "ITextServices_TxGetNaturalSize failed: 0x%08x.\n", res);
> +    ok_(__FILE__,line)(width >= expected_width && width <= expected_width + 1,
> +                       "got wrong width: %d, expected: %d {+1}.\n", width, expected_width);
> +    ok_(__FILE__,line)(height == expected_height, "got wrong height: %d, expected: %d.\n",
> +                       height, expected_height);
> +}
> +
>  static void test_TxGetNaturalSize(void)
>  {
>      ITextServices *txtserv;
>      ITextHost *host;
>      HRESULT result;
> -    BOOL ret;
> -
> -    /* This value is used when calling TxGetNaturalSize.  MSDN says
> -       that this is not supported however a null pointer cannot be
> -       used as it will cause a segmentation violation.  The values in
> -       the structure being pointed to are required to be INT_MAX
> -       otherwise calculations can give wrong values. */
> -    const SIZEL psizelExtent = {INT_MAX,INT_MAX};
> -
> -    static const WCHAR oneA[] = {'A',0};
> -
> -    /* Results of measurements */
> -    LONG xdim, ydim;
> -
> -    /* The device context to do the tests in */
> +    SIZEL psizelExtent = {-1,-1};

Let's just call this 'extent';

> +    static const WCHAR test_text[] = {'T','e','s','t','S','o','m','e','T','e','x','t',0};
> +    LONG width, height;
>      HDC hdcDraw;
> -
> -    /* Variables with the text metric information */
> -    INT charwidth_caps_text[26];
> -    TEXTMETRICA tmInfo_text;
> +    HWND hwnd;
> +    RECT rect;
> +    CHARFORMAT2W cf;
> +    LRESULT lresult;
> +    HFONT hf;
> +    LOGFONTW lf;
>  
>      if (!init_texthost(&txtserv, &host))
>          return;
>  
> -    hdcDraw = GetDC(NULL);
> -    SaveDC(hdcDraw);
> -
> -    /* Populate the metric strucs */
> -    SetMapMode(hdcDraw,MM_TEXT);
> -    GetTextMetricsA(hdcDraw, &tmInfo_text);
> -    SetLastError(0xdeadbeef);
> -    ret = GetCharWidth32A(hdcDraw,'A','Z',charwidth_caps_text);
> -    if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) {
> -        win_skip("GetCharWidth32 is not available\n");
> -        goto cleanup;
> -    }
> -
> -    /* Make measurements in MM_TEXT */
> +    hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP | WS_VISIBLE,
> +                           0, 0, 100, 100, 0, 0, 0, NULL);
> +    hdcDraw = GetDC(hwnd);
>      SetMapMode(hdcDraw,MM_TEXT);
> -    xdim = 0; ydim = 0;
> -
> -    result = ITextServices_TxSetText(txtserv, oneA);
> -    ok(result == S_OK, "ITextServices_TxSetText failed (result = %x)\n", result);
> -    if (result != S_OK) {
> -        skip("Could not set text\n");
> -        goto cleanup;
> -    }
> -
> -    SetLastError(0xdeadbeef);
> -    result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT,
> -                                            hdcDraw, NULL, NULL,
> -                                            TXTNS_FITTOCONTENT, &psizelExtent,
> -                                            &xdim, &ydim);
> -    todo_wine ok(result == S_OK || broken(result == E_FAIL), /* WINXP Arabic Language */
> -        "TxGetNaturalSize gave unexpected return value (result = %x)\n", result);
> -    if (result == S_OK) {
> -    todo_wine ok(ydim == tmInfo_text.tmHeight,
> -                 "Height calculated incorrectly (expected %d, got %d)\n",
> -                 tmInfo_text.tmHeight, ydim);
> -    /* The native DLL adds one pixel extra when calculating widths. */
> -    todo_wine ok(xdim >= charwidth_caps_text[0] && xdim <= charwidth_caps_text[0] + 1,
> -                 "Width calculated incorrectly (expected %d {+1}, got %d)\n",
> -                 charwidth_caps_text[0], xdim);
> -    } else
> -        skip("TxGetNaturalSize measurements not performed (xdim = %d, ydim = %d, result = %x, error = %x)\n",
> -             xdim, ydim, result, GetLastError());
> -
> -cleanup:
> -    RestoreDC(hdcDraw,1);
> -    ReleaseDC(NULL,hdcDraw);
> +    GetClientRect(hwnd, &rect);
> +
> +    memset(&cf, 0, sizeof(cf));
> +    cf.cbSize = sizeof(cf);
> +    cf.dwMask = CFM_ALL2;
> +    hf = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

No need for cast.

> +    GetObjectW(hf, sizeof(LOGFONTW), &lf);
> +    lstrcpyW(cf.szFaceName, lf.lfFaceName);
> +    cf.yHeight = MulDiv(abs(lf.lfHeight), 1440, GetDeviceCaps(GetDC(NULL), LOGPIXELSY));
> +    if (lf.lfWeight > FW_NORMAL) cf.dwEffects |= CFE_BOLD;
> +    if (lf.lfItalic) cf.dwEffects |= CFE_ITALIC;
> +    if (lf.lfUnderline) cf.dwEffects |= CFE_UNDERLINE;
> +    if (lf.lfStrikeOut) cf.dwEffects |= CFE_SUBSCRIPT;
> +    cf.bPitchAndFamily = lf.lfPitchAndFamily;
> +    cf.bCharSet = lf.lfCharSet;
> +    result = ITextServices_TxSendMessage(txtserv, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM)&cf, &lresult);
> +    ok(result == S_OK, "ITextServices_TxSendMessage failed: 0x%08x.\n", result);
> +    SelectObject(hdcDraw, hf);
> +
> +    result = ITextServices_TxSetText(txtserv, test_text);
> +    ok(result == S_OK, "ITextServices_TxSetText failed: 0x%08x.\n", result);
> +
> +    psizelExtent.cx = -1; psizelExtent.cy = -1;

This is already initialised.

> +    width = rect.right - rect.left;
> +    height = 0;
> +    result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, hdcDraw, NULL, NULL,
> +                                            TXTNS_FITTOCONTENT, &psizelExtent, &width, &height);
> +    todo_wine CHECK_TXGETNATURALSIZE(result, width, height, hdcDraw, test_text);
> +
> +    ReleaseDC(hwnd, hdcDraw);
> +    DestroyWindow(hwnd);
>      ITextServices_Release(txtserv);
>      ITextHost_Release(host);
>  }
> -- 
> 2.17.1
> 
> 
> 
> 



More information about the wine-devel mailing list