@@ -1949,6 +1949,94 @@ TEST_CASE("observer explicit conversion copy constructor subobject", "[observer_
19491949 REQUIRE (mem_track.double_del () == 0u );
19501950}
19511951
1952+ TEST_CASE (" observer from null owner constructor" , " [observer_construction]" ) {
1953+ memory_tracker mem_track;
1954+
1955+ {
1956+ test_ptr ptr_owner;
1957+ {
1958+ test_optr ptr{ptr_owner};
1959+ REQUIRE (instances == 0 );
1960+ REQUIRE (ptr.get () == ptr_owner.get ());
1961+ REQUIRE (ptr.expired () == true );
1962+ }
1963+
1964+ REQUIRE (instances == 0 );
1965+ }
1966+
1967+ REQUIRE (instances == 0 );
1968+ REQUIRE (mem_track.leaks () == 0u );
1969+ REQUIRE (mem_track.double_del () == 0u );
1970+ }
1971+
1972+ TEST_CASE (" observer from owner constructor" , " [observer_construction]" ) {
1973+ memory_tracker mem_track;
1974+
1975+ {
1976+ test_ptr ptr_owner{new test_object};
1977+ {
1978+ test_optr ptr{ptr_owner};
1979+ REQUIRE (instances == 1 );
1980+ REQUIRE (ptr.get () == ptr_owner.get ());
1981+ REQUIRE (ptr.expired () == false );
1982+
1983+ ptr_owner.reset ();
1984+ REQUIRE (ptr.get () == nullptr );
1985+ REQUIRE (ptr.expired () == true );
1986+ }
1987+
1988+ REQUIRE (instances == 0 );
1989+ }
1990+
1991+ REQUIRE (instances == 0 );
1992+ REQUIRE (mem_track.leaks () == 0u );
1993+ REQUIRE (mem_track.double_del () == 0u );
1994+ }
1995+
1996+ TEST_CASE (" observer from null owner casting constructor" , " [observer_construction]" ) {
1997+ memory_tracker mem_track;
1998+
1999+ {
2000+ test_ptr ptr_owner;
2001+ {
2002+ test_optr ptr{ptr_owner, static_cast <test_object*>(nullptr )};
2003+ REQUIRE (instances == 0 );
2004+ REQUIRE (ptr.get () == ptr_owner.get ());
2005+ REQUIRE (ptr.expired () == true );
2006+ }
2007+
2008+ REQUIRE (instances == 0 );
2009+ }
2010+
2011+ REQUIRE (instances == 0 );
2012+ REQUIRE (mem_track.leaks () == 0u );
2013+ REQUIRE (mem_track.double_del () == 0u );
2014+ }
2015+
2016+ TEST_CASE (" observer from owner casting constructor" , " [observer_construction]" ) {
2017+ memory_tracker mem_track;
2018+
2019+ {
2020+ test_ptr ptr_owner{new test_object_derived};
2021+ {
2022+ test_optr ptr{ptr_owner, dynamic_cast <test_object_derived*>(ptr_owner.get ())};
2023+ REQUIRE (instances == 1 );
2024+ REQUIRE (ptr.get () == ptr_owner.get ());
2025+ REQUIRE (ptr.expired () == false );
2026+
2027+ ptr_owner.reset ();
2028+ REQUIRE (ptr.get () == nullptr );
2029+ REQUIRE (ptr.expired () == true );
2030+ }
2031+
2032+ REQUIRE (instances == 0 );
2033+ }
2034+
2035+ REQUIRE (instances == 0 );
2036+ REQUIRE (mem_track.leaks () == 0u );
2037+ REQUIRE (mem_track.double_del () == 0u );
2038+ }
2039+
19522040TEST_CASE (" observer move constructor" , " [observer_construction]" ) {
19532041 memory_tracker mem_track;
19542042
0 commit comments