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.find_with( 50, eq<key_type>() ) == l.end() );
87 CPPUNIT_ASSERT( l.insert( 50, 500 ) != l.end());
89 CPPUNIT_ASSERT( it != l.end() );
90 CPPUNIT_ASSERT( it.key() == 50 );
91 CPPUNIT_ASSERT( it.val().m_val == 500 );
93 CPPUNIT_ASSERT( l.insert( 50, 5 ) == l.end() );
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() );
100 CPPUNIT_ASSERT( l.find( 150 ) == l.end() );
101 CPPUNIT_ASSERT( l.insert_with( 150, insert_functor() ) != l.end() );
103 CPPUNIT_ASSERT( it != l.end() );
104 CPPUNIT_ASSERT( it.key() == 150 );
105 CPPUNIT_ASSERT( it.val().m_val == 1500 );
107 CPPUNIT_ASSERT( it != l.end() );
108 CPPUNIT_ASSERT( it.key() == 100 );
109 CPPUNIT_ASSERT( it.val().m_val == 0 );
111 CPPUNIT_ASSERT( it != l.end() );
112 CPPUNIT_ASSERT( it.key() == 50 );
113 CPPUNIT_ASSERT( it.val().m_val == 500 );
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() );
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;
129 CPPUNIT_ASSERT( it != l.end() );
130 CPPUNIT_ASSERT( it.key() == 100 );
131 CPPUNIT_ASSERT( it.val().m_val == 5 );
133 CPPUNIT_ASSERT( !l.empty() );
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 );
148 CPPUNIT_ASSERT( l.empty() );
151 CPPUNIT_ASSERT( l.emplace( 501 ) != l.end());
152 CPPUNIT_ASSERT( l.emplace( 251, 152 ) != l.end());
154 // insert failed - such key exists
155 CPPUNIT_ASSERT( l.emplace( 501, 2 ) == l.end());
156 CPPUNIT_ASSERT( l.emplace( 251, 10) == l.end());
159 CPPUNIT_ASSERT( it != l.end() );
160 CPPUNIT_ASSERT( it.key() == 501 );
161 CPPUNIT_ASSERT( it.val().m_val == 0 );
164 CPPUNIT_ASSERT( it != l.end() );
165 CPPUNIT_ASSERT( it.key() == 251 );
166 CPPUNIT_ASSERT( it.val().m_val == 152 );
169 CPPUNIT_ASSERT( l.empty() );
174 for ( int i = 0; i < nCount; ++i )
175 CPPUNIT_ASSERT( l.insert(i, i * 2 ) != l.end() );
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() );
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() );
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() );
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 );
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 );
209 iter.val().m_val = i * 3;
212 // Check that we have visited all items
213 for ( int i = 0; i < nCount; ++i ) {
215 CPPUNIT_ASSERT( it != l.end() );
216 CPPUNIT_ASSERT( it.key() == i );
217 CPPUNIT_ASSERT( it.val().m_val == i * 3 );
221 CPPUNIT_ASSERT( l.empty() );
224 for ( int i = 0; i < nCount; ++i )
225 CPPUNIT_ASSERT( l.insert(i, i * 7) != l.end() );
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 );
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
241 CPPUNIT_ASSERT( l.empty() );
249 void NOGC_equal_to();
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()
262 } // namespace unordlist
264 #endif // #ifndef CDSTEST_HDR_LAZY_KV_H