@@ -1579,7 +1579,7 @@ TEST_CASE("observer default constructor", "[observer_construction]") {
15791579 memory_tracker mem_track;
15801580
15811581 {
1582- test_optr ptr{} ;
1582+ test_optr ptr;
15831583 REQUIRE (instances == 0 );
15841584 REQUIRE (ptr.get () == nullptr );
15851585 REQUIRE (ptr.expired () == true );
@@ -2023,7 +2023,7 @@ TEST_CASE("observer operator bool invalid", "[observer_utility]") {
20232023 REQUIRE (mem_track.double_del () == 0u );
20242024}
20252025
2026- TEST_CASE (" observer copy assignment operator from valid" , " [observer_assignment]" ) {
2026+ TEST_CASE (" observer copy assignment operator valid to empty " , " [observer_assignment]" ) {
20272027 memory_tracker mem_track;
20282028
20292029 {
@@ -2033,9 +2033,9 @@ TEST_CASE("observer copy assignment operator from valid", "[observer_assignment]
20332033 test_optr ptr;
20342034 ptr = ptr_orig;
20352035 REQUIRE (instances == 1 );
2036- REQUIRE (ptr.get () != nullptr );
2036+ REQUIRE (ptr.get () == ptr_owner. get () );
20372037 REQUIRE (ptr.expired () == false );
2038- REQUIRE (ptr_orig.get () != nullptr );
2038+ REQUIRE (ptr_orig.get () == ptr_owner. get () );
20392039 REQUIRE (ptr_orig.expired () == false );
20402040 }
20412041
@@ -2047,7 +2047,32 @@ TEST_CASE("observer copy assignment operator from valid", "[observer_assignment]
20472047 REQUIRE (mem_track.double_del () == 0u );
20482048}
20492049
2050- TEST_CASE (" observer copy assignment operator from empty" , " [observer_assignment]" ) {
2050+ TEST_CASE (" observer copy assignment operator valid to valid" , " [observer_assignment]" ) {
2051+ memory_tracker mem_track;
2052+
2053+ {
2054+ test_ptr ptr_owner1{new test_object};
2055+ test_ptr ptr_owner2{new test_object};
2056+ test_optr ptr_orig{ptr_owner1};
2057+ {
2058+ test_optr ptr (ptr_owner2);
2059+ ptr = ptr_orig;
2060+ REQUIRE (instances == 2 );
2061+ REQUIRE (ptr.get () == ptr_owner1.get ());
2062+ REQUIRE (ptr.expired () == false );
2063+ REQUIRE (ptr_orig.get () == ptr_owner1.get ());
2064+ REQUIRE (ptr_orig.expired () == false );
2065+ }
2066+
2067+ REQUIRE (instances == 2 );
2068+ }
2069+
2070+ REQUIRE (instances == 0 );
2071+ REQUIRE (mem_track.leaks () == 0u );
2072+ REQUIRE (mem_track.double_del () == 0u );
2073+ }
2074+
2075+ TEST_CASE (" observer copy assignment operator empty to empty" , " [observer_assignment]" ) {
20512076 memory_tracker mem_track;
20522077
20532078 {
@@ -2070,7 +2095,7 @@ TEST_CASE("observer copy assignment operator from empty", "[observer_assignment]
20702095 REQUIRE (mem_track.double_del () == 0u );
20712096}
20722097
2073- TEST_CASE (" observer move assignment operator from valid" , " [observer_assignment]" ) {
2098+ TEST_CASE (" observer move assignment operator valid to empty " , " [observer_assignment]" ) {
20742099 memory_tracker mem_track;
20752100
20762101 {
@@ -2080,7 +2105,7 @@ TEST_CASE("observer move assignment operator from valid", "[observer_assignment]
20802105 test_optr ptr;
20812106 ptr = std::move (ptr_orig);
20822107 REQUIRE (instances == 1 );
2083- REQUIRE (ptr.get () != nullptr );
2108+ REQUIRE (ptr.get () == ptr_owner. get () );
20842109 REQUIRE (ptr.expired () == false );
20852110 REQUIRE (ptr_orig.get () == nullptr );
20862111 REQUIRE (ptr_orig.expired () == true );
@@ -2094,7 +2119,32 @@ TEST_CASE("observer move assignment operator from valid", "[observer_assignment]
20942119 REQUIRE (mem_track.double_del () == 0u );
20952120}
20962121
2097- TEST_CASE (" observer move assignment operator from empty" , " [observer_assignment]" ) {
2122+ TEST_CASE (" observer move assignment operator valid to valid" , " [observer_assignment]" ) {
2123+ memory_tracker mem_track;
2124+
2125+ {
2126+ test_ptr ptr_owner1{new test_object};
2127+ test_ptr ptr_owner2{new test_object};
2128+ test_optr ptr_orig{ptr_owner1};
2129+ {
2130+ test_optr ptr{ptr_owner2};
2131+ ptr = std::move (ptr_orig);
2132+ REQUIRE (instances == 2 );
2133+ REQUIRE (ptr.get () == ptr_owner1.get ());
2134+ REQUIRE (ptr.expired () == false );
2135+ REQUIRE (ptr_orig.get () == nullptr );
2136+ REQUIRE (ptr_orig.expired () == true );
2137+ }
2138+
2139+ REQUIRE (instances == 2 );
2140+ }
2141+
2142+ REQUIRE (instances == 0 );
2143+ REQUIRE (mem_track.leaks () == 0u );
2144+ REQUIRE (mem_track.double_del () == 0u );
2145+ }
2146+
2147+ TEST_CASE (" observer move assignment operator empty to empty" , " [observer_assignment]" ) {
20982148 memory_tracker mem_track;
20992149
21002150 {
@@ -2117,7 +2167,7 @@ TEST_CASE("observer move assignment operator from empty", "[observer_assignment]
21172167 REQUIRE (mem_track.double_del () == 0u );
21182168}
21192169
2120- TEST_CASE (" observer acquiring assignment operator from valid" , " [observer_assignment]" ) {
2170+ TEST_CASE (" observer acquiring assignment operator valid to empty " , " [observer_assignment]" ) {
21212171 memory_tracker mem_track;
21222172
21232173 {
@@ -2126,7 +2176,7 @@ TEST_CASE("observer acquiring assignment operator from valid", "[observer_assign
21262176 ptr = ptr_owner;
21272177
21282178 REQUIRE (instances == 1 );
2129- REQUIRE (ptr.get () != nullptr );
2179+ REQUIRE (ptr.get () == ptr_owner. get () );
21302180 REQUIRE (ptr.expired () == false );
21312181 }
21322182
@@ -2135,34 +2185,72 @@ TEST_CASE("observer acquiring assignment operator from valid", "[observer_assign
21352185 REQUIRE (mem_track.double_del () == 0u );
21362186}
21372187
2138- TEST_CASE (" observer acquiring assignment operator from valid sealed " , " [observer_assignment]" ) {
2188+ TEST_CASE (" observer acquiring assignment operator valid to valid " , " [observer_assignment]" ) {
21392189 memory_tracker mem_track;
21402190
21412191 {
2142- test_sptr ptr_owner = oup::make_observable_sealed<test_object>();
2192+ test_ptr ptr_owner1{new test_object};
2193+ test_ptr ptr_owner2{new test_object};
2194+ test_optr ptr{ptr_owner1};
2195+ ptr = ptr_owner2;
2196+
2197+ REQUIRE (instances == 2 );
2198+ REQUIRE (ptr.get () == ptr_owner2.get ());
2199+ REQUIRE (ptr.expired () == false );
2200+ }
2201+
2202+ REQUIRE (instances == 0 );
2203+ REQUIRE (mem_track.leaks () == 0u );
2204+ REQUIRE (mem_track.double_del () == 0u );
2205+ }
2206+
2207+ TEST_CASE (" observer acquiring assignment operator empty to valid" , " [observer_assignment]" ) {
2208+ memory_tracker mem_track;
2209+
2210+ {
2211+ test_ptr ptr_owner1{new test_object};
2212+ test_ptr ptr_owner2;
2213+ test_optr ptr{ptr_owner1};
2214+ ptr = ptr_owner2;
2215+
2216+ REQUIRE (instances == 1 );
2217+ REQUIRE (ptr.get () == nullptr );
2218+ REQUIRE (ptr.expired () == true );
2219+ }
2220+
2221+ REQUIRE (instances == 0 );
2222+ REQUIRE (mem_track.leaks () == 0u );
2223+ REQUIRE (mem_track.double_del () == 0u );
2224+ }
2225+
2226+ TEST_CASE (" observer acquiring assignment operator empty to empty" , " [observer_assignment]" ) {
2227+ memory_tracker mem_track;
2228+
2229+ {
2230+ test_ptr ptr_owner;
21432231 test_optr ptr;
21442232 ptr = ptr_owner;
21452233
2146- REQUIRE (instances == 1 );
2147- REQUIRE (ptr.get () ! = nullptr );
2148- REQUIRE (ptr.expired () == false );
2234+ REQUIRE (instances == 0 );
2235+ REQUIRE (ptr.get () = = nullptr );
2236+ REQUIRE (ptr.expired () == true );
21492237 }
21502238
21512239 REQUIRE (instances == 0 );
21522240 REQUIRE (mem_track.leaks () == 0u );
21532241 REQUIRE (mem_track.double_del () == 0u );
21542242}
21552243
2156- TEST_CASE (" observer acquiring assignment operator from valid with deleter " , " [observer_assignment]" ) {
2244+ TEST_CASE (" observer acquiring assignment operator valid to empty sealed " , " [observer_assignment]" ) {
21572245 memory_tracker mem_track;
21582246
21592247 {
2160- test_ptr_with_deleter ptr_owner{ new test_object, test_deleter{ 42 }} ;
2248+ test_sptr ptr_owner = oup::make_observable_sealed<test_object>() ;
21612249 test_optr ptr;
21622250 ptr = ptr_owner;
21632251
21642252 REQUIRE (instances == 1 );
2165- REQUIRE (ptr.get () != nullptr );
2253+ REQUIRE (ptr.get () == ptr_owner. get () );
21662254 REQUIRE (ptr.expired () == false );
21672255 }
21682256
@@ -2171,11 +2259,49 @@ TEST_CASE("observer acquiring assignment operator from valid with deleter", "[ob
21712259 REQUIRE (mem_track.double_del () == 0u );
21722260}
21732261
2174- TEST_CASE (" observer acquiring assignment operator from empty " , " [observer_assignment]" ) {
2262+ TEST_CASE (" observer acquiring assignment operator valid to valid sealed " , " [observer_assignment]" ) {
21752263 memory_tracker mem_track;
21762264
21772265 {
2178- test_ptr ptr_owner;
2266+ test_sptr ptr_owner1 = oup::make_observable_sealed<test_object>();
2267+ test_sptr ptr_owner2 = oup::make_observable_sealed<test_object>();
2268+ test_optr ptr{ptr_owner1};
2269+ ptr = ptr_owner2;
2270+
2271+ REQUIRE (instances == 2 );
2272+ REQUIRE (ptr.get () == ptr_owner2.get ());
2273+ REQUIRE (ptr.expired () == false );
2274+ }
2275+
2276+ REQUIRE (instances == 0 );
2277+ REQUIRE (mem_track.leaks () == 0u );
2278+ REQUIRE (mem_track.double_del () == 0u );
2279+ }
2280+
2281+ TEST_CASE (" observer acquiring assignment operator empty to valid sealed" , " [observer_assignment]" ) {
2282+ memory_tracker mem_track;
2283+
2284+ {
2285+ test_sptr ptr_owner1 = oup::make_observable_sealed<test_object>();
2286+ test_sptr ptr_owner2;
2287+ test_optr ptr{ptr_owner1};
2288+ ptr = ptr_owner2;
2289+
2290+ REQUIRE (instances == 1 );
2291+ REQUIRE (ptr.get () == nullptr );
2292+ REQUIRE (ptr.expired () == true );
2293+ }
2294+
2295+ REQUIRE (instances == 0 );
2296+ REQUIRE (mem_track.leaks () == 0u );
2297+ REQUIRE (mem_track.double_del () == 0u );
2298+ }
2299+
2300+ TEST_CASE (" observer acquiring assignment operator empty to empty sealed" , " [observer_assignment]" ) {
2301+ memory_tracker mem_track;
2302+
2303+ {
2304+ test_sptr ptr_owner;
21792305 test_optr ptr;
21802306 ptr = ptr_owner;
21812307
@@ -2189,15 +2315,53 @@ TEST_CASE("observer acquiring assignment operator from empty", "[observer_assign
21892315 REQUIRE (mem_track.double_del () == 0u );
21902316}
21912317
2192- TEST_CASE (" observer acquiring assignment operator from empty sealed " , " [observer_assignment]" ) {
2318+ TEST_CASE (" observer acquiring assignment operator valid to empty with deleter " , " [observer_assignment]" ) {
21932319 memory_tracker mem_track;
21942320
21952321 {
2196- test_sptr ptr_owner;
2322+ test_ptr_with_deleter ptr_owner{ new test_object, test_deleter{ 42 }} ;
21972323 test_optr ptr;
21982324 ptr = ptr_owner;
21992325
2200- REQUIRE (instances == 0 );
2326+ REQUIRE (instances == 1 );
2327+ REQUIRE (ptr.get () == ptr_owner.get ());
2328+ REQUIRE (ptr.expired () == false );
2329+ }
2330+
2331+ REQUIRE (instances == 0 );
2332+ REQUIRE (mem_track.leaks () == 0u );
2333+ REQUIRE (mem_track.double_del () == 0u );
2334+ }
2335+
2336+ TEST_CASE (" observer acquiring assignment operator valid to valid with deleter" , " [observer_assignment]" ) {
2337+ memory_tracker mem_track;
2338+
2339+ {
2340+ test_ptr_with_deleter ptr_owner1{new test_object, test_deleter{42 }};
2341+ test_ptr_with_deleter ptr_owner2{new test_object, test_deleter{42 }};
2342+ test_optr ptr{ptr_owner1};
2343+ ptr = ptr_owner2;
2344+
2345+ REQUIRE (instances == 2 );
2346+ REQUIRE (ptr.get () == ptr_owner2.get ());
2347+ REQUIRE (ptr.expired () == false );
2348+ }
2349+
2350+ REQUIRE (instances == 0 );
2351+ REQUIRE (mem_track.leaks () == 0u );
2352+ REQUIRE (mem_track.double_del () == 0u );
2353+ }
2354+
2355+ TEST_CASE (" observer acquiring assignment operator empty to valid with deleter" , " [observer_assignment]" ) {
2356+ memory_tracker mem_track;
2357+
2358+ {
2359+ test_ptr_with_deleter ptr_owner1{new test_object, test_deleter{42 }};
2360+ test_ptr_with_deleter ptr_owner2{nullptr , test_deleter{43 }};
2361+ test_optr ptr{ptr_owner1};
2362+ ptr = ptr_owner2;
2363+
2364+ REQUIRE (instances == 1 );
22012365 REQUIRE (ptr.get () == nullptr );
22022366 REQUIRE (ptr.expired () == true );
22032367 }
@@ -2207,7 +2371,7 @@ TEST_CASE("observer acquiring assignment operator from empty sealed", "[observer
22072371 REQUIRE (mem_track.double_del () == 0u );
22082372}
22092373
2210- TEST_CASE (" observer acquiring assignment operator from empty with deleter" , " [observer_assignment]" ) {
2374+ TEST_CASE (" observer acquiring assignment operator empty to empty with deleter" , " [observer_assignment]" ) {
22112375 memory_tracker mem_track;
22122376
22132377 {
0 commit comments