cf3c4d203f8b6aa7f459c2a10417c2b85999b292
[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.insert( 50, 500 ) != l.end());
87                 it = l.find( 50 );
88                 CPPUNIT_ASSERT( it != l.end() );
89                 CPPUNIT_ASSERT( it.key() == 50 );
90                 CPPUNIT_ASSERT( it.val().m_val == 500 );
91
92                 CPPUNIT_ASSERT( l.insert( 50, 5 ) == l.end() );
93                 it = l.find( 50 );
94                 CPPUNIT_ASSERT( it != l.end() );
95                 CPPUNIT_ASSERT( it.key() == 50 );
96                 CPPUNIT_ASSERT( it.val().m_val == 500 );
97                 CPPUNIT_ASSERT( !l.empty() );
98
99                 CPPUNIT_ASSERT( l.find( 150 ) == l.end() );
100                 CPPUNIT_ASSERT( l.insert_with( 150, insert_functor() ) != l.end() );
101                 it = l.find( 150 );
102                 CPPUNIT_ASSERT( it != l.end() );
103                 CPPUNIT_ASSERT( it.key() == 150 );
104                 CPPUNIT_ASSERT( it.val().m_val == 1500 );
105                 it = l.find( 100 );
106                 CPPUNIT_ASSERT( it != l.end() );
107                 CPPUNIT_ASSERT( it.key() == 100 );
108                 CPPUNIT_ASSERT( it.val().m_val == 0 );
109                 it = l.find( 50 );
110                 CPPUNIT_ASSERT( it != l.end() );
111                 CPPUNIT_ASSERT( it.key() == 50 );
112                 CPPUNIT_ASSERT( it.val().m_val == 500 );
113                 it.val().m_val = 25;
114                 it = l.find( 50 );
115                 CPPUNIT_ASSERT( it != l.end() );
116                 CPPUNIT_ASSERT( it.key() == 50 );
117                 CPPUNIT_ASSERT( it.val().m_val == 25 );
118                 CPPUNIT_ASSERT( !l.empty() );
119
120                 // ensure existing item
121                 std::pair<iterator, bool> ensureResult;
122                 ensureResult = l.ensure( 100 );
123                 CPPUNIT_ASSERT( !ensureResult.second );
124                 CPPUNIT_ASSERT( ensureResult.first.key() == 100 );
125                 CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
126                 ensureResult.first.val().m_val = 5;
127                 it = l.find( 100 );
128                 CPPUNIT_ASSERT( it != l.end() );
129                 CPPUNIT_ASSERT( it.key() == 100 );
130                 CPPUNIT_ASSERT( it.val().m_val == 5 );
131
132                 CPPUNIT_ASSERT( !l.empty() );
133
134                 // ensure new item
135                 ensureResult = l.ensure( 1000 );
136                 CPPUNIT_ASSERT( ensureResult.second );
137                 CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
138                 CPPUNIT_ASSERT( ensureResult.first.val().m_val == 0   );
139                 ensureResult.first.val().m_val = 33;
140                 ensureResult = l.ensure( 1000 );
141                 CPPUNIT_ASSERT( !ensureResult.second );
142                 CPPUNIT_ASSERT( ensureResult.first.key() == 1000 );
143                 CPPUNIT_ASSERT( ensureResult.first.val().m_val == 33   );
144
145                 // clear test
146                 l.clear();
147                 CPPUNIT_ASSERT( l.empty() );
148
149                 // insert test
150                 CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
151                 CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
152
153                 // insert failed - such key exists
154                 CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
155                 CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
156
157                 it = l.find(501);
158                 CPPUNIT_ASSERT( it != l.end() );
159                 CPPUNIT_ASSERT( it.key() == 501 );
160                 CPPUNIT_ASSERT( it.val().m_val == 0 );
161
162                 it = l.find(251);
163                 CPPUNIT_ASSERT( it != l.end() );
164                 CPPUNIT_ASSERT( it.key() == 251 );
165                 CPPUNIT_ASSERT( it.val().m_val == 152 );
166
167                 l.clear();
168                 CPPUNIT_ASSERT( l.empty() );
169
170                 // Iterator test
171                 {
172                     int nCount = 100;
173                     for ( int i = 0; i < nCount; ++i )
174                         CPPUNIT_ASSERT( l.insert(i, i * 2 ) != l.end() );
175
176                     {
177                         typename UnordList::iterator it( l.begin() );
178                         typename UnordList::const_iterator cit( l.cbegin() );
179                         CPPUNIT_CHECK( it == cit );
180                         CPPUNIT_CHECK( it != l.end() );
181                         CPPUNIT_CHECK( it != l.cend() );
182                         CPPUNIT_CHECK( cit != l.end() );
183                         CPPUNIT_CHECK( cit != l.cend() );
184                         ++it;
185                         CPPUNIT_CHECK( it != cit );
186                         CPPUNIT_CHECK( it != l.end() );
187                         CPPUNIT_CHECK( it != l.cend() );
188                         CPPUNIT_CHECK( cit != l.end() );
189                         CPPUNIT_CHECK( cit != l.cend() );
190                         ++cit;
191                         CPPUNIT_CHECK( it == cit );
192                         CPPUNIT_CHECK( it != l.end() );
193                         CPPUNIT_CHECK( it != l.cend() );
194                         CPPUNIT_CHECK( cit != l.end() );
195                         CPPUNIT_CHECK( cit != l.cend() );
196                     }
197
198                     int i = 0;
199                     for ( typename UnordList::iterator iter = l.begin(), itEnd = l.end(); iter != itEnd; ++iter, ++i ) {
200                         CPPUNIT_ASSERT( iter.key() == i );
201                         CPPUNIT_ASSERT( iter->first == i );
202                         CPPUNIT_ASSERT( (*iter).first == i );
203
204                         CPPUNIT_ASSERT( iter.val().m_val == i * 2 );
205                         CPPUNIT_ASSERT( iter->second.m_val == i * 2 );
206                         CPPUNIT_ASSERT( (*iter).second.m_val == i * 2 );
207
208                         iter.val().m_val = i * 3;
209                     }
210
211                     // Check that we have visited all items
212                     for ( int i = 0; i < nCount; ++i ) {
213                         it = l.find( i );
214                         CPPUNIT_ASSERT( it != l.end() );
215                         CPPUNIT_ASSERT( it.key() == i );
216                         CPPUNIT_ASSERT( it.val().m_val == i * 3 );
217                     }
218
219                     l.clear();
220                     CPPUNIT_ASSERT( l.empty() );
221
222                     // Const iterator
223                     for ( int i = 0; i < nCount; ++i )
224                         CPPUNIT_ASSERT( l.insert(i, i * 7) != l.end() );
225
226                     i = 0;
227                     const UnordList& rl = l;
228                     for ( typename UnordList::const_iterator iter = rl.begin(), itEnd = rl.end(); iter != itEnd; ++iter, ++i ) {
229                         CPPUNIT_ASSERT( iter.key() == i );
230                         CPPUNIT_ASSERT( iter->first == i );
231                         CPPUNIT_ASSERT( (*iter).first == i );
232
233                         CPPUNIT_ASSERT( iter.val().m_val == i * 7 );
234                         CPPUNIT_ASSERT( iter->second.m_val == i * 7 );
235                         CPPUNIT_ASSERT( (*iter).second.m_val == i * 7 );
236                         // it.val().m_val = i * 3    ; // error: const-iterator
237                     }
238
239                     l.clear();
240                     CPPUNIT_ASSERT( l.empty() );
241                 }
242
243             }
244         }
245
246         void NOGC_cmp();
247         void NOGC_less();
248         void NOGC_equal_to();
249         void NOGC_cmpmix();
250         void NOGC_ic();
251
252         CPPUNIT_TEST_SUITE(UnorderedLazyKVListTestHeader)
253             CPPUNIT_TEST(NOGC_cmp)
254             CPPUNIT_TEST(NOGC_less)
255             CPPUNIT_TEST(NOGC_equal_to)
256             CPPUNIT_TEST(NOGC_cmpmix)
257             CPPUNIT_TEST(NOGC_ic)
258         CPPUNIT_TEST_SUITE_END()
259     };
260
261 }   // namespace unordlist
262
263 #endif // #ifndef CDSTEST_HDR_LAZY_KV_H