Nikolay Sivov : comctl32/tests: Add some tests for ComboEx callback functionality.

Alexandre Julliard julliard at winehq.org
Mon Apr 12 16:11:25 CDT 2021


Module: wine
Branch: master
Commit: 0bb8ddfd413587f515cf55c9213ab5bf53aa0a25
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0bb8ddfd413587f515cf55c9213ab5bf53aa0a25

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Apr 12 12:17:05 2021 +0300

comctl32/tests: Add some tests for ComboEx callback functionality.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/tests/combo.c | 159 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 155 insertions(+), 4 deletions(-)

diff --git a/dlls/comctl32/tests/combo.c b/dlls/comctl32/tests/combo.c
index 4102191e2f6..69232a3d4bd 100644
--- a/dlls/comctl32/tests/combo.c
+++ b/dlls/comctl32/tests/combo.c
@@ -27,8 +27,12 @@
 #include "v6util.h"
 #include "msg.h"
 
-#define EDITBOX_SEQ_INDEX  0
-#define NUM_MSG_SEQUENCES  1
+enum message_seq_index
+{
+    EDITBOX_SEQ_INDEX = 0,
+    PARENT_SEQ_INDEX,
+    NUM_MSG_SEQUENCES,
+};
 
 #define EDITBOX_ID         0
 #define COMBO_ID           1995
@@ -442,10 +446,29 @@ static void test_comboex_WM_WINDOWPOSCHANGING(void)
     ok(ret, "DestroyWindow failed\n");
 }
 
-static LRESULT ComboExTestOnNotify(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+struct di_context
 {
+    unsigned int mask;
+    BOOL set_CBEIF_DI_SETITEM;
+};
+
+static struct di_context di_context;
+
+static LRESULT ComboExTestOnNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    struct message msg;
     NMHDR *hdr = (NMHDR*)lParam;
-    switch(hdr->code){
+
+    msg.message = message;
+    msg.flags = sent|wparam|lparam;
+    msg.wParam = wParam;
+    msg.lParam = lParam;
+    if (hdr) msg.id = hdr->code;
+
+    add_message(sequences, PARENT_SEQ_INDEX, &msg);
+
+    switch (hdr->code)
+    {
     case CBEN_ENDEDITA:
         {
             NMCBEENDEDITA *edit_info = (NMCBEENDEDITA*)hdr;
@@ -462,6 +485,42 @@ static LRESULT ComboExTestOnNotify(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
             }
             break;
         }
+    case CBEN_GETDISPINFOA:
+    case CBEN_GETDISPINFOW:
+        {
+            NMCOMBOBOXEXA *item = (NMCOMBOBOXEXA *)hdr;
+
+            di_context.mask = item->ceItem.mask;
+
+            if (item->ceItem.mask & CBEIF_IMAGE)
+            {
+                ok(item->ceItem.iImage == I_IMAGECALLBACK, "Unexpected iImage %d.\n", item->ceItem.iImage);
+                item->ceItem.iImage = 123;
+            }
+
+            if (item->ceItem.mask & CBEIF_TEXT)
+            {
+                ok(item->ceItem.pszText && item->ceItem.pszText != LPSTR_TEXTCALLBACKA,
+                        "Unexpected pszText %p.\n", item->ceItem.pszText);
+                ok(item->ceItem.cchTextMax == 0, "Unexpected cchTextMax %d.\n", item->ceItem.cchTextMax);
+            }
+
+            if (item->ceItem.mask & CBEIF_SELECTEDIMAGE)
+                ok(item->ceItem.iSelectedImage == I_IMAGECALLBACK, "Unexpected iSelectedImage %d.\n",
+                        item->ceItem.iSelectedImage);
+
+            if (item->ceItem.mask & CBEIF_OVERLAY)
+                ok(item->ceItem.iOverlay == I_IMAGECALLBACK, "Unexpected iOverlay %d.\n",
+                        item->ceItem.iOverlay);
+
+            if (item->ceItem.mask & CBEIF_INDENT)
+                ok(item->ceItem.iIndent == 0, "Unexpected iIndent %d.\n", item->ceItem.iIndent);
+
+            if (di_context.set_CBEIF_DI_SETITEM)
+                item->ceItem.mask |= CBEIF_DI_SETITEM;
+
+            break;
+        }
     }
     return 0;
 }
@@ -1365,6 +1424,96 @@ static void test_combo_ctlcolor(void)
     DestroyWindow(combo);
 }
 
