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