Angelo Haller : comctl32/tests: Add more ownerdata listview tests.
Alexandre Julliard
julliard at winehq.org
Mon Aug 8 15:19:03 CDT 2022
Module: wine
Branch: master
Commit: ef79843c94e8735a1899cfb7064ce8ed6b343e19
URL: https://gitlab.winehq.org/wine/wine/-/commit/ef79843c94e8735a1899cfb7064ce8ed6b343e19
Author: Angelo Haller <angelo at szanni.org>
Date: Tue Jun 28 16:16:06 2022 -0500
comctl32/tests: Add more ownerdata listview tests.
Signed-off-by: Angelo Haller <angelo at szanni.org>
---
dlls/comctl32/tests/listview.c | 182 ++++++++++++++++++++++++++++++++---------
1 file changed, 142 insertions(+), 40 deletions(-)
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index fec1a83de4d..b1cb0ef16c2 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -256,11 +256,77 @@ static const struct message ownerdata_deselect_all_parent_seq[] = {
{ 0 }
};
-static const struct message ownerdata_multiselect_odstatechanged_seq[] = {
- { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGED },
+static const struct message ownerdata_multiselect_select_0_to_1_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
{ WM_NOTIFY, sent|id, 0, 0, LVN_ODSTATECHANGED },
- { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGED },
- { WM_NOTIFY, sent|id, 0, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 0, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 1, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_0_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 0, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_0_modkey_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 0, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 0, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_move_0_to_1_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, 0, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 1, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_0_to_2_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id, 0, 0, LVN_ODSTATECHANGED },
+ { WM_NOTIFY, sent|id|wparam, 1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 2, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_3_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 2, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 3, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_3_modkey_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 3, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 2, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 3, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_3_to_2_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id, 0, 0, LVN_ODSTATECHANGED },
+ { WM_NOTIFY, sent|id|wparam, 3, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 2, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_move_3_to_2_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, 3, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 2, 0, LVN_ITEMCHANGED },
+ { 0 }
+};
+
+static const struct message ownerdata_multiselect_select_3_to_1_odstatechanged_seq[] = {
+ { WM_NOTIFY, sent|id|wparam, -1, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id, 0, 0, LVN_ODSTATECHANGED },
+ { WM_NOTIFY, sent|id|wparam, 2, 0, LVN_ITEMCHANGED },
+ { WM_NOTIFY, sent|id|wparam, 1, 0, LVN_ITEMCHANGED },
{ 0 }
};
@@ -3549,6 +3615,52 @@ static void test_ownerdata_multiselect(void)
HWND hwnd;
DWORD res;
LVITEMA item;
+ unsigned int i;
+ char buf[256];
+
+ static const struct
+ {
+ BOOL hold_shift;
+ BOOL hold_control;
+ UINT press_key;
+ UINT selected_count;
+ const char *context;
+ const struct message *expected;
+ BOOL todo;
+ }
+ key_tests[] =
+ {
+ /* First down then up */
+ { TRUE, FALSE, VK_DOWN, 2, "select multiple via SHIFT+DOWN",
+ ownerdata_multiselect_select_0_to_1_odstatechanged_seq, FALSE },
+ { TRUE, FALSE, VK_UP, 1, "select one item via SHIFT+UP",
+ ownerdata_multiselect_select_0_modkey_odstatechanged_seq, TRUE },
+ { TRUE, TRUE, VK_DOWN, 2, "select multiple via SHIFT+CONTROL+DOWN",
+ ownerdata_multiselect_select_0_to_1_odstatechanged_seq, FALSE },
+ { TRUE, TRUE, VK_UP, 1, "select one item via SHIFT+CONTROL+UP",
+ ownerdata_multiselect_select_0_modkey_odstatechanged_seq, TRUE },
+ { FALSE, TRUE, VK_DOWN, 1, "keep selection but move cursor via CONTROL+DOWN",
+ ownerdata_multiselect_move_0_to_1_odstatechanged_seq, FALSE },
+ { TRUE, TRUE, VK_DOWN, 3, "select multiple after skip via SHIFT+CONTROL+DOWN",
+ ownerdata_multiselect_select_0_to_2_odstatechanged_seq, FALSE },
+ { FALSE, FALSE, VK_DOWN, 1, "deselect all, select item 3 via DOWN",
+ ownerdata_multiselect_select_3_odstatechanged_seq, FALSE },
+ /* First up then down */
+ { TRUE, FALSE, VK_UP, 2, "select multiple via SHIFT+UP",
+ ownerdata_multiselect_select_3_to_2_odstatechanged_seq, FALSE },
+ { TRUE, FALSE, VK_DOWN, 1, "select one item via SHIFT+DOWN",
+ ownerdata_multiselect_select_3_modkey_odstatechanged_seq, TRUE },
+ { TRUE, TRUE, VK_UP, 2, "select multiple via SHIFT+CONTROL+UP",
+ ownerdata_multiselect_select_3_to_2_odstatechanged_seq, FALSE },
+ { TRUE, TRUE, VK_DOWN, 1, "select one item via SHIFT+CONTROL+DOWN",
+ ownerdata_multiselect_select_3_modkey_odstatechanged_seq, TRUE },
+ { FALSE, TRUE, VK_UP, 1, "keep selection but move cursor via CONTROL+UP",
+ ownerdata_multiselect_move_3_to_2_odstatechanged_seq, FALSE },
+ { TRUE, TRUE, VK_UP, 3, "select multiple after skip via SHIFT+CONTROL+UP",
+ ownerdata_multiselect_select_3_to_1_odstatechanged_seq, FALSE },
+ { FALSE, FALSE, VK_UP, 1, "deselect all, select item 0 via UP",
+ ownerdata_multiselect_select_0_odstatechanged_seq, FALSE },
+ };
hwnd = create_listview_control(LVS_OWNERDATA | LVS_REPORT);
ok(hwnd != NULL, "failed to create a listview window\n");
@@ -3557,6 +3669,7 @@ static void test_ownerdata_multiselect(void)
res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
expect(0, res);
+ /* Select and focus the first row */
memset(&item, 0, sizeof(item));
item.state = LVIS_SELECTED | LVIS_FOCUSED;
item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
@@ -3564,46 +3677,35 @@ static void test_ownerdata_multiselect(void)
expect(TRUE, res);
res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
expect(1, res);
-
res = SendMessageA(hwnd, LVM_SETSELECTIONMARK, 0, 0);
expect(0, res);
- hold_key(VK_SHIFT);
-
- flush_sequences(sequences, NUM_MSG_SEQUENCES);
-
- res = SendMessageA(hwnd, WM_KEYDOWN, VK_DOWN, 0);
- expect(0, res);
-
- ok_sequence(sequences, PARENT_ODSTATECHANGED_SEQ_INDEX,
- ownerdata_multiselect_odstatechanged_seq,
- "ownerdata select multiple notification", FALSE);
-
- res = SendMessageA(hwnd, WM_KEYUP, VK_DOWN, 0);
- expect(0, res);
-
- res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
- expect(2, res);
-
- hold_key(VK_CONTROL);
-
- flush_sequences(sequences, NUM_MSG_SEQUENCES);
-
- res = SendMessageA(hwnd, WM_KEYDOWN, VK_DOWN, 0);
- expect(0, res);
-
- ok_sequence(sequences, PARENT_ODSTATECHANGED_SEQ_INDEX,
- ownerdata_multiselect_odstatechanged_seq,
- "ownerdata select multiple notification", FALSE);
-
- res = SendMessageA(hwnd, WM_KEYUP, VK_DOWN, 0);
- expect(0, res);
-
- release_key(VK_CONTROL);
- release_key(VK_SHIFT);
+ /* Select/deselect rows using UP/DOWN and SHIFT/CONTROL keys */
+ for (i = 0; i < ARRAY_SIZE(key_tests); i++)
+ {
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
- res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
- expect(3, res);
+ if (key_tests[i].hold_shift)
+ hold_key(VK_SHIFT);
+ if (key_tests[i].hold_control)
+ hold_key(VK_CONTROL);
+
+ res = SendMessageA(hwnd, WM_KEYDOWN, key_tests[i].press_key, 0);
+ expect(0, res);
+ sprintf(buf, "ownerdata multiselect: %s", key_tests[i].context);
+ ok_sequence(sequences, PARENT_ODSTATECHANGED_SEQ_INDEX, key_tests[i].expected,
+ buf, key_tests[i].todo);
+ res = SendMessageA(hwnd, WM_KEYUP, key_tests[i].press_key, 0);
+ expect(0, res);
+
+ res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
+ expect(key_tests[i].selected_count, res);
+
+ if (key_tests[i].hold_shift)
+ release_key(VK_SHIFT);
+ if (key_tests[i].hold_control)
+ release_key(VK_CONTROL);
+ }
DestroyWindow(hwnd);
}
More information about the wine-cvs
mailing list