riched20/tests: Beginnings of EM_SETMARGINS test. This patch is released into the Public Domain under the requirements of the LGPL version 2.1 or later. Released by James McKenzie jjmckenzie51 at gmail.com

James McKenzie jjmckenzie51 at gmail.com
Sun Mar 13 18:48:58 CDT 2011


Just checking if gmail has a 'wrapping' problem or if this will actually 
go through.

riched20/tests: Beginnings of EM_SETMARGINS test. This patch is released 
into the Public Domain under the requirements of the LGPL version 2.1 or 
later. Released by James McKenzie jjmckenzie51 at gmail.com
---
  dlls/riched20/tests/editor.c |  215 
++++++++++++++++++++++++++++++++++++++++++
  1 files changed, 215 insertions(+), 0 deletions(-)

diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index 7a4e032..31f3bdc 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -7034,6 +7034,220 @@ static void test_dialogmode(void)
      DestroyWindow(hwParent);
  }
  +static INT CALLBACK is_truetype_font_installed_proc(const LOGFONT 
*elf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
+{
+    if (type != TRUETYPE_FONTTYPE) return 1;
+
+    return 0;
+}
+
+static BOOL is_truetype_font_installed(const char *name)
+{
+    HDC hdc = GetDC(0);
+    BOOL ret = FALSE;
+
+    if (!EnumFontFamiliesA(hdc, name, is_truetype_font_installed_proc, 0))
+        ret = TRUE;
+
+    ReleaseDC(0, hdc);
+    return ret;
+}
+
+static INT CALLBACK is_font_installed_proc(const LOGFONT *elf, const 
TEXTMETRIC *ntm, DWORD type, LPARAM lParam)
+{
+    return 0;
+}
+
+static BOOL is_font_installed(const char *name)
+{
+    HDC hdc = GetDC(0);
+    BOOL ret = FALSE;
+
+    if(!EnumFontFamiliesA(hdc, name, is_font_installed_proc, 0))
+        ret = TRUE;
+
+    ReleaseDC(0, hdc);
+    return ret;
+}
+
+static void test_em_setmargins(void)
+{
+  HWND hwndRichEdit;
+  RECT old_rect, new_rect;
+
+  HDC hDC;
+  LOGFONTA lfA;
+  UINT ret;
+  int ry, i, j, k;
+
+  HFONT testFont1A, hDC_font;
+
+  /* Add various window sizes for USEFONTINFO tests */
+  static const struct rect_parameters
+  {
+    int start_left, start_top, end_right, end_bottom;
+  } rect_param[] =
+  {
+    { 0, 0, 400, 80 },
+  };
+
+  /* data for ANSI font tests */
+  static const struct font_margins_data
+  {
+    const char face_name[LF_FACESIZE];
+    int weight, height, ascent, descent, int_leading, ext_leading;
+    int ave_char_width, max_char_width, dpi;
+  } fmd[] =
+  {
+    { "Courier", FW_NORMAL, 13, 11, 2, 0, 0, 8, 8, 96 },
+    { "System", FW_BOLD, 16, 13, 3, 3, 0, 7, 14, 96 },
+    { "Arial", FW_NORMAL, 16, 13, 3, 3, 0, 6, 35, 96, },
+  };
+
+  /* Test data for margins testing */
+  static const struct margin_test_data
+  {
+    int left_margin, right_margin;
+    DWORD margin_type;
+  } mmt [] =
+  {
+    { 0, 0, EC_LEFTMARGIN }, /*Clear all margin settings */
+    /*Left Margin tests*/
+    { 10, 0, EC_LEFTMARGIN }, /*Set Left Margin to 10 */
+    { EC_USEFONTINFO, 0, EC_LEFTMARGIN }, /*Test EC_USEFONTINFO as 
lparam with EC_LEFTMARGIN */
+    { 0, 0, EC_LEFTMARGIN },  /*Clear margins for Right Margin tests */
+    /*EC_USEFONTINFO as lpararm tests */
+    { 10, 10, EC_USEFONTINFO }, /*Set margins to 10 with 
EC_USEFONTINFO, should return zero */
+    { 0, EC_USEFONTINFO, EC_USEFONTINFO }, /*Set Right Margin to 
EC_USEFONTINFO under EC_USEFONTINFO, should
+      return zero except with TrueType Fonts, this should be the 
lagging spacing value for large fonts and large
+      edit windows*/
+    { EC_USEFONTINFO, 0, EC_USEFONTINFO }, /*Set Left Margin to 
EC_USEFONTINFO under EC_USEFONTINFO, should return
+      zero except with TrueType Fonts, this should be the leading 
spacing value for large fonts and large edit
+      windows*/
+    { EC_USEFONTINFO, EC_USEFONTINFO, EC_USEFONTINFO }, /*Set both 
margins to EC_USEFONTINFO under EC_USEFONTINFO,
+      should have same results for both left and right tests above */
+    { 0, 0, EC_USEFONTINFO }, /*Clear Margins, if set */
+  };
+
+  /* Run tests for number of rectangles */
+  for ( k=0; k< (sizeof(rect_param)/sizeof(rect_param[0])); k++)
+  {
+    hwndRichEdit = CreateWindow(RICHEDIT_CLASS, NULL, 
ES_MULTILINE|WS_POPUP|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE,
+                                rect_param[k].start_left, 
rect_param[k].start_top, rect_param[k].end_right,
+                                rect_param[k].end_bottom, NULL, NULL, 
hmoduleRichEdit, NULL);
+    ok(hwndRichEdit != NULL, "Error creating Richedit Window in 
EM_SETMARGINS test. error received: %d\n",
+                             (int) GetLastError());
+    if (!hwndRichEdit)
+    {
+      return;
+    }
+
+    hDC = GetDC(hwndRichEdit);
+    ok (hDC != NULL, "Creation of hdc failed.\n");
+    if (!hDC)
+    {
+      DestroyWindow(hwndRichEdit);
+      return;
+    }
+
+    ry = GetDeviceCaps(hDC, LOGPIXELSY);
+
+    ZeroMemory(&lfA, sizeof(lfA));
+    ZeroMemory(&testFont1A, sizeof(HFONT));
+    /*Initialize rect variable to be the size of the entire richedit 
window */
+    old_rect.left = rect_param[k].start_left;
+    old_rect.right = rect_param[k].end_right;
+    old_rect.top = rect_param[k].start_top;
+    old_rect.bottom = rect_param[k].end_bottom;
+    SendMessageA(hwndRichEdit, EM_SETRECT, 0, (LPARAM)&old_rect);
+    SendMessageA(hwndRichEdit, EM_GETRECT, 0, (LPARAM)&old_rect);
+    ok (rect_param[k].start_left == old_rect.left , "Richedit control 
window not created correctly. Canceling "
+        "test for window size of %d by %d\n", rect_param[k].end_right, 
rect_param[k].end_bottom);
+    if (rect_param[k].start_left != old_rect.left) continue;
+
+    /* Run tests for number of ANSI fonts */
+    for (i = 0; i < sizeof(fmd)/sizeof(fmd[0]); i++)
+    {
+      strcpy(lfA.lfFaceName, fmd[i].face_name);
+      lfA.lfHeight = fmd[i].height;
+      lfA.lfCharSet = DEFAULT_CHARSET;
+      lfA.lfWeight = fmd[i].weight;
+      ret = is_font_installed(lfA.lfFaceName);
+      /* If font cannot cannot be found, skip rest of tests */
+      ok (ret != 0, "Font not found, test results are not predictable. 
Aborting test for font %s\n",
+         fmd[i].face_name);
+      if (ret) continue;
+      ret = is_truetype_font_installed(lfA.lfFaceName);
+      if (lfA.lfFaceName == "Arial")
+      {
+        ok (ret == 0, "Truetype font emulated, test results will not be 
consistent with Windows!\n");
+        if (!ret) continue;
+      }
+
+      testFont1A = CreateFontIndirectA (&lfA);
+      hDC_font = SelectObject(hDC, testFont1A);
+      /* looping through the all of the tests */
+      for (j=0; j < sizeof (mmt)/sizeof (mmt[1]); j++)
+      {
+        SendMessageA(hwndRichEdit, EM_SETMARGINS, mmt[j].margin_type, 
MAKELONG (mmt[j].left_margin,
+                     mmt[j].right_margin));
+        ret=SendMessageA(hwndRichEdit, EM_GETRECT, 0, (LPARAM)&new_rect);
+        ok (ret == 0, "An error occurred getting new margins\n");
+        switch (mmt[j].margin_type)
+        {
+          case EC_USEFONTINFO :
+          /* Per several web sources, using the EC_USEFONTINFO with a 
TrueType font should result in the
+             following: The Left Margin should be set to the 'C' value, 
that is the value used to set white
+             space after a character and the next printed character. 
This is also called leading spacing.
+             The Right Margin should be set to the 'A' value, that is 
the value use to set white space to the
+             current position before drawing the next character.  This 
is also called lagging spacing.
+             During testing could not find a case where this was true 
for any version of riched20.dll */
+            {
+              ok(new_rect.right == old_rect.right, "The right border 
moved in EC_USEFONTINFO Left/Right "
+                 "margin change test to %d for font %s(%d)\n", 
old_rect.right - new_rect.right,
+                 fmd[i].face_name, fmd[i].height);
+              ok(new_rect.left == old_rect.left, "The left border was 
moved in EC_USEFONTINFO Left/Right Margin "
+                 "change test to %d for font %s(%d).\n", old_rect.left 
- new_rect.left, fmd[i].face_name,
+                 fmd[i].height);
+            }
+            break;
+          case EC_LEFTMARGIN :
+            if (mmt[j].left_margin == 0 )
+            {
+              ok(new_rect.left == old_rect.left, "The left border moved 
%d in the Left Margin "
+                 "Zero test for font %s(%d).\n", new_rect.left - 
old_rect.left, fmd[i].face_name, fmd[i].height);
+            }
+            else
+            {
+              todo_wine {
+                ok(new_rect.left == old_rect.left + mmt[j].left_margin, 
"The left border moved %d and should be "
+                   "%d in the Left margin change test for font 
%s(%d).\n",  new_rect.left - old_rect.left,
+                   mmt[j].left_margin, fmd[i].face_name, fmd[i].height);
+              }
+            }
+            ok(new_rect.right == old_rect.right, "The right border was 
moved %d in Left Margin change test for "
+               "font %s(%d).\n", new_rect.right - old_rect.right, 
fmd[i].face_name, fmd[i].height);
+            break;
+          case EC_LEFTMARGIN | EC_RIGHTMARGIN :
+          case EC_RIGHTMARGIN :
+          default: /* fall through if there is a data error or new 
margin type test */
+            ok (0 == 1, "Check %s %d %d 0x%x\n", fmd[i].face_name, 
fmd[i].height, fmd[i].dpi, mmt[j].margin_type);
+        }
+        /* test if top or bottom margin moved.  Test should not disturb 
them */
+        ok(new_rect.top == old_rect.top, "The top border moved %d in 
the test.\n",
+           new_rect.top - old_rect.top);
+        ok(new_rect.bottom == old_rect.bottom, "The bottom border moved 
%d in the test\n",
+           new_rect.bottom - old_rect.bottom);
+      }
+      SelectObject(hDC, hDC_font);
+      DeleteObject(testFont1A);
+    }
+    DeleteObject(testFont1A);
+    ReleaseDC (hwndRichEdit, hDC);
+    DestroyWindow (hwndRichEdit);
+  }
+}
+
  START_TEST( editor )
  {
    BOOL ret;
@@ -7090,6 +7304,7 @@ START_TEST( editor )
    test_WM_GETDLGCODE();
    test_zoom();
    test_dialogmode();
+  test_em_setmargins();
     /* Set the environment variable WINETEST_RICHED20 to keep windows
     * responsive and open for 30 seconds. This is useful for debugging.
-- 
1.7.4




More information about the wine-devel mailing list