Skip to content

Commit 94bc97f

Browse files
committed
Add unit tests to check that sharing map modifications do not invalidate views
This adds unit tests to check that the references into the sharing map in the views and delta views remain valid after operations erase(), insert(), and replace(). The references should remain valid to those elements that are not changed by the respective operations.
1 parent 2e7f414 commit 94bc97f

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

unit/util/sharing_map.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,98 @@ TEST_CASE("Sharing map views and iteration", "[core][util]")
439439
}
440440
}
441441

442+
TEST_CASE("Sharing map view validity", "[core][util]")
443+
{
444+
SECTION("View validity")
445+
{
446+
sharing_map_standardt sm;
447+
sharing_map_standardt::viewt view;
448+
449+
fill(sm);
450+
fill2(sm);
451+
452+
sharing_map_standardt sm2(sm);
453+
sm2.replace("l", "8");
454+
455+
sm.get_view(view);
456+
457+
std::size_t i_idx = 0;
458+
std::size_t k_idx = 0;
459+
460+
for(std::size_t i = 0; i < view.size(); i++)
461+
{
462+
if(view[i].first == "i")
463+
i_idx = i;
464+
465+
if(view[i].first == "k")
466+
k_idx = i;
467+
}
468+
469+
sm.erase("i");
470+
sm.replace("k", "7");
471+
sm.insert("o", "6");
472+
473+
for(std::size_t i = 0; i < view.size(); i++)
474+
{
475+
if(i == i_idx || i == k_idx)
476+
continue;
477+
478+
auto &p = view[i];
479+
480+
REQUIRE(&p.second == &sm.find(p.first)->get());
481+
}
482+
}
483+
484+
SECTION("Delta view validity")
485+
{
486+
sharing_map_standardt sm;
487+
488+
sharing_map_standardt::delta_viewt delta_view;
489+
490+
fill(sm);
491+
fill2(sm);
492+
493+
sharing_map_standardt sm2(sm);
494+
495+
sm2.erase("i");
496+
sm2.erase("j");
497+
sm2.erase("k");
498+
499+
sm2.erase("m");
500+
sm2.erase("n");
501+
502+
sm.get_delta_view(sm2, delta_view, false);
503+
504+
REQUIRE(delta_view.size() == 5);
505+
506+
std::size_t i_idx = 0;
507+
std::size_t k_idx = 0;
508+
509+
for(std::size_t i = 0; i < delta_view.size(); i++)
510+
{
511+
if(delta_view[i].k == "i")
512+
i_idx = i;
513+
514+
if(delta_view[i].k == "k")
515+
k_idx = i;
516+
}
517+
518+
sm.erase("i");
519+
sm.replace("k", "7");
520+
sm.insert("o", "6");
521+
522+
for(std::size_t i = 0; i < delta_view.size(); i++)
523+
{
524+
if(i == i_idx || i == k_idx)
525+
continue;
526+
527+
auto &delta_item = delta_view[i];
528+
529+
REQUIRE(&delta_item.m == &sm.find(delta_item.k)->get());
530+
}
531+
}
532+
}
533+
442534
TEST_CASE("Sharing map sharing stats", "[core][util]")
443535
{
444536
#if !defined(_MSC_VER)

0 commit comments

Comments
 (0)