161 static GenericMapFactory
const factory;
164 BOOST_TEST(demoMap->at(KEY0) == VALUE0);
165 BOOST_TEST(demoMap->at(KEY1) == VALUE1);
166 BOOST_TEST(demoMap->at(KEY2) == VALUE2);
167 BOOST_TEST(demoMap->at(KEY3) == VALUE3);
168 BOOST_TEST(*(demoMap->at(KEY4)) == VALUE4);
169 BOOST_TEST(demoMap->at(KEY5) == VALUE5);
170 BOOST_TEST(demoMap->at(KEY6) == VALUE6);
174 using namespace std::string_literals;
176 static GenericMapFactory
const factory;
179 BOOST_TEST(demoMap->at(KEY0) == VALUE0);
180 demoMap->at(KEY0) =
false;
181 BOOST_TEST(demoMap->at(KEY0) ==
false);
184 BOOST_TEST(demoMap->at(KEY1) == VALUE1);
186 BOOST_TEST(demoMap->at(KEY1) == VALUE1 + 1);
189 BOOST_TEST(demoMap->at(KEY2) == VALUE2);
190 demoMap->at(KEY2) = 0.0;
191 BOOST_TEST(demoMap->at(KEY2) == 0.0);
193 using Type2 = std::remove_const_t<
decltype(VALUE2)>;
196 BOOST_TEST(demoMap->at(KEY3) == VALUE3);
197 demoMap->at(KEY3).append(
" Oops, wrong question."s);
198 BOOST_TEST(demoMap->at(KEY3) == VALUE3 +
" Oops, wrong question."s);
200 BOOST_TEST(*(demoMap->at(KEY4)) == VALUE4);
202 using Type4 = std::remove_const_t<
decltype(VALUE4)>;
205 BOOST_TEST(demoMap->at(KEY5) == VALUE5);
208 ComplexStorable newValue(5.0);
209 demoMap->at(KEY5) = newValue;
210 BOOST_TEST(demoMap->at(KEY5) == newValue);
212 BOOST_TEST(demoMap->at(KEY6) == VALUE6);
226 static GenericMapFactory
const factory;
232 auto bruteForcePrinter = [&map](
int key) {
235 return universalToString(map->at(KEY0));
237 return universalToString(map->at(KEY1));
239 return universalToString(map->at(KEY2));
241 return universalToString(map->at(KEY3));
243 return universalToString(map->at(KEY4));
245 return universalToString(map->at(KEY5));
247 return universalToString(map->at(KEY6));
253 for (
int key : mapKeys) {
254 expected.
push_back(bruteForcePrinter(key));
263 void operator()(
int,
bool value) { results.
push_back(universalToString(value)); }
264 void operator()(
int,
int const& value) { results.
push_back(universalToString(value)); }
265 void operator()(
int,
long value) { results.
push_back(universalToString(value)); }
266 void operator()(
int,
long long value) { results.
push_back(universalToString(value)); }
267 void operator()(
int,
float const& value) { results.
push_back(universalToString(value)); }
268 void operator()(
int,
double value) { results.
push_back(universalToString(value)); }
270 void operator()(
int,
Storable const& value) { results.
push_back(universalToString(value)); }
272 results.
push_back(universalToString(value));
276 BOOST_REQUIRE(printer.results.size() == expected.
size());
277 for (
std::size_t i = 0; i < printer.results.size(); ++i) {
278 BOOST_TEST(printer.results[i] == expected[i],
279 printer.results[i] <<
" != " << expected[i] <<
", key = " << mapKeys[i]);
284 map->apply([](
int,
auto const& value) {
return universalToString(value); });
285 BOOST_REQUIRE(strings.
size() == expected.
size());
287 BOOST_TEST(strings[i] == expected[i],
288 strings[i] <<
" != " << expected[i] <<
", key = " << mapKeys[i]);
293 static GenericMapFactory
const factory;
301 void operator()(
int,
bool& value) { value = !value; }
302 void operator()(
int,
int& value) { value *= 2; }
303 void operator()(
int,
long& value) { value *= 2; }
304 void operator()(
int,
long long& value) { value *= 2; }
305 void operator()(
int,
float& value) { value *= 2; }
306 void operator()(
int,
double& value) { value *= 2; }
307 void operator()(
int,
std::string& value) { value +=
"Appendix"; }
308 void operator()(
int,
Storable& value) {
309 auto complexStorable =
dynamic_cast<ComplexStorable*
>(&value);
310 if (complexStorable !=
nullptr) {
311 *complexStorable = 42;
319 BOOST_TEST(newKeys == originalKeys);
320 BOOST_TEST(map->at(KEY0) == !VALUE0);
321 BOOST_TEST(map->at(KEY1) == 2 * VALUE1);
322 BOOST_TEST(map->at(KEY2) == 2 * VALUE2);
323 BOOST_TEST(map->at(KEY3) == VALUE3 +
"Appendix");
324 BOOST_TEST(*(map->at(KEY4)) == VALUE4);
325 BOOST_TEST(map->at(KEY5) != VALUE5);
326 BOOST_TEST(map->at(KEY5) == ComplexStorable(42));
327 BOOST_TEST(map->at(KEY6) ==
nullptr);
331 static GenericMapFactory
const factory;
339 int operator()(
int key,
bool& value) {
343 int operator()(
int key,
int& value) {
347 int operator()(
int key,
long& value) {
351 int operator()(
int key,
long long& value) {
355 int operator()(
int key,
float& value) {
359 int operator()(
int key,
double& value) {
367 int operator()(
int key,
Storable& value) {
368 auto complexStorable =
dynamic_cast<ComplexStorable*
>(&value);
369 if (complexStorable !=
nullptr) {
370 *complexStorable = 42;
377 BOOST_TEST(editedKeys == originalKeys);
380 BOOST_TEST(newKeys == originalKeys);
381 BOOST_TEST(map->at(KEY0) == !VALUE0);
382 BOOST_TEST(map->at(KEY1) == 2 * VALUE1);
383 BOOST_TEST(map->at(KEY2) == 2 * VALUE2);
384 BOOST_TEST(map->at(KEY3) == VALUE3 +
"Appendix");
385 BOOST_TEST(*(map->at(KEY4)) == VALUE4);
386 BOOST_TEST(map->at(KEY5) != VALUE5);
387 BOOST_TEST(map->at(KEY5) == ComplexStorable(42));
388 BOOST_TEST(map->at(KEY6) ==
nullptr);
392 using namespace std::string_literals;
394 static GenericMapFactory
const factory;
395 auto map1 = factory.makeMutableGenericMap();
396 auto map2 = factory.makeMutableGenericMap();
399 BOOST_CHECK(*map1 == *map2);
402 map1->insert(primitiveKey, 42);
403 BOOST_CHECK(*map1 != *map2);
404 map2->insert(primitiveKey, 42);
405 BOOST_CHECK(*map1 == *map2);
409 map1->insert(sharedKey, common);
410 BOOST_CHECK(*map1 != *map2);
412 BOOST_CHECK(*map1 != *map2);
413 map2->erase(sharedKey);
414 map2->insert(sharedKey, common);
415 BOOST_CHECK(*map1 == *map2);
418 map1->insert(storableKey, VALUE5);
419 BOOST_CHECK(*map1 != *map2);
420 map2->insert(storableKey, VALUE5);
421 BOOST_CHECK(*map1 == *map2);
425 BOOST_CHECK(*map1 != *map2);
427 BOOST_CHECK(*map1 == *map2);
439 using namespace std::string_literals;
441 static GenericMapFactory
const factory;
444 BOOST_TEST_REQUIRE(demoMap->size() == 0);
445 BOOST_TEST_REQUIRE(demoMap->empty());
448 BOOST_TEST(demoMap->size() == 1);
449 BOOST_TEST(!demoMap->empty());
452 BOOST_TEST(demoMap->size() == 0);
453 BOOST_TEST(demoMap->empty());
457 using namespace std::string_literals;
459 static GenericMapFactory
const factory;
462 BOOST_TEST(demoMap->contains(KEY0.getId()));
463 BOOST_TEST(demoMap->contains(KEY1.getId()));
464 BOOST_TEST(demoMap->contains(KEY2.getId()));
465 BOOST_TEST(demoMap->contains(KEY3.getId()));
466 BOOST_TEST(demoMap->contains(KEY4.getId()));
467 BOOST_TEST(demoMap->contains(KEY5.getId()));
468 BOOST_TEST(demoMap->contains(KEY6.getId()));
472 static GenericMapFactory
const factory;
475 BOOST_TEST(demoMap->contains(KEY0));
476 BOOST_TEST(!demoMap->contains(
makeKey<int>(KEY0.getId())));
478 BOOST_TEST(demoMap->contains(KEY1));
481 BOOST_TEST(demoMap->contains(KEY2));
483 BOOST_TEST(!demoMap->contains(
makeKey<
decltype(VALUE2)>(KEY2.getId())));
485 BOOST_TEST(demoMap->contains(KEY3));
487 BOOST_TEST(demoMap->contains(KEY4));
489 BOOST_TEST(!demoMap->contains(
makeKey<
decltype(VALUE4)>(KEY4.getId())));
491 BOOST_TEST(demoMap->contains(KEY5));
495 BOOST_TEST(demoMap->contains(KEY6));
501 static GenericMapFactory
const factory;
503 auto orderedKeys = demoMap->keys();
507 BOOST_TEST(keys ==
std::set<int>({KEY0.getId(), KEY1.getId(), KEY2.getId(), KEY3.getId(), KEY4.getId(),
508 KEY5.getId(), KEY6.getId()}));
545 using namespace std::string_literals;
547 static GenericMapFactory
const factory;
550 BOOST_TEST_REQUIRE(demoMap->empty());
553 BOOST_TEST(demoMap->insert(
makeKey<int>(
"cube"s), x) ==
true);
554 BOOST_TEST(demoMap->insert(
makeKey<int>(
"cube"s), 0) ==
false);
556 BOOST_TEST(!demoMap->empty());
557 BOOST_TEST(demoMap->size() == 1);
558 BOOST_TEST(demoMap->contains(
"cube"s));
571 using namespace std::string_literals;
573 static GenericMapFactory
const factory;
576 BOOST_TEST_REQUIRE(demoMap->empty());
578 auto insertResult = demoMap->insert(
"cube"s, 27);
579 BOOST_TEST(insertResult.second ==
true);
580 BOOST_TEST(demoMap->insert(
"cube"s, 0).second ==
false);
582 BOOST_TEST(!demoMap->empty());
583 BOOST_TEST(demoMap->size() == 1);
584 BOOST_TEST(demoMap->contains(
"cube"s));
585 BOOST_TEST(demoMap->contains(insertResult.first));
588 BOOST_TEST(demoMap->at(insertResult.first) == 27);
591 demoMap->at(insertResult.first) = 0;
592 BOOST_TEST(demoMap->at(insertResult.first) == 0);
596 using namespace std::string_literals;
598 static GenericMapFactory
const factory;
601 BOOST_TEST_REQUIRE(demoMap->empty());
604 "I have a most elegant and wonderful proof, but this string is too small to contain it."s);
607 BOOST_TEST(demoMap->insert(
makeKey<std::string>(
"Ultimate answer"s),
"Something philosophical"s) ==
610 BOOST_TEST(!demoMap->empty());
611 BOOST_TEST(demoMap->size() == 2);
612 BOOST_TEST(demoMap->contains(
"OK"s));
617 answer =
"I don't know"s;
622 using namespace std::string_literals;
624 static GenericMapFactory
const factory;
627 BOOST_TEST_REQUIRE(demoMap->empty());
629 auto insertResult1 = demoMap->insert(
"Ultimate answer"s,
"Something philosophical"s);
630 BOOST_TEST(insertResult1.second ==
true);
631 auto insertResult2 = demoMap->insert(
"OK"s,
"Ook!"s);
632 BOOST_TEST(insertResult2.second ==
true);
634 BOOST_TEST(!demoMap->empty());
635 BOOST_TEST(demoMap->size() == 2);
636 BOOST_TEST(demoMap->contains(insertResult1.first));
637 BOOST_TEST(demoMap->contains(insertResult2.first));
638 BOOST_TEST(demoMap->contains(
"OK"s));
640 BOOST_TEST(demoMap->at(insertResult1.first) ==
"Something philosophical"s);
641 BOOST_TEST(demoMap->at(
makeKey<std::string>(
"Ultimate answer"s)) ==
"Something philosophical"s);
642 BOOST_TEST(demoMap->at(insertResult2.first) ==
"Ook!"s);
647 using namespace std::string_literals;
649 static GenericMapFactory
const factory;
652 BOOST_TEST_REQUIRE(demoMap->empty());
654 ComplexStorable object(3.1416);
664 BOOST_TEST(!demoMap->empty());
665 BOOST_TEST(demoMap->size() == 3);
666 BOOST_TEST(demoMap->contains(
"foo"s));
673 object = ComplexStorable(1.4);
676 ComplexStorable(3.141));
680 using namespace std::string_literals;
682 static GenericMapFactory
const factory;
685 BOOST_TEST_REQUIRE(demoMap->empty());
687 BOOST_TEST(demoMap->insert(
makeKey<int>(
"key1"s), 3) ==
true);
692 std::string const message =
"Unknown value for key5."s;
694 BOOST_TEST(demoMap->insert(
makeKey<int>(
"key3"s), 20) ==
false);
695 BOOST_TEST(demoMap->insert<
double>(
makeKey<double>(
"key6"s), 42) ==
true);
697 BOOST_TEST(!demoMap->empty());
698 BOOST_TEST(demoMap->size() == 6);
708 using namespace std::string_literals;
710 static GenericMapFactory
const factory;
714 BOOST_TEST_REQUIRE(demoMap->size() == 1);
717 BOOST_TEST(demoMap->size() == 1);
718 BOOST_TEST(demoMap->erase(
makeKey<int>(
"Ultimate answer"s)) ==
true);
719 BOOST_TEST(demoMap->size() == 0);
723 using namespace std::string_literals;
725 static GenericMapFactory
const factory;
728 BOOST_TEST_REQUIRE(demoMap->empty());
730 BOOST_TEST(demoMap->insert(
makeKey<int>(
"Ultimate answer"s), 42) ==
true);
731 BOOST_TEST(demoMap->insert(
makeKey<int>(
"OK"s), 200) ==
true);
732 BOOST_TEST(demoMap->erase(
makeKey<int>(
"Ultimate answer"s)) ==
true);
733 BOOST_TEST(demoMap->insert(
makeKey<double>(
"Ultimate answer"s), 3.1415927) ==
true);
735 BOOST_TEST(!demoMap->empty());
736 BOOST_TEST(demoMap->size() == 2);
737 BOOST_TEST(demoMap->contains(
"OK"s));
738 BOOST_TEST(!demoMap->contains(
makeKey<int>(
"Ultimate answer"s)));
740 BOOST_TEST(demoMap->at(
makeKey<double>(
"Ultimate answer"s)) == 3.1415927);
752 using factories = boost::mpl::list<GenericMapFactory>;
754 suite->add(BOOST_TEST_CASE_TEMPLATE(TestConstAt, factories));
755 suite->add(BOOST_TEST_CASE_TEMPLATE(TestAt, factories));
756 suite->add(BOOST_TEST_CASE_TEMPLATE(TestEquals, factories));
757 suite->add(BOOST_TEST_CASE_TEMPLATE(TestSize, factories));
758 suite->add(BOOST_TEST_CASE_TEMPLATE(TestWeakContains, factories));
759 suite->add(BOOST_TEST_CASE_TEMPLATE(TestContains, factories));
760 suite->add(BOOST_TEST_CASE_TEMPLATE(TestKeys, factories));
761 suite->add(BOOST_TEST_CASE_TEMPLATE(TestKeyOrder, factories));
762 suite->add(BOOST_TEST_CASE_TEMPLATE(TestConstVisitor, factories));
763 suite->add(BOOST_TEST_CASE_TEMPLATE(TestModifyingVoidVisitor, factories));
764 suite->add(BOOST_TEST_CASE_TEMPLATE(TestModifyingReturningVisitor, factories));
778 using factories = boost::mpl::list<GenericMapFactory>;
782 suite->add(BOOST_TEST_CASE_TEMPLATE(TestMutableEquals, factories));
783 suite->add(BOOST_TEST_CASE_TEMPLATE(TestMutableSize, factories));
784 suite->add(BOOST_TEST_CASE_TEMPLATE(TestClear, factories));
785 suite->add(BOOST_TEST_CASE_TEMPLATE(TestClearIdempotent, factories));
786 suite->add(BOOST_TEST_CASE_TEMPLATE(TestInsertInt, factories));
787 suite->add(BOOST_TEST_CASE_TEMPLATE(TestInsertString, factories));
788 suite->add(BOOST_TEST_CASE_TEMPLATE(TestInsertStorable, factories));
789 suite->add(BOOST_TEST_CASE_TEMPLATE(TestInterleavedInserts, factories));
790 suite->add(BOOST_TEST_CASE_TEMPLATE(TestErase, factories));
791 suite->add(BOOST_TEST_CASE_TEMPLATE(TestInsertEraseInsert, factories));