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 <bungleh...@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 <bungleh...@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



Reply via email to