Testing modal property sheets
Hi. Some time ago I tried to fix bug http://bugs.winehq.org/show_bug.cgi?id=16876 . It's about wrong return codes of PropertySheet call. The question is about a proper way of testing this. I tried to exit just after creation in PSCB_INITIALIZED handler, it looks like it shows a problem, but I'm not sure is it a correct way or not. I'd like to see some advices about that Thanks. rom 56c14340af9ac298bde22cf207fca7c8ae95957c Mon Sep 17 00:00:00 2001 From: Nikolay Sivov <bunglehead(a)gmail.com> Date: Sat, 23 May 2009 19:21:08 +0400 Subject: Some propsheet tests --- dlls/comctl32/tests/propsheet.c | 128 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 128 insertions(+), 0 deletions(-) diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c index 4164f68..37b89fd 100644 --- a/dlls/comctl32/tests/propsheet.c +++ b/dlls/comctl32/tests/propsheet.c @@ -199,9 +199,137 @@ static void test_disableowner(void) DestroyWindow(parent); } +#define PSM_PRESSBUTTON_CALLBACK(id) \ +static int CALLBACK psm_pressbutton_callback_##id (HWND hwnd, UINT msg, LPARAM lparam) \ +{\ + switch(msg)\ + {\ + case PSCB_INITIALIZED:\ + {\ + PostMessage(NULL, PSM_PRESSBUTTON, PSBTN_##id, (LPARAM)0);\ + return FALSE;\ + }\ + }\ + return FALSE;\ +} + +PSM_PRESSBUTTON_CALLBACK(OK) +PSM_PRESSBUTTON_CALLBACK(CANCEL) +PSM_PRESSBUTTON_CALLBACK(APPLYNOW) +PSM_PRESSBUTTON_CALLBACK(BACK) +PSM_PRESSBUTTON_CALLBACK(FINISH) +PSM_PRESSBUTTON_CALLBACK(HELP) +PSM_PRESSBUTTON_CALLBACK(NEXT) + +static void test_singlepressbutton(INT id, INT expected, BOOL modal, BOOL todo, int line) +{ + HPROPSHEETPAGE hpsp[1]; + PROPSHEETPAGEA psp; + PROPSHEETHEADERA psh; + HWND hdlg; + INT ret; + DWORD r; + + memset(&psp, 0, sizeof(psp)); + psp.dwSize = sizeof(psp); + psp.dwFlags = 0; + psp.hInstance = GetModuleHandleW(NULL); + U(psp).pszTemplate = "prop_page1"; + U2(psp).pszIcon = NULL; + psp.pfnDlgProc = NULL; + psp.lParam = 0; + + hpsp[0] = CreatePropertySheetPageA(&psp); + + memset(&psh, 0, sizeof(psh)); + psh.dwSize = sizeof(psh); + psh.pszCaption = "test caption"; + psh.nPages = 1; + U3(psh).phpage = hpsp; + + if (modal) + { + /* modal sheet */ + psh.dwFlags = PSH_USECALLBACK; + psh.hwndParent = NULL; + switch(id) + { + case PSBTN_BACK: + psh.pfnCallback = psm_pressbutton_callback_BACK; + break; + case PSBTN_NEXT: + psh.pfnCallback = psm_pressbutton_callback_NEXT; + break; + case PSBTN_FINISH: + psh.pfnCallback = psm_pressbutton_callback_FINISH; + break; + case PSBTN_OK: + psh.pfnCallback = psm_pressbutton_callback_OK; + break; + case PSBTN_APPLYNOW: + psh.pfnCallback = psm_pressbutton_callback_APPLYNOW; + break; + case PSBTN_CANCEL: + psh.pfnCallback = psm_pressbutton_callback_CANCEL; + break; + case PSBTN_HELP: + psh.pfnCallback = psm_pressbutton_callback_HELP; + break; + } + + ret = PropertySheetA(&psh); + if (todo) + { + todo_wine ok_(__FILE__, line)(ret == expected, "Expected %d result, got %d\n", expected, ret); + } + else + ok_(__FILE__, line)(ret == expected, "Expected %d result, got %d\n", expected, ret); + } + else + { + /* modeless sheet */ + psh.dwFlags = PSH_MODELESS; + psh.hwndParent = GetDesktopWindow(); + + hdlg = (HWND)PropertySheetA(&psh); + ok(IsWindow(hdlg), "Expected dialog handle, got %p\n", hdlg); + + SendMessage(hdlg, PSM_PRESSBUTTON, PSBTN_FINISH, 0); + ok(IsWindow(hdlg), "Expected dialog handle, got %p\n", hdlg); + r = SendMessage(hdlg, PSM_GETRESULT, 0, 0); + if (todo) + { + todo_wine ok_(__FILE__, line)(r == expected, "Expected %d result, got %d\n", expected, r); + } + else + ok_(__FILE__, line)(r == expected, "Expected %d result, got %d\n", expected, r); + + DestroyWindow(hdlg); + } +} + +static void test_psmpressbutton(void) +{ + test_singlepressbutton(PSBTN_BACK, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_BACK, IDOK, FALSE, FALSE, __LINE__); + test_singlepressbutton(PSBTN_NEXT, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_NEXT, IDOK, FALSE, FALSE, __LINE__); + test_singlepressbutton(PSBTN_FINISH, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_FINISH, IDOK, FALSE, FALSE, __LINE__); + test_singlepressbutton(PSBTN_OK, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_OK, IDOK, FALSE, FALSE, __LINE__); + test_singlepressbutton(PSBTN_CANCEL, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_CANCEL, IDOK, FALSE, FALSE, __LINE__); + test_singlepressbutton(PSBTN_APPLYNOW, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_APPLYNOW, IDOK, FALSE, FALSE, __LINE__); + test_singlepressbutton(PSBTN_HELP, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_HELP, IDOK, FALSE, FALSE, __LINE__); +} + START_TEST(propsheet) { test_title(); test_nopage(); test_disableowner(); + test_psmpressbutton(); } -- 1.5.6.5
From 370b1938ce218b8be93d463267ff23adf33097bd Mon Sep 17 00:00:00 2001 From: Nikolay Sivov <bunglehead(a)gmail.com> Date: Sat, 23 May 2009 19:34:54 +0400 Subject: Fix PropertySheet return value for modal sheets
--- dlls/comctl32/propsheet.c | 5 +---- dlls/comctl32/tests/propsheet.c | 14 +++++++------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c index 44151e4..7d337bd 100644 --- a/dlls/comctl32/propsheet.c +++ b/dlls/comctl32/propsheet.c @@ -1703,7 +1703,7 @@ static BOOL PROPSHEET_Finish(HWND hwndDlg) if (msgResult != 0) return FALSE; - if (psInfo->result == 0) + if (psInfo->result == 0 && psInfo->isModeless) psInfo->result = IDOK; if (psInfo->isModeless) psInfo->activeValid = FALSE; @@ -2742,10 +2742,7 @@ static INT do_loop(const PropSheetInfo *psInfo) } if(ret == 0) - { PostQuitMessage(msg.wParam); - ret = -1; - } if(ret != -1) ret = psInfo->result; diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c index 37b89fd..b7a97cd 100644 --- a/dlls/comctl32/tests/propsheet.c +++ b/dlls/comctl32/tests/propsheet.c @@ -310,19 +310,19 @@ static void test_singlepressbutton(INT id, INT expected, BOOL modal, BOOL todo, static void test_psmpressbutton(void) { - test_singlepressbutton(PSBTN_BACK, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_BACK, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_BACK, IDOK, FALSE, FALSE, __LINE__); - test_singlepressbutton(PSBTN_NEXT, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_NEXT, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_NEXT, IDOK, FALSE, FALSE, __LINE__); - test_singlepressbutton(PSBTN_FINISH, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_FINISH, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_FINISH, IDOK, FALSE, FALSE, __LINE__); - test_singlepressbutton(PSBTN_OK, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_OK, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_OK, IDOK, FALSE, FALSE, __LINE__); - test_singlepressbutton(PSBTN_CANCEL, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_CANCEL, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_CANCEL, IDOK, FALSE, FALSE, __LINE__); - test_singlepressbutton(PSBTN_APPLYNOW, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_APPLYNOW, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_APPLYNOW, IDOK, FALSE, FALSE, __LINE__); - test_singlepressbutton(PSBTN_HELP, 0, TRUE, TRUE, __LINE__); + test_singlepressbutton(PSBTN_HELP, 0, TRUE, FALSE, __LINE__); test_singlepressbutton(PSBTN_HELP, IDOK, FALSE, FALSE, __LINE__); } -- 1.5.6.5
participants (1)
-
Nikolay Sivov