Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/comctl32/tests/listview.c | 122 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+)
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 0e12362b69..4e2efe422b 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -193,6 +193,12 @@ static const struct message empty_seq[] = {
{ 0 }
};
+static const struct message parent_focus_change_ownerdata_seq[] = {
+ { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id, 0, 0, LVN_GETDISPINFOA },
+ { 0 }
+};
+
static const struct message forward_erasebkgnd_parent_seq[] = {
{ WM_ERASEBKGND, sent },
{ 0 }
@@ -5996,6 +6002,7 @@ static void test_oneclickactivate(void)
static void test_callback_mask(void)
{
+ LVITEMA item;
DWORD mask;
HWND hwnd;
BOOL ret;
@@ -6012,6 +6019,121 @@ static void test_callback_mask(void)
ok(mask == ~0u, "got 0x%08x\n", mask);
DestroyWindow(hwnd);
+
+ /* LVS_OWNERDATA, mask LVIS_FOCUSED */
+ hwnd = create_listview_control(LVS_REPORT | LVS_OWNERDATA);
+
+ mask = SendMessageA(hwnd, LVM_GETCALLBACKMASK, 0, 0);
+ ok(mask == 0, "Unexpected callback mask %#x.\n", mask);
+
+ ret = SendMessageA(hwnd, LVM_SETCALLBACKMASK, LVIS_FOCUSED, 0);
+ ok(ret, "Failed to set callback mask, %d\n", ret);
+
+ mask = SendMessageA(hwnd, LVM_GETCALLBACKMASK, 0, 0);
+ ok(mask == LVIS_FOCUSED, "Unexpected callback mask %#x.\n", mask);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+ ok(ret == -1, "Unexpected selection mark, %d\n", ret);
+
+ item.stateMask = LVIS_FOCUSED;
+ item.state = LVIS_FOCUSED;
+ ret = SendMessageA(hwnd, LVM_SETITEMSTATE, 0, (LPARAM)&item);
+ ok(ret, "Failed to set item state.\n");
+
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+todo_wine
+ ok(ret == 0, "Unexpected focused item, ret %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+todo_wine
+ ok(ret == 0, "Unexpected selection mark, %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 0, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ ok(ret == -1, "Unexpected focused item, ret %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+ ok(ret == -1, "Unexpected selection mark, %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ ok(ret == -1, "Unexpected focused item, ret %d\n", ret);
+
+ ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent seq, owner data/focus 1", FALSE);
+
+ /* LVS_OWNDERDATA, empty mask */
+ ret = SendMessageA(hwnd, LVM_SETCALLBACKMASK, 0, 0);
+ ok(ret, "Failed to set callback mask, %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+ ok(ret == -1, "Unexpected selection mark, %d\n", ret);
+
+ item.stateMask = LVIS_FOCUSED;
+ item.state = LVIS_FOCUSED;
+ ret = SendMessageA(hwnd, LVM_SETITEMSTATE, 0, (LPARAM)&item);
+ ok(ret, "Failed to set item state.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+ ok(ret == 0, "Unexpected selection mark, %d\n", ret);
+
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ ok(ret == 0, "Unexpected focused item, ret %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 0, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ ok(ret == -1, "Unexpected focused item, ret %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_GETSELECTIONMARK, 0, 0);
+todo_wine
+ ok(ret == -1, "Unexpected selection mark, %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+todo_wine
+ ok(ret == -1, "Unexpected focused item, ret %d\n", ret);
+
+ ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent seq, owner data/focus 2", TRUE);
+
+ /* 2 items, focus on index 0, reduce to 1 item. */
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 2, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_SETITEMSTATE, 0, (LPARAM)&item);
+ ok(ret, "Failed to set item state.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ ok(ret == 0, "Unexpected focused item, ret %d\n", ret);
+
+ ret = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0);
+ ok(ret, "Failed to set item count.\n");
+
+ ret = SendMessageA(hwnd, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ ok(ret == 0, "Unexpected focused item, ret %d\n", ret);
+
+ ok_sequence(sequences, PARENT_SEQ_INDEX, parent_focus_change_ownerdata_seq,
+ "parent seq, owner data/focus 3", TRUE);
+
+ DestroyWindow(hwnd);
}
START_TEST(listview)
--
2.15.0