From 2451f8085be6ced9ac8e5b2595e0b43bf50599d9 Mon Sep 17 00:00:00 2001 From: Pavel Tyunin Date: Thu, 25 Feb 2021 21:23:33 +0200 Subject: [PATCH 1/5] Fix search in wxSortedArrayString with custom compare function --- include/wx/arrstr.h | 3 ++ src/common/arrstr.cpp | 70 ++++++++++++++++------------------------- tests/arrays/arrays.cpp | 5 +++ 3 files changed, 35 insertions(+), 43 deletions(-) diff --git a/include/wx/arrstr.h b/include/wx/arrstr.h index e21dc78761..bed1098d74 100644 --- a/include/wx/arrstr.h +++ b/include/wx/arrstr.h @@ -398,6 +398,9 @@ private: // (if the old buffer is big enough, just return NULL). wxString *Grow(size_t nIncrement); + // Binary search in the sorted array + size_t BinarySearch(const wxString& str, bool equal = false) const; + size_t m_nSize, // current size of the array m_nCount; // current number of elements diff --git a/src/common/arrstr.cpp b/src/common/arrstr.cpp index dc569a80bf..3aac42f67d 100644 --- a/src/common/arrstr.cpp +++ b/src/common/arrstr.cpp @@ -377,6 +377,29 @@ void wxArrayString::Shrink() } } +// Binary search in the sorted array +size_t wxArrayString::BinarySearch(const wxString& str, bool equal) const +{ + size_t + lo = 0, + hi = m_nCount; + while (lo < hi) { + size_t i; + i = (lo + hi) / 2; + + int res; + res = m_compareFunction ? m_compareFunction(str, m_pItems[i]) : str.Cmp(m_pItems[i]); + if (res < 0) + hi = i; + else if (res > 0) + lo = i + 1; + else + return i; + } + wxASSERT_MSG(lo == hi, wxT("binary search broken")); + return equal ? wxNOT_FOUND : lo; +} + // searches the array for an item (forward or backwards) int wxArrayString::Index(const wxString& str, bool bCase, bool bFromEnd) const { @@ -384,25 +407,7 @@ int wxArrayString::Index(const wxString& str, bool bCase, bool bFromEnd) const // use binary search in the sorted array wxASSERT_MSG( bCase && !bFromEnd, wxT("search parameters ignored for auto sorted array") ); - - size_t - lo = 0, - hi = m_nCount; - while ( lo < hi ) { - size_t i; - i = (lo + hi)/2; - - int res; - res = str.compare(m_pItems[i]); - if ( res < 0 ) - hi = i; - else if ( res > 0 ) - lo = i + 1; - else - return i; - } - - return wxNOT_FOUND; + return BinarySearch(str, true); } else { // use linear search in unsorted array @@ -432,30 +437,9 @@ size_t wxArrayString::Add(const wxString& str, size_t nInsert) { if ( m_autoSort ) { // insert the string at the correct position to keep the array sorted - size_t - lo = 0, - hi = m_nCount; - while ( lo < hi ) { - size_t i; - i = (lo + hi)/2; - - int res; - res = m_compareFunction ? m_compareFunction(str, m_pItems[i]) : str.Cmp(m_pItems[i]); - if ( res < 0 ) - hi = i; - else if ( res > 0 ) - lo = i + 1; - else { - lo = hi = i; - break; - } - } - - wxASSERT_MSG( lo == hi, wxT("binary search broken") ); - - Insert(str, lo, nInsert); - - return (size_t)lo; + size_t nIndex = BinarySearch(str); + Insert(str, nIndex, nInsert); + return nIndex; } else { // Now that we must postpone freeing the old memory until we don't need it diff --git a/tests/arrays/arrays.cpp b/tests/arrays/arrays.cpp index 3f61c4ff41..6c815eb52f 100644 --- a/tests/arrays/arrays.cpp +++ b/tests/arrays/arrays.cpp @@ -399,6 +399,11 @@ void ArraysTestCase::SortedArray() ad.Add("Aa"); CPPUNIT_ASSERT_EQUAL( "a", ad[0] ); CPPUNIT_ASSERT_EQUAL( "Aa", ad[1] ); + CPPUNIT_ASSERT_EQUAL( 0, ad.Index("a") ); + CPPUNIT_ASSERT_EQUAL( 1, ad.Index("Aa") ); + CPPUNIT_ASSERT_EQUAL( 2, ad.Index("AB") ); + CPPUNIT_ASSERT_EQUAL( wxNOT_FOUND, ad.Index("A") ); + CPPUNIT_ASSERT_EQUAL( wxNOT_FOUND, ad.Index("z") ); } void ArraysTestCase::wxStringArraySplitTest() From 00fec01308d6cdfbb0edb945cb7c45d0cce1afc9 Mon Sep 17 00:00:00 2001 From: Pavel Tyunin Date: Fri, 26 Feb 2021 11:52:44 +0200 Subject: [PATCH 2/5] Fex search in wxSortedArrayString with custom compare function in STL build --- include/wx/dynarray.h | 3 +++ src/common/arrstr.cpp | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index 67dc5e6f5e..03cb8c6c1f 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -255,6 +255,9 @@ public: Add(item); } +protected: + SCMPFUNC GetCompareFunction() const wxNOEXCEPT { return m_fnCompare; } + private: SCMPFUNC m_fnCompare; }; diff --git a/src/common/arrstr.cpp b/src/common/arrstr.cpp index 3aac42f67d..3611bc4276 100644 --- a/src/common/arrstr.cpp +++ b/src/common/arrstr.cpp @@ -198,15 +198,16 @@ int wxSortedArrayString::Index(const wxString& str, wxASSERT_MSG( bCase && !bFromEnd, "search parameters ignored for sorted array" ); + SCMPFUNC function = GetCompareFunction(); wxSortedArrayString::const_iterator it = std::lower_bound(begin(), end(), str, #if __cplusplus >= 201103L || wxCHECK_VISUALC_VERSION(14) - [](const wxString& s1, const wxString& s2) + [function](const wxString& s1, const wxString& s2) { - return s1 < s2; + return function(s1, s2) < 0; } #else // C++98 version - wxStringCompare(wxStringCmp()) + wxStringCompare(function) #endif // C++11/C++98 ); From 6819b5512bf1fb1652cab3d83f0ba509f6ad1b44 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 26 Feb 2021 16:25:28 +0100 Subject: [PATCH 3/5] Make BinarySearch() interface slightly more readable Replace "equal" parameter with the (opposite) "lowerBound" one with a more descriptive name, add a comment describing it and also remove the default value to force explaining how it is used in the caller. No real changes. --- include/wx/arrstr.h | 6 ++++-- src/common/arrstr.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/wx/arrstr.h b/include/wx/arrstr.h index bed1098d74..951dd16d1b 100644 --- a/include/wx/arrstr.h +++ b/include/wx/arrstr.h @@ -398,8 +398,10 @@ private: // (if the old buffer is big enough, just return NULL). wxString *Grow(size_t nIncrement); - // Binary search in the sorted array - size_t BinarySearch(const wxString& str, bool equal = false) const; + // Binary search in the sorted array: return the index of the string if it's + // present, otherwise, if lowerBound is true, return the position at which + // the string should be inserted and if it's false return wxNOT_FOUND. + size_t BinarySearch(const wxString& str, bool lowerBound) const; size_t m_nSize, // current size of the array m_nCount; // current number of elements diff --git a/src/common/arrstr.cpp b/src/common/arrstr.cpp index 3611bc4276..65317bb1e8 100644 --- a/src/common/arrstr.cpp +++ b/src/common/arrstr.cpp @@ -379,7 +379,7 @@ void wxArrayString::Shrink() } // Binary search in the sorted array -size_t wxArrayString::BinarySearch(const wxString& str, bool equal) const +size_t wxArrayString::BinarySearch(const wxString& str, bool lowerBound) const { size_t lo = 0, @@ -398,7 +398,7 @@ size_t wxArrayString::BinarySearch(const wxString& str, bool equal) const return i; } wxASSERT_MSG(lo == hi, wxT("binary search broken")); - return equal ? wxNOT_FOUND : lo; + return lowerBound ? lo : wxNOT_FOUND; } // searches the array for an item (forward or backwards) @@ -408,7 +408,7 @@ int wxArrayString::Index(const wxString& str, bool bCase, bool bFromEnd) const // use binary search in the sorted array wxASSERT_MSG( bCase && !bFromEnd, wxT("search parameters ignored for auto sorted array") ); - return BinarySearch(str, true); + return BinarySearch(str, false /* not lower bound */); } else { // use linear search in unsorted array @@ -438,7 +438,7 @@ size_t wxArrayString::Add(const wxString& str, size_t nInsert) { if ( m_autoSort ) { // insert the string at the correct position to keep the array sorted - size_t nIndex = BinarySearch(str); + size_t nIndex = BinarySearch(str, true /* return lower bound */); Insert(str, nIndex, nInsert); return nIndex; } From eb3fdfe82fcbc63369667db1b946d983f6834c1b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 26 Feb 2021 16:32:45 +0100 Subject: [PATCH 4/5] Get rid of ArraysTestCase class in the dyn arrays unit tests Just remove more CppUnit boilerplate, no real changes. --- tests/arrays/arrays.cpp | 78 ++++++++--------------------------------- 1 file changed, 14 insertions(+), 64 deletions(-) diff --git a/tests/arrays/arrays.cpp b/tests/arrays/arrays.cpp index 6c815eb52f..49575dd301 100644 --- a/tests/arrays/arrays.cpp +++ b/tests/arrays/arrays.cpp @@ -156,60 +156,10 @@ struct Item WX_DEFINE_ARRAY_PTR(Item *, ItemPtrArray); // ---------------------------------------------------------------------------- -// test class +// the tests // ---------------------------------------------------------------------------- -class ArraysTestCase : public CppUnit::TestCase -{ -public: - ArraysTestCase() { } - -private: - CPPUNIT_TEST_SUITE( ArraysTestCase ); - CPPUNIT_TEST( wxStringArrayTest ); - CPPUNIT_TEST( SortedArray ); - CPPUNIT_TEST( wxStringArraySplitTest ); - CPPUNIT_TEST( wxStringArrayJoinTest ); - CPPUNIT_TEST( wxStringArraySplitJoinTest ); - - CPPUNIT_TEST( wxObjArrayTest ); - CPPUNIT_TEST( wxObjArrayPtrTest ); - CPPUNIT_TEST( wxArrayUShortTest ); - CPPUNIT_TEST( wxArrayIntTest ); - CPPUNIT_TEST( wxArrayCharTest ); - CPPUNIT_TEST( TestSTL ); - CPPUNIT_TEST( Alloc ); - CPPUNIT_TEST( Clear ); - CPPUNIT_TEST( Swap ); - CPPUNIT_TEST( IndexFromEnd ); - CPPUNIT_TEST_SUITE_END(); - - void wxStringArrayTest(); - void SortedArray(); - void wxStringArraySplitTest(); - void wxStringArrayJoinTest(); - void wxStringArraySplitJoinTest(); - void wxObjArrayTest(); - void wxObjArrayPtrTest(); - void wxArrayUShortTest(); - void wxArrayIntTest(); - void wxArrayCharTest(); - void TestSTL(); - void Alloc(); - void Clear(); - void Swap(); - void IndexFromEnd(); - - wxDECLARE_NO_COPY_CLASS(ArraysTestCase); -}; - -// register in the unnamed registry so that these tests are run by default -CPPUNIT_TEST_SUITE_REGISTRATION( ArraysTestCase ); - -// also include in its own registry so that these tests can be run alone -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ArraysTestCase, "ArraysTestCase" ); - -void ArraysTestCase::wxStringArrayTest() +TEST_CASE("wxArrayString", "[dynarray]") { wxArrayString a1; a1.Add(wxT("thermit")); @@ -375,7 +325,7 @@ void ArraysTestCase::wxStringArrayTest() wxCLANG_WARNING_RESTORE(self-assign-overloaded) } -void ArraysTestCase::SortedArray() +TEST_CASE("wxSortedArrayString", "[dynarray]") { wxSortedArrayString a; a.Add("d"); @@ -406,7 +356,7 @@ void ArraysTestCase::SortedArray() CPPUNIT_ASSERT_EQUAL( wxNOT_FOUND, ad.Index("z") ); } -void ArraysTestCase::wxStringArraySplitTest() +TEST_CASE("Arrays::Split", "[dynarray]") { // test wxSplit: @@ -461,7 +411,7 @@ void ArraysTestCase::wxStringArraySplitTest() } } -void ArraysTestCase::wxStringArrayJoinTest() +TEST_CASE("Arrays::Join", "[dynarray]") { // test wxJoin: @@ -506,7 +456,7 @@ void ArraysTestCase::wxStringArrayJoinTest() } } -void ArraysTestCase::wxStringArraySplitJoinTest() +TEST_CASE("Arrays::SplitJoin", "[dynarray]") { wxChar separators[] = { wxT('a'), wxT(','), wxT('_'), wxT(' '), wxT('\\'), wxT('&'), wxT('{'), wxT('A'), wxT('<'), wxT('>'), @@ -560,7 +510,7 @@ void ArraysTestCase::wxStringArraySplitJoinTest() CPPUNIT_ASSERT_EQUAL( 2, wxSplit(wxT(";"), wxT(';')).size() ); } -void ArraysTestCase::wxObjArrayTest() +TEST_CASE("wxObjArray", "[dynarray]") { { ArrayBars bars; @@ -588,7 +538,7 @@ void ArraysTestCase::wxObjArrayTest() CPPUNIT_ASSERT_EQUAL( 0, Bar::GetNumber() ); } -void ArraysTestCase::wxObjArrayPtrTest() +TEST_CASE("wxObjArrayPtr", "[dynarray]") { // Just check that instantiating this class compiles. ArrayBarPtrs barptrs; @@ -597,7 +547,7 @@ void ArraysTestCase::wxObjArrayPtrTest() #define TestArrayOf(name) \ \ -void ArraysTestCase::wxArray ## name ## Test() \ +TEST_CASE("wxDynArray::" #name, "[dynarray]") \ { \ wxArray##name a; \ a.Add(1); \ @@ -642,7 +592,7 @@ TestArrayOf(Char) TestArrayOf(Int) -void ArraysTestCase::Alloc() +TEST_CASE("wxDynArray::Alloc", "[dynarray]") { wxArrayInt a; a.Add(17); @@ -656,7 +606,7 @@ void ArraysTestCase::Alloc() CPPUNIT_ASSERT_EQUAL( 9, a[1] ); } -void ArraysTestCase::Clear() +TEST_CASE("wxDynArray::Clear", "[dynarray]") { ItemPtrArray items; @@ -702,7 +652,7 @@ void DoTestSwap(T v1, T v2, T v3) } // anonymous namespace -void ArraysTestCase::Swap() +TEST_CASE("wxDynArray::Swap", "[dynarray]") { DoTestSwap("Foo", "Bar", "Baz"); @@ -710,7 +660,7 @@ void ArraysTestCase::Swap() DoTestSwap(6, 28, 496); } -void ArraysTestCase::TestSTL() +TEST_CASE("wxDynArray::TestSTL", "[dynarray]") { wxArrayInt list1; wxArrayInt::iterator it, en; @@ -768,7 +718,7 @@ void ArraysTestCase::TestSTL() WX_CLEAR_ARRAY(items); } -void ArraysTestCase::IndexFromEnd() +TEST_CASE("wxDynArray::IndexFromEnd", "[dynarray]") { wxArrayInt a; a.push_back(10); From b113635111d49b723af1e1991dac5688aa07fa8d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 26 Feb 2021 16:36:10 +0100 Subject: [PATCH 5/5] Use CHECK() instead of CPPUNIT_ASSERT_XXX in arrays tests This could be further improved by defining array matchers instead of using the macros, but for now just get rid of the last traces of CppUnit in this file. No real changes. --- tests/arrays/arrays.cpp | 266 ++++++++++++++++++++-------------------- 1 file changed, 133 insertions(+), 133 deletions(-) diff --git a/tests/arrays/arrays.cpp b/tests/arrays/arrays.cpp index 49575dd301..3476bfb62f 100644 --- a/tests/arrays/arrays.cpp +++ b/tests/arrays/arrays.cpp @@ -169,7 +169,7 @@ TEST_CASE("wxArrayString", "[dynarray]") a1.Add(wxT("human")); a1.Add(wxT("alligator")); - CPPUNIT_ASSERT((COMPARE_8_VALUES( a1 , wxT("thermit") , + CHECK((COMPARE_8_VALUES( a1 , wxT("thermit") , wxT("condor") , wxT("lion") , wxT("lion") , @@ -177,11 +177,11 @@ TEST_CASE("wxArrayString", "[dynarray]") wxT("dog") , wxT("human") , wxT("alligator") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a1 , 8 ) ); + CHECK( COMPARE_COUNT( a1 , 8 ) ); wxArrayString a2(a1); - CPPUNIT_ASSERT((COMPARE_8_VALUES( a2 , wxT("thermit") , + CHECK((COMPARE_8_VALUES( a2 , wxT("thermit") , wxT("condor") , wxT("lion") , wxT("lion") , @@ -189,11 +189,11 @@ TEST_CASE("wxArrayString", "[dynarray]") wxT("dog") , wxT("human") , wxT("alligator") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a2 , 8 ) ); + CHECK( COMPARE_COUNT( a2 , 8 ) ); wxSortedArrayString a3(a1); - CPPUNIT_ASSERT((COMPARE_8_VALUES( a3 , wxT("alligator") , + CHECK((COMPARE_8_VALUES( a3 , wxT("alligator") , wxT("condor") , wxT("dog") , wxT("human") , @@ -201,13 +201,13 @@ TEST_CASE("wxArrayString", "[dynarray]") wxT("lion") , wxT("lion") , wxT("thermit") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a3 , 8 ) ); + CHECK( COMPARE_COUNT( a3 , 8 ) ); wxSortedArrayString a4; for (wxArrayString::iterator it = a1.begin(), en = a1.end(); it != en; ++it) a4.Add(*it); - CPPUNIT_ASSERT((COMPARE_8_VALUES( a4 , wxT("alligator") , + CHECK((COMPARE_8_VALUES( a4 , wxT("alligator") , wxT("condor") , wxT("dog") , wxT("human") , @@ -215,97 +215,97 @@ TEST_CASE("wxArrayString", "[dynarray]") wxT("lion") , wxT("lion") , wxT("thermit") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a4 , 8 ) ); + CHECK( COMPARE_COUNT( a4 , 8 ) ); a1.RemoveAt(2,3); - CPPUNIT_ASSERT((COMPARE_5_VALUES( a1 , wxT("thermit") , + CHECK((COMPARE_5_VALUES( a1 , wxT("thermit") , wxT("condor") , wxT("dog") , wxT("human") , wxT("alligator") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a1 , 5 ) ); + CHECK( COMPARE_COUNT( a1 , 5 ) ); a2 = a1; - CPPUNIT_ASSERT((COMPARE_5_VALUES( a2 , wxT("thermit") , + CHECK((COMPARE_5_VALUES( a2 , wxT("thermit") , wxT("condor") , wxT("dog") , wxT("human") , wxT("alligator") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a2 , 5 ) ); + CHECK( COMPARE_COUNT( a2 , 5 ) ); a1.Sort(false); - CPPUNIT_ASSERT((COMPARE_5_VALUES( a1 , wxT("alligator") , + CHECK((COMPARE_5_VALUES( a1 , wxT("alligator") , wxT("condor") , wxT("dog") , wxT("human") , wxT("thermit") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a1 , 5 ) ); + CHECK( COMPARE_COUNT( a1 , 5 ) ); a1.Sort(true); - CPPUNIT_ASSERT((COMPARE_5_VALUES( a1 , wxT("thermit") , + CHECK((COMPARE_5_VALUES( a1 , wxT("thermit") , wxT("human") , wxT("dog") , wxT("condor") , wxT("alligator") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a1 , 5 ) ); + CHECK( COMPARE_COUNT( a1 , 5 ) ); a1.Sort(&StringLenCompare); - CPPUNIT_ASSERT((COMPARE_5_VALUES( a1 , wxT("dog") , + CHECK((COMPARE_5_VALUES( a1 , wxT("dog") , wxT("human") , wxT("condor") , wxT("thermit") , wxT("alligator") ))); - CPPUNIT_ASSERT( COMPARE_COUNT( a1 , 5 ) ); - CPPUNIT_ASSERT( a1.Index( wxT("dog") ) == 0 ); - CPPUNIT_ASSERT( a1.Index( wxT("human") ) == 1 ); - CPPUNIT_ASSERT( a1.Index( wxT("humann") ) == wxNOT_FOUND ); - CPPUNIT_ASSERT( a1.Index( wxT("condor") ) == 2 ); - CPPUNIT_ASSERT( a1.Index( wxT("thermit") ) == 3 ); - CPPUNIT_ASSERT( a1.Index( wxT("alligator") ) == 4 ); + CHECK( COMPARE_COUNT( a1 , 5 ) ); + CHECK( a1.Index( wxT("dog") ) == 0 ); + CHECK( a1.Index( wxT("human") ) == 1 ); + CHECK( a1.Index( wxT("humann") ) == wxNOT_FOUND ); + CHECK( a1.Index( wxT("condor") ) == 2 ); + CHECK( a1.Index( wxT("thermit") ) == 3 ); + CHECK( a1.Index( wxT("alligator") ) == 4 ); - CPPUNIT_ASSERT( a1.Index( wxT("dog"), /*bCase=*/true, /*fromEnd=*/true ) == 0 ); - CPPUNIT_ASSERT( a1.Index( wxT("human"), /*bCase=*/true, /*fromEnd=*/true ) == 1 ); - CPPUNIT_ASSERT( a1.Index( wxT("humann"), /*bCase=*/true, /*fromEnd=*/true ) == wxNOT_FOUND ); - CPPUNIT_ASSERT( a1.Index( wxT("condor"), /*bCase=*/true, /*fromEnd=*/true ) == 2 ); - CPPUNIT_ASSERT( a1.Index( wxT("thermit"), /*bCase=*/true, /*fromEnd=*/true ) == 3 ); - CPPUNIT_ASSERT( a1.Index( wxT("alligator"), /*bCase=*/true, /*fromEnd=*/true ) == 4 ); + CHECK( a1.Index( wxT("dog"), /*bCase=*/true, /*fromEnd=*/true ) == 0 ); + CHECK( a1.Index( wxT("human"), /*bCase=*/true, /*fromEnd=*/true ) == 1 ); + CHECK( a1.Index( wxT("humann"), /*bCase=*/true, /*fromEnd=*/true ) == wxNOT_FOUND ); + CHECK( a1.Index( wxT("condor"), /*bCase=*/true, /*fromEnd=*/true ) == 2 ); + CHECK( a1.Index( wxT("thermit"), /*bCase=*/true, /*fromEnd=*/true ) == 3 ); + CHECK( a1.Index( wxT("alligator"), /*bCase=*/true, /*fromEnd=*/true ) == 4 ); wxArrayString a5; - CPPUNIT_ASSERT( a5.Add( wxT("x"), 1 ) == 0 ); - CPPUNIT_ASSERT( a5.Add( wxT("a"), 3 ) == 1 ); + CHECK( a5.Add( wxT("x"), 1 ) == 0 ); + CHECK( a5.Add( wxT("a"), 3 ) == 1 ); - CPPUNIT_ASSERT((COMPARE_4_VALUES( a5, wxT("x") , + CHECK((COMPARE_4_VALUES( a5, wxT("x") , wxT("a") , wxT("a") , wxT("a") ))); a5.assign(a1.end(), a1.end()); - CPPUNIT_ASSERT( a5.empty() ); + CHECK( a5.empty() ); a5.assign(a1.begin(), a1.end()); - CPPUNIT_ASSERT( a5 == a1 ); + CHECK( a5 == a1 ); const wxString months[] = { "Jan", "Feb", "Mar" }; a5.assign(months, months + WXSIZEOF(months)); - CPPUNIT_ASSERT_EQUAL( WXSIZEOF(months), a5.size() ); - CPPUNIT_ASSERT((COMPARE_3_VALUES(a5, "Jan", "Feb", "Mar"))); + CHECK( a5.size() == WXSIZEOF(months) ); + CHECK((COMPARE_3_VALUES(a5, "Jan", "Feb", "Mar"))); a5.clear(); - CPPUNIT_ASSERT_EQUAL( 0, a5.size() ); + CHECK( a5.size() == 0 ); a5.resize(7, "Foo"); - CPPUNIT_ASSERT_EQUAL( 7, a5.size() ); - CPPUNIT_ASSERT_EQUAL( "Foo", a5[3] ); + CHECK( a5.size() == 7 ); + CHECK( a5[3] == "Foo" ); a5.resize(3); - CPPUNIT_ASSERT_EQUAL( 3, a5.size() ); - CPPUNIT_ASSERT_EQUAL( "Foo", a5[2] ); + CHECK( a5.size() == 3 ); + CHECK( a5[2] == "Foo" ); wxArrayString a6; a6.Add("Foo"); @@ -317,10 +317,10 @@ TEST_CASE("wxArrayString", "[dynarray]") wxArrayString a7; a7 = a7; - CPPUNIT_ASSERT_EQUAL( 0, a7.size() ); + CHECK( a7.size() == 0 ); a7.Add("Bar"); a7 = a7; - CPPUNIT_ASSERT_EQUAL( 1, a7.size() ); + CHECK( a7.size() == 1 ); wxCLANG_WARNING_RESTORE(self-assign-overloaded) } @@ -330,30 +330,30 @@ TEST_CASE("wxSortedArrayString", "[dynarray]") wxSortedArrayString a; a.Add("d"); a.Add("c"); - CPPUNIT_ASSERT_EQUAL( 0, a.Index("c") ); + CHECK( a.Index("c") == 0 ); a.push_back("b"); a.push_back("a"); - CPPUNIT_ASSERT_EQUAL( 0, a.Index("a") ); + CHECK( a.Index("a") == 0 ); wxSortedArrayString ar(wxStringSortDescending); ar.Add("a"); ar.Add("b"); - CPPUNIT_ASSERT_EQUAL( "b", ar[0] ); - CPPUNIT_ASSERT_EQUAL( "a", ar[1] ); + CHECK( ar[0] == "b" ); + CHECK( ar[1] == "a" ); wxSortedArrayString ad(wxDictionaryStringSortAscending); ad.Add("AB"); ad.Add("a"); ad.Add("Aa"); - CPPUNIT_ASSERT_EQUAL( "a", ad[0] ); - CPPUNIT_ASSERT_EQUAL( "Aa", ad[1] ); - CPPUNIT_ASSERT_EQUAL( 0, ad.Index("a") ); - CPPUNIT_ASSERT_EQUAL( 1, ad.Index("Aa") ); - CPPUNIT_ASSERT_EQUAL( 2, ad.Index("AB") ); - CPPUNIT_ASSERT_EQUAL( wxNOT_FOUND, ad.Index("A") ); - CPPUNIT_ASSERT_EQUAL( wxNOT_FOUND, ad.Index("z") ); + CHECK( ad[0] == "a" ); + CHECK( ad[1] == "Aa" ); + CHECK( ad.Index("a") == 0 ); + CHECK( ad.Index("Aa") == 1 ); + CHECK( ad.Index("AB") == 2 ); + CHECK( ad.Index("A") == wxNOT_FOUND ); + CHECK( ad.Index("z") == wxNOT_FOUND ); } TEST_CASE("Arrays::Split", "[dynarray]") @@ -368,7 +368,7 @@ TEST_CASE("Arrays::Split", "[dynarray]") wxArrayString exparr(WXSIZEOF(expected), expected); wxArrayString realarr(wxSplit(str, wxT(','))); - CPPUNIT_ASSERT( exparr == realarr ); + CHECK( exparr == realarr ); } { @@ -381,12 +381,12 @@ TEST_CASE("Arrays::Split", "[dynarray]") // escaping on: wxArrayString exparr(WXSIZEOF(expected), expected); wxArrayString realarr(wxSplit(str, wxT(','), wxT('\\'))); - CPPUNIT_ASSERT( exparr == realarr ); + CHECK( exparr == realarr ); // escaping turned off: wxArrayString exparr2(WXSIZEOF(expected2), expected2); wxArrayString realarr2(wxSplit(str, wxT(','), wxT('\0'))); - CPPUNIT_ASSERT( exparr2 == realarr2 ); + CHECK( exparr2 == realarr2 ); } { @@ -402,12 +402,12 @@ TEST_CASE("Arrays::Split", "[dynarray]") // escaping on: wxArrayString exparr(WXSIZEOF(expected), expected); wxArrayString realarr(wxSplit(str, wxT(','), wxT('\\'))); - CPPUNIT_ASSERT( exparr == realarr ); + CHECK( exparr == realarr ); // escaping turned off: wxArrayString exparr2(WXSIZEOF(expected2), expected2); wxArrayString realarr2(wxSplit(str, wxT(','), wxT('\0'))); - CPPUNIT_ASSERT( exparr2 == realarr2 ); + CHECK( exparr2 == realarr2 ); } } @@ -421,7 +421,7 @@ TEST_CASE("Arrays::Join", "[dynarray]") wxArrayString arrstr(WXSIZEOF(arr), arr); wxString result = wxJoin(arrstr, wxT(',')); - CPPUNIT_ASSERT( expected == result ); + CHECK( expected == result ); } { @@ -432,11 +432,11 @@ TEST_CASE("Arrays::Join", "[dynarray]") // escaping on: wxArrayString arrstr(WXSIZEOF(arr), arr); wxString result = wxJoin(arrstr, wxT(','), wxT('\\')); - CPPUNIT_ASSERT( expected == result ); + CHECK( expected == result ); // escaping turned off: wxString result2 = wxJoin(arrstr, wxT(','), wxT('\0')); - CPPUNIT_ASSERT( expected2 == result2 ); + CHECK( expected2 == result2 ); } { @@ -448,11 +448,11 @@ TEST_CASE("Arrays::Join", "[dynarray]") // escaping on: wxArrayString arrstr(WXSIZEOF(arr), arr); wxString result = wxJoin(arrstr, wxT(','), wxT('\\')); - CPPUNIT_ASSERT( expected == result ); + CHECK( expected == result ); // escaping turned off: wxString result2 = wxJoin(arrstr, wxT(','), wxT('\0')); - CPPUNIT_ASSERT( expected2 == result2 ); + CHECK( expected2 == result2 ); } } @@ -481,7 +481,7 @@ TEST_CASE("Arrays::SplitJoin", "[dynarray]") for (i = 0; i < WXSIZEOF(separators); i++) { wxArrayString arr = wxSplit(str, separators[i]); - CPPUNIT_ASSERT( str == wxJoin(arr, separators[i]) ); + CHECK( str == wxJoin(arr, separators[i]) ); } @@ -498,16 +498,16 @@ TEST_CASE("Arrays::SplitJoin", "[dynarray]") for (i = 0; i < WXSIZEOF(separators); i++) { wxString string = wxJoin(theArr, separators[i]); - CPPUNIT_ASSERT( theArr == wxSplit(string, separators[i]) ); + CHECK( theArr == wxSplit(string, separators[i]) ); } wxArrayString emptyArray; wxString string = wxJoin(emptyArray, wxT(';')); - CPPUNIT_ASSERT( string.empty() ); + CHECK( string.empty() ); - CPPUNIT_ASSERT( wxSplit(string, wxT(';')).empty() ); + CHECK( wxSplit(string, wxT(';')).empty() ); - CPPUNIT_ASSERT_EQUAL( 2, wxSplit(wxT(";"), wxT(';')).size() ); + CHECK( wxSplit(wxT(";"), wxT(';')).size() == 2 ); } TEST_CASE("wxObjArray", "[dynarray]") @@ -516,33 +516,33 @@ TEST_CASE("wxObjArray", "[dynarray]") ArrayBars bars; Bar bar(wxT("first bar in general, second bar in array (two copies!)")); - CPPUNIT_ASSERT_EQUAL( 0, bars.GetCount() ); - CPPUNIT_ASSERT_EQUAL( 1, Bar::GetNumber() ); + CHECK( bars.GetCount() == 0 ); + CHECK( Bar::GetNumber() == 1 ); bars.Add(new Bar(wxT("first bar in array"))); bars.Add(bar, 2); - CPPUNIT_ASSERT_EQUAL( 3, bars.GetCount() ); - CPPUNIT_ASSERT_EQUAL( 4, Bar::GetNumber() ); + CHECK( bars.GetCount() == 3 ); + CHECK( Bar::GetNumber() == 4 ); bars.RemoveAt(1, bars.GetCount() - 1); - CPPUNIT_ASSERT_EQUAL( 1, bars.GetCount() ); - CPPUNIT_ASSERT_EQUAL( 2, Bar::GetNumber() ); + CHECK( bars.GetCount() == 1 ); + CHECK( Bar::GetNumber() == 2 ); bars.Empty(); - CPPUNIT_ASSERT_EQUAL( 0, bars.GetCount() ); - CPPUNIT_ASSERT_EQUAL( 1, Bar::GetNumber() ); + CHECK( bars.GetCount() == 0 ); + CHECK( Bar::GetNumber() == 1 ); } - CPPUNIT_ASSERT_EQUAL( 0, Bar::GetNumber() ); + CHECK( Bar::GetNumber() == 0 ); } TEST_CASE("wxObjArrayPtr", "[dynarray]") { // Just check that instantiating this class compiles. ArrayBarPtrs barptrs; - CPPUNIT_ASSERT_EQUAL( 0, barptrs.size() ); + CHECK( barptrs.size() == 0 ); } #define TestArrayOf(name) \ @@ -555,18 +555,18 @@ TEST_CASE("wxDynArray::" #name, "[dynarray]") \ a.Add(5,3); \ a.Add(3,4); \ \ - CPPUNIT_ASSERT((COMPARE_10_VALUES(a,1,17,17,5,5,5,3,3,3,3))); \ - CPPUNIT_ASSERT( COMPARE_COUNT( a , 10 ) ); \ + CHECK((COMPARE_10_VALUES(a,1,17,17,5,5,5,3,3,3,3))); \ + CHECK( COMPARE_COUNT( a , 10 ) ); \ \ a.Sort(name ## Compare); \ \ - CPPUNIT_ASSERT((COMPARE_10_VALUES(a,1,3,3,3,3,5,5,5,17,17))); \ - CPPUNIT_ASSERT( COMPARE_COUNT( a , 10 ) ); \ + CHECK((COMPARE_10_VALUES(a,1,3,3,3,3,5,5,5,17,17))); \ + CHECK( COMPARE_COUNT( a , 10 ) ); \ \ a.Sort(name ## RevCompare); \ \ - CPPUNIT_ASSERT((COMPARE_10_VALUES(a,17,17,5,5,5,3,3,3,3,1))); \ - CPPUNIT_ASSERT( COMPARE_COUNT( a , 10 ) ); \ + CHECK((COMPARE_10_VALUES(a,17,17,5,5,5,3,3,3,3,1))); \ + CHECK( COMPARE_COUNT( a , 10 ) ); \ \ wxSortedArray##name b; \ \ @@ -575,15 +575,15 @@ TEST_CASE("wxDynArray::" #name, "[dynarray]") \ b.Add(5); \ b.Add(3); \ \ - CPPUNIT_ASSERT((COMPARE_4_VALUES(b,1,3,5,17))); \ - CPPUNIT_ASSERT( COMPARE_COUNT( b , 4 ) ); \ - CPPUNIT_ASSERT( b.Index( 0 ) == wxNOT_FOUND ); \ - CPPUNIT_ASSERT( b.Index( 1 ) == 0 ); \ - CPPUNIT_ASSERT( b.Index( 3 ) == 1 ); \ - CPPUNIT_ASSERT( b.Index( 4 ) == wxNOT_FOUND ); \ - CPPUNIT_ASSERT( b.Index( 5 ) == 2 ); \ - CPPUNIT_ASSERT( b.Index( 6 ) == wxNOT_FOUND ); \ - CPPUNIT_ASSERT( b.Index( 17 ) == 3 ); \ + CHECK((COMPARE_4_VALUES(b,1,3,5,17))); \ + CHECK( COMPARE_COUNT( b , 4 ) ); \ + CHECK( b.Index( 0 ) == wxNOT_FOUND ); \ + CHECK( b.Index( 1 ) == 0 ); \ + CHECK( b.Index( 3 ) == 1 ); \ + CHECK( b.Index( 4 ) == wxNOT_FOUND ); \ + CHECK( b.Index( 5 ) == 2 ); \ + CHECK( b.Index( 6 ) == wxNOT_FOUND ); \ + CHECK( b.Index( 17 ) == 3 ); \ } TestArrayOf(UShort) @@ -597,13 +597,13 @@ TEST_CASE("wxDynArray::Alloc", "[dynarray]") wxArrayInt a; a.Add(17); a.Add(9); - CPPUNIT_ASSERT_EQUAL( 2, a.GetCount() ); + CHECK( a.GetCount() == 2 ); a.Alloc(1000); - CPPUNIT_ASSERT_EQUAL( 2, a.GetCount() ); - CPPUNIT_ASSERT_EQUAL( 17, a[0] ); - CPPUNIT_ASSERT_EQUAL( 9, a[1] ); + CHECK( a.GetCount() == 2 ); + CHECK( a[0] == 17 ); + CHECK( a[1] == 9 ); } TEST_CASE("wxDynArray::Clear", "[dynarray]") @@ -611,14 +611,14 @@ TEST_CASE("wxDynArray::Clear", "[dynarray]") ItemPtrArray items; WX_CLEAR_ARRAY(items); - CPPUNIT_ASSERT_EQUAL( 0, items.size() ); + CHECK( items.size() == 0 ); items.push_back(new Item(17)); items.push_back(new Item(71)); - CPPUNIT_ASSERT_EQUAL( 2, items.size() ); + CHECK( items.size() == 2 ); WX_CLEAR_ARRAY(items); - CPPUNIT_ASSERT_EQUAL( 0, items.size() ); + CHECK( items.size() == 0 ); } namespace @@ -629,25 +629,25 @@ void DoTestSwap(T v1, T v2, T v3) { A a1, a2; a1.swap(a2); - CPPUNIT_ASSERT( a1.empty() ); - CPPUNIT_ASSERT( a2.empty() ); + CHECK( a1.empty() ); + CHECK( a2.empty() ); a1.push_back(v1); a1.swap(a2); - CPPUNIT_ASSERT( a1.empty() ); - CPPUNIT_ASSERT_EQUAL( 1, a2.size() ); + CHECK( a1.empty() ); + CHECK( a2.size() == 1 ); a1.push_back(v2); a1.push_back(v3); a2.swap(a1); - CPPUNIT_ASSERT_EQUAL( 1, a1.size() ); - CPPUNIT_ASSERT_EQUAL( 2, a2.size() ); - CPPUNIT_ASSERT_EQUAL( v1, a1[0] ); - CPPUNIT_ASSERT_EQUAL( v3, a2[1] ); + CHECK( a1.size() == 1 ); + CHECK( a2.size() == 2 ); + CHECK( a1[0] == v1 ); + CHECK( a2[1] == v3 ); a1.swap(a2); - CPPUNIT_ASSERT_EQUAL( 2, a1.size() ); - CPPUNIT_ASSERT_EQUAL( 1, a2.size() ); + CHECK( a1.size() == 2 ); + CHECK( a2.size() == 1 ); } } // anonymous namespace @@ -671,35 +671,35 @@ TEST_CASE("wxDynArray::TestSTL", "[dynarray]") for ( i = 0; i < COUNT; ++i ) list1.push_back(i); - CPPUNIT_ASSERT( list1.capacity() >= (size_t)COUNT ); - CPPUNIT_ASSERT_EQUAL( COUNT, list1.size() ); + CHECK( list1.capacity() >= (size_t)COUNT ); + CHECK( list1.size() == COUNT ); for ( it = list1.begin(), en = list1.end(), i = 0; it != en; ++it, ++i ) { - CPPUNIT_ASSERT( *it == i ); + CHECK( *it == i ); } - CPPUNIT_ASSERT_EQUAL( COUNT, i ); + CHECK( i == COUNT ); for ( rit = list1.rbegin(), ren = list1.rend(), i = COUNT; rit != ren; ++rit, --i ) { - CPPUNIT_ASSERT( *rit == i-1 ); + CHECK( *rit == i-1 ); } - CPPUNIT_ASSERT_EQUAL( 0, i ); + CHECK( i == 0 ); - CPPUNIT_ASSERT( *list1.rbegin() == *(list1.end()-1) ); - CPPUNIT_ASSERT( *list1.begin() == *(list1.rend()-1) ); + CHECK( *list1.rbegin() == *(list1.end()-1) ); + CHECK( *list1.begin() == *(list1.rend()-1) ); it = list1.begin()+1; rit = list1.rbegin()+1; - CPPUNIT_ASSERT( *list1.begin() == *(it-1) ); - CPPUNIT_ASSERT( *list1.rbegin() == *(rit-1) ); + CHECK( *list1.begin() == *(it-1) ); + CHECK( *list1.rbegin() == *(rit-1) ); - CPPUNIT_ASSERT( list1.front() == 0 ); - CPPUNIT_ASSERT( list1.back() == COUNT - 1 ); + CHECK( list1.front() == 0 ); + CHECK( list1.back() == COUNT - 1 ); list1.erase(list1.begin()); list1.erase(list1.end()-1); @@ -707,14 +707,14 @@ TEST_CASE("wxDynArray::TestSTL", "[dynarray]") for ( it = list1.begin(), en = list1.end(), i = 1; it != en; ++it, ++i ) { - CPPUNIT_ASSERT( *it == i ); + CHECK( *it == i ); } ItemPtrArray items; items.push_back(new Item(17)); - CPPUNIT_ASSERT_EQUAL( 17, (*(items.rbegin()))->n ); - CPPUNIT_ASSERT_EQUAL( 17, (**items.begin()).n ); + CHECK( (*(items.rbegin()))->n == 17 ); + CHECK( (**items.begin()).n == 17 ); WX_CLEAR_ARRAY(items); } @@ -725,12 +725,12 @@ TEST_CASE("wxDynArray::IndexFromEnd", "[dynarray]") a.push_back(1); a.push_back(42); - CPPUNIT_ASSERT_EQUAL( 0, a.Index(10) ); - CPPUNIT_ASSERT_EQUAL( 1, a.Index(1) ); - CPPUNIT_ASSERT_EQUAL( 2, a.Index(42) ); - CPPUNIT_ASSERT_EQUAL( 0, a.Index(10, /*bFromEnd=*/true) ); - CPPUNIT_ASSERT_EQUAL( 1, a.Index(1, /*bFromEnd=*/true) ); - CPPUNIT_ASSERT_EQUAL( 2, a.Index(42, /*bFromEnd=*/true) ); + CHECK( a.Index(10) == 0 ); + CHECK( a.Index(1) == 1 ); + CHECK( a.Index(42) == 2 ); + CHECK( a.Index(10, /*bFromEnd=*/true) == 0 ); + CHECK( a.Index( 1, /*bFromEnd=*/true) == 1 ); + CHECK( a.Index(42, /*bFromEnd=*/true) == 2 ); }