itemcontainertest.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: tests/controls/itemcontainertest.cpp
  3. // Purpose: wxItemContainer unit test
  4. // Author: Steven Lamerton
  5. // Created: 2010-06-29
  6. // Copyright: (c) 2010 Steven Lamerton
  7. ///////////////////////////////////////////////////////////////////////////////
  8. #include "testprec.h"
  9. #ifndef WX_PRECOMP
  10. #include "wx/app.h"
  11. #include "wx/ctrlsub.h"
  12. #endif // WX_PRECOMP
  13. #include "wx/scopeguard.h"
  14. #include "itemcontainertest.h"
  15. void ItemContainerTestCase::Append()
  16. {
  17. wxItemContainer * const container = GetContainer();
  18. container->Append("item 0");
  19. CPPUNIT_ASSERT_EQUAL("item 0", container->GetString(0));
  20. wxArrayString testitems;
  21. testitems.Add("item 1");
  22. testitems.Add("item 2");
  23. container->Append(testitems);
  24. CPPUNIT_ASSERT_EQUAL("item 1", container->GetString(1));
  25. CPPUNIT_ASSERT_EQUAL("item 2", container->GetString(2));
  26. wxString arritems[] = { "item 3", "item 4" };
  27. container->Append(2, arritems);
  28. CPPUNIT_ASSERT_EQUAL("item 3", container->GetString(3));
  29. CPPUNIT_ASSERT_EQUAL("item 4", container->GetString(4));
  30. }
  31. void ItemContainerTestCase::Insert()
  32. {
  33. wxItemContainer * const container = GetContainer();
  34. CPPUNIT_ASSERT_EQUAL( 0, container->Insert("item 0", 0) );
  35. CPPUNIT_ASSERT_EQUAL("item 0", container->GetString(0));
  36. wxArrayString testitems;
  37. testitems.Add("item 1");
  38. testitems.Add("item 2");
  39. CPPUNIT_ASSERT_EQUAL( 1, container->Insert(testitems, 0) );
  40. CPPUNIT_ASSERT_EQUAL("item 1", container->GetString(0));
  41. CPPUNIT_ASSERT_EQUAL("item 2", container->GetString(1));
  42. wxString arritems[] = { "item 3", "item 4" };
  43. CPPUNIT_ASSERT_EQUAL( 2, container->Insert(2, arritems, 1) );
  44. CPPUNIT_ASSERT_EQUAL("item 3", container->GetString(1));
  45. CPPUNIT_ASSERT_EQUAL("item 4", container->GetString(2));
  46. }
  47. void ItemContainerTestCase::Count()
  48. {
  49. wxItemContainer * const container = GetContainer();
  50. CPPUNIT_ASSERT(container->IsEmpty());
  51. wxArrayString testitems;
  52. testitems.Add("item 0");
  53. testitems.Add("item 1");
  54. testitems.Add("item 2");
  55. testitems.Add("item 3");
  56. container->Append(testitems);
  57. CPPUNIT_ASSERT(!container->IsEmpty());
  58. CPPUNIT_ASSERT_EQUAL(4, container->GetCount());
  59. container->Delete(0);
  60. CPPUNIT_ASSERT_EQUAL(3, container->GetCount());
  61. container->Delete(0);
  62. container->Delete(0);
  63. CPPUNIT_ASSERT_EQUAL(1, container->GetCount());
  64. container->Insert(testitems, 1);
  65. CPPUNIT_ASSERT_EQUAL(5, container->GetCount());
  66. }
  67. void ItemContainerTestCase::ItemSelection()
  68. {
  69. wxItemContainer * const container = GetContainer();
  70. wxArrayString testitems;
  71. testitems.Add("item 0");
  72. testitems.Add("item 1");
  73. testitems.Add("item 2");
  74. testitems.Add("ITEM 2"); // The same as the last one except for case.
  75. container->Append(testitems);
  76. container->SetSelection(wxNOT_FOUND);
  77. CPPUNIT_ASSERT_EQUAL(wxNOT_FOUND, container->GetSelection());
  78. CPPUNIT_ASSERT_EQUAL("", container->GetStringSelection());
  79. container->SetSelection(1);
  80. CPPUNIT_ASSERT_EQUAL(1, container->GetSelection());
  81. CPPUNIT_ASSERT_EQUAL("item 1", container->GetStringSelection());
  82. CPPUNIT_ASSERT( container->SetStringSelection("item 2") );
  83. CPPUNIT_ASSERT_EQUAL(2, container->GetSelection());
  84. CPPUNIT_ASSERT_EQUAL("item 2", container->GetStringSelection());
  85. // Check that selecting a non-existent item fails.
  86. CPPUNIT_ASSERT( !container->SetStringSelection("bloordyblop") );
  87. // Check that SetStringSelection() is case-insensitive.
  88. CPPUNIT_ASSERT( container->SetStringSelection("ITEM 2") );
  89. CPPUNIT_ASSERT_EQUAL(2, container->GetSelection());
  90. CPPUNIT_ASSERT_EQUAL("item 2", container->GetStringSelection());
  91. }
  92. void ItemContainerTestCase::FindString()
  93. {
  94. wxItemContainer * const container = GetContainer();
  95. wxArrayString testitems;
  96. testitems.Add("item 0");
  97. testitems.Add("item 1");
  98. testitems.Add("item 2");
  99. testitems.Add("item 3");
  100. container->Append(testitems);
  101. CPPUNIT_ASSERT_EQUAL(1, container->FindString("item 1"));
  102. CPPUNIT_ASSERT_EQUAL(1, container->FindString("ITEM 1"));
  103. CPPUNIT_ASSERT_EQUAL(wxNOT_FOUND, container->FindString("ITEM 1", true));
  104. }
  105. void ItemContainerTestCase::ClientData()
  106. {
  107. wxItemContainer * const container = GetContainer();
  108. wxStringClientData* item0data = new wxStringClientData("item0data");
  109. wxStringClientData* item1data = new wxStringClientData("item1data");
  110. wxStringClientData* item2data = new wxStringClientData("item2data");
  111. container->Append("item 0", item0data);
  112. CPPUNIT_ASSERT_EQUAL(static_cast<wxClientData*>(item0data),
  113. container->GetClientObject(0));
  114. container->Append("item 1");
  115. container->SetClientObject(1, item1data);
  116. CPPUNIT_ASSERT_EQUAL(static_cast<wxClientData*>(item1data),
  117. container->GetClientObject(1));
  118. container->Insert("item 2", 2, item2data);
  119. CPPUNIT_ASSERT_EQUAL(static_cast<wxClientData*>(item2data),
  120. container->GetClientObject(2));
  121. WX_ASSERT_FAILS_WITH_ASSERT( container->SetClientObject((unsigned)-1, item0data) );
  122. WX_ASSERT_FAILS_WITH_ASSERT( container->SetClientObject(12345, item0data) );
  123. }
  124. void ItemContainerTestCase::VoidData()
  125. {
  126. wxItemContainer * const container = GetContainer();
  127. wxString item0data("item0data"), item1data("item0data"),
  128. item2data("item0data");
  129. void* item0 = &item0data;
  130. void* item1 = &item1data;
  131. void* item2 = &item2data;
  132. container->Append("item 0", item0);
  133. CPPUNIT_ASSERT_EQUAL(item0, container->GetClientData(0));
  134. container->Append("item 1");
  135. container->SetClientData(1, item1);
  136. CPPUNIT_ASSERT_EQUAL(item1, container->GetClientData(1));
  137. container->Insert("item 2", 2, item2);
  138. CPPUNIT_ASSERT_EQUAL(item2, container->GetClientData(2));
  139. WX_ASSERT_FAILS_WITH_ASSERT( container->SetClientData((unsigned)-1, NULL) );
  140. WX_ASSERT_FAILS_WITH_ASSERT( container->SetClientData(12345, NULL) );
  141. // wxMSW used to hace problems retrieving the client data of -1 from a few
  142. // standard controls, especially if the last error was set before doing it,
  143. // so test for this specially.
  144. const wxUIntPtr minus1 = static_cast<wxUIntPtr>(-1);
  145. container->Append("item -1", wxUIntToPtr(minus1));
  146. #ifdef __WINDOWS__
  147. ::SetLastError(ERROR_INVALID_DATA);
  148. #endif
  149. CPPUNIT_ASSERT_EQUAL( minus1, wxPtrToUInt(container->GetClientData(3)) );
  150. }
  151. void ItemContainerTestCase::Set()
  152. {
  153. wxItemContainer * const container = GetContainer();
  154. wxArrayString testitems;
  155. testitems.Add("item 0");
  156. testitems.Add("item 1");
  157. container->Append(testitems);
  158. wxArrayString newtestitems;
  159. newtestitems.Add("new item 0");
  160. newtestitems.Add("new item 1");
  161. newtestitems.Add("new item 2");
  162. newtestitems.Add("new item 3");
  163. container->Set(newtestitems);
  164. CPPUNIT_ASSERT_EQUAL(4, container->GetCount());
  165. CPPUNIT_ASSERT_EQUAL("new item 1", container->GetString(1));
  166. wxString arrnewitems[] = { "even newer 0", "event newer 1" };
  167. container->Set(2, arrnewitems);
  168. CPPUNIT_ASSERT_EQUAL(2, container->GetCount());
  169. CPPUNIT_ASSERT_EQUAL("even newer 0", container->GetString(0));
  170. }
  171. void ItemContainerTestCase::SetString()
  172. {
  173. wxItemContainer * const container = GetContainer();
  174. wxArrayString testitems;
  175. testitems.Add("item 0");
  176. testitems.Add("item 1");
  177. testitems.Add("item 2");
  178. testitems.Add("item 3");
  179. container->Append(testitems);
  180. container->SetSelection(0);
  181. container->SetString(0, "new item 0");
  182. CPPUNIT_ASSERT_EQUAL("new item 0", container->GetString(0));
  183. // Modifying the item shouldn't deselect it.
  184. CPPUNIT_ASSERT_EQUAL(0, container->GetSelection());
  185. // wxOSX doesn't support having empty items in some containers.
  186. #ifndef __WXOSX__
  187. container->SetString(2, "");
  188. CPPUNIT_ASSERT_EQUAL("", container->GetString(2));
  189. #endif
  190. }
  191. void ItemContainerTestCase::SetSelection()
  192. {
  193. wxItemContainer * const container = GetContainer();
  194. container->Append("first");
  195. container->Append("second");
  196. // This class is used to check that SetSelection() doesn't generate any
  197. // events, as documented.
  198. class CommandEventHandler : public wxEvtHandler
  199. {
  200. public:
  201. virtual bool ProcessEvent(wxEvent& event)
  202. {
  203. CPPUNIT_ASSERT_MESSAGE
  204. (
  205. "unexpected command event from SetSelection",
  206. !event.IsCommandEvent()
  207. );
  208. return wxEvtHandler::ProcessEvent(event);
  209. }
  210. } h;
  211. wxWindow * const win = GetContainerWindow();
  212. win->PushEventHandler(&h);
  213. wxON_BLOCK_EXIT_OBJ1( *win, wxWindow::PopEventHandler, false );
  214. container->SetSelection(0);
  215. CPPUNIT_ASSERT_EQUAL( 0, container->GetSelection() );
  216. container->SetSelection(1);
  217. CPPUNIT_ASSERT_EQUAL( 1, container->GetSelection() );
  218. }