1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/controls/listbasetest.cpp
3 // Purpose: Base class for wxListCtrl and wxListView tests
4 // Author: Steven Lamerton
7 // Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>,
8 // (c) 2010 Steven Lamerton
9 ///////////////////////////////////////////////////////////////////////////////
23 #include "wx/listctrl.h"
24 #include "listbasetest.h"
25 #include "testableframe.h"
26 #include "asserthelper.h"
27 #include "wx/uiaction.h"
28 #include "wx/imaglist.h"
29 #include "wx/artprov.h"
31 void ListBaseTestCase::ColumnsOrder()
33 #ifdef wxHAS_LISTCTRL_COLUMN_ORDER
34 wxListCtrl
* const list
= GetList();
38 li
.SetMask(wxLIST_MASK_TEXT
);
40 // first set up some columns
41 static const int NUM_COLS
= 3;
43 list
->InsertColumn(0, "Column 0");
44 list
->InsertColumn(1, "Column 1");
45 list
->InsertColumn(2, "Column 2");
47 // and a couple of test items too
48 list
->InsertItem(0, "Item 0");
49 list
->SetItem(0, 1, "first in first");
51 list
->InsertItem(1, "Item 1");
52 list
->SetItem(1, 2, "second in second");
55 // check that the order is natural in the beginning
56 const wxArrayInt orderOrig
= list
->GetColumnsOrder();
57 for ( n
= 0; n
< NUM_COLS
; n
++ )
58 CPPUNIT_ASSERT_EQUAL( n
, orderOrig
[n
] );
60 // then rearrange them: using { 2, 0, 1 } order means that column 2 is
61 // shown first, then column 0 and finally column 1
66 list
->SetColumnsOrder(order
);
68 // check that we get back the same order as we set
69 const wxArrayInt orderNew
= list
->GetColumnsOrder();
70 for ( n
= 0; n
< NUM_COLS
; n
++ )
71 CPPUNIT_ASSERT_EQUAL( order
[n
], orderNew
[n
] );
73 // and the order -> index mappings for individual columns
74 for ( n
= 0; n
< NUM_COLS
; n
++ )
75 CPPUNIT_ASSERT_EQUAL( order
[n
], list
->GetColumnIndexFromOrder(n
) );
77 // and also the reverse mapping
78 CPPUNIT_ASSERT_EQUAL( 1, list
->GetColumnOrder(0) );
79 CPPUNIT_ASSERT_EQUAL( 2, list
->GetColumnOrder(1) );
80 CPPUNIT_ASSERT_EQUAL( 0, list
->GetColumnOrder(2) );
83 // finally check that accessors still use indices, not order
84 CPPUNIT_ASSERT( list
->GetColumn(0, li
) );
85 CPPUNIT_ASSERT_EQUAL( "Column 0", li
.GetText() );
89 CPPUNIT_ASSERT( list
->GetItem(li
) );
90 CPPUNIT_ASSERT_EQUAL( "first in first", li
.GetText() );
94 CPPUNIT_ASSERT( list
->GetItem(li
) );
95 CPPUNIT_ASSERT_EQUAL( "second in second", li
.GetText() );
97 //tidy up when we are finished
99 #endif // wxHAS_LISTCTRL_COLUMN_ORDER
104 void ListBaseTestCase::ItemRect()
106 wxListCtrl
* const list
= GetList();
108 // set up for the test
109 list
->InsertColumn(0, "Column 0", wxLIST_FORMAT_LEFT
, 60);
110 list
->InsertColumn(1, "Column 1", wxLIST_FORMAT_LEFT
, 50);
111 list
->InsertColumn(2, "Column 2", wxLIST_FORMAT_LEFT
, 40);
113 list
->InsertItem(0, "Item 0");
114 list
->SetItem(0, 1, "first column");
115 list
->SetItem(0, 1, "second column");
119 WX_ASSERT_FAILS_WITH_ASSERT( list
->GetItemRect(1, r
) );
120 CPPUNIT_ASSERT( list
->GetItemRect(0, r
) );
121 CPPUNIT_ASSERT_EQUAL( 150, r
.GetWidth() );
123 CPPUNIT_ASSERT( list
->GetSubItemRect(0, 0, r
) );
124 CPPUNIT_ASSERT_EQUAL( 60, r
.GetWidth() );
126 CPPUNIT_ASSERT( list
->GetSubItemRect(0, 1, r
) );
127 CPPUNIT_ASSERT_EQUAL( 50, r
.GetWidth() );
129 CPPUNIT_ASSERT( list
->GetSubItemRect(0, 2, r
) );
130 CPPUNIT_ASSERT_EQUAL( 40, r
.GetWidth() );
132 WX_ASSERT_FAILS_WITH_ASSERT( list
->GetSubItemRect(0, 3, r
) );
134 //tidy up when we are finished
138 void ListBaseTestCase::ItemText()
140 wxListCtrl
* const list
= GetList();
142 list
->InsertColumn(0, "First");
143 list
->InsertColumn(1, "Second");
145 list
->InsertItem(0, "0,0");
146 CPPUNIT_ASSERT_EQUAL( "0,0", list
->GetItemText(0) );
147 CPPUNIT_ASSERT_EQUAL( "", list
->GetItemText(0, 1) );
149 list
->SetItem(0, 1, "0,1");
150 CPPUNIT_ASSERT_EQUAL( "0,1", list
->GetItemText(0, 1) );
153 void ListBaseTestCase::ChangeMode()
155 wxListCtrl
* const list
= GetList();
157 list
->InsertColumn(0, "Header");
158 list
->InsertItem(0, "First");
159 list
->InsertItem(1, "Second");
160 CPPUNIT_ASSERT_EQUAL( 2, list
->GetItemCount() );
162 // check that switching the mode preserves the items
163 list
->SetWindowStyle(wxLC_ICON
);
164 CPPUNIT_ASSERT_EQUAL( 2, list
->GetItemCount() );
165 CPPUNIT_ASSERT_EQUAL( "First", list
->GetItemText(0) );
167 // and so does switching back
168 list
->SetWindowStyle(wxLC_REPORT
);
169 CPPUNIT_ASSERT_EQUAL( 2, list
->GetItemCount() );
170 CPPUNIT_ASSERT_EQUAL( "First", list
->GetItemText(0) );
172 //tidy up when we are finished
176 void ListBaseTestCase::ItemClick()
178 // FIXME: This test fail under wxGTK because we get 3 FOCUSED events and
179 // 2 SELECTED ones instead of the one of each we expect for some
180 // reason, this needs to be debugged as it may indicate a bug in the
181 // generic wxListCtrl implementation.
182 #if wxUSE_UIACTIONSIMULATOR && !defined(__WXGTK__)
184 // FIXME: This test fails on MSW buildbot slaves although works fine on
185 // development machine, no idea why. It seems to be a problem with
186 // wxUIActionSimulator rather the wxListCtrl control itself however.
187 if ( wxGetUserId().Lower().Matches("buildslave*") )
190 wxTestableFrame
* frame
= wxStaticCast(wxTheApp
->GetTopWindow(),
193 wxListCtrl
* const list
= GetList();
195 list
->InsertColumn(0, "Column 0", wxLIST_FORMAT_LEFT
, 60);
196 list
->InsertColumn(1, "Column 1", wxLIST_FORMAT_LEFT
, 50);
197 list
->InsertColumn(2, "Column 2", wxLIST_FORMAT_LEFT
, 40);
199 list
->InsertItem(0, "Item 0");
200 list
->SetItem(0, 1, "first column");
201 list
->SetItem(0, 2, "second column");
203 EventCounter
count(list
, wxEVT_COMMAND_LIST_ITEM_SELECTED
);
204 EventCounter
count1(list
, wxEVT_COMMAND_LIST_ITEM_FOCUSED
);
205 EventCounter
count2(list
, wxEVT_COMMAND_LIST_ITEM_ACTIVATED
);
206 EventCounter
count3(list
, wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK
);
208 wxUIActionSimulator sim
;
211 list
->GetItemRect(0, pos
);
213 //We move in slightly so we are not on the edge
214 wxPoint point
= list
->ClientToScreen(pos
.GetPosition()) + wxPoint(2, 2);
216 sim
.MouseMove(point
);
225 sim
.MouseClick(wxMOUSE_BTN_RIGHT
);
228 // when the first item was selected the focus changes to it, but not
229 // on subsequent clicks
230 CPPUNIT_ASSERT_EQUAL(1, frame
->GetEventCount(wxEVT_COMMAND_LIST_ITEM_FOCUSED
));
231 CPPUNIT_ASSERT_EQUAL(1, frame
->GetEventCount(wxEVT_COMMAND_LIST_ITEM_SELECTED
));
232 CPPUNIT_ASSERT_EQUAL(1, frame
->GetEventCount(wxEVT_COMMAND_LIST_ITEM_ACTIVATED
));
233 CPPUNIT_ASSERT_EQUAL(1, frame
->GetEventCount(wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK
));
235 //tidy up when we are finished
237 #endif // wxUSE_UIACTIONSIMULATOR
240 void ListBaseTestCase::KeyDown()
242 #if wxUSE_UIACTIONSIMULATOR
243 wxTestableFrame
* frame
= wxStaticCast(wxTheApp
->GetTopWindow(),
246 wxListCtrl
* const list
= GetList();
248 EventCounter
count(list
, wxEVT_COMMAND_LIST_KEY_DOWN
);
250 wxUIActionSimulator sim
;
256 CPPUNIT_ASSERT_EQUAL(6, frame
->GetEventCount());
260 void ListBaseTestCase::DeleteItems()
263 wxTestableFrame
* frame
= wxStaticCast(wxTheApp
->GetTopWindow(),
266 wxListCtrl
* const list
= GetList();
268 EventCounter
count(list
, wxEVT_COMMAND_LIST_DELETE_ITEM
);
269 EventCounter
count1(list
, wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS
);
272 list
->InsertColumn(0, "Column 0", wxLIST_FORMAT_LEFT
, 60);
273 list
->InsertColumn(1, "Column 1", wxLIST_FORMAT_LEFT
, 50);
274 list
->InsertColumn(2, "Column 2", wxLIST_FORMAT_LEFT
, 40);
276 list
->InsertItem(0, "Item 0");
277 list
->InsertItem(1, "Item 1");
278 list
->InsertItem(2, "Item 1");
282 list
->DeleteAllItems();
284 //Add some new items to tests ClearAll with
285 list
->InsertColumn(0, "Column 0");
286 list
->InsertItem(0, "Item 0");
287 list
->InsertItem(1, "Item 1");
289 //Check that ClearAll actually sends a DELETE_ALL_ITEMS event
292 //ClearAll and DeleteAllItems shouldn't send an event if there was nothing
295 list
->DeleteAllItems();
297 CPPUNIT_ASSERT_EQUAL(2, frame
->GetEventCount(wxEVT_COMMAND_LIST_DELETE_ITEM
));
298 CPPUNIT_ASSERT_EQUAL(2, frame
->GetEventCount(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS
));
302 void ListBaseTestCase::InsertItem()
304 wxTestableFrame
* frame
= wxStaticCast(wxTheApp
->GetTopWindow(),
307 wxListCtrl
* const list
= GetList();
309 EventCounter
count(list
, wxEVT_COMMAND_LIST_INSERT_ITEM
);
311 list
->InsertColumn(0, "Column 0", wxLIST_FORMAT_LEFT
, 60);
315 item
.SetText("some text");
317 list
->InsertItem(item
);
318 list
->InsertItem(1, "more text");
320 CPPUNIT_ASSERT_EQUAL(2, frame
->GetEventCount(wxEVT_COMMAND_LIST_INSERT_ITEM
));
323 void ListBaseTestCase::Find()
325 wxListCtrl
* const list
= GetList();
327 // set up for the test
328 list
->InsertColumn(0, "Column 0");
329 list
->InsertColumn(1, "Column 1");
331 list
->InsertItem(0, "Item 0");
332 list
->SetItem(0, 1, "first column");
334 list
->InsertItem(1, "Item 1");
335 list
->SetItem(1, 1, "first column");
337 list
->InsertItem(2, "Item 40");
338 list
->SetItem(2, 1, "first column");
340 list
->InsertItem(3, "ITEM 01");
341 list
->SetItem(3, 1, "first column");
343 CPPUNIT_ASSERT_EQUAL(1, list
->FindItem(-1, "Item 1"));
344 CPPUNIT_ASSERT_EQUAL(2, list
->FindItem(-1, "Item 4", true));
345 CPPUNIT_ASSERT_EQUAL(2, list
->FindItem(1, "Item 40"));
346 CPPUNIT_ASSERT_EQUAL(3, list
->FindItem(2, "Item 0", true));
349 void ListBaseTestCase::Visible()
351 wxListCtrl
* const list
= GetList();
353 list
->InsertColumn(0, "Column 0");
355 int count
= list
->GetCountPerPage();
357 for( int i
= 0; i
< count
+ 10; i
++ )
359 list
->InsertItem(i
, wxString::Format("string %d", i
));
362 CPPUNIT_ASSERT_EQUAL(count
+ 10, list
->GetItemCount());
363 CPPUNIT_ASSERT_EQUAL(0, list
->GetTopItem());
365 list
->EnsureVisible(count
+ 9);
367 CPPUNIT_ASSERT(list
->GetTopItem() != 0);
370 void ListBaseTestCase::ItemFormatting()
372 wxListCtrl
* const list
= GetList();
374 list
->InsertColumn(0, "Column 0");
376 list
->InsertItem(0, "Item 0");
377 list
->InsertItem(1, "Item 1");
378 list
->InsertItem(2, "Item 2");
380 list
->SetTextColour(*wxYELLOW
);
381 list
->SetBackgroundColour(*wxGREEN
);
382 list
->SetItemTextColour(0, *wxRED
);
383 list
->SetItemBackgroundColour(1, *wxBLUE
);
385 CPPUNIT_ASSERT_EQUAL(*wxGREEN
, list
->GetBackgroundColour());
386 CPPUNIT_ASSERT_EQUAL(*wxBLUE
,list
->GetItemBackgroundColour(1));
388 CPPUNIT_ASSERT_EQUAL(*wxYELLOW
, list
->GetTextColour());
389 CPPUNIT_ASSERT_EQUAL(*wxRED
, list
->GetItemTextColour(0));
392 void ListBaseTestCase::EditLabel()
394 #if wxUSE_UIACTIONSIMULATOR
395 wxListCtrl
* const list
= GetList();
397 list
->SetWindowStyleFlag(wxLC_REPORT
| wxLC_EDIT_LABELS
);
399 list
->InsertColumn(0, "Column 0");
401 list
->InsertItem(0, "Item 0");
402 list
->InsertItem(1, "Item 1");
404 wxTestableFrame
* frame
= wxStaticCast(wxTheApp
->GetTopWindow(),
407 EventCounter
count(list
, wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT
);
408 EventCounter
count1(list
, wxEVT_COMMAND_LIST_END_LABEL_EDIT
);
410 wxUIActionSimulator sim
;
414 sim
.Text("sometext");
415 sim
.Char(WXK_RETURN
);
419 CPPUNIT_ASSERT_EQUAL(1, frame
->GetEventCount(wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT
));
420 CPPUNIT_ASSERT_EQUAL(1, frame
->GetEventCount(wxEVT_COMMAND_LIST_END_LABEL_EDIT
));
424 void ListBaseTestCase::ImageList()
426 wxListCtrl
* const list
= GetList();
430 wxImageList
* imglist
= new wxImageList(size
.x
, size
.y
);
431 imglist
->Add(wxArtProvider::GetIcon(wxART_INFORMATION
, wxART_OTHER
, size
));
432 imglist
->Add(wxArtProvider::GetIcon(wxART_QUESTION
, wxART_OTHER
, size
));
433 imglist
->Add(wxArtProvider::GetIcon(wxART_WARNING
, wxART_OTHER
, size
));
435 list
->AssignImageList(imglist
, wxIMAGE_LIST_NORMAL
);
437 CPPUNIT_ASSERT_EQUAL(imglist
, list
->GetImageList(wxIMAGE_LIST_NORMAL
));
442 //From the sample but fixed so it actually inverts
444 MyCompareFunction(long item1
, long item2
, wxIntPtr
WXUNUSED(sortData
))
457 void ListBaseTestCase::Sort()
459 wxListCtrl
* const list
= GetList();
461 list
->InsertColumn(0, "Column 0");
463 list
->InsertItem(0, "Item 0");
464 list
->SetItemData(0, 0);
465 list
->InsertItem(1, "Item 1");
466 list
->SetItemData(1, 1);
468 list
->SortItems(MyCompareFunction
, 0);
470 CPPUNIT_ASSERT_EQUAL("Item 1", list
->GetItemText(0));
471 CPPUNIT_ASSERT_EQUAL("Item 0", list
->GetItemText(1));
474 #endif //wxUSE_LISTCTRL