]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/controls/treectrltest.cpp
fixes potential crash under gatekeeper
[wxWidgets.git] / tests / controls / treectrltest.cpp
index 3c5d2c6a5210b7e67c0673550034347d485104cb..218a9b7942134aafe680495d4cab7475c59d3627 100644 (file)
@@ -5,6 +5,7 @@
 // Created:     2008-11-26
 // RCS-ID:      $Id$
 // Copyright:   (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
+//              (c) 2010 Steven Lamerton
 ///////////////////////////////////////////////////////////////////////////////
 
 // ----------------------------------------------------------------------------
@@ -13,6 +14,8 @@
 
 #include "testprec.h"
 
+#if wxUSE_TREECTRL
+
 #ifdef __BORLANDC__
     #pragma hdrstop
 #endif
     #include "wx/app.h"
 #endif // WX_PRECOMP
 
+#include "wx/artprov.h"
+#include "wx/imaglist.h"
 #include "wx/treectrl.h"
+#include "wx/uiaction.h"
+#include "testableframe.h"
 
 // ----------------------------------------------------------------------------
 // test class
@@ -37,6 +44,25 @@ public:
 
 private:
     CPPUNIT_TEST_SUITE( TreeCtrlTestCase );
+        WXUISIM_TEST( ItemClick );
+        CPPUNIT_TEST( DeleteItem );
+        WXUISIM_TEST( LabelEdit );
+        WXUISIM_TEST( KeyDown );
+#ifndef __WXGTK__
+        WXUISIM_TEST( CollapseExpandEvents );
+        WXUISIM_TEST( SelectionChange );
+#endif // !__WXGTK__
+        WXUISIM_TEST( Menu );
+        CPPUNIT_TEST( ItemData );
+        CPPUNIT_TEST( Iteration );
+        CPPUNIT_TEST( Parent );
+        CPPUNIT_TEST( CollapseExpand );
+        CPPUNIT_TEST( AssignImageList );
+        CPPUNIT_TEST( Focus );
+        CPPUNIT_TEST( Bold );
+        CPPUNIT_TEST( Visible );
+        CPPUNIT_TEST( Sort );
+        WXUISIM_TEST( KeyNavigation );
         CPPUNIT_TEST( HasChildren );
         CPPUNIT_TEST( SelectItemSingle );
         CPPUNIT_TEST( PseudoTest_MultiSelect );
@@ -45,6 +71,25 @@ private:
         CPPUNIT_TEST( HasChildren );
     CPPUNIT_TEST_SUITE_END();
 
+    void ItemClick();
+    void DeleteItem();
+    void LabelEdit();
+    void KeyDown();
+#ifndef __WXGTK__
+    void CollapseExpandEvents();
+    void SelectionChange();
+#endif // !__WXGTK__
+    void Menu();
+    void ItemData();
+    void Iteration();
+    void Parent();
+    void CollapseExpand();
+    void AssignImageList();
+    void Focus();
+    void Bold();
+    void Visible();
+    void Sort();
+    void KeyNavigation();
     void HasChildren();
     void SelectItemSingle();
     void SelectItemMulti();
@@ -69,7 +114,7 @@ private:
 // register in the unnamed registry so that these tests are run by default
 CPPUNIT_TEST_SUITE_REGISTRATION( TreeCtrlTestCase );
 
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TreeCtrlTestCase, "TreeCtrlTestCase" );
 
 // ----------------------------------------------------------------------------
@@ -81,7 +126,11 @@ bool TreeCtrlTestCase::ms_hiddenRoot = false;
 
 void TreeCtrlTestCase::setUp()
 {
-    m_tree = new wxTreeCtrl(wxTheApp->GetTopWindow());
+    m_tree = new wxTreeCtrl(wxTheApp->GetTopWindow(),
+                            wxID_ANY,
+                            wxDefaultPosition,
+                            wxSize(400, 200),
+                            wxTR_DEFAULT_STYLE | wxTR_EDIT_LABELS);
 
     if ( ms_multiSelect )
         m_tree->ToggleWindowStyle(wxTR_MULTIPLE);
@@ -93,6 +142,11 @@ void TreeCtrlTestCase::setUp()
     m_child1 = m_tree->AppendItem(m_root, "child1");
     m_child2 = m_tree->AppendItem(m_root, "child2");
     m_grandchild = m_tree->AppendItem(m_child1, "grandchild");
+
+    m_tree->SetSize(400, 200);
+    m_tree->ExpandAll();
+    m_tree->Refresh();
+    m_tree->Update();
 }
 
 void TreeCtrlTestCase::tearDown()
