Alex Henrie : comctl32/tests: Extend TVS_SINGLEEXPAND tests.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 18 07:57:34 CDT 2015


Module: wine
Branch: master
Commit: 9f93080754feae79a292508f48f96a17cfdf80cf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9f93080754feae79a292508f48f96a17cfdf80cf

Author: Alex Henrie <alexhenrie24 at gmail.com>
Date:   Sun May 17 23:36:24 2015 -0600

comctl32/tests: Extend TVS_SINGLEEXPAND tests.

---

 dlls/comctl32/tests/treeview.c | 173 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 166 insertions(+), 7 deletions(-)

diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c
index eb7d7e5..72d4c2a 100644
--- a/dlls/comctl32/tests/treeview.c
+++ b/dlls/comctl32/tests/treeview.c
@@ -19,6 +19,7 @@
  */
 
 #include <stdarg.h>
+#include <stdio.h>
 
 #include "windef.h"
 #include "winbase.h"
@@ -226,7 +227,8 @@ static const struct message parent_expand_empty_kb_seq[] = {
     { 0 }
 };
 
-static const struct message parent_singleexpand_seq[] = {
+static const struct message parent_singleexpand_seq0[] = {
+    /* alpha expands */
     { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
     { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
     { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
@@ -235,6 +237,84 @@ static const struct message parent_singleexpand_seq[] = {
     { 0 }
 };
 
+static const struct message parent_singleexpand_seq1[] = {
+    /* bravo expands */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { 0 }
+};
+
+static const struct message parent_singleexpand_seq2[] = {
+    /* delta expands, bravo collapses */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { 0 }
+};
+
+static const struct message parent_singleexpand_seq3[] = {
+    /* foxtrot expands, alpha and delta collapse */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { 0 }
+};
+
+static const struct message parent_singleexpand_seq4[] = {
+    /* alpha expands, foxtrot collapses */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { 0 }
+};
+
+static const struct message parent_singleexpand_seq5[] = {
+    /* foxtrot expands while golf is selected, then golf expands and alpha collapses */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+    { 0 }
+};
+
+static const struct message parent_singleexpand_seq6[] = {
+    /* hotel does not expand and india does not collapse because they have no children */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { 0 }
+};
+
+static const struct message parent_singleexpand_seq7[] = {
+    /* india does not expand and hotel does not collapse because they have no children */
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+    { 0 }
+};
+
 static const struct message parent_get_dispinfo_seq[] = {
     { WM_NOTIFY, sent|id, 0, 0, TVN_GETDISPINFOA },
     { 0 }
@@ -1637,21 +1717,100 @@ static void test_expandedimage(void)
 static void test_TVS_SINGLEEXPAND(void)
 {
     HWND hTree;
+    HTREEITEM alpha, bravo, charlie, delta, echo, foxtrot, golf, hotel, india, juliet;
+    TVINSERTSTRUCTA ins;
+    char foo[] = "foo";
+    char context[32];
+    int i;
     BOOL ret;
 
+    /* build a fairly complex tree
+     * - TVI_ROOT
+     *   - alpha
+     *     - bravo
+     *       - charlie
+     *     - delta
+     *       - echo
+     *   - foxtrot
+     *     - golf
+     *       - hotel
+     *       - india
+     *     - juliet
+     */
+    struct
+    {
+        HTREEITEM *handle;
+        HTREEITEM *parent;
+        UINT final_state;
+    }
+    items[] =
+    {
+        { &alpha,    NULL,      TVIS_EXPANDEDONCE               },
+        { &bravo,    &alpha,    TVIS_EXPANDEDONCE               },
+        { &charlie,  &bravo,    0                               },
+        { &delta,    &alpha,    TVIS_EXPANDEDONCE               },
+        { &echo,     &delta,    0                               },
+        { &foxtrot,  NULL,      TVIS_EXPANDEDONCE|TVIS_EXPANDED },
+        { &golf,     &foxtrot,  TVIS_EXPANDEDONCE|TVIS_EXPANDED },
+        { &hotel,    &golf,     0                               },
+        { &india,    &golf,     TVIS_SELECTED                   },
+        { &juliet,   &foxtrot,  0                               }
+    };
+
+    struct
+    {
+        HTREEITEM *select;
+        const struct message *sequence;
+        BOOL todo;
+    }
+    sequence_tests[] =
+    {
+        { &alpha,    parent_singleexpand_seq0,  FALSE },
+        { &bravo,    parent_singleexpand_seq1,  FALSE },
+        { &delta,    parent_singleexpand_seq2,  TRUE },
+        { &foxtrot,  parent_singleexpand_seq3,  TRUE },
+        { &alpha,    parent_singleexpand_seq4,  TRUE },
+        { &golf,     parent_singleexpand_seq5,  TRUE },
+        { &hotel,    parent_singleexpand_seq6,  FALSE },
+        { &india,    parent_singleexpand_seq7,  FALSE },
+        { &india,    empty_seq,  TRUE }
+    };
+
     hTree = create_treeview_control(0);
     SetWindowLongA(hTree, GWL_STYLE, GetWindowLongA(hTree, GWL_STYLE) | TVS_SINGLEEXPAND);
     /* to avoid painting related notifications */
     ShowWindow(hTree, SW_HIDE);
-    fill_tree(hTree);
+    for (i = 0; i < sizeof(items)/sizeof(items[0]); i++)
+    {
+        ins.hParent = items[i].parent ? *items[i].parent : TVI_ROOT;
+        ins.hInsertAfter = TVI_FIRST;
+        U(ins).item.mask = TVIF_TEXT;
+        U(ins).item.pszText = foo;
+        *items[i].handle = TreeView_InsertItemA(hTree, &ins);
+    }
 
-    flush_sequences(sequences, NUM_MSG_SEQUENCES);
-    ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hRoot);
-    ok(ret, "got %d\n", ret);
-    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_singleexpand_seq, "singleexpand notifications", FALSE);
+    for (i = 0; i < sizeof(sequence_tests)/sizeof(sequence_tests[0]); i++)
+    {
+        flush_sequences(sequences, NUM_MSG_SEQUENCES);
+        ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)(*sequence_tests[i].select));
+        ok(ret, "got %d\n", ret);
+        sprintf(context, "singleexpand notifications %d", i);
+        ok_sequence(sequences, PARENT_SEQ_INDEX, sequence_tests[i].sequence, context, sequence_tests[i].todo);
+    }
+
+    for (i = 0; i < sizeof(items)/sizeof(items[0]); i++)
+    {
+        ret = SendMessageA(hTree, TVM_GETITEMSTATE, (WPARAM)(*items[i].handle), 0xFFFF);
+        if (i == 0)
+            todo_wine ok(ret == items[i].final_state, "singleexpand items[%d]: expected state 0x%x got 0x%x\n",
+                         i, items[i].final_state, ret);
+        else
+            ok(ret == items[i].final_state, "singleexpand items[%d]: expected state 0x%x got 0x%x\n",
+               i, items[i].final_state, ret);
+    }
 
     /* a workaround for NT4 that sends expand notifications when nothing is about to expand */
-    ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hRoot);
+    ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);
     ok(ret, "got %d\n", ret);
     fill_tree(hTree);
     ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, 0);




More information about the wine-cvs mailing list