1///////////////////////////////////////////////////////////////////////////////
2// Name:        tests/lists/lists.cpp
3// Purpose:     wxList unit test
4// Author:      Vadim Zeitlin, Mattia Barbon
5// Created:     2004-12-08
6// RCS-ID:      $Id: lists.cpp 36216 2005-11-20 21:55:35Z DS $
7// Copyright:   (c) 2004 Vadim Zeitlin, Mattia Barbon
8///////////////////////////////////////////////////////////////////////////////
9
10// ----------------------------------------------------------------------------
11// headers
12// ----------------------------------------------------------------------------
13
14#include "testprec.h"
15
16#ifdef __BORLANDC__
17    #pragma hdrstop
18#endif
19
20#ifndef WX_PRECOMP
21    #include "wx/wx.h"
22#endif // WX_PRECOMP
23
24#include "wx/list.h"
25
26// --------------------------------------------------------------------------
27// test class
28// --------------------------------------------------------------------------
29
30class ListsTestCase : public CppUnit::TestCase
31{
32public:
33    ListsTestCase() { }
34
35private:
36    CPPUNIT_TEST_SUITE( ListsTestCase );
37        CPPUNIT_TEST( wxListTest );
38        CPPUNIT_TEST( wxStdListTest );
39        CPPUNIT_TEST( wxListCtorTest );
40    CPPUNIT_TEST_SUITE_END();
41
42    void wxListTest();
43    void wxStdListTest();
44    void wxListCtorTest();
45
46    DECLARE_NO_COPY_CLASS(ListsTestCase)
47};
48
49// register in the unnamed registry so that these tests are run by default
50CPPUNIT_TEST_SUITE_REGISTRATION( ListsTestCase );
51
52// also include in it's own registry so that these tests can be run alone
53CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ListsTestCase, "ListsTestCase" );
54
55class Baz // Foo is already taken in the hash test
56{
57public:
58    Baz(const wxString& name) : m_name(name) { ms_bars++; }
59    Baz(const Baz& bar) : m_name(bar.m_name) { ms_bars++; }
60   ~Baz() { ms_bars--; }
61
62   static size_t GetNumber() { return ms_bars; }
63
64   const wxChar *GetName() const { return m_name; }
65
66private:
67   wxString m_name;
68
69   static size_t ms_bars;
70};
71
72size_t Baz::ms_bars = 0;
73
74#include "wx/list.h"
75
76WX_DECLARE_LIST(Baz, wxListBazs);
77#include "wx/listimpl.cpp"
78WX_DEFINE_LIST(wxListBazs)
79
80WX_DECLARE_LIST(int, wxListInt);
81WX_DEFINE_LIST(wxListInt)
82
83void ListsTestCase::wxListTest()
84{
85    wxListInt list1;
86    int dummy[5];
87    int i;
88
89    for ( i = 0; i < 5; ++i )
90        list1.Append(dummy + i);
91
92    CPPUNIT_ASSERT( list1.GetCount() == 5 );
93    CPPUNIT_ASSERT( list1.Item(3)->GetData() == dummy + 3 );
94    CPPUNIT_ASSERT( list1.Find(dummy + 4) );
95
96    wxListInt::compatibility_iterator node = list1.GetFirst();
97    i = 0;
98
99    while (node)
100    {
101        CPPUNIT_ASSERT( node->GetData() == dummy + i );
102        node = node->GetNext();
103        ++i;
104    }
105
106    CPPUNIT_ASSERT( size_t(i) == list1.GetCount() );
107
108    list1.Insert(dummy + 0);
109    list1.Insert(1, dummy + 1);
110    list1.Insert(list1.GetFirst()->GetNext()->GetNext(), dummy + 2);
111
112    node = list1.GetFirst();
113    i = 0;
114
115    while (i < 3)
116    {
117        int* t = node->GetData();
118        CPPUNIT_ASSERT( t == dummy + i );
119        node = node->GetNext();
120        ++i;
121    }
122}
123
124void ListsTestCase::wxStdListTest()
125{
126    wxListInt list1;
127    wxListInt::iterator it, en;
128    wxListInt::reverse_iterator rit, ren;
129    int i;
130    for ( i = 0; i < 5; ++i )
131        list1.push_back(i + &i);
132
133    for ( it = list1.begin(), en = list1.end(), i = 0;
134          it != en; ++it, ++i )
135    {
136        CPPUNIT_ASSERT( *it == i + &i );
137    }
138
139    for ( rit = list1.rbegin(), ren = list1.rend(), i = 4;
140          rit != ren; ++rit, --i )
141    {
142        CPPUNIT_ASSERT( *rit == i + &i );
143    }
144
145    CPPUNIT_ASSERT( *list1.rbegin() == *--list1.end() &&
146                    *list1.begin() == *--list1.rend() );
147    CPPUNIT_ASSERT( *list1.begin() == *--++list1.begin() &&
148                    *list1.rbegin() == *--++list1.rbegin() );
149
150    CPPUNIT_ASSERT( list1.front() == &i && list1.back() == &i + 4 );
151
152    list1.erase(list1.begin());
153    list1.erase(--list1.end());
154
155    for ( it = list1.begin(), en = list1.end(), i = 1;
156          it != en; ++it, ++i )
157    {
158        CPPUNIT_ASSERT( *it == i + &i );
159    }
160}
161
162void ListsTestCase::wxListCtorTest()
163{
164    {
165        wxListBazs list1;
166        list1.Append(new Baz(_T("first")));
167        list1.Append(new Baz(_T("second")));
168
169        CPPUNIT_ASSERT( list1.GetCount() == 2 );
170        CPPUNIT_ASSERT( Baz::GetNumber() == 2 );
171
172        wxListBazs list2;
173        list2 = list1;
174
175        CPPUNIT_ASSERT( list1.GetCount() == 2 );
176        CPPUNIT_ASSERT( list2.GetCount() == 2 );
177        CPPUNIT_ASSERT( Baz::GetNumber() == 2 );
178
179#if !wxUSE_STL
180        list1.DeleteContents(true);
181#else
182        WX_CLEAR_LIST(wxListBazs, list1);
183#endif
184    }
185
186    CPPUNIT_ASSERT( Baz::GetNumber() == 0 );
187}
188
189