From 649b47da1848e2e296a7a4199424a5a9138a555e Mon Sep 17 00:00:00 2001 From: Peter Oberndorfer Date: Thu, 22 Nov 2007 19:10:53 +0100 Subject: [PATCH] add some interactive user32 menu tests (run with WINETEST_INTERACTIVE=1) barely tested on wine --- dlls/user32/tests/menu.c | 303 +++++++++++++++++++++++++++++++++++++++++++++++ dlls/user32/tests/win.c | 52 ++++++++ 2 files changed, 355 insertions(+) diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c index cb37ac01496..afb1c208615 100644 --- a/dlls/user32/tests/menu.c +++ b/dlls/user32/tests/menu.c @@ -1830,6 +1830,303 @@ static void test_menu_input(void) { DestroyWindow(hWnd); } + +int state = 0; +static void do_system_menu_change(HWND hWnd) +{ + HMENU new, back; + BOOL ret; + state++; + if (state >=10) + state = 0; + switch (state) + { + case 0: + trace("0-------> GetSystemMenu reset\n"); + GetSystemMenu(hWnd, TRUE); + break; + case 1: + { + // fails to set the system menu + new = CreateMenu(); + trace("1-------> new CreateMenu: %p\n", new); + ret = AppendMenuA(new, MF_STRING, 0, "&Baz"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new, MF_STRING, 0, "&Boo"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back == NULL, "GetSystemMenu should return null menu not %p\n", back); + break; + } + case 2: + { + new = CreatePopupMenu(); + trace("2-------> new CreatePopupMenu: %p\n", new); + ret = AppendMenuA(new, MF_STRING, 0, "&Foo"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back == NULL, "GetSystemMenu should return null menu not %p\n", back); + break; + } + case 3: + { + static const WCHAR sysmenuW[] = {'S','Y','S','M','E','N','U',0}; + HMODULE user32 = GetModuleHandleA("user32"); + /* wine and windows save the system memu different resource name */ + new = LoadMenuW(user32, MAKEINTRESOURCEW(16)); + if(!new) + new = LoadMenuW(user32, sysmenuW); + trace("3------->LoadMenuW %p\n", new); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + break; + } + case 4: + { + HMENU new2; + new = CreatePopupMenu(); + new2 = CreatePopupMenu(); + trace("4-------> new CreatePopupMenu nested popup: %p/%p\n", new, new2); + ret = AppendMenuA(new, MF_STRING|MF_POPUP, (UINT_PTR)new2, "&Foo"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new2, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + break; + } + case 5: + { + HMENU new2; + new = CreatePopupMenu(); + new2 = CreatePopupMenu(); + trace("5-------> new CreatePopupMenu nested popup with a -: %p/%p\n", new, new2); + ret = AppendMenuA(new, MF_STRING|MF_POPUP, (UINT_PTR)new2, "-"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new2, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + break; + } + case 6: + { + HMENU new2; + new = CreatePopupMenu(); + new2 = CreatePopupMenu(); + trace("6-------> new CreatePopupMenu nested popup empty: %p/%p\n", new, new2); + ret = AppendMenuA(new, MF_STRING|MF_POPUP, (UINT_PTR)new2, ""); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new2, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + break; + } + case 7: + { + // this seems to be the right behavior on windows + // if the first menu is a popup menu it will corrupt the space below with a popup menu image + HMENU new2; + new = CreateMenu(); + new2 = CreatePopupMenu(); + trace("7-------> new CreateMenu nested popup empty: %p/%p\n", new, new2); + ret = AppendMenuA(new, MF_STRING|MF_POPUP, (UINT_PTR)new2, ""); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new2, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + break; + } + case 8: + { + // this seems to be the right behavior on windows + // if the first menu is a popup menu it will corrupt the space below with a popup menu image + HMENU new2; + new = CreateMenu(); + new2 = CreatePopupMenu(); + trace("8-------> new CreateMenu nested popup asdf text: %p/%p\n", new, new2); + ret = AppendMenuA(new, MF_STRING|MF_POPUP, (UINT_PTR)new2, "asdf"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new2, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = SetSystemMenu(hWnd, new); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p\n", new, back); + todo_wine ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + break; + } + case 9: + { + // this one prooves windows takes the first submenu and checks if it is a popup menu(MF_POPUP) + // if not it return failure + // hmm above does not seem to be true + HMENU new2; + new = CreateMenu(); + new2 = CreatePopupMenu(); + trace("9-------> new CreateMenu nested popup asdf text and leading entry: %p/%p\n", new, new2); + ret = AppendMenuA(new, MF_STRING, 0, "&another one"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new, MF_STRING|MF_POPUP, (UINT_PTR)new2, "asdf"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + ret = AppendMenuA(new2, MF_STRING, 0, "&Bar"); + ok(ret, "AppendMenuA failed GLE:%d\n", GetLastError()); + + ret = SetSystemMenu(hWnd, new); + trace("SetSystemMenu %d, %d\n", ret, GetLastError()); + ok(ret, "SetSystemMenu failed GLE:%d\n", GetLastError()); + back = GetSystemMenu(hWnd, FALSE); + trace("set menu:%p get menu:%p, GLE:%d\n", new, back, GetLastError()); +// ok(back != new, "GetSystemMenu should return a different menu than set by SetSystemMenu %p\n", back); + todo_wine ok(back == NULL, "GetSystemMenu should return null menu not %p\n", back); + break; + } + } +} + + +static LRESULT CALLBACK SystemMenuTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + switch (msg) { + case WM_RBUTTONDOWN: + trace("-----------------WM_RBUTTONDOWN pressed\n"); + do_system_menu_change(hWnd); + break; + case WM_DESTROY: + PostQuitMessage (0); + break; + default: + return( DefWindowProcA( hWnd, msg, wParam, lParam ) ); + } + return 0; +} + +static void test_system_menu(void) { + MSG msg; + WNDCLASSA wclass; + HINSTANCE hInstance = GetModuleHandleA( NULL ); + HANDLE hWnd; + HMENU hSysMenu, hSysMenu2; + MENUITEMINFOW infoW; + BOOL ret; + UINT default_item; + + wclass.lpszClassName = "SystemMenuTestClass"; + wclass.style = CS_HREDRAW | CS_VREDRAW; + wclass.lpfnWndProc = SystemMenuTestWndProc; + wclass.hInstance = hInstance; + wclass.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, (LPSTR)IDC_ARROW); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1); + wclass.lpszMenuName = 0; + wclass.cbClsExtra = 0; + wclass.cbWndExtra = 0; + assert (RegisterClassA( &wclass )); + assert (hWnd = CreateWindowA( wclass.lpszClassName, "SystemMenuTest", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, + 400, 200, NULL, NULL, hInstance, NULL) ); + + ShowWindow(hWnd, SW_SHOW); + + memset(&infoW, 0, sizeof(infoW)); + infoW.cbSize = sizeof(infoW); + infoW.fMask = MIIM_BITMAP | MIIM_CHECKMARKS | MIIM_DATA | MIIM_FTYPE | MIIM_ID | MIIM_STATE /*| MIIM_STRING*/ | MIIM_SUBMENU; + hSysMenu = GetSystemMenu(hWnd, FALSE); + hSysMenu2 = GetSystemMenu(hWnd, FALSE); + ok(hSysMenu == hSysMenu2, "GetSystemMenu should return the same menu %p/%p\n", hSysMenu, hSysMenu2); + + trace("sysmenu: %p\n", hSysMenu); + + ret = GetMenuItemInfoW(hSysMenu, SC_RESTORE, FALSE, &infoW); + trace("SC_RESTORE re:%d fType:%x, fState:%x, wID:%x hSubMenu:%p, hbmpChecked:%p, hbmpUnchecked:%p, dwItemData:%08lx, dwTypeData:%p, cch:%d, hbmpItem:%p\n", + ret, infoW.fType, infoW.fState, infoW.wID, infoW.hSubMenu, infoW.hbmpChecked, + infoW.hbmpUnchecked, infoW.dwItemData, infoW.dwTypeData, infoW.cch, infoW.hbmpItem); + todo_wine{ + ok(infoW.hbmpItem == HBMMENU_POPUP_RESTORE, "bitmap for SC_RESTORE wrong (%p)\n", infoW.hbmpItem); + } + + ret = GetMenuItemInfoW(hSysMenu, SC_MINIMIZE, FALSE, &infoW); + trace("SC_MINIMIZE re:%d fType:%x, fState:%x, wID:%x hSubMenu:%p, hbmpChecked:%p, hbmpUnchecked:%p, dwItemData:%08lx, dwTypeData:%p, cch:%d, hbmpItem:%p\n", + ret, infoW.fType, infoW.fState, infoW.wID, infoW.hSubMenu, infoW.hbmpChecked, + infoW.hbmpUnchecked, infoW.dwItemData, infoW.dwTypeData, infoW.cch, infoW.hbmpItem); + todo_wine{ + ok(infoW.hbmpItem == HBMMENU_POPUP_MINIMIZE, "bitmap for SC_MINIMIZE wrong (%p)\n", infoW.hbmpItem); + } + + ret = GetMenuItemInfoW(hSysMenu, SC_MAXIMIZE, FALSE, &infoW); + trace("SC_MAXIMIZE re:%d fType:%x, fState:%x, wID:%x hSubMenu:%p, hbmpChecked:%p, hbmpUnchecked:%p, dwItemData:%08lx, dwTypeData:%p, cch:%d, hbmpItem:%p\n", + ret, infoW.fType, infoW.fState, infoW.wID, infoW.hSubMenu, infoW.hbmpChecked, + infoW.hbmpUnchecked, infoW.dwItemData, infoW.dwTypeData, infoW.cch, infoW.hbmpItem); + todo_wine{ + ok(infoW.hbmpItem == HBMMENU_POPUP_MAXIMIZE, "bitmap for SC_MAXIMIZE wrong (%p)\n", infoW.hbmpItem); + } + +// WCHAR asdf[128]; +// infoW.dwTypeData = asdf; + ret = GetMenuItemInfoW(hSysMenu, SC_CLOSE, FALSE, &infoW); + trace("SC_CLOSE re:%d fType:%x, fState:%x, wID:%x hSubMenu:%p, hbmpChecked:%p, hbmpUnchecked:%p, dwItemData:%08lx, dwTypeData:%p, cch:%d, hbmpItem:%p\n", + ret, infoW.fType, infoW.fState, infoW.wID, infoW.hSubMenu, infoW.hbmpChecked, + infoW.hbmpUnchecked, infoW.dwItemData, infoW.dwTypeData, infoW.cch, infoW.hbmpItem); + + ok(ret, "failed to get info for SC_CLOSE GLE:%d\n", GetLastError()); + todo_wine{ + ok(infoW.hbmpItem == HBMMENU_POPUP_CLOSE, "bitmap for SC_CLOSE wrong (%p)\n", infoW.hbmpItem); + } + ok(!infoW.fType , "fType should be 0 not %x\n", infoW.fType); + todo_wine{ + ok(!infoW.fState , "fState should be 0 not %x\n", infoW.fState); + } + ok(!infoW.hSubMenu , "hSubMenu should be 0 not %p\n", infoW.hSubMenu); + ok(!infoW.hbmpChecked , "hbmpChecked should be 0 not %p\n", infoW.hbmpChecked); + ok(!infoW.hbmpUnchecked , "hbmpUnchecked should be 0 not %p\n", infoW.hbmpUnchecked); + ok(!infoW.dwItemData , "dwItemData should be 0 not %08lx\n", infoW.dwItemData); + ok(!infoW.dwTypeData , "dwTypeData should be 0 not %p\n", infoW.dwTypeData); + + + default_item = GetMenuDefaultItem(hSysMenu, FALSE, GMDI_GOINTOPOPUPS|GMDI_USEDISABLED); + todo_wine{ + ok(default_item == -1, "default menu item should be -1 not %x\n", default_item); + } +// trace("%ls\n", asdf); + + /* TODO: create a MDI window and test GetSystemMenu on the MDI child */ + /* also check the bitmaps/default entry on MDI menu */ + + while (GetMessage (&msg, 0, 0, 0)) + { + TranslateMessage (&msg); + DispatchMessage (&msg); + } + + DestroyWindow(hWnd); +} + static void test_menu_flags( void ) { HMENU hMenu, hPopupMenu; @@ -2245,6 +2542,12 @@ START_TEST(menu) register_menu_check_class(); + if(winetest_interactive) + { + test_system_menu(); + return; + } + test_menu_locked_by_window(); test_menu_ownerdraw(); test_menu_add_string(); diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 49fe7666db6..c881cbed672 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -1075,6 +1075,35 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) mdi_child = (HWND)SendMessageA(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); ok(mdi_child != 0, "MDI child creation failed\n"); ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); +{ + HMENU menu; + UINT state2; + HMENU sysMenu = GetSystemMenu(mdi_child, FALSE); + UINT state = GetMenuState(sysMenu, SC_CLOSE, MF_BYCOMMAND); + trace("mdi_child SystemMenu: %p->%x\n", sysMenu, state); + + menu = GetMenu(mdi_child); + state2 = GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND); + trace("mdi_child Menu: %p->%x\n", menu, state2); +} + + +{ + HMENU menu; + UINT state2; + HMENU sysMenu = GetSystemMenu(mdi_child, FALSE); + UINT state = GetMenuState(sysMenu, SC_NEXTWINDOW, MF_BYCOMMAND); + trace("mdi_child SC_NEXTWINDOW SystemMenu: %p->%x\n", sysMenu, state); + + menu = GetMenu(mdi_child); + state2 = GetMenuState(menu, SC_NEXTWINDOW, MF_BYCOMMAND); + trace("mdi_child SC_NEXTWINDOW Menu: %p->%x\n", menu, state2); +} + + + + + SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); @@ -1611,6 +1640,29 @@ static LRESULT WINAPI mdi_main_wnd_procA(HWND hwnd, UINT msg, WPARAM wparam, LPA (LPVOID)&client_cs); assert(mdi_client); test_MDI_create(hwnd, mdi_client, client_cs.idFirstChild); +{ + UINT state2; + HMENU menu; + HMENU sysMenu = GetSystemMenu(hwnd, FALSE); + UINT state = GetMenuState(sysMenu, SC_CLOSE, MF_BYCOMMAND); + trace("Top SystemMenu: %p->%x\n", sysMenu, state); + + menu = GetMenu(hwnd); + state2 = GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND); + trace("Top Menu: %p->%x\n", menu, state2); +} +{ + UINT state2; + HMENU menu; + HMENU sysMenu = GetSystemMenu(mdi_client, FALSE); + UINT state = GetMenuState(sysMenu, SC_CLOSE, MF_BYCOMMAND); + trace("mdi_client SystemMenu: %p->%x\n", sysMenu, state); + + menu = GetMenu(mdi_client); + state2 = GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND); + trace("mdi_client Menu: %p->%x\n", menu, state2); +} + DestroyWindow(mdi_client); /* MDIClient with MDIS_ALLCHILDSTYLES */ -- 2.11.4.GIT