Dmitry Timoshkov : user32: Add a test for the menu resource loader, make it pass under Wine.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 15 14:02:08 CDT 2007


Module: wine
Branch: master
Commit: 34015b93a4af1d9387e32bad070a6ac6fdcd0a07
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=34015b93a4af1d9387e32bad070a6ac6fdcd0a07

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Tue May 15 16:33:29 2007 +0900

user32: Add a test for the menu resource loader, make it pass under Wine.

---

 dlls/user32/menu.c       |    2 +
 dlls/user32/tests/menu.c |   86 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 86 insertions(+), 2 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 789f769..b57b0dc 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -2032,6 +2032,8 @@ static BOOL MENU_SetItemData( MENUITEM *item, UINT flags, UINT_PTR id,
         item->text = NULL;
     }
 
+    if (flags & MF_SEPARATOR) flags |= MF_GRAYED | MF_DISABLED;
+
     if (flags & MF_OWNERDRAW)
         item->dwItemData = (DWORD_PTR)str;
     else
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c
index 141d6c5..5c94b4c 100644
--- a/dlls/user32/tests/menu.c
+++ b/dlls/user32/tests/menu.c
@@ -1914,9 +1914,7 @@ static void check_menu_items(HMENU hmenu, UINT checked_cmd, UINT checked_type,
 
                 if (mii.fType == MFT_SEPARATOR)
                 {
-todo_wine {
                     ok(mii.fState == MFS_GRAYED, "id %u: expected fState MFS_GRAYED, got %04x\n", checked_cmd, mii.fState);
-}
                     ok(mii.wID == 0, "id %u: expected wID 0, got %u\n", checked_cmd, mii.wID);
                 }
                 else
@@ -1988,6 +1986,89 @@ static void test_CheckMenuRadioItem(void)
     check_menu_items(hmenu, -1, 0, 0);
 }
 
+static void test_menu_resource_layout(void)
+{
+    static const struct
+    {
+        MENUITEMTEMPLATEHEADER mith;
+        WORD data[];
+    } menu_template =
+    {
+        { 0, 0 }, /* versionNumber, offset */
+        {
+            /* mtOption, mtID, mtString[] '\0' terminated */
+            MF_STRING, 1, 'F', 0,
+            MF_STRING, 2, 0,
+            MF_SEPARATOR, 3, 0,
+            /* MF_SEPARATOR, 4, 'S', 0, FIXME: Wine ignores 'S' */
+            MF_STRING|MF_GRAYED|MF_END, 5, 'E', 0
+        }
+    };
+    static const struct
+    {
+        UINT type, state, id;
+        const char *str;
+    } menu_data[] =
+    {
+        { MF_STRING, MF_ENABLED, 1, "F" },
+        { MF_SEPARATOR, MF_GRAYED|MF_DISABLED, 2, "" },
+        { MF_SEPARATOR, MF_GRAYED|MF_DISABLED, 3, "" },
+        /*{ MF_SEPARATOR, MF_GRAYED|MF_DISABLED, 4, "S" }, FIXME: Wine ignores 'S'*/
+        { MF_STRING, MF_GRAYED, 5, "E" },
+        { MF_SEPARATOR, MF_GRAYED|MF_DISABLED, 6, "" },
+        { MF_STRING, MF_ENABLED, 7, "" },
+        { MF_SEPARATOR, MF_GRAYED|MF_DISABLED, 8, "" }
+    };
+    HMENU hmenu;
+    UINT count, i;
+    BOOL ret;
+
+    hmenu = LoadMenuIndirect(&menu_template);
+    ok(hmenu != 0, "LoadMenuIndirect error %u\n", GetLastError());
+
+    ret = AppendMenu(hmenu, MF_STRING, 6, NULL);
+    ok(ret, "AppendMenu failed\n");
+    ret = AppendMenu(hmenu, MF_STRING, 7, "\0");
+    ok(ret, "AppendMenu failed\n");
+    ret = AppendMenu(hmenu, MF_SEPARATOR, 8, "separator");
+    ok(ret, "AppendMenu failed\n");
+
+    count = GetMenuItemCount(hmenu);
+    ok(count == sizeof(menu_data)/sizeof(menu_data[0]),
+       "expected %u menu items, got %u\n",
+       (UINT)sizeof(menu_data)/sizeof(menu_data[0]), count);
+
+    for (i = 0; i < count; i++)
+    {
+        char buf[20];
+        MENUITEMINFO mii;
+
+        memset(&mii, 0, sizeof(mii));
+        mii.cbSize = sizeof(mii);
+        mii.dwTypeData = buf;
+        mii.cch = sizeof(buf);
+        mii.fMask  = MIIM_FTYPE | MIIM_STATE | MIIM_ID | MIIM_STRING;
+        ret = GetMenuItemInfo(hmenu, i, TRUE, &mii);
+        ok(ret, "GetMenuItemInfo(%u) failed\n", i);
+#if 0
+        trace("item #%u: fType %04x, fState %04x, wID %u, dwTypeData %s\n",
+               i, mii.fType, mii.fState, mii.wID, (LPCSTR)mii.dwTypeData);
+#endif
+        ok(mii.fType == menu_data[i].type,
+           "%u: expected fType %04x, got %04x\n", i, menu_data[i].type, mii.fType);
+        ok(mii.fState == menu_data[i].state,
+           "%u: expected fState %04x, got %04x\n", i, menu_data[i].state, mii.fState);
+        ok(mii.wID == menu_data[i].id,
+           "%u: expected wID %04x, got %04x\n", i, menu_data[i].id, mii.wID);
+        ok(mii.cch == strlen(menu_data[i].str),
+           "%u: expected cch %u, got %u\n", i, (UINT)strlen(menu_data[i].str), mii.cch);
+        ok(!strcmp((LPCSTR)mii.dwTypeData, menu_data[i].str),
+           "%u: expected dwTypeData %s, got %s\n", i, menu_data[i].str, (LPCSTR)mii.dwTypeData);
+    }
+
+    DestroyMenu(hmenu);
+}
+
 START_TEST(menu)
 {
     pSetMenuInfo =
@@ -2007,4 +2088,5 @@ START_TEST(menu)
     test_menu_flags();
     test_menu_hilitemenuitem();
     test_CheckMenuRadioItem();
+    test_menu_resource_layout();
 }




More information about the wine-cvs mailing list