Skip to content

Commit 91786b7

Browse files
committed
Added self assignment tests
1 parent c8acb1f commit 91786b7

File tree

1 file changed

+202
-0
lines changed

1 file changed

+202
-0
lines changed

tests/runtime_tests.cpp

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,102 @@ TEST_CASE("owner move assignment operator valid to valid with deleter", "[owner_
748748
REQUIRE(mem_track.double_del() == 0u);
749749
}
750750

751+
TEST_CASE("owner move assignment operator self to self", "[owner_assignment]") {
752+
memory_tracker mem_track;
753+
754+
{
755+
test_ptr ptr(new test_object);
756+
ptr = std::move(ptr);
757+
REQUIRE(instances == 0);
758+
REQUIRE(ptr.get() == nullptr);
759+
}
760+
761+
REQUIRE(instances == 0);
762+
REQUIRE(mem_track.leaks() == 0u);
763+
REQUIRE(mem_track.double_del() == 0u);
764+
}
765+
766+
TEST_CASE("owner move assignment operator self to self sealed", "[owner_assignment]") {
767+
memory_tracker mem_track;
768+
769+
{
770+
test_sptr ptr = oup::make_observable_sealed<test_object>();
771+
ptr = std::move(ptr);
772+
REQUIRE(instances == 0);
773+
REQUIRE(ptr.get() == nullptr);
774+
}
775+
776+
REQUIRE(instances == 0);
777+
REQUIRE(mem_track.leaks() == 0u);
778+
REQUIRE(mem_track.double_del() == 0u);
779+
}
780+
781+
TEST_CASE("owner move assignment operator self to self with deleter", "[owner_assignment]") {
782+
memory_tracker mem_track;
783+
784+
{
785+
test_ptr_with_deleter ptr(new test_object, test_deleter{42});
786+
ptr = std::move(ptr);
787+
REQUIRE(instances == 0);
788+
REQUIRE(ptr.get() == nullptr);
789+
REQUIRE(instances_deleter == 1);
790+
REQUIRE(ptr.get_deleter().state_ == 0);
791+
}
792+
793+
REQUIRE(instances == 0);
794+
REQUIRE(instances_deleter == 0);
795+
REQUIRE(mem_track.leaks() == 0u);
796+
REQUIRE(mem_track.double_del() == 0u);
797+
}
798+
799+
TEST_CASE("owner move assignment operator self to self empty", "[owner_assignment]") {
800+
memory_tracker mem_track;
801+
802+
{
803+
test_ptr ptr;
804+
ptr = std::move(ptr);
805+
REQUIRE(instances == 0);
806+
REQUIRE(ptr.get() == nullptr);
807+
}
808+
809+
REQUIRE(instances == 0);
810+
REQUIRE(mem_track.leaks() == 0u);
811+
REQUIRE(mem_track.double_del() == 0u);
812+
}
813+
814+
TEST_CASE("owner move assignment operator self to self empty sealed", "[owner_assignment]") {
815+
memory_tracker mem_track;
816+
817+
{
818+
test_sptr ptr;
819+
ptr = std::move(ptr);
820+
REQUIRE(instances == 0);
821+
REQUIRE(ptr.get() == nullptr);
822+
}
823+
824+
REQUIRE(instances == 0);
825+
REQUIRE(mem_track.leaks() == 0u);
826+
REQUIRE(mem_track.double_del() == 0u);
827+
}
828+
829+
TEST_CASE("owner move assignment operator self to self empty with deleter", "[owner_assignment]") {
830+
memory_tracker mem_track;
831+
832+
{
833+
test_ptr_with_deleter ptr;
834+
ptr = std::move(ptr);
835+
REQUIRE(instances == 0);
836+
REQUIRE(ptr.get() == nullptr);
837+
REQUIRE(instances_deleter == 1);
838+
REQUIRE(ptr.get_deleter().state_ == 0);
839+
}
840+
841+
REQUIRE(instances == 0);
842+
REQUIRE(instances_deleter == 0);
843+
REQUIRE(mem_track.leaks() == 0u);
844+
REQUIRE(mem_track.double_del() == 0u);
845+
}
846+
751847
TEST_CASE("owner comparison valid ptr vs nullptr", "[owner_comparison]") {
752848
memory_tracker mem_track;
753849

@@ -2118,6 +2214,59 @@ TEST_CASE("observer copy assignment operator empty to empty", "[observer_assignm
21182214
REQUIRE(mem_track.double_del() == 0u);
21192215
}
21202216

2217+
TEST_CASE("observer copy assignment operator self to self", "[observer_assignment]") {
2218+
memory_tracker mem_track;
2219+
2220+
{
2221+
test_ptr ptr_owner{new test_object};
2222+
test_optr ptr{ptr_owner};
2223+
ptr = ptr;
2224+
REQUIRE(instances == 1);
2225+
REQUIRE(ptr.get() != nullptr);
2226+
REQUIRE(ptr.expired() == false);
2227+
}
2228+
2229+
REQUIRE(instances == 0);
2230+
REQUIRE(mem_track.leaks() == 0u);
2231+
REQUIRE(mem_track.double_del() == 0u);
2232+
}
2233+
2234+
TEST_CASE("observer copy assignment operator self to self expired", "[observer_assignment]") {
2235+
memory_tracker mem_track;
2236+
2237+
{
2238+
test_optr ptr;
2239+
{
2240+
test_ptr ptr_owner{new test_object};
2241+
ptr = ptr_owner;
2242+
}
2243+
ptr = ptr;
2244+
REQUIRE(instances == 0);
2245+
REQUIRE(ptr.get() == nullptr);
2246+
REQUIRE(ptr.expired() == true);
2247+
}
2248+
2249+
REQUIRE(instances == 0);
2250+
REQUIRE(mem_track.leaks() == 0u);
2251+
REQUIRE(mem_track.double_del() == 0u);
2252+
}
2253+
2254+
TEST_CASE("observer copy assignment operator self to self empty", "[observer_assignment]") {
2255+
memory_tracker mem_track;
2256+
2257+
{
2258+
test_optr ptr;
2259+
ptr = ptr;
2260+
REQUIRE(instances == 0);
2261+
REQUIRE(ptr.get() == nullptr);
2262+
REQUIRE(ptr.expired() == true);
2263+
}
2264+
2265+
REQUIRE(instances == 0);
2266+
REQUIRE(mem_track.leaks() == 0u);
2267+
REQUIRE(mem_track.double_del() == 0u);
2268+
}
2269+
21212270
TEST_CASE("observer move assignment operator valid to empty", "[observer_assignment]") {
21222271
memory_tracker mem_track;
21232272

@@ -2190,6 +2339,59 @@ TEST_CASE("observer move assignment operator empty to empty", "[observer_assignm
21902339
REQUIRE(mem_track.double_del() == 0u);
21912340
}
21922341

2342+
TEST_CASE("observer move assignment operator self to self", "[observer_assignment]") {
2343+
memory_tracker mem_track;
2344+
2345+
{
2346+
test_ptr ptr_owner{new test_object};
2347+
test_optr ptr{ptr_owner};
2348+
ptr = std::move(ptr);
2349+
REQUIRE(instances == 1);
2350+
REQUIRE(ptr.get() == nullptr);
2351+
REQUIRE(ptr.expired() == true);
2352+
}
2353+
2354+
REQUIRE(instances == 0);
2355+
REQUIRE(mem_track.leaks() == 0u);
2356+
REQUIRE(mem_track.double_del() == 0u);
2357+
}
2358+
2359+
TEST_CASE("observer move assignment operator self to self expired", "[observer_assignment]") {
2360+
memory_tracker mem_track;
2361+
2362+
{
2363+
test_optr ptr;
2364+
{
2365+
test_ptr ptr_owner{new test_object};
2366+
ptr = ptr_owner;
2367+
}
2368+
ptr = std::move(ptr);
2369+
REQUIRE(instances == 0);
2370+
REQUIRE(ptr.get() == nullptr);
2371+
REQUIRE(ptr.expired() == true);
2372+
}
2373+
2374+
REQUIRE(instances == 0);
2375+
REQUIRE(mem_track.leaks() == 0u);
2376+
REQUIRE(mem_track.double_del() == 0u);
2377+
}
2378+
2379+
TEST_CASE("observer move assignment operator self to self empty", "[observer_assignment]") {
2380+
memory_tracker mem_track;
2381+
2382+
{
2383+
test_optr ptr;
2384+
ptr = std::move(ptr);
2385+
REQUIRE(instances == 0);
2386+
REQUIRE(ptr.get() == nullptr);
2387+
REQUIRE(ptr.expired() == true);
2388+
}
2389+
2390+
REQUIRE(instances == 0);
2391+
REQUIRE(mem_track.leaks() == 0u);
2392+
REQUIRE(mem_track.double_del() == 0u);
2393+
}
2394+
21932395
TEST_CASE("observer acquiring assignment operator valid to empty", "[observer_assignment]") {
21942396
memory_tracker mem_track;
21952397

0 commit comments

Comments
 (0)