21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
23 #include <boost/graph/graph_concepts.hpp>
25 #include "core/bitfield_map.hpp"
27 #include <boost/mpl/map.hpp>
29 using namespace libjmmcg;
44 typedef boost::mpl::map<
46 std::integral_constant<bitfield_3_positions, bitfield_3_positions::pos1>::type,
50 std::integral_constant<bitfield_3_positions, bitfield_3_positions::pos2>::type,
54 std::integral_constant<bitfield_3_positions, bitfield_3_positions::pos3>::type,
57 > bitfield_3_to_type_map;
59 BOOST_AUTO_TEST_SUITE(bitfield_map_tests)
61 BOOST_AUTO_TEST_CASE(ctor)
63 using m_t=bitfield_map<bitfield_3_to_type_map>;
64 BOOST_MPL_ASSERT_RELATION(
sizeof(m_t), ==,
sizeof(bitfield_3_positions)+
sizeof(
int)+
sizeof(p1_t)+
sizeof(p2_t));
66 BOOST_CHECK(m.empty());
67 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions));
68 BOOST_CHECK_GT(m.max_size(), m.size());
69 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos1>(), std::range_error);
70 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos2>(), std::range_error);
71 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos3>(), std::range_error);
72 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
false);
73 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
false);
74 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos3>(),
false);
77 BOOST_AUTO_TEST_CASE(ctor_move)
79 bitfield_map<bitfield_3_to_type_map> m1;
80 bitfield_map<bitfield_3_to_type_map> m2(std::move(m1));
81 BOOST_CHECK(m1.empty());
82 BOOST_CHECK_EQUAL(m1.size(),
sizeof(bitfield_3_positions));
83 BOOST_CHECK_GT(m1.max_size(), m1.size());
84 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos1>(), std::range_error);
85 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos2>(), std::range_error);
86 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos3>(), std::range_error);
87 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos1>(),
false);
88 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos2>(),
false);
89 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos3>(),
false);
90 BOOST_CHECK(m2.empty());
91 BOOST_CHECK_EQUAL(m2.size(),
sizeof(bitfield_3_positions));
92 BOOST_CHECK_GT(m2.max_size(), m2.size());
93 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos1>(), std::range_error);
94 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos2>(), std::range_error);
95 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos3>(), std::range_error);
96 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos1>(),
false);
97 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos2>(),
false);
98 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos3>(),
false);
101 BOOST_AUTO_TEST_CASE(cctor)
103 bitfield_map<bitfield_3_to_type_map> m1;
104 bitfield_map<bitfield_3_to_type_map> m2(m1);
105 BOOST_CHECK(m1.empty());
106 BOOST_CHECK_EQUAL(m1.size(),
sizeof(bitfield_3_positions));
107 BOOST_CHECK_GT(m1.max_size(), m1.size());
108 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos1>(), std::range_error);
109 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos2>(), std::range_error);
110 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos3>(), std::range_error);
111 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos1>(),
false);
112 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos2>(),
false);
113 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos3>(),
false);
114 BOOST_CHECK(m2.empty());
115 BOOST_CHECK_EQUAL(m2.size(),
sizeof(bitfield_3_positions));
116 BOOST_CHECK_GT(m2.max_size(), m2.size());
117 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos1>(), std::range_error);
118 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos2>(), std::range_error);
119 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos3>(), std::range_error);
120 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos1>(),
false);
121 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos2>(),
false);
122 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos3>(),
false);
125 BOOST_AUTO_TEST_CASE(insert_1_item_at_find)
127 bitfield_map<bitfield_3_to_type_map> m;
128 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
129 BOOST_CHECK(!m.empty());
130 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
131 BOOST_CHECK_GT(m.max_size(), m.size());
132 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos1>(), 42);
133 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos2>(), std::range_error);
134 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos3>(), std::range_error);
135 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
true);
136 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
false);
137 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos3>(),
false);
140 BOOST_AUTO_TEST_CASE(insert_1_move)
142 bitfield_map<bitfield_3_to_type_map> m1;
143 BOOST_CHECK_NO_THROW(m1.push_back<bitfield_3_positions::pos1>(42));
144 bitfield_map<bitfield_3_to_type_map> m2(std::move(m1));
145 BOOST_CHECK(m1.empty());
146 BOOST_CHECK_EQUAL(m1.size(),
sizeof(bitfield_3_positions));
147 BOOST_CHECK_GT(m1.max_size(), m1.size());
148 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos1>(), std::range_error);
149 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos2>(), std::range_error);
150 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos3>(), std::range_error);
151 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos1>(),
false);
152 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos2>(),
false);
153 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos3>(),
false);
154 BOOST_CHECK(!m2.empty());
155 BOOST_CHECK_EQUAL(m2.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
156 BOOST_CHECK_GT(m2.max_size(), m2.size());
157 BOOST_CHECK_EQUAL(m2.at<bitfield_3_positions::pos1>(), 42);
158 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos2>(), std::range_error);
159 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos3>(), std::range_error);
160 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos1>(),
true);
161 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos2>(),
false);
162 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos3>(),
false);
165 BOOST_AUTO_TEST_CASE(insert_1_cctor)
167 bitfield_map<bitfield_3_to_type_map> m1;
168 BOOST_CHECK_NO_THROW(m1.push_back<bitfield_3_positions::pos1>(42));
169 bitfield_map<bitfield_3_to_type_map> m2(m1);
170 BOOST_CHECK(!m1.empty());
171 BOOST_CHECK_EQUAL(m1.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
172 BOOST_CHECK_GT(m1.max_size(), m1.size());
173 BOOST_CHECK_EQUAL(m1.at<bitfield_3_positions::pos1>(), 42);
174 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos2>(), std::range_error);
175 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos3>(), std::range_error);
176 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos1>(),
true);
177 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos2>(),
false);
178 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos3>(),
false);
179 BOOST_CHECK(!m2.empty());
180 BOOST_CHECK_EQUAL(m2.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
181 BOOST_CHECK_GT(m2.max_size(), m2.size());
182 BOOST_CHECK_EQUAL(m2.at<bitfield_3_positions::pos1>(), 42);
183 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos2>(), std::range_error);
184 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos3>(), std::range_error);
185 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos1>(),
true);
186 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos2>(),
false);
187 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos3>(),
false);
190 BOOST_AUTO_TEST_CASE(insert_1_move_assign)
192 bitfield_map<bitfield_3_to_type_map> m1;
193 BOOST_CHECK_NO_THROW(m1.push_back<bitfield_3_positions::pos1>(42));
194 bitfield_map<bitfield_3_to_type_map> m2;
195 BOOST_CHECK_NO_THROW(m2=std::move(m1));
196 BOOST_CHECK(m1.empty());
197 BOOST_CHECK_EQUAL(m1.size(),
sizeof(bitfield_3_positions));
198 BOOST_CHECK_GT(m1.max_size(), m1.size());
199 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos1>(), std::range_error);
200 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos2>(), std::range_error);
201 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos3>(), std::range_error);
202 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos1>(),
false);
203 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos2>(),
false);
204 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos3>(),
false);
205 BOOST_CHECK(!m2.empty());
206 BOOST_CHECK_EQUAL(m2.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
207 BOOST_CHECK_GT(m2.max_size(), m2.size());
208 BOOST_CHECK_EQUAL(m2.at<bitfield_3_positions::pos1>(), 42);
209 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos2>(), std::range_error);
210 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos3>(), std::range_error);
211 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos1>(),
true);
212 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos2>(),
false);
213 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos3>(),
false);
216 BOOST_AUTO_TEST_CASE(insert_2_move_assign)
218 bitfield_map<bitfield_3_to_type_map> m1;
219 BOOST_CHECK_NO_THROW(m1.push_back<bitfield_3_positions::pos1>(42));
220 bitfield_map<bitfield_3_to_type_map> m2;
221 BOOST_CHECK_NO_THROW(m2.push_back<bitfield_3_positions::pos2>(p1_t()));
222 BOOST_CHECK_NO_THROW(m2=std::move(m1));
223 BOOST_CHECK(!m1.empty());
224 BOOST_CHECK_EQUAL(m1.size(),
sizeof(bitfield_3_positions)+
sizeof(p1_t));
225 BOOST_CHECK_GT(m1.max_size(), m1.size());
226 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos1>(), std::range_error);
227 BOOST_CHECK_EQUAL(m1.at<bitfield_3_positions::pos2>().i, p1_t().i);
228 BOOST_CHECK_THROW(m1.at<bitfield_3_positions::pos3>(), std::range_error);
229 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos1>(),
false);
230 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos2>(),
true);
231 BOOST_CHECK_EQUAL(m1.find<bitfield_3_positions::pos3>(),
false);
232 BOOST_CHECK(!m2.empty());
233 BOOST_CHECK_EQUAL(m2.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
234 BOOST_CHECK_GT(m2.max_size(), m2.size());
235 BOOST_CHECK_EQUAL(m2.at<bitfield_3_positions::pos1>(), 42);
236 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos2>(), std::range_error);
237 BOOST_CHECK_THROW(m2.at<bitfield_3_positions::pos3>(), std::range_error);
238 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos1>(),
true);
239 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos2>(),
false);
240 BOOST_CHECK_EQUAL(m2.find<bitfield_3_positions::pos3>(),
false);
243 BOOST_AUTO_TEST_CASE(clear_1_element)
245 bitfield_map<bitfield_3_to_type_map> m;
246 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
247 BOOST_CHECK_NO_THROW(m.clear());
248 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos1>(), std::range_error);
249 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos2>(), std::range_error);
250 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos3>(), std::range_error);
251 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
false);
252 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
false);
253 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos3>(),
false);
254 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions));
255 BOOST_CHECK(m.empty());
258 BOOST_AUTO_TEST_CASE(at_1_item)
260 bitfield_map<bitfield_3_to_type_map> m;
261 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
262 BOOST_CHECK_NO_THROW(m.at<bitfield_3_positions::pos1>());
263 BOOST_CHECK_NO_THROW(m.at<bitfield_3_positions::pos1>()=68);
264 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos1>(), 68);
267 BOOST_AUTO_TEST_CASE(erase_1_item)
269 bitfield_map<bitfield_3_to_type_map> m;
270 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
271 BOOST_CHECK_NO_THROW(m.erase<bitfield_3_positions::pos1>());
272 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos1>(), std::range_error);
273 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
false);
274 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions));
275 BOOST_CHECK(m.empty());
278 BOOST_AUTO_TEST_CASE(insert_2_items_at_find)
280 bitfield_map<bitfield_3_to_type_map> m;
281 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
282 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos2>(p1_t()));
283 BOOST_CHECK(!m.empty());
284 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions)+
sizeof(
int)+
sizeof(p1_t));
285 BOOST_CHECK_GE(m.max_size(), m.size());
286 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos1>(), 42);
287 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos2>().i, p1_t().i);
288 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
true);
289 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
true);
292 BOOST_AUTO_TEST_CASE(invalid_insert_2_erase_1_element)
294 bitfield_map<bitfield_3_to_type_map> m;
295 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
296 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos2>(p1_t()));
297 BOOST_CHECK_NO_THROW(m.erase<bitfield_3_positions::pos1>());
298 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos1>(), std::range_error);
299 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
false);
300 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
true);
301 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions)+
sizeof(p1_t));
302 BOOST_CHECK(!m.empty());
305 BOOST_AUTO_TEST_CASE(insert_2_erase_2_elements)
307 bitfield_map<bitfield_3_to_type_map> m;
308 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
309 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos2>(p1_t()));
310 BOOST_CHECK_NO_THROW(m.erase<bitfield_3_positions::pos2>());
311 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos2>(), std::range_error);
312 BOOST_CHECK_NO_THROW(m.at<bitfield_3_positions::pos1>());
313 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
true);
314 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
false);
315 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions)+
sizeof(
int));
316 BOOST_CHECK(!m.empty());
317 BOOST_CHECK_NO_THROW(m.erase<bitfield_3_positions::pos1>());
318 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos1>(), std::range_error);
319 BOOST_CHECK_THROW(m.at<bitfield_3_positions::pos2>(), std::range_error);
320 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos1>(),
false);
321 BOOST_CHECK_EQUAL(m.find<bitfield_3_positions::pos2>(),
false);
322 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions));
323 BOOST_CHECK(m.empty());
326 BOOST_AUTO_TEST_CASE(insert_3_items_at)
328 bitfield_map<bitfield_3_to_type_map> m;
329 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos1>(42));
330 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos2>(p1_t()));
331 BOOST_CHECK_NO_THROW(m.push_back<bitfield_3_positions::pos3>(p2_t()));
332 BOOST_CHECK(!m.empty());
333 BOOST_CHECK_EQUAL(m.size(),
sizeof(bitfield_3_positions)+
sizeof(
int)+
sizeof(p1_t)+
sizeof(p2_t));
334 BOOST_CHECK_GE(m.max_size(), m.size());
335 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos1>(), 42);
336 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos2>().i, p1_t().i);
337 BOOST_CHECK_EQUAL(m.at<bitfield_3_positions::pos3>().i, p2_t().i);
340 BOOST_AUTO_TEST_SUITE_END()