Renamed test-hdr/ordered_list dir to test-hdr/list, added unordered LazyList<nogc...
[libcds.git] / tests / test-hdr / unordered_list / hdr_lazy_kv.h
1 //$$CDS-header$$
2
3 #ifndef CDSTEST_HDR_LAZY_KV_H
4 #define CDSTEST_HDR_LAZY_KV_H
5
6 #include "cppunit/cppunit_proxy.h"
7 #include <cds/container/details/lazy_list_base.h>
8
9 namespace unordlist {
10     namespace cc = cds::container;
11     namespace co = cds::container::opt;
12
13     class UnorderedLazyKVListTestHeader: public CppUnitMini::TestCase
14     {
15     public:
16         typedef int key_type;
17         struct value_type {
18             int m_val;
19
20             value_type()
21                 : m_val(0)
22             {}
23
24             value_type( int n )
25                 : m_val( n )
26             {}
27         };
28
29         template <typename T>
30         struct lt
31         {
32             bool operator ()(const T& v1, const T& v2 ) const
33             {
34                 return v1 < v2;
35             }
36         };
37
38         template <typename T>
39         struct cmp {
40             int operator ()(const T& v1, const T& v2 ) const
41             {
42                 if ( v1 < v2 )
43                     return -1;
44                 return v1 > v2 ? 1 : 0;
45             }
46         };
47
48         template <typename T>
49         struct eq {
50             bool operator ()(const T& v1, const T& v2 ) const
51             {
52                 return v1 == v2;
53             }
54         };
55
56         struct insert_functor {
57             template <typename T>
58             void operator()( T& pair )
59             {
60                 pair.second.m_val = pair.first * 10;
61             }
62         };
63
64     protected:
65         template <class UnordList>
66         void nogc_test()
67         {
68             typedef typename UnordList::value_type    value_type;
69             typedef typename UnordList::iterator      iterator;
70
71             {
72                 UnordList l;
73                 iterator it;
74
75                 CPPUNIT_ASSERT( l.empty() );
76
77                 // insert / find test
78                 CPPUNIT_ASSERT( l.find( 100 ) == l.end() );
79                 CPPUNIT_ASSERT( l.insert( 100 ) != l.end() );
80                 CPPUNIT_ASSERT( !l.empty() );
81                 it = l.find( 100 );
82                 CPPUNIT_ASSERT( it != l.end() );
83                 CPPUNIT_ASSERT( it.key() == 100 );
84                 CPPUNIT_ASSERT( it.val().m_val == 0 );
85
86                 CPPUNIT_ASSERT( l.find_with( 50, eq<key_type>() ) == l.end() );
87                 CPPUNIT_ASSERT( l.insert( 50, 500 ) != l.end());
88                 it = l.find( 50 );
89                 CPPUNIT_ASSERT( it != l.end() );
90                 CPPUNIT_ASSERT( it.key() == 50 );
91                 CPPUNIT_ASSERT( it.val().m_val == 500 );
92
93                 CPPUNIT_ASSERT( l.insert( 50, 5 ) == l.end() );
94                 it = l.find( 50 );
95                 CPPUNIT_ASSERT( it != l.end() );
96                 CPPUNIT_ASSERT( it.key() == 50 );
97                 CPPUNIT_ASSERT( it.val().m_val == 500 );
98                 CPPUNIT_ASSERT( !l.empty() );
99
100                 CPPUNIT_ASSERT( l.find( 150 ) == l.end() );
101                 CPPUNIT_ASSERT( l.insert_with( 150, insert_functor() ) != l.end() );
102                 it = l.find( 150 );
103                 CPPUNIT_ASSERT( it != l.end() );
104                 CPPUNIT_ASSERT( it.key() == 150 );
105                 CPPUNIT_ASSERT( it.val().m_val == 1500 );
106                 it = l.find( 100 );
107                 CPPUNIT_ASSERT( it != l.end() );
108                 CPPUNIT_ASSERT( it.key() == 100 );
109                 CPPUNIT_ASSERT( it.val().m_val == 0 );
110                 it = l.find( 50 );
111                 CPPUNIT_ASSERT( it != l.end() );
112                 CPPUNIT_ASSERT( it.key() == 50 );
113                 CPPUNIT_ASSERT( it.val().m_val == 500 );
114                 it.val().m_val = 25;
115                 it = l.find( 50 );
116                 CPPUNIT_ASSERT( it != l.end() );
117                 CPPUNIT_ASSERT( it.key() == 50 );
118                 CPPUNIT_ASSERT( it.val().m_val == 25 );
119                 CPPUNIT_ASSERT( !l.empty() );
120
121                 // ensure existing item
122                 std::pair<iterator, bool> ensureResult;
123                 ensureResult = l.ensure( 100 );
124                 CPPUNIT_ASSERT( !ensureResult.second );
125                 CPPUNIT_ASSERT( ensureResult.first.key() == 100 );
126                 CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
127                 ensureResult.first.val().m_val = 5;
128                 it = l.find( 100 );
129                 CPPUNIT_ASSERT( it != l.end() );
130                 CPPUNIT_ASSERT( it.key() == 100 );
131                 CPPUNIT_ASSERT( it.val().m_val == 5 );
132
133                 CPPUNIT_ASSERT( !l.empty() );
134
135                 // ensure new item
136                 ensureResult = l.ensure( 1000 );
137                 CPPUNIT_ASSERT( ensureResult.second );
138                 CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
139                 CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
140                 ensureResult.first.val().m_val = 33;
141                 ensureResult = l.ensure( 1000 );
142                 CPPUNIT_ASSERT( !ensureResult.second );
143                 CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
144                 CPPUNIT_ASSERT( ensureResult.first.val().m_val == 33   );
145
146                 // clear test
147                 l.clear();
148                 CPPUNIT_ASSERT( l.empty() );
149
150                 // insert test
151                 CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
152                 CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
153
154                 // insert failed - such key exists
155                 CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
156                 CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
157
158                 it = l.find(501);
159                 CPPUNIT_ASSERT( it != l.end() );
160                 CPPUNIT_ASSERT( it.key() == 501 );
161                 CPPUNIT_ASSERT( it.val().m_val == 0 );
162
163                 it = l.find(251);
164                 CPPUNIT_ASSERT( it != l.end() );
165                 CPPUNIT_ASSERT( it.key() == 251 );
166                 CPPUNIT_ASSERT( it.val().m_val == 152 );
167
168                 l.clear();
169                 CPPUNIT_ASSERT( l.empty() );
170
171                 // Iterator test
172                 {
173                     int nCount = 100;
174                     for ( int i = 0; i < nCount; ++i )
175                         CPPUNIT_ASSERT( l.insert(i, i * 2 ) != l.end() );
176
177                     {
178                         typename UnordList::iterator it( l.begin() );
179                         typename UnordList::const_iterator cit( l.cbegin() );
180                         CPPUNIT_CHECK( it == cit );
181                         CPPUNIT_CHECK( it != l.end() );
182                         CPPUNIT_CHECK( it != l.cend() );
183                         CPPUNIT_CHECK( cit != l.end() );
184                         CPPUNIT_CHECK( cit != l.cend() );
185                         ++it;
186                         CPPUNIT_CHECK( it != cit );
187                         CPPUNIT_CHECK( it != l.end() );
188                         CPPUNIT_CHECK( it != l.cend() );
189                         CPPUNIT_CHECK( cit != l.end() );
190                         CPPUNIT_CHECK( cit != l.cend() );
191                         ++cit;
192                         CPPUNIT_CHECK( it == cit );
193                         CPPUNIT_CHECK( it != l.end() );
194                         CPPUNIT_CHECK( it != l.cend() );
195                         CPPUNIT_CHECK( cit != l.end() );
196                         CPPUNIT_CHECK( cit != l.cend() );
197                     }
198
199                     int i = 0;
200                     for ( typename UnordList::iterator iter = l.begin(), itEnd = l.end(); iter != itEnd; ++iter, ++i ) {
201                         CPPUNIT_ASSERT( iter.key() == i );
202                         CPPUNIT_ASSERT( iter->first == i );
203                         CPPUNIT_ASSERT( (*iter).first == i );
204
205                         CPPUNIT_ASSERT( iter.val().m_val == i * 2 );
206                         CPPUNIT_ASSERT( iter->second.m_val == i * 2 );
207                         CPPUNIT_ASSERT( (*iter).second.m_val == i * 2 );
208
209                         iter.val().m_val = i * 3;
210                     }
211
212                     // Check that we have visited all items
213                     for ( int i = 0; i < nCount; ++i ) {
214                         it = l.find( i );
215                         CPPUNIT_ASSERT( it != l.end() );
216                         CPPUNIT_ASSERT( it.key() == i );
217                         CPPUNIT_ASSERT( it.val().m_val == i * 3 );
218                     }
219
220                     l.clear();
221                     CPPUNIT_ASSERT( l.empty() );
222
223                     // Const iterator
224                     for ( int i = 0; i < nCount; ++i )
225                         CPPUNIT_ASSERT( l.insert(i, i * 7) != l.end() );
226
227                     i = 0;
228                     const UnordList& rl = l;
229                     for ( typename UnordList::const_iterator iter = rl.begin(), itEnd = rl.end(); iter != itEnd; ++iter, ++i ) {
230                         CPPUNIT_ASSERT( iter.key() == i );
231                         CPPUNIT_ASSERT( iter->first == i );
232                         CPPUNIT_ASSERT( (*iter).first == i );
233
234                         CPPUNIT_ASSERT( iter.val().m_val == i * 7 );
235                         CPPUNIT_ASSERT( iter->second.m_val == i * 7 );
236                         CPPUNIT_ASSERT( (*iter).second.m_val == i * 7 );
237                         // it.val().m_val = i * 3    ; // error: const-iterator
238                     }
239
240                     l.clear();
241                     CPPUNIT_ASSERT( l.empty() );
242                 }
243
244             }
245         }
246
247         void NOGC_cmp();
248         void NOGC_less();
249         void NOGC_equal_to();
250         void NOGC_cmpmix();
251         void NOGC_ic();
252
253         CPPUNIT_TEST_SUITE(UnorderedLazyKVListTestHeader)
254             CPPUNIT_TEST(NOGC_cmp)
255             CPPUNIT_TEST(NOGC_less)
256             CPPUNIT_TEST(NOGC_equal_to)
257             CPPUNIT_TEST(NOGC_cmpmix)
258             CPPUNIT_TEST(NOGC_ic)
259         CPPUNIT_TEST_SUITE_END()
260     };
261
262 }   // namespace unordlist
263
264 #endif // #ifndef CDSTEST_HDR_LAZY_KV_H