22
33#include < catch2/catch_test_macros.hpp>
44#include < cstdlib>
5+ #include < vector>
6+ #include < algorithm>
57
68// Allocation tracker, to catch memory leaks and double delete
79constexpr std::size_t max_allocations = 20'000 ;
@@ -2572,7 +2574,7 @@ TEST_CASE("object owning observer pointer to other", "[system_tests]") {
25722574 REQUIRE (mem_track.double_del () == 0u );
25732575}
25742576
2575- TEST_CASE (" object owning observer pointer chain" , " [system_tests]" ) {
2577+ TEST_CASE (" object owning observer pointer open chain" , " [system_tests]" ) {
25762578 memory_tracker mem_track;
25772579
25782580 {
@@ -2587,7 +2589,7 @@ TEST_CASE("object owning observer pointer chain", "[system_tests]") {
25872589 REQUIRE (mem_track.double_del () == 0u );
25882590}
25892591
2590- TEST_CASE (" object owning observer pointer chain reversed" , " [system_tests]" ) {
2592+ TEST_CASE (" object owning observer pointer open chain reversed" , " [system_tests]" ) {
25912593 memory_tracker mem_track;
25922594
25932595 {
@@ -2601,3 +2603,51 @@ TEST_CASE("object owning observer pointer chain reversed", "[system_tests]") {
26012603 REQUIRE (mem_track.leaks () == 0u );
26022604 REQUIRE (mem_track.double_del () == 0u );
26032605}
2606+
2607+ TEST_CASE (" object owning observer pointer closed chain interleaved" , " [system_tests]" ) {
2608+ memory_tracker mem_track;
2609+
2610+ {
2611+ auto ptr1 = oup::make_observable_sealed<observer_owner>();
2612+ auto ptr2 = oup::make_observable_sealed<observer_owner>();
2613+ auto ptr3 = oup::make_observable_sealed<observer_owner>();
2614+ auto ptr4 = oup::make_observable_sealed<observer_owner>();
2615+ ptr1->obs = ptr2;
2616+ ptr2->obs = ptr4;
2617+ ptr3->obs = ptr1;
2618+ ptr4->obs = ptr3;
2619+ }
2620+
2621+ REQUIRE (mem_track.leaks () == 0u );
2622+ REQUIRE (mem_track.double_del () == 0u );
2623+ }
2624+
2625+ TEST_CASE (" pointers in vector" , " [system_tests]" ) {
2626+ memory_tracker mem_track;
2627+
2628+ {
2629+ std::vector<test_sptr> vec_own;
2630+ std::vector<test_optr> vec_obs;
2631+
2632+ vec_own.resize (100 );
2633+ REQUIRE (std::all_of (vec_own.begin (), vec_own.end (), [](const auto & p) { return p == nullptr ; }) == true );
2634+
2635+ std::generate (vec_own.begin (), vec_own.end (), []() { return oup::make_observable_sealed<test_object>(); });
2636+ REQUIRE (std::none_of (vec_own.begin (), vec_own.end (), [](const auto & p) { return p == nullptr ; }) == true );
2637+
2638+ vec_obs.resize (100 );
2639+ REQUIRE (std::all_of (vec_obs.begin (), vec_obs.end (), [](const auto & p) { return p == nullptr ; }) == true );
2640+
2641+ std::copy (vec_own.begin (), vec_own.end (), vec_obs.begin ());
2642+ REQUIRE (std::none_of (vec_own.begin (), vec_own.end (), [](const auto & p) { return p == nullptr ; }) == true );
2643+
2644+ std::vector<test_sptr> vec_own_new = std::move (vec_own);
2645+ REQUIRE (std::none_of (vec_own.begin (), vec_own.end (), [](const auto & p) { return p == nullptr ; }) == true );
2646+
2647+ vec_own_new.clear ();
2648+ REQUIRE (std::all_of (vec_obs.begin (), vec_obs.end (), [](const auto & p) { return p == nullptr ; }) == true );
2649+ }
2650+
2651+ REQUIRE (mem_track.leaks () == 0u );
2652+ REQUIRE (mem_track.double_del () == 0u );
2653+ }
0 commit comments