]>
git.saurik.com Git - wxWidgets.git/blob - tests/arrays/arrays.cpp
c6fa3f3bd40e70e253fb2ecf066a244696a8a32b
   1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        tests/arrays/arrays.cpp 
   3 // Purpose:     wxArray unit test 
   4 // Author:      Vadim Zeitlin, Wlodzimierz ABX Skiba 
   7 // Copyright:   (c) 2004 Vadim Zeitlin, Wlodzimierz Skiba 
   8 /////////////////////////////////////////////////////////////////////////////// 
  10 // ---------------------------------------------------------------------------- 
  12 // ---------------------------------------------------------------------------- 
  24 #include "wx/dynarray.h" 
  26 // ---------------------------------------------------------------------------- 
  27 // helpers for testing values and sizes 
  28 // ---------------------------------------------------------------------------- 
  30 #define COMPARE_VALUE( array , index , value ) ( array.Item( index ) == value ) 
  32 #define COMPARE_2_VALUES( array , p0 , p1 ) \ 
  33     COMPARE_VALUE( array , 0 , p0 ) && \ 
  34     COMPARE_VALUE( array , 1 , p1 ) 
  36 #define COMPARE_3_VALUES( array , p0 , p1 , p2 ) \ 
  37     COMPARE_2_VALUES( array , p0 , p1 ) && \ 
  38     COMPARE_VALUE( array , 2 , p2 ) 
  40 #define COMPARE_4_VALUES( array , p0 , p1 , p2 , p3 ) \ 
  41     COMPARE_3_VALUES( array , p0 , p1 , p2 ) && \ 
  42     COMPARE_VALUE( array , 3 , p3 ) 
  44 #define COMPARE_5_VALUES( array , p0 , p1 , p2 , p3 , p4 ) \ 
  45     COMPARE_4_VALUES( array , p0 , p1 , p2 , p3 ) && \ 
  46     COMPARE_VALUE( array , 4 , p4 ) 
  48 #define COMPARE_6_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 ) \ 
  49     COMPARE_5_VALUES( array , p0 , p1 , p2 , p3 , p4 ) && \ 
  50     COMPARE_VALUE( array , 5 , p5 ) 
  52 #define COMPARE_7_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 ) \ 
  53     COMPARE_6_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 ) && \ 
  54     COMPARE_VALUE( array , 6 , p6 ) 
  56 #define COMPARE_8_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 , p7 ) \ 
  57     COMPARE_7_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 ) && \ 
  58     COMPARE_VALUE( array , 7 , p7 ) 
  60 #define COMPARE_9_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 ) \ 
  61     COMPARE_8_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 , p7 ) && \ 
  62     COMPARE_VALUE( array , 8 , p8 ) 
  64 #define COMPARE_10_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 , p9 ) \ 
  65     COMPARE_9_VALUES( array , p0 , p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8 ) && \ 
  66     COMPARE_VALUE( array , 9 , p9 ) 
  68 #define COMPARE_COUNT( array , n ) \ 
  69     ( array.GetCount() == n ) && \ 
  70     ( array.Last() == array.Item( n - 1 ) ) 
  72 // ---------------------------------------------------------------------------- 
  73 // helpers for testing wxObjArray 
  74 // ---------------------------------------------------------------------------- 
  79     Bar(const wxString
& name
) : m_name(name
) { ms_bars
++; } 
  80     Bar(const Bar
& bar
) : m_name(bar
.m_name
) { ms_bars
++; } 
  83    static size_t GetNumber() { return ms_bars
; } 
  85    const wxChar 
*GetName() const { return m_name
; } 
  90    static size_t ms_bars
; 
  93 size_t Bar::ms_bars 
= 0; 
  95 WX_DECLARE_OBJARRAY(Bar
, ArrayBars
); 
  96 #include "wx/arrimpl.cpp" 
  97 WX_DEFINE_OBJARRAY(ArrayBars
); 
  99 // ---------------------------------------------------------------------------- 
 100 // helpers for sorting arrays and comparing items 
 101 // ---------------------------------------------------------------------------- 
 103 int wxCMPFUNC_CONV 
