treectrltest.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: tests/controls/treectrltest.cpp
  3. // Purpose: wxTreeCtrl unit test
  4. // Author: Vadim Zeitlin
  5. // Created: 2008-11-26
  6. // Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
  7. // (c) 2010 Steven Lamerton
  8. ///////////////////////////////////////////////////////////////////////////////
  9. // ----------------------------------------------------------------------------
  10. // headers
  11. // ----------------------------------------------------------------------------
  12. #include "testprec.h"
  13. #if wxUSE_TREECTRL
  14. #ifdef __BORLANDC__
  15. #pragma hdrstop
  16. #endif
  17. #ifndef WX_PRECOMP
  18. #include "wx/app.h"
  19. #endif // WX_PRECOMP
  20. #include "wx/artprov.h"
  21. #include "wx/imaglist.h"
  22. #include "wx/treectrl.h"
  23. #include "wx/uiaction.h"
  24. #include "testableframe.h"
  25. // ----------------------------------------------------------------------------
  26. // test class
  27. // ----------------------------------------------------------------------------
  28. class TreeCtrlTestCase : public CppUnit::TestCase
  29. {
  30. public:
  31. TreeCtrlTestCase() { }
  32. virtual void setUp();
  33. virtual void tearDown();
  34. private:
  35. CPPUNIT_TEST_SUITE( TreeCtrlTestCase );
  36. WXUISIM_TEST( ItemClick );
  37. CPPUNIT_TEST( DeleteItem );
  38. WXUISIM_TEST( LabelEdit );
  39. WXUISIM_TEST( KeyDown );
  40. #ifndef __WXGTK__
  41. WXUISIM_TEST( CollapseExpandEvents );
  42. WXUISIM_TEST( SelectionChange );
  43. #endif // !__WXGTK__
  44. WXUISIM_TEST( Menu );
  45. CPPUNIT_TEST( ItemData );
  46. CPPUNIT_TEST( Iteration );
  47. CPPUNIT_TEST( Parent );
  48. CPPUNIT_TEST( CollapseExpand );
  49. CPPUNIT_TEST( AssignImageList );
  50. CPPUNIT_TEST( Focus );
  51. CPPUNIT_TEST( Bold );
  52. CPPUNIT_TEST( Visible );
  53. CPPUNIT_TEST( Sort );
  54. WXUISIM_TEST( KeyNavigation );
  55. CPPUNIT_TEST( HasChildren );
  56. CPPUNIT_TEST( SelectItemSingle );
  57. CPPUNIT_TEST( PseudoTest_MultiSelect );
  58. CPPUNIT_TEST( SelectItemMulti );
  59. CPPUNIT_TEST( PseudoTest_SetHiddenRoot );
  60. CPPUNIT_TEST( HasChildren );
  61. CPPUNIT_TEST_SUITE_END();
  62. void ItemClick();
  63. void DeleteItem();
  64. void LabelEdit();
  65. void KeyDown();
  66. #ifndef __WXGTK__
  67. void CollapseExpandEvents();
  68. void SelectionChange();
  69. #endif // !__WXGTK__
  70. void Menu();
  71. void ItemData();
  72. void Iteration();
  73. void Parent();
  74. void CollapseExpand();
  75. void AssignImageList();
  76. void Focus();
  77. void Bold();
  78. void Visible();
  79. void Sort();
  80. void KeyNavigation();
  81. void HasChildren();
  82. void SelectItemSingle();
  83. void SelectItemMulti();
  84. void PseudoTest_MultiSelect() { ms_multiSelect = true; }
  85. void PseudoTest_SetHiddenRoot() { ms_hiddenRoot = true; }
  86. static bool ms_multiSelect;
  87. static bool ms_hiddenRoot;
  88. // the tree control itself
  89. wxTreeCtrl *m_tree;
  90. // and some of its items
  91. wxTreeItemId m_root,
  92. m_child1,
  93. m_child2,
  94. m_grandchild;
  95. DECLARE_NO_COPY_CLASS(TreeCtrlTestCase)
  96. };
  97. // register in the unnamed registry so that these tests are run by default
  98. CPPUNIT_TEST_SUITE_REGISTRATION( TreeCtrlTestCase );
  99. // also include in its own registry so that these tests can be run alone
  100. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TreeCtrlTestCase, "TreeCtrlTestCase" );
  101. // ----------------------------------------------------------------------------
  102. // test initialization
  103. // ----------------------------------------------------------------------------
  104. bool TreeCtrlTestCase::ms_multiSelect = false;
  105. bool TreeCtrlTestCase::ms_hiddenRoot = false;
  106. void TreeCtrlTestCase::setUp()
  107. {
  108. m_tree = new wxTreeCtrl(wxTheApp->GetTopWindow(),
  109. wxID_ANY,
  110. wxDefaultPosition,
  111. wxSize(400, 200),
  112. wxTR_DEFAULT_STYLE | wxTR_EDIT_LABELS);
  113. if ( ms_multiSelect )
  114. m_tree->ToggleWindowStyle(wxTR_MULTIPLE);
  115. if ( ms_hiddenRoot )
  116. m_tree->ToggleWindowStyle(wxTR_HIDE_ROOT); // actually set it
  117. m_root = m_tree->AddRoot("root");
  118. m_child1 = m_tree->AppendItem(m_root, "child1");
  119. m_child2 = m_tree->AppendItem(m_root, "child2");
  120. m_grandchild = m_tree->AppendItem(m_child1, "grandchild");
  121. m_tree->SetSize(400, 200);
  122. m_tree->ExpandAll();
  123. m_tree->Refresh();
  124. m_tree->Update();
  125. }
  126. void TreeCtrlTestCase::tearDown()
  127. {
  128. delete m_tree;
  129. m_tree = NULL;
  130. m_root =
  131. m_child1 =
  132. m_child2 =
  133. m_grandchild = wxTreeItemId();
  134. }
  135. // ----------------------------------------------------------------------------
  136. // the tests themselves
  137. // ----------------------------------------------------------------------------
  138. void TreeCtrlTestCase::HasChildren()
  139. {
  140. CPPUNIT_ASSERT( m_tree->HasChildren(m_root) );
  141. CPPUNIT_ASSERT( m_tree->HasChildren(m_child1) );
  142. CPPUNIT_ASSERT( !m_tree->HasChildren(m_child2) );
  143. CPPUNIT_ASSERT( !m_tree->HasChildren(m_grandchild) );
  144. }
  145. void TreeCtrlTestCase::SelectItemSingle()
  146. {
  147. // this test should be only ran in single-selection control
  148. CPPUNIT_ASSERT( !m_tree->HasFlag(wxTR_MULTIPLE) );
  149. // initially nothing is selected
  150. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child1) );
  151. // selecting an item should make it selected
  152. m_tree->SelectItem(m_child1);
  153. CPPUNIT_ASSERT( m_tree->IsSelected(m_child1) );
  154. // selecting it again shouldn't change anything
  155. m_tree->SelectItem(m_child1);
  156. CPPUNIT_ASSERT( m_tree->IsSelected(m_child1) );
  157. // selecting another item should switch the selection to it
  158. m_tree->SelectItem(m_child2);
  159. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child1) );
  160. CPPUNIT_ASSERT( m_tree->IsSelected(m_child2) );
  161. // selecting it again still shouldn't change anything
  162. m_tree->SelectItem(m_child2);
  163. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child1) );
  164. CPPUNIT_ASSERT( m_tree->IsSelected(m_child2) );
  165. // deselecting an item should remove the selection entirely
  166. m_tree->UnselectItem(m_child2);
  167. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child1) );
  168. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child2) );
  169. }
  170. void TreeCtrlTestCase::SelectItemMulti()
  171. {
  172. // this test should be only ran in multi-selection control
  173. CPPUNIT_ASSERT( m_tree->HasFlag(wxTR_MULTIPLE) );
  174. // initially nothing is selected
  175. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child1) );
  176. // selecting an item should make it selected
  177. m_tree->SelectItem(m_child1);
  178. CPPUNIT_ASSERT( m_tree->IsSelected(m_child1) );
  179. // selecting it again shouldn't change anything
  180. m_tree->SelectItem(m_child1);
  181. CPPUNIT_ASSERT( m_tree->IsSelected(m_child1) );
  182. // selecting another item shouldn't deselect the previously selected one
  183. m_tree->SelectItem(m_child2);
  184. CPPUNIT_ASSERT( m_tree->IsSelected(m_child1) );
  185. CPPUNIT_ASSERT( m_tree->IsSelected(m_child2) );
  186. // selecting it again still shouldn't change anything
  187. m_tree->SelectItem(m_child2);
  188. CPPUNIT_ASSERT( m_tree->IsSelected(m_child1) );
  189. CPPUNIT_ASSERT( m_tree->IsSelected(m_child2) );
  190. // deselecting one of the items should leave the others selected
  191. m_tree->UnselectItem(m_child1);
  192. CPPUNIT_ASSERT( !m_tree->IsSelected(m_child1) );
  193. CPPUNIT_ASSERT( m_tree->IsSelected(m_child2) );
  194. }
  195. void TreeCtrlTestCase::ItemClick()
  196. {
  197. #if wxUSE_UIACTIONSIMULATOR
  198. EventCounter activated(m_tree, wxEVT_TREE_ITEM_ACTIVATED);
  199. EventCounter rclick(m_tree, wxEVT_TREE_ITEM_RIGHT_CLICK);
  200. wxUIActionSimulator sim;
  201. wxRect pos;
  202. m_tree->GetBoundingRect(m_child1, pos, true);
  203. // We move in slightly so we are not on the edge
  204. wxPoint point = m_tree->ClientToScreen(pos.GetPosition()) + wxPoint(4, 4);
  205. sim.MouseMove(point);
  206. wxYield();
  207. sim.MouseDblClick();
  208. wxYield();
  209. sim.MouseClick(wxMOUSE_BTN_RIGHT);
  210. wxYield();
  211. CPPUNIT_ASSERT_EQUAL(1, activated.GetCount());
  212. CPPUNIT_ASSERT_EQUAL(1, rclick.GetCount());
  213. #endif // wxUSE_UIACTIONSIMULATOR
  214. }
  215. void TreeCtrlTestCase::DeleteItem()
  216. {
  217. EventCounter deleteitem(m_tree, wxEVT_TREE_DELETE_ITEM);
  218. wxTreeItemId todelete = m_tree->AppendItem(m_root, "deleteme");
  219. m_tree->Delete(todelete);
  220. // We do not test DeleteAllItems() as under some versions of Windows events
  221. // are not generated.
  222. CPPUNIT_ASSERT_EQUAL(1, deleteitem.GetCount());
  223. }
  224. #if wxUSE_UIACTIONSIMULATOR
  225. void TreeCtrlTestCase::LabelEdit()
  226. {
  227. EventCounter beginedit(m_tree, wxEVT_TREE_BEGIN_LABEL_EDIT);
  228. EventCounter endedit(m_tree, wxEVT_TREE_END_LABEL_EDIT);
  229. wxUIActionSimulator sim;
  230. m_tree->SetFocusedItem(m_tree->GetRootItem());
  231. m_tree->EditLabel(m_tree->GetRootItem());
  232. sim.Text("newroottext");
  233. wxYield();
  234. CPPUNIT_ASSERT_EQUAL(1, beginedit.GetCount());
  235. sim.Char(WXK_RETURN);
  236. wxYield();
  237. CPPUNIT_ASSERT_EQUAL(1, endedit.GetCount());
  238. }
  239. void TreeCtrlTestCase::KeyDown()
  240. {
  241. EventCounter keydown(m_tree, wxEVT_TREE_KEY_DOWN);
  242. wxUIActionSimulator sim;
  243. m_tree->SetFocus();
  244. sim.Text("aAbB");
  245. wxYield();
  246. CPPUNIT_ASSERT_EQUAL(6, keydown.GetCount());
  247. }
  248. #if !defined(__WXGTK__)
  249. void TreeCtrlTestCase::CollapseExpandEvents()
  250. {
  251. m_tree->CollapseAll();
  252. EventCounter collapsed(m_tree, wxEVT_TREE_ITEM_COLLAPSED);
  253. EventCounter collapsing(m_tree, wxEVT_TREE_ITEM_COLLAPSING);
  254. EventCounter expanded(m_tree, wxEVT_TREE_ITEM_EXPANDED);
  255. EventCounter expanding(m_tree, wxEVT_TREE_ITEM_EXPANDING);
  256. wxUIActionSimulator sim;
  257. wxRect pos;
  258. m_tree->GetBoundingRect(m_root, pos, true);
  259. // We move in slightly so we are not on the edge
  260. wxPoint point = m_tree->ClientToScreen(pos.GetPosition()) + wxPoint(4, 4);
  261. sim.MouseMove(point);
  262. wxYield();
  263. sim.MouseDblClick();
  264. wxYield();
  265. CPPUNIT_ASSERT_EQUAL(1, expanding.GetCount());
  266. CPPUNIT_ASSERT_EQUAL(1, expanded.GetCount());
  267. sim.MouseDblClick();
  268. wxYield();
  269. CPPUNIT_ASSERT_EQUAL(1, collapsing.GetCount());
  270. CPPUNIT_ASSERT_EQUAL(1, collapsed.GetCount());
  271. }
  272. void TreeCtrlTestCase::SelectionChange()
  273. {
  274. m_tree->ExpandAll();
  275. // This is currently needed to work around a problem under wxMSW: clicking
  276. // on an item in an unfocused control generates two selection change events
  277. // because of the SetFocus() call in TVN_SELCHANGED handler in wxMSW code.
  278. // This is, of course, wrong on its own, but fixing it without breaking
  279. // anything else is non-obvious, so for now at least work around this
  280. // problem in the test.
  281. m_tree->SetFocus();
  282. EventCounter changed(m_tree, wxEVT_TREE_SEL_CHANGED);
  283. EventCounter changing(m_tree, wxEVT_TREE_SEL_CHANGING);
  284. wxUIActionSimulator sim;
  285. wxRect poschild1, poschild2;
  286. m_tree->GetBoundingRect(m_child1, poschild1, true);
  287. m_tree->GetBoundingRect(m_child2, poschild2, true);
  288. // We move in slightly so we are not on the edge
  289. wxPoint point1 = m_tree->ClientToScreen(poschild1.GetPosition()) + wxPoint(4, 4);
  290. wxPoint point2 = m_tree->ClientToScreen(poschild2.GetPosition()) + wxPoint(4, 4);
  291. sim.MouseMove(point1);
  292. wxYield();
  293. sim.MouseClick();
  294. wxYield();
  295. CPPUNIT_ASSERT_EQUAL(1, changed.GetCount());
  296. CPPUNIT_ASSERT_EQUAL(1, changing.GetCount());
  297. sim.MouseMove(point2);
  298. wxYield();
  299. sim.MouseClick();
  300. wxYield();
  301. CPPUNIT_ASSERT_EQUAL(2, changed.GetCount());
  302. CPPUNIT_ASSERT_EQUAL(2, changing.GetCount());
  303. }
  304. #endif // !__WXGTK__
  305. void TreeCtrlTestCase::Menu()
  306. {
  307. EventCounter menu(m_tree, wxEVT_TREE_ITEM_MENU);
  308. wxUIActionSimulator sim;
  309. wxRect pos;
  310. m_tree->GetBoundingRect(m_child1, pos, true);
  311. // We move in slightly so we are not on the edge
  312. wxPoint point = m_tree->ClientToScreen(pos.GetPosition()) + wxPoint(4, 4);
  313. sim.MouseMove(point);
  314. wxYield();
  315. sim.MouseClick(wxMOUSE_BTN_RIGHT);
  316. wxYield();
  317. CPPUNIT_ASSERT_EQUAL(1, menu.GetCount());
  318. }
  319. #endif // wxUSE_UIACTIONSIMULATOR
  320. void TreeCtrlTestCase::ItemData()
  321. {
  322. wxTreeItemData* child1data = new wxTreeItemData();
  323. wxTreeItemData* appenddata = new wxTreeItemData();
  324. wxTreeItemData* insertdata = new wxTreeItemData();
  325. m_tree->SetItemData(m_child1, child1data);
  326. CPPUNIT_ASSERT_EQUAL(child1data, m_tree->GetItemData(m_child1));
  327. CPPUNIT_ASSERT_EQUAL(m_child1, child1data->GetId());
  328. wxTreeItemId append = m_tree->AppendItem(m_root, "new", -1, -1, appenddata);
  329. CPPUNIT_ASSERT_EQUAL(appenddata, m_tree->GetItemData(append));
  330. CPPUNIT_ASSERT_EQUAL(append, appenddata->GetId());
  331. wxTreeItemId insert = m_tree->InsertItem(m_root, m_child1, "new", -1, -1,
  332. insertdata);
  333. CPPUNIT_ASSERT_EQUAL(insertdata, m_tree->GetItemData(insert));
  334. CPPUNIT_ASSERT_EQUAL(insert, insertdata->GetId());
  335. }
  336. void TreeCtrlTestCase::Iteration()
  337. {
  338. // Get first / next / last child
  339. wxTreeItemIdValue cookie;
  340. CPPUNIT_ASSERT_EQUAL(m_tree->GetFirstChild(m_root, cookie), m_child1);
  341. CPPUNIT_ASSERT_EQUAL(m_tree->GetNextChild(m_root, cookie),
  342. m_tree->GetLastChild(m_root));
  343. CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetLastChild(m_root));
  344. // Get next / previous sibling
  345. CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetNextSibling(m_child1));
  346. CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetPrevSibling(m_child2));
  347. }
  348. void TreeCtrlTestCase::Parent()
  349. {
  350. CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetRootItem());
  351. CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetItemParent(m_child1));
  352. CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetItemParent(m_child2));
  353. CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetItemParent(m_grandchild));
  354. }
  355. void TreeCtrlTestCase::CollapseExpand()
  356. {
  357. m_tree->ExpandAll();
  358. CPPUNIT_ASSERT(m_tree->IsExpanded(m_root));
  359. CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
  360. m_tree->CollapseAll();
  361. CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
  362. CPPUNIT_ASSERT(!m_tree->IsExpanded(m_child1));
  363. m_tree->ExpandAllChildren(m_root);
  364. CPPUNIT_ASSERT(m_tree->IsExpanded(m_root));
  365. CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
  366. m_tree->CollapseAllChildren(m_child1);
  367. CPPUNIT_ASSERT(!m_tree->IsExpanded(m_child1));
  368. m_tree->Expand(m_child1);
  369. CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
  370. m_tree->Collapse(m_root);
  371. CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
  372. CPPUNIT_ASSERT(m_tree->IsExpanded(m_child1));
  373. m_tree->CollapseAndReset(m_root);
  374. CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
  375. }
  376. void TreeCtrlTestCase::AssignImageList()
  377. {
  378. wxSize size(16, 16);
  379. wxImageList *imagelist = new wxImageList(size.x, size.y);
  380. imagelist->Add(wxArtProvider::GetIcon(wxART_QUESTION, wxART_OTHER, size));
  381. wxImageList *statelist = new wxImageList(size.x, size.y);
  382. statelist->Add(wxArtProvider::GetIcon(wxART_ERROR, wxART_OTHER, size));
  383. m_tree->AssignImageList(imagelist);
  384. m_tree->AssignStateImageList(statelist);
  385. CPPUNIT_ASSERT_EQUAL(imagelist, m_tree->GetImageList());
  386. CPPUNIT_ASSERT_EQUAL(statelist, m_tree->GetStateImageList());
  387. }
  388. void TreeCtrlTestCase::Focus()
  389. {
  390. #if !defined(__WXGTK__) && !defined(__WXOSX__)
  391. m_tree->SetFocusedItem(m_child1);
  392. CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetFocusedItem());
  393. m_tree->ClearFocusedItem();
  394. CPPUNIT_ASSERT(!m_tree->GetFocusedItem());
  395. #endif
  396. }
  397. void TreeCtrlTestCase::Bold()
  398. {
  399. CPPUNIT_ASSERT(!m_tree->IsBold(m_child1));
  400. m_tree->SetItemBold(m_child1);
  401. CPPUNIT_ASSERT(m_tree->IsBold(m_child1));
  402. m_tree->SetItemBold(m_child1, false);
  403. CPPUNIT_ASSERT(!m_tree->IsBold(m_child1));
  404. }
  405. void TreeCtrlTestCase::Visible()
  406. {
  407. m_tree->CollapseAll();
  408. CPPUNIT_ASSERT(m_tree->IsVisible(m_root));
  409. CPPUNIT_ASSERT(!m_tree->IsVisible(m_child1));
  410. m_tree->EnsureVisible(m_grandchild);
  411. CPPUNIT_ASSERT(m_tree->IsVisible(m_grandchild));
  412. m_tree->ExpandAll();
  413. CPPUNIT_ASSERT_EQUAL(m_root, m_tree->GetFirstVisibleItem());
  414. CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetNextVisible(m_root));
  415. CPPUNIT_ASSERT_EQUAL(m_grandchild, m_tree->GetNextVisible(m_child1));
  416. CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetNextVisible(m_grandchild));
  417. CPPUNIT_ASSERT(!m_tree->GetNextVisible(m_child2));
  418. CPPUNIT_ASSERT(!m_tree->GetPrevVisible(m_root));
  419. }
  420. void TreeCtrlTestCase::Sort()
  421. {
  422. wxTreeItemId zitem = m_tree->AppendItem(m_root, "zzzz");
  423. wxTreeItemId aitem = m_tree->AppendItem(m_root, "aaaa");
  424. m_tree->SortChildren(m_root);
  425. wxTreeItemIdValue cookie;
  426. CPPUNIT_ASSERT_EQUAL(aitem, m_tree->GetFirstChild(m_root, cookie));
  427. CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetNextChild(m_root, cookie));
  428. CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetNextChild(m_root, cookie));
  429. CPPUNIT_ASSERT_EQUAL(zitem, m_tree->GetNextChild(m_root, cookie));
  430. }
  431. void TreeCtrlTestCase::KeyNavigation()
  432. {
  433. #if wxUSE_UIACTIONSIMULATOR && !defined(__WXGTK__)
  434. wxUIActionSimulator sim;
  435. m_tree->CollapseAll();
  436. m_tree->SelectItem(m_root);
  437. m_tree->SetFocus();
  438. sim.Char(WXK_RIGHT);
  439. wxYield();
  440. CPPUNIT_ASSERT(m_tree->IsExpanded(m_root));
  441. sim.Char(WXK_LEFT);
  442. wxYield();
  443. CPPUNIT_ASSERT(!m_tree->IsExpanded(m_root));
  444. sim.Char(WXK_RIGHT);
  445. sim.Char(WXK_DOWN);
  446. wxYield();
  447. CPPUNIT_ASSERT_EQUAL(m_child1, m_tree->GetSelection());
  448. sim.Char(WXK_DOWN);
  449. wxYield();
  450. CPPUNIT_ASSERT_EQUAL(m_child2, m_tree->GetSelection());
  451. #endif
  452. }
  453. #endif //wxUSE_TREECTRL