@@ -818,6 +818,23 @@ TEST_CASE("owner operator bool invalid", "[owner_utility]") {
818818TEST_CASE (" owner release valid" , " [owner_utility]" ) {
819819 memory_tracker mem_track;
820820
821+ {
822+ test_ptr ptr (new test_object);
823+ test_object* ptr_raw = ptr.release ();
824+ REQUIRE (ptr_raw != nullptr );
825+ REQUIRE (ptr.get () == nullptr );
826+ REQUIRE (instances == 1 );
827+ delete ptr_raw;
828+ }
829+
830+ REQUIRE (instances == 0 );
831+ REQUIRE (mem_track.leaks () == 0u );
832+ REQUIRE (mem_track.double_del () == 0u );
833+ }
834+
835+ TEST_CASE (" owner release valid with observer" , " [owner_utility]" ) {
836+ memory_tracker mem_track;
837+
821838 {
822839 test_optr optr;
823840 {
@@ -841,6 +858,23 @@ TEST_CASE("owner release valid", "[owner_utility]") {
841858TEST_CASE (" owner release valid from make_observable_unique" , " [owner_utility]" ) {
842859 memory_tracker mem_track;
843860
861+ {
862+ test_ptr ptr = oup::make_observable_unique<test_object>();
863+ test_object* ptr_raw = ptr.release ();
864+ REQUIRE (ptr_raw != nullptr );
865+ REQUIRE (ptr.get () == nullptr );
866+ REQUIRE (instances == 1 );
867+ delete ptr_raw;
868+ }
869+
870+ REQUIRE (instances == 0 );
871+ REQUIRE (mem_track.leaks () == 0u );
872+ REQUIRE (mem_track.double_del () == 0u );
873+ }
874+
875+ TEST_CASE (" owner release valid from make_observable_unique with obsever" , " [owner_utility]" ) {
876+ memory_tracker mem_track;
877+
844878 {
845879 test_optr optr;
846880 {
@@ -864,10 +898,31 @@ TEST_CASE("owner release valid from make_observable_unique", "[owner_utility]")
864898TEST_CASE (" owner release valid with deleter" , " [owner_utility]" ) {
865899 memory_tracker mem_track;
866900
901+ {
902+ test_ptr_with_deleter ptr (new test_object, test_deleter{42 });
903+ test_object* ptr_raw = ptr.release ();
904+ REQUIRE (ptr_raw != nullptr );
905+ REQUIRE (ptr.get () == nullptr );
906+ REQUIRE (instances == 1 );
907+ REQUIRE (instances_deleter == 1 );
908+ REQUIRE (ptr.get_deleter ().state_ == 42 );
909+ delete ptr_raw;
910+ }
911+
912+ REQUIRE (instances == 0 );
913+ REQUIRE (instances_deleter == 0 );
914+ REQUIRE (mem_track.leaks () == 0u );
915+ REQUIRE (mem_track.double_del () == 0u );
916+ }
917+
918+ TEST_CASE (" owner release valid with deleter with observer" , " [owner_utility]" ) {
919+ memory_tracker mem_track;
920+
867921 {
868922 test_optr optr;
869923 {
870924 test_ptr_with_deleter ptr (new test_object, test_deleter{42 });
925+ optr = ptr;
871926 test_object* ptr_raw = ptr.release ();
872927 REQUIRE (ptr_raw != nullptr );
873928 REQUIRE (ptr.get () == nullptr );
@@ -1010,6 +1065,8 @@ TEST_CASE("observer move constructor", "[observer_construction]") {
10101065 REQUIRE (instances == 1 );
10111066 REQUIRE (ptr.get () != nullptr );
10121067 REQUIRE (ptr.expired () == false );
1068+ REQUIRE (ptr_orig.get () == nullptr );
1069+ REQUIRE (ptr_orig.expired () == true );
10131070 }
10141071
10151072 REQUIRE (instances == 1 );
0 commit comments