StringLenCompare(const wxString
& first
, 
 104                                     const wxString
& second
) 
 106     return first
.length() - second
.length(); 
 109 #define DEFINE_COMPARE(name, T)                                               \ 
 111 int wxCMPFUNC_CONV name ## CompareValues(T first, T second)                   \ 
 113     return first - second;                                                    \ 
 116 int wxCMPFUNC_CONV name ## Compare(T* first, T* second)                       \ 
 118     return *first - *second;                                                  \ 
 121 int wxCMPFUNC_CONV name ## RevCompare(T* first, T* second)                    \ 
 123     return *second - *first;                                                  \ 
 126 typedef unsigned short ushort; 
 128 DEFINE_COMPARE(UShort
, ushort
); 
 129 DEFINE_COMPARE(Int
, int); 
 131 WX_DEFINE_ARRAY_SHORT(ushort
, wxArrayUShort
); 
 132 WX_DEFINE_SORTED_ARRAY_SHORT(ushort
, wxSortedArrayUShortNoCmp
); 
 133 WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort
, UShortCompareValues
, wxSortedArrayUShort
); 
 134 WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues
, wxSortedArrayInt
); 
 136 // ---------------------------------------------------------------------------- 
 138 // ---------------------------------------------------------------------------- 
 140 class ArraysTestCase 
: public CppUnit::TestCase
 
 146     CPPUNIT_TEST_SUITE( ArraysTestCase 
); 
 147         CPPUNIT_TEST( wxStringArrayTest 
); 
 148         CPPUNIT_TEST( wxObjArrayTest 
); 
 149         CPPUNIT_TEST( wxArrayUShortTest 
); 
 150         CPPUNIT_TEST( wxArrayIntTest 
); 
 151         CPPUNIT_TEST( TestSTL 
); 
 152         CPPUNIT_TEST( Alloc 
); 
 153     CPPUNIT_TEST_SUITE_END(); 
 155     void wxStringArrayTest(); 
 156     void wxObjArrayTest(); 
 157     void wxArrayUShortTest(); 
 158     void wxArrayIntTest(); 
 162     DECLARE_NO_COPY_CLASS(ArraysTestCase
) 
 165 // register in the unnamed registry so that these tests are run by default 
 166 CPPUNIT_TEST_SUITE_REGISTRATION( ArraysTestCase 
); 
 168 // also include in it's own registry so that these tests can be run alone 
 169 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ArraysTestCase
, "ArraysTestCase" ); 
 171 void ArraysTestCase::wxStringArrayTest() 
 174     a1
.Add(_T("thermit")); 
 175     a1
.Add(_T("condor")); 
 176     a1
.Add(_T("lion"), 3); 
 179     a1