@@ -182,3 +236,366 @@ void TreeCtrlTestCase::SelectItemMulti()
     CPPUNIT_ASSERT( m_tree->IsSelected(m_child2) );
 }
 
+void TreeCtrlTestCase::ItemClick()
+{
+#if wxUSE_UIACTIONSIMULATOR
+    EventCounter activated(m_tree, wxEVT_TREE_ITEM_ACTIVATED);
+    EventCounter rclick(m_tree, wxEVT_TREE_ITEM_RIGHT_CLICK);
+
+    wxUIActionSimulator sim;
+
+    wxRect pos;
+    m_tree->GetBoundingRect(m_child1, pos, true);
+
+    // We move in slightly so we are not on the edge
+    wxPoint point = m_tree->ClientToScreen(pos.GetPosition()) + wxPoint(4, 4);
+
+    sim.MouseMove(point);
+    wxYield();
+
+    sim.MouseDblClick();
+    wxYield();
+
+    sim.MouseClick(wxMOUSE_BTN_RIGHT);
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(1, activated.GetCount());
+    CPPUNIT_ASSERT_EQUAL(1, rclick.GetCount());
+#endif // wxUSE_UIACTIONSIMULATOR
+}
+
+void TreeCtrlTestCase::DeleteItem()
+{
+    EventCounter deleteitem(m_tree, wxEVT_TREE_DELETE_ITEM);
+
+    wxTreeItemId todelete = m_tree->AppendItem(m_root, "deleteme");
+    m_tree->Delete(todelete);
+    // We do not test DeleteAllItems() as under some versions of Windows events
+    // are not generated.
+
+    CPPUNIT_ASSERT_EQUAL(1, deleteitem.GetCount());
+}
+
+#if wxUSE_UIACTIONSIMULATOR
+
+void TreeCtrlTestCase::LabelEdit()
+{
+    EventCounter beginedit(m_tree, wxEVT_TREE_BEGIN_LABEL_EDIT);
+    EventCounter endedit(m_tree, wxEVT_TREE_END_LABEL_EDIT);
+
+    wxUIActionSimulator sim;
+
+    m_tree->SetFocusedItem(m_tree->GetRootItem());
+    m_tree->EditLabel(m_tree->GetRootItem());
+
+    sim.Text("newroottext");
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(1, beginedit.GetCount());
+
+    sim.Char(WXK_RETURN);
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(1, endedit.GetCount());
+}
+
+void TreeCtrlTestCase::KeyDown()
+{
+    EventCounter keydown(m_tree, wxEVT_TREE_KEY_DOWN);
+
+    wxUIActionSimulator sim;
+
+    m_tree->SetFocus();
+    sim.Text("aAbB");
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(6, keydown.GetCount());
+}
+
+#if !defined(__WXGTK__)
+
+void TreeCtrlTestCase::CollapseExpandEvents()
+{
+    m_tree->CollapseAll();
+
+    EventCounter collapsed(m_tree, wxEVT_TREE_ITEM_COLLAPSED);
+    EventCounter collapsing(m_tree, wxEVT_TREE_ITEM_COLLAPSING);
+    EventCounter expanded(m_tree, wxEVT_TREE_ITEM_EXPANDED);
+    EventCounter expanding(m_tree, wxEVT_TREE_ITEM_EXPANDING);
+
+    wxUIActionSimulator sim;
+
+    wxRect pos;
+    m_tree->GetBoundingRect(m_root, pos, true);
+
+    // We move in slightly so we are not on the edge
+    wxPoint point = m_tree->ClientToScreen(pos.GetPosition()) + wxPoint(4, 4);
+
+    sim.MouseMove(point);
+    wxYield();
+
+    sim.MouseDblClick();
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(1, expanding.GetCount());
+    CPPUNIT_ASSERT_EQUAL(1, expanded.GetCount());
+
+    sim.MouseDblClick();
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(1, collapsing.GetCount());
+    CPPUNIT_ASSERT_EQUAL(1, collapsed.GetCount());
+}
+
+void TreeCtrlTestCase::SelectionChange()
+{
+    m_tree->ExpandAll();
+    m_tree->UnselectAll();
+
+    EventCounter changed(m_tree, wxEVT_TREE_SEL_CHANGED);
+    EventCounter changing(m_tree, wxEVT_TREE_SEL_CHANGING);
+
+    wxUIActionSimulator sim;
+
+    wxRect poschild1, poschild2;
+    m_tree->GetBoundingRect(m_child1, poschild1, true);
+    m_tree->GetBoundingRect(m_child1, poschild2, true);
+
+    // We move in slightly so we are not on the edge
+    wxPoint point1 = m_tree->ClientToScreen(poschild1.GetPosition()) + wxPoint(4, 4);
+    wxPoint point2 = m_tree->ClientToScreen(poschild2.GetPosition()) + wxPoint(4, 4);
+
+    sim.MouseMove(point1);
+    wxYield();
+
+    sim.MouseClick();
+    wxYield();
+
+    sim.MouseMove(point2);
+    wxYield();
+
+    sim.MouseClick();
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(2, changed.GetCount());
+    CPPUNIT_ASSERT_EQUAL(2, changing.GetCount());
+}
+
+#endif // !__WXGTK__
+
+void TreeCtrlTestCase::Menu()
+{
+    EventCounter menu(m_tree, wxEVT_TREE_ITEM_MENU);
+    wxUIActionSimulator sim;
+
+    wxRect pos;
+    m_tree->GetBoundingRect(m_child1, pos, true);
+
+    // We move in slightly so we are not on the edge
+    wxPoint point = m_tree->ClientToScreen(pos.GetPosition()) + wxPoint(4, 4);
+
+    sim.MouseMove(point);
+    wxYield();
+
+    sim.MouseClick(wxMOUSE_BTN_RIGHT);
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(1, menu.GetCount());
+}
+
+#endif // wxUSE_UIACTIONSIMULATOR
+
+void TreeCtrlTestCase::ItemData()
+{
+    wxTreeItemData* child1data = new wxTreeItemData();
+    wxTreeItemData* appenddata = new wxTreeItemData();
+    wxTreeItemData* insertdata = new wxTreeItemData();
+
+    m_tree->SetItemData(m_child1, child1data);
+
+    CPPUNIT_ASSERT_EQUAL(child1data, m_tree->GetItemData(m_child1));
+    CPPUNIT_ASSERT_EQUAL(m_child1, child1data->GetId());
+
+    wxTreeItemId append = m_tree->AppendItem(m_root, "new", -1, -1, appenddata);
+
+    CPPUNIT_ASSERT_EQUAL(appenddata, m_tree->GetItemData(append));
+    CPPUNIT_ASSERT_EQUAL(append, appenddata->GetId());
+
+    wxTreeItemId insert = m_tree->InsertItem(m_root, m_child1, "new", -1, -1,
+                                             insertdata);
+
+    CPPUNIT_ASSERT_EQUAL(insertdata, m_tree->GetItemData(insert));
+    CPPUNIT_ASSERT_EQUAL(insert, insertdata->GetId());
+}
+
+void TreeCtrlTestCase::Iteration()
+{
+    // Get first / next / last child
+    wxTreeItemIdValue cookie;
+    CPPUNIT_ASSERT_EQUAL(m_tree->GetFirstChild(m_root, cookie), m_child1);
+    CPPUNIT_ASSERT_EQUAL(m_tree->GetNextChild(m_root, cookie),
+                         m_tree->GetLastChild(m_root));
+    CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetLastChild(m_root));
+
+    // Get next / previous sibling
+    CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetNextSibling(m_child1));
+    CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetPrevSibling(m_child2));
+}
+
+void TreeCtrlTestCase::Parent()
+{
+    CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetRootItem());
+    CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetItemParent(m_child1));
+    CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetItemParent(m_child2));
+    CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetItemParent(m_grandchild));
+}
+
+void TreeCtrlTestCase::CollapseExpand()
+{
+    m_tree->ExpandAll();
+
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_root));
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
+
+    m_tree->CollapseAll();
+
+    CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
+    CPPUNIT_ASSERT(!m_tree->IsExpanded(m_child1));
+
+    m_tree->ExpandAllChildren(m_root);
+
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_root));
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
+
+    m_tree->CollapseAllChildren(m_child1);
+
+    CPPUNIT_ASSERT(!m_tree->IsExpanded(m_child1));
+
+    m_tree->Expand(m_child1);
+
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
+
+    m_tree->Collapse(m_root);
+
+    CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
+
+    m_tree->CollapseAndReset(m_root);
+
+    CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
+}
+
+void TreeCtrlTestCase::AssignImageList()
+{
+    wxSize size(16, 16);
+
+    wxImageList *imagelist = new wxImageList(size.x, size.y);
+    imagelist->Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, size));
+
+    wxImageList *statelist = new wxImageList(size.x, size.y);
+    statelist->Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, size));
+
+    m_tree->AssignImageList(imagelist);
+    m_tree->AssignStateImageList(statelist);
+
+    CPPUNIT_ASSERT_EQUAL(imagelist, m_tree->GetImageList());
+    CPPUNIT_ASSERT_EQUAL(statelist, m_tree->GetStateImageList());
+}
+
+void TreeCtrlTestCase::Focus()
+{
+#if !defined(__WXGTK__) && !defined(__WXOSX__)
+    m_tree->SetFocusedItem(m_child1);
+
+    CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetFocusedItem());
+
+    m_tree->ClearFocusedItem();
+
+    CPPUNIT_ASSERT(!m_tree->GetFocusedItem());
+#endif
+}
+
+void TreeCtrlTestCase::Bold()
+{
+    CPPUNIT_ASSERT(!m_tree->IsBold(m_child1));
+
+    m_tree->SetItemBold(m_child1);
+
+    CPPUNIT_ASSERT(m_tree->IsBold(m_child1));
+
+    m_tree->SetItemBold(m_child1, false);
+
+    CPPUNIT_ASSERT(!m_tree->IsBold(m_child1));
+}
+
+void TreeCtrlTestCase::Visible()
+{
+    m_tree->CollapseAll();
+
+    CPPUNIT_ASSERT(m_tree->IsVisible(m_root));
+    CPPUNIT_ASSERT(!m_tree->IsVisible(m_child1));
+
+    m_tree->EnsureVisible(m_grandchild);
+
+    CPPUNIT_ASSERT(m_tree->IsVisible(m_grandchild));
+
+    m_tree->ExpandAll();
+
+    CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetFirstVisibleItem());
+    CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetNextVisible(m_root));
+    CPPUNIT_ASSERT_EQUAL(m_grandchild, m_tree->GetNextVisible(m_child1));
+    CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetNextVisible(m_grandchild));
+
+    CPPUNIT_ASSERT(!m_tree->GetNextVisible(m_child2));
+    CPPUNIT_ASSERT(!m_tree->GetPrevVisible(m_root));
+}
+
+void TreeCtrlTestCase::Sort()
+{
+    wxTreeItemId zitem = m_tree->AppendItem(m_root, "zzzz");
+    wxTreeItemId aitem = m_tree->AppendItem(m_root, "aaaa");
+
+    m_tree->SortChildren(m_root);
+
+    wxTreeItemIdValue cookie;
+
+    CPPUNIT_ASSERT_EQUAL(aitem, m_tree->GetFirstChild(m_root, cookie));
+    CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetNextChild(m_root, cookie));
+    CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetNextChild(m_root, cookie));
+    CPPUNIT_ASSERT_EQUAL(zitem, m_tree->GetNextChild(m_root, cookie));
+}
+
+void TreeCtrlTestCase::KeyNavigation()
+{
+#if wxUSE_UIACTIONSIMULATOR && !defined(__WXGTK__)
+    wxUIActionSimulator sim;
+
+    m_tree->CollapseAll();
+
+    m_tree->SelectItem(m_root);
+
+    m_tree->SetFocus();
+    sim.Char(WXK_RIGHT);
+    wxYield();
+
+    CPPUNIT_ASSERT(m_tree->IsExpanded(m_root));
+
+    sim.Char(WXK_LEFT);
+    wxYield();
+
+    CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
+
+    sim.Char(WXK_RIGHT);
+    sim.Char(WXK_DOWN);
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetSelection());
+
+    sim.Char(WXK_DOWN);
+    wxYield();
+
+    CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetSelection());
+#endif
+}
+
+#endif //wxUSE_TREECTRL