@@ -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+
751847TEST_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+
21212270TEST_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+
21932395TEST_CASE (" observer acquiring assignment operator valid to empty" , " [observer_assignment]" ) {
21942396 memory_tracker mem_track;
21952397
0 commit comments