Skip to content

Commit 83567c0

Browse files
committed
Added more complex "system" tests
1 parent 6e93605 commit 83567c0

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

tests/runtime_tests.cpp

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
16401700
TEST_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

Comments
 (0)