@@ -1637,6 +1637,66 @@ TEST_CASE("observer expiring sealed", "[observer_utility]") {
16371637 REQUIRE (mem_track.double_del () == 0u );
16381638}
16391639
1640+ TEST_CASE (" observer expiring reset" , " [observer_utility]" ) {
1641+ memory_tracker mem_track;
1642+
1643+ {
1644+ test_ptr ptr_owner{new test_object};
1645+ test_optr ptr = ptr_owner;
1646+ REQUIRE (!ptr.expired ());
1647+ ptr_owner.reset ();
1648+ REQUIRE (ptr.expired ());
1649+ }
1650+
1651+ REQUIRE (mem_track.leaks () == 0u );
1652+ REQUIRE (mem_track.double_del () == 0u );
1653+ }
1654+
1655+ TEST_CASE (" observer expiring reset sealed" , " [observer_utility]" ) {
1656+ memory_tracker mem_track;
1657+
1658+ {
1659+ test_sptr ptr_owner = oup::make_observable_sealed<test_object>();
1660+ test_optr ptr = ptr_owner;
1661+ REQUIRE (!ptr.expired ());
1662+ ptr_owner.reset ();
1663+ REQUIRE (ptr.expired ());
1664+ }
1665+
1666+ REQUIRE (mem_track.leaks () == 0u );
1667+ REQUIRE (mem_track.double_del () == 0u );
1668+ }
1669+
1670+ TEST_CASE (" observer not expiring when owner moved" , " [observer_utility]" ) {
1671+ memory_tracker mem_track;
1672+
1673+ {
1674+ test_ptr ptr_owner{new test_object};
1675+ test_optr ptr = ptr_owner;
1676+ REQUIRE (!ptr.expired ());
1677+ test_ptr ptr_owner_new = std::move (ptr_owner);
1678+ REQUIRE (!ptr.expired ());
1679+ }
1680+
1681+ REQUIRE (mem_track.leaks () == 0u );
1682+ REQUIRE (mem_track.double_del () == 0u );
1683+ }
1684+
1685+ TEST_CASE (" observer not expiring when owner moved sealed" , " [observer_utility]" ) {
1686+ memory_tracker mem_track;
1687+
1688+ {
1689+ test_sptr ptr_owner = oup::make_observable_sealed<test_object>();
1690+ test_optr ptr = ptr_owner;
1691+ REQUIRE (!ptr.expired ());
1692+ test_sptr ptr_owner_new = std::move (ptr_owner);
1693+ REQUIRE (!ptr.expired ());
1694+ }
1695+
1696+ REQUIRE (mem_track.leaks () == 0u );
1697+ REQUIRE (mem_track.double_del () == 0u );
1698+ }
1699+
16401700TEST_CASE (" observer reset to null" , " [observer_utility]" ) {
16411701 memory_tracker mem_track;
16421702
@@ -2105,3 +2165,62 @@ TEST_CASE("observer comparison valid ptr vs valid ptr different owner derived",
21052165 REQUIRE (mem_track.double_del () == 0u );
21062166}
21072167
2168+ struct observer_owner {
2169+ oup::observer_ptr<observer_owner> obs;
2170+ };
2171+
2172+ TEST_CASE (" object owning observer pointer to itself" , " [system_tests]" ) {
2173+ memory_tracker mem_track;
2174+
2175+ {
2176+ auto ptr = oup::make_observable_sealed<observer_owner>();
2177+ ptr->obs = ptr;
2178+ }
2179+
2180+ REQUIRE (mem_track.leaks () == 0u );
2181+ REQUIRE (mem_track.double_del () == 0u );
2182+ }
2183+
2184+ TEST_CASE (" object owning observer pointer to other" , " [system_tests]" ) {
2185+ memory_tracker mem_track;
2186+
2187+ {
2188+ auto ptr1 = oup::make_observable_sealed<observer_owner>();
2189+ auto ptr2 = oup::make_observable_sealed<observer_owner>();
2190+ ptr1->obs = ptr2;
2191+ ptr2->obs = ptr1;
2192+ }
2193+
2194+ REQUIRE (mem_track.leaks () == 0u );
2195+ REQUIRE (mem_track.double_del () == 0u );
2196+ }
2197+
2198+ TEST_CASE (" object owning observer pointer chain" , " [system_tests]" ) {
2199+ memory_tracker mem_track;
2200+
2201+ {
2202+ auto ptr1 = oup::make_observable_sealed<observer_owner>();
2203+ auto ptr2 = oup::make_observable_sealed<observer_owner>();
2204+ auto ptr3 = oup::make_observable_sealed<observer_owner>();
2205+ ptr1->obs = ptr2;
2206+ ptr2->obs = ptr3;
2207+ }
2208+
2209+ REQUIRE (mem_track.leaks () == 0u );
2210+ REQUIRE (mem_track.double_del () == 0u );
2211+ }
2212+
2213+ TEST_CASE (" object owning observer pointer chain reversed" , " [system_tests]" ) {
2214+ memory_tracker mem_track;
2215+
2216+ {
2217+ auto ptr1 = oup::make_observable_sealed<observer_owner>();
2218+ auto ptr2 = oup::make_observable_sealed<observer_owner>();
2219+ auto ptr3 = oup::make_observable_sealed<observer_owner>();
2220+ ptr3->obs = ptr2;
2221+ ptr2->obs = ptr1;
2222+ }
2223+
2224+ REQUIRE (mem_track.leaks () == 0u );
2225+ REQUIRE (mem_track.double_del () == 0u );
2226+ }
0 commit comments