.Add(_T("alligator")); 
 181     CPPUNIT_ASSERT( COMPARE_8_VALUES( a1 
, _T("thermit") , 
 189     CPPUNIT_ASSERT( COMPARE_COUNT( a1 
, 8 ) ); 
 191     wxArrayString 
a2(a1
); 
 193     CPPUNIT_ASSERT( COMPARE_8_VALUES( a2 
, _T("thermit") , 
 201     CPPUNIT_ASSERT( COMPARE_COUNT( a2 
, 8 ) ); 
 203     wxSortedArrayString 
a3(a1
); 
 205     CPPUNIT_ASSERT( COMPARE_8_VALUES( a3 
, _T("alligator") , 
 213     CPPUNIT_ASSERT( COMPARE_COUNT( a3 
, 8 ) ); 
 215     wxSortedArrayString a4
; 
 216     for (wxArrayString::iterator it 
= a1
.begin(), en 
= a1
.end(); it 
!= en
; ++it
) 
 219     CPPUNIT_ASSERT( COMPARE_8_VALUES( a4 
, _T("alligator") , 
 227     CPPUNIT_ASSERT( COMPARE_COUNT( a4 
, 8 ) ); 
 231     CPPUNIT_ASSERT( COMPARE_5_VALUES( a1 
, _T("thermit") , 
 236     CPPUNIT_ASSERT( COMPARE_COUNT( a1 
, 5 ) ); 
 240     CPPUNIT_ASSERT( COMPARE_5_VALUES( a2 
, _T("thermit") , 
 245     CPPUNIT_ASSERT( COMPARE_COUNT( a2 
, 5 ) ); 
 249     CPPUNIT_ASSERT( COMPARE_5_VALUES( a1 
, _T("alligator") , 
 254     CPPUNIT_ASSERT( COMPARE_COUNT( a1 
, 5 ) ); 
 258     CPPUNIT_ASSERT( COMPARE_5_VALUES( a1 
, _T("thermit") , 
 263     CPPUNIT_ASSERT( COMPARE_COUNT( a1 
, 5 ) ); 
 265     a1
.Sort(&StringLenCompare
); 
 267     CPPUNIT_ASSERT( COMPARE_5_VALUES( a1 
, _T("dog") , 
 272     CPPUNIT_ASSERT( COMPARE_COUNT( a1 
, 5 ) ); 
 273     CPPUNIT_ASSERT( a1
.Index( _T("dog") ) == 0 ); 
 274     CPPUNIT_ASSERT( a1
.Index( _T("human") ) == 1 ); 
 275     CPPUNIT_ASSERT( a1
.Index( _T("humann") ) == wxNOT_FOUND 
); 
 276     CPPUNIT_ASSERT( a1
.Index( _T("condor") ) == 2 ); 
 277     CPPUNIT_ASSERT( a1
.Index( _T("thermit") ) == 3 ); 
 278     CPPUNIT_ASSERT( a1
.Index( _T("alligator") ) == 4 ); 
 282     CPPUNIT_ASSERT( a5
.Add( _T("x"), 1 ) == 0 ); 
 283     CPPUNIT_ASSERT( a5
.Add( _T("a"), 3 ) == 1 ); 
 285     CPPUNIT_ASSERT( COMPARE_4_VALUES( a5
, _T("x") , 
 291 void ArraysTestCase::wxObjArrayTest() 
 295         Bar 
bar(_T("first bar in general, second bar in array (two copies!)")); 
 297         CPPUNIT_ASSERT( bars
.GetCount() == 0 ); 
 298         CPPUNIT_ASSERT( Bar::GetNumber() == 1 ); 
 300         bars
.Add(new Bar(_T("first bar in array"))); 
 303         CPPUNIT_ASSERT( bars
.GetCount() == 3 ); 
 304         CPPUNIT_ASSERT( Bar::GetNumber() == 4 ); 
 306         bars
.RemoveAt(1, bars
.GetCount() - 1); 
 308         CPPUNIT_ASSERT( bars
.GetCount() == 1 ); 
 309         CPPUNIT_ASSERT( Bar::GetNumber() == 2 ); 
 313         CPPUNIT_ASSERT( bars
.GetCount() == 0 ); 
 314         CPPUNIT_ASSERT( Bar::GetNumber() == 1 ); 
 316     CPPUNIT_ASSERT( Bar::GetNumber() == 0 ); 
 319 #define TestArrayOf(name)                                                     \ 
 321 void ArraysTestCase::wxArray ## name ## Test()                                \ 
 329     CPPUNIT_ASSERT( COMPARE_10_VALUES(a,1,17,17,5,5,5,3,3,3,3) );             \ 
 330     CPPUNIT_ASSERT( COMPARE_COUNT( a , 10 ) );                                \ 
 332     a.Sort(name ## Compare);                                                  \ 
 334     CPPUNIT_ASSERT( COMPARE_10_VALUES(a,1,3,3,3,3,5,5,5,17,17) );             \ 
 335     CPPUNIT_ASSERT( COMPARE_COUNT( a , 10 ) );                                \ 
 337     a.Sort(name ## RevCompare);                                               \ 
 339     CPPUNIT_ASSERT( COMPARE_10_VALUES(a,17,17,5,5,5,3,3,3,3,1) );             \ 
 340     CPPUNIT_ASSERT( COMPARE_COUNT( a , 10 ) );                                \ 
 342     wxSortedArray##name b;                                                    \ 
 349     CPPUNIT_ASSERT( COMPARE_4_VALUES(b,1,3,5,17) );                           \ 
 350     CPPUNIT_ASSERT( COMPARE_COUNT( b , 4 ) );                                 \ 
 351     CPPUNIT_ASSERT( b.Index( 0 ) == wxNOT_FOUND );                            \ 
 352     CPPUNIT_ASSERT( b.Index( 1 ) == 0 );                                      \ 
 353     CPPUNIT_ASSERT( b.Index( 3 ) == 1 );                                      \ 
 354     CPPUNIT_ASSERT( b.Index( 4 ) == wxNOT_FOUND );                            \ 
 355     CPPUNIT_ASSERT( b.Index( 5 ) == 2 );                                      \ 
 356     CPPUNIT_ASSERT( b.Index( 6 ) == wxNOT_FOUND );                            \ 
 357     CPPUNIT_ASSERT( b.Index( 17 ) == 3 );                                     \ 
 364 void ArraysTestCase::Alloc() 
 369     CPPUNIT_ASSERT_EQUAL( 2u, a
.GetCount() ); 
 373     CPPUNIT_ASSERT_EQUAL( 2u, a
.GetCount() ); 
 374     CPPUNIT_ASSERT_EQUAL( 17, a
[0] ); 
 375     CPPUNIT_ASSERT_EQUAL( 9, a
[1] ); 
 378 void ArraysTestCase::TestSTL() 
 381     wxArrayInt::iterator it
, en
; 
 382     wxArrayInt::reverse_iterator rit
, ren
; 
 384     static const int COUNT 
= 5; 
 386     for ( i 
= 0; i 
< COUNT
; ++i 
) 
 389     CPPUNIT_ASSERT( list1
.capacity() >= (size_t)COUNT 
); 
 390     CPPUNIT_ASSERT_EQUAL( (size_t)COUNT
, list1
.size() ); 
 392     for ( it 
= list1
.begin(), en 
= list1
.end(), i 
= 0; 
 393           it 
!= en
; ++it
, ++i 
) 
 395         CPPUNIT_ASSERT( *it 
== i 
); 
 398     CPPUNIT_ASSERT_EQUAL( COUNT
, i 
); 
 400     for ( rit 
= list1
.rbegin(), ren 
= list1
.rend(), i 
= COUNT
; 
 401           rit 
!= ren
; ++rit
, --i 
) 
 403         CPPUNIT_ASSERT( *rit 
== i
-1 ); 
 406     CPPUNIT_ASSERT_EQUAL( 0, i 
); 
 408     CPPUNIT_ASSERT( *list1
.rbegin() == *(list1
.end()-1) && 
 409                     *list1
.begin() == *(list1
.rend()-1) ); 
 411     it 
= list1
.begin()+1; 
 412     rit 
= list1
.rbegin()+1; 
 413     CPPUNIT_ASSERT( *list1
.begin() == *(it
-1) && 
 414                     *list1
.rbegin() == *(rit
-1) ); 
 416     CPPUNIT_ASSERT( ( list1
.front() == 0 ) && ( list1
.back() == COUNT 
- 1 ) ); 
 418     list1
.erase(list1
.begin()); 
 419     list1
.erase(list1
.end()-1); 
 421     for ( it 
= list1
.begin(), en 
= list1
.end(), i 
= 1; 
 422           it 
!= en
; ++it
, ++i 
) 
 424         CPPUNIT_ASSERT( *it 
== i 
);