+static const struct message getdisp_parent_seq[] =
+{
+    { WM_NOTIFY, sent|id, 0, 0, CBEN_GETDISPINFOA },
+    { 0 }
+};
+
+static const struct message empty_seq[] =
+{
+    { 0 }
+};
+
+static void test_comboex_CBEN_GETDISPINFO(void)
+{
+    static const unsigned int test_masks[] =
+    {
+        CBEIF_TEXT,
+        CBEIF_IMAGE,
+        CBEIF_INDENT,
+        CBEIF_OVERLAY,
+        CBEIF_SELECTEDIMAGE,
+        CBEIF_IMAGE | CBEIF_INDENT,
+    };
+    COMBOBOXEXITEMA item;
+    unsigned int i;
+    HWND combo;
+    DWORD res;
+
+    combo = createComboEx(WS_BORDER | WS_VISIBLE | WS_CHILD | CBS_DROPDOWN);
+    ok(!!combo, "Failed to create control window.\n");
+
+    /* All possible callback fields. */
+    memset(&item, 0, sizeof(item));
+    item.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_INDENT | CBEIF_OVERLAY | CBEIF_SELECTEDIMAGE;
+    item.pszText = LPSTR_TEXTCALLBACKA;
+    item.iImage = I_IMAGECALLBACK;
+    item.iSelectedImage = I_IMAGECALLBACK;
+    item.iOverlay = I_IMAGECALLBACK;
+    item.iIndent = I_INDENTCALLBACK;
+
+    res = SendMessageA(combo, CBEM_INSERTITEMA, 0, (LPARAM)&item);
+    ok(!res, "Unexpected return value %u.\n", res);
+
+    for (i = 0; i < ARRAY_SIZE(test_masks); ++i)
+    {
+        flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+        memset(&item, 0, sizeof(item));
+        item.mask = test_masks[i];
+        res = SendMessageA(combo, CBEM_GETITEMA, 0, (LPARAM)&item);
+        ok(res == 1, "Unexpected return value %u.\n", res);
+
+        ok_sequence(sequences, PARENT_SEQ_INDEX, getdisp_parent_seq, "Get disp mask seq", TRUE);
+    }
+
+    di_context.set_CBEIF_DI_SETITEM = TRUE;
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+    memset(&item, 0, sizeof(item));
+    item.mask = CBEIF_IMAGE;
+    di_context.mask = 0;
+    res = SendMessageA(combo, CBEM_GETITEMA, 0, (LPARAM)&item);
+    ok(res == 1, "Unexpected return value %u.\n", res);
+todo_wine
+    ok(di_context.mask == CBEIF_IMAGE, "Unexpected mask %#x.\n", di_context.mask);
+
+    ok_sequence(sequences, PARENT_SEQ_INDEX, getdisp_parent_seq, "Get disp DI_SETITEM seq", TRUE);
+
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+    memset(&item, 0, sizeof(item));
+    item.mask = CBEIF_IMAGE;
+    res = SendMessageA(combo, CBEM_GETITEMA, 0, (LPARAM)&item);
+    ok(res == 1, "Unexpected return value %u.\n", res);
+    ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "Get disp after DI_SETITEM seq", FALSE);
+
+    /* Request two fields, one was set. */
+    memset(&item, 0, sizeof(item));
+    item.mask = CBEIF_IMAGE | CBEIF_INDENT;
+    di_context.mask = 0;
+    res = SendMessageA(combo, CBEM_GETITEMA, 0, (LPARAM)&item);
+    ok(res == 1, "Unexpected return value %u.\n", res);
+todo_wine
+    ok(di_context.mask == CBEIF_INDENT, "Unexpected mask %#x.\n", di_context.mask);
+
+    di_context.set_CBEIF_DI_SETITEM = FALSE;
+
+    DestroyWindow(combo);
+}
+
 START_TEST(combo)
 {
     ULONG_PTR ctx_cookie;
@@ -1384,6 +1533,7 @@ START_TEST(combo)
     test_comboex_WM_WINDOWPOSCHANGING();
     test_comboex_subclass();
     test_comboex_get_set_item();
+    test_comboex_CBEN_GETDISPINFO();
 
     if (!load_v6_module(&ctx_cookie, &hCtx))
     {
@@ -1395,6 +1545,7 @@ START_TEST(combo)
     test_comboex_CB_GETLBTEXT();
     test_comboex_WM_WINDOWPOSCHANGING();
     test_comboex_get_set_item();
+    test_comboex_CBEN_GETDISPINFO();
 
     /* ComboBox control tests. */
     test_combo_WS_VSCROLL();




More information about the wine-cvs mailing list