3 #ifndef CDSTEST_HDR_LAZY_KV_H
4 #define CDSTEST_HDR_LAZY_KV_H
6 #include "cppunit/cppunit_proxy.h"
7 #include <cds/container/details/lazy_list_base.h>
10 namespace cc = cds::container;
11 namespace co = cds::container::opt;
13 class UnorderedLazyKVListTestHeader: public CppUnitMini::TestCase
32 bool operator ()(const T& v1, const T& v2 ) const
40 int operator ()(const T& v1, const T& v2 ) const
44 return v1 > v2 ? 1 : 0;
50 bool operator ()(const T& v1, const T& v2 ) const
56 struct insert_functor {
58 void operator()( T& pair )
60 pair.second.m_val = pair.first * 10;
65 template <class UnordList>
68 typedef typename UnordList::value_type value_type;
69 typedef typename UnordList::iterator iterator;
75 CPPUNIT_ASSERT( l.empty() );
78 CPPUNIT_ASSERT( l.find( 100 ) == l.end() );
79 CPPUNIT_ASSERT( l.insert( 100 ) != l.end() );
80 CPPUNIT_ASSERT( !l.empty() );
82 CPPUNIT_ASSERT( it != l.end() );
83 CPPUNIT_ASSERT( it.key() == 100 );
84 CPPUNIT_ASSERT( it.val().m_val == 0 );
86 CPPUNIT_ASSERT( l.insert( 50, 500 ) != l.end());
88 CPPUNIT_ASSERT( it != l.end() );
89 CPPUNIT_ASSERT( it.key() == 50 );
90 CPPUNIT_ASSERT( it.val().m_val == 500 );
92 CPPUNIT_ASSERT( l.insert( 50, 5 ) == l.end() );
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() );
99 CPPUNIT_ASSERT( l.find( 150 ) == l.end() );
100 CPPUNIT_ASSERT( l.insert_with( 150, insert_functor() ) != l.end() );
102 CPPUNIT_ASSERT( it != l.end() );
103 CPPUNIT_ASSERT( it.key() == 150 );
104 CPPUNIT_ASSERT( it.val().m_val == 1500 );
106 CPPUNIT_ASSERT( it != l.end() );
107 CPPUNIT_ASSERT( it.key() == 100 );
108 CPPUNIT_ASSERT( it.val().m_val == 0 );
110 CPPUNIT_ASSERT( it != l.end() );
111 CPPUNIT_ASSERT( it.key() == 50 );
112 CPPUNIT_ASSERT( it.val().m_val == 500 );
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() );
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;
128 CPPUNIT_ASSERT( it != l.end() );
129 CPPUNIT_ASSERT( it.key() == 100 );
130 CPPUNIT_ASSERT( it.val().m_val == 5 );
132 CPPUNIT_ASSERT( !l.empty() );
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 );
147 CPPUNIT_ASSERT( l.empty() );
150 CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
151 CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
153 // insert failed - such key exists
154 CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
155 CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
158 CPPUNIT_ASSERT( it != l.end() );
159 CPPUNIT_ASSERT( it.key() == 501 );
160 CPPUNIT_ASSERT( it.val().m_val == 0 );
163 CPPUNIT_ASSERT( it != l.end() );
164 CPPUNIT_ASSERT( it.key() == 251 );
165 CPPUNIT_ASSERT( it.val().m_val == 152 );
168 CPPUNIT_ASSERT( l.empty() );
173 for ( int i = 0; i < nCount; ++i )
174 CPPUNIT_ASSERT( l.insert(i, i * 2 ) != l.end() );
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() );
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() );
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() );
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 );
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 );
208 iter.val().m_val = i * 3;
211 // Check that we have visited all items
212 for ( int i = 0; i < nCount; ++i ) {
214 CPPUNIT_ASSERT( it != l.end() );
215 CPPUNIT_ASSERT( it.key() == i );
216 CPPUNIT_ASSERT( it.val().m_val == i * 3 );
220 CPPUNIT_ASSERT( l.empty() );
223 for ( int i = 0; i < nCount; ++i )
224 CPPUNIT_ASSERT( l.insert(i, i * 7) != l.end() );
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 );
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
240 CPPUNIT_ASSERT( l.empty() );
248 void NOGC_equal_to();
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()
261 } // namespace unordlist
263 #endif // #ifndef CDSTEST_HDR_LAZY_KV_H