corelib/tests/ptr-weak.cc

487 lines
12 KiB
C++
Raw Normal View History

#include <ebcl/Pointers.hh>
#include <cppunit/extensions/HelperMacros.h>
using namespace ebcl;
class WeakPointerTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( WeakPointerTest );
CPPUNIT_TEST( testEmpty );
CPPUNIT_TEST( testSharedCons );
CPPUNIT_TEST( testSharedConsEmpty );
CPPUNIT_TEST( testSharedConsCastC2P );
CPPUNIT_TEST( testSharedConsCastP2C );
CPPUNIT_TEST( testSharedConsCastBad );
CPPUNIT_TEST( testSharedAss );
CPPUNIT_TEST( testSharedAssEmpty );
CPPUNIT_TEST( testSharedAssCastC2P );
CPPUNIT_TEST( testSharedAssCastP2C );
CPPUNIT_TEST( testSharedAssCastBad );
CPPUNIT_TEST( testCopyCons );
CPPUNIT_TEST( testCopyConsCastC2P );
CPPUNIT_TEST( testCopyConsCastP2C );
CPPUNIT_TEST( testCopyConsCastBad );
CPPUNIT_TEST( testCopyAss );
CPPUNIT_TEST( testCopyAssCastC2P );
CPPUNIT_TEST( testCopyAssCastP2C );
CPPUNIT_TEST( testCopyAssCastBad );
CPPUNIT_TEST( testMoveCons );
CPPUNIT_TEST( testMoveConsCastC2P );
CPPUNIT_TEST( testMoveConsCastP2C );
CPPUNIT_TEST( testMoveConsCastBad );
CPPUNIT_TEST( testMoveAss );
CPPUNIT_TEST( testMoveAssCastC2P );
CPPUNIT_TEST( testMoveAssCastP2C );
CPPUNIT_TEST( testMoveAssCastBad );
CPPUNIT_TEST( testSwap );
CPPUNIT_TEST( testClear );
CPPUNIT_TEST( testBecomesNull );
CPPUNIT_TEST( testMakeOwned );
CPPUNIT_TEST_SUITE_END( );
public:
void tearDown( );
void testEmpty( );
void testSharedCons( );
void testSharedConsEmpty( );
void testSharedConsCastC2P( );
void testSharedConsCastP2C( );
void testSharedConsCastBad( );
void testSharedAss( );
void testSharedAssEmpty( );
void testSharedAssCastC2P( );
void testSharedAssCastP2C( );
void testSharedAssCastBad( );
void testCopyCons( );
void testCopyConsCastC2P( );
void testCopyConsCastP2C( );
void testCopyConsCastBad( );
void testCopyAss( );
void testCopyAssCastC2P( );
void testCopyAssCastP2C( );
void testCopyAssCastBad( );
void testMoveCons( );
void testMoveConsCastC2P( );
void testMoveConsCastP2C( );
void testMoveConsCastBad( );
void testMoveAss( );
void testMoveAssCastC2P( );
void testMoveAssCastP2C( );
void testMoveAssCastBad( );
void testSwap( );
void testClear( );
void testBecomesNull( );
void testMakeOwned( );
};
CPPUNIT_TEST_SUITE_REGISTRATION( WeakPointerTest );
/*----------------------------------------------------------------------------*/
#include "ptr-common.hh"
using Ptr = T_SharedPtr< T_Test >;
using WPtr = T_WeakPtr< T_Test >;
void WeakPointerTest::tearDown( )
{
T_Test::dCalled = 0;
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testEmpty( )
{
{
WPtr test;
CPPUNIT_ASSERT( !test );
CPPUNIT_ASSERT_EQUAL( false , bool( test ) );
CPPUNIT_ASSERT_EQUAL( (T_Test *) nullptr , (T_Test *) test );
}
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testSharedCons( )
{
Ptr shared( NewShared< T_Test >( ) );
{
WPtr test( shared );
CPPUNIT_ASSERT( bool( test ) );
CPPUNIT_ASSERT_EQUAL( false , !test );
CPPUNIT_ASSERT( (T_Test *) test != nullptr );
CPPUNIT_ASSERT( test == shared );
CPPUNIT_ASSERT( shared == test );
CPPUNIT_ASSERT_EQUAL( -1 , test->field );
}
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testSharedConsEmpty( )
{
{
Ptr shared;
WPtr test( shared );
CPPUNIT_ASSERT( !test );
CPPUNIT_ASSERT_EQUAL( false , bool( test ) );
CPPUNIT_ASSERT_EQUAL( (T_Test *) nullptr , (T_Test *) test );
CPPUNIT_ASSERT( test == shared );
CPPUNIT_ASSERT( shared == test );
}
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testSharedConsCastC2P( )
{
T_SharedPtr< T_TestChild > shared( NewShared< T_TestChild >( ) );
WPtr test( shared );
CPPUNIT_ASSERT( bool( test ) );
CPPUNIT_ASSERT( (T_Test *) test == (T_TestChild *) shared );
}
void WeakPointerTest::testSharedConsCastP2C( )
{
Ptr shared( NewShared< T_TestChild >( ) );
T_WeakPtr< T_TestChild > test( shared );
CPPUNIT_ASSERT( bool( test ) );
CPPUNIT_ASSERT( (T_TestChild *) test == (T_Test *) shared );
}
void WeakPointerTest::testSharedConsCastBad( )
{
Ptr shared( NewShared< T_OtherChild >( 12 , 34 ) );
try {
T_WeakPtr< T_TestChild > test( shared );
CPPUNIT_FAIL( "std::bad_cast not thrown" );
} catch ( std::bad_cast const& ) {
// OK
}
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testSharedAss( )
{
Ptr shared( NewShared< T_Test >( ) );
{
WPtr test;
test = shared;
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( test == shared );
CPPUNIT_ASSERT( shared == test );
CPPUNIT_ASSERT_EQUAL( -1 , test->field );
}
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testSharedAssEmpty( )
{
Ptr shared;
WPtr test;
test = shared;
CPPUNIT_ASSERT( !test );
shared = NewShared< T_Test >( );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testSharedAssCastC2P( )
{
T_SharedPtr< T_TestChild > shared( NewShared< T_TestChild >( ) );
WPtr test;
test = shared;
CPPUNIT_ASSERT( bool( test ) );
CPPUNIT_ASSERT( (T_Test *) test == (T_TestChild *) shared );
}
void WeakPointerTest::testSharedAssCastP2C( )
{
Ptr shared( NewShared< T_TestChild >( ) );
T_WeakPtr< T_TestChild > test;
test = shared;
CPPUNIT_ASSERT( bool( test ) );
CPPUNIT_ASSERT( (T_TestChild *) test == (T_Test *) shared );
}
void WeakPointerTest::testSharedAssCastBad( )
{
Ptr shared( NewShared< T_OtherChild >( 12 , 34 ) );
T_WeakPtr< T_TestChild > test;
try {
test = shared;
CPPUNIT_FAIL( "std::bad_cast not thrown" );
} catch ( std::bad_cast const& ) {
// OK
}
CPPUNIT_ASSERT( !test );
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testCopyCons( )
{
Ptr shared( NewShared< T_Test >( ) );
WPtr wtest( shared );
{
WPtr test( wtest );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( test == shared );
CPPUNIT_ASSERT( shared == test );
CPPUNIT_ASSERT( test == wtest );
CPPUNIT_ASSERT( wtest == test );
CPPUNIT_ASSERT_EQUAL( -1 , test->field );
}
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testCopyConsCastC2P( )
{
auto shared( NewShared< T_TestChild >( ) );
T_WeakPtr< T_TestChild > weak( shared );
WPtr test( weak );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( (T_TestChild*) weak == (T_Test*) test );
shared.clear( );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testCopyConsCastP2C( )
{
Ptr shared( NewShared< T_TestChild >( ) );
WPtr weak( shared );
T_WeakPtr< T_TestChild > test( weak );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( (T_Test*) weak == (T_TestChild*) test );
shared.clear( );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testCopyConsCastBad( )
{
Ptr shared( NewShared< T_OtherChild >( 12 , 34 ) );
WPtr weak( shared );
try {
T_WeakPtr< T_TestChild > test( weak );
CPPUNIT_FAIL( "std::bad_cast not thrown" );
} catch ( std::bad_cast const& ) {
// OK
}
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testCopyAss( )
{
Ptr shared( NewShared< T_Test >( ) );
WPtr wtest( shared );
{
WPtr test;
test = wtest;
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( test == shared );
CPPUNIT_ASSERT( shared == test );
CPPUNIT_ASSERT( test == wtest );
CPPUNIT_ASSERT( wtest == test );
CPPUNIT_ASSERT_EQUAL( -1 , test->field );
}
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testCopyAssCastC2P( )
{
auto shared( NewShared< T_TestChild >( ) );
T_WeakPtr< T_TestChild > weak( shared );
WPtr test;
test = weak;
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( (T_TestChild*) weak == (T_Test*) test );
shared.clear( );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testCopyAssCastP2C( )
{
Ptr shared( NewShared< T_TestChild >( ) );
WPtr weak( shared );
T_WeakPtr< T_TestChild > test;
test = weak;
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( (T_Test*) weak == (T_TestChild*) test );
shared.clear( );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testCopyAssCastBad( )
{
Ptr shared( NewShared< T_OtherChild >( 12 , 34 ) );
WPtr weak( shared );
T_WeakPtr< T_TestChild > test;
try {
test = weak;
CPPUNIT_FAIL( "std::bad_cast not thrown" );
} catch ( std::bad_cast const& ) {
// OK
}
CPPUNIT_ASSERT( !test );
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testMoveCons( )
{
Ptr shared( NewShared< T_Test >( ) );
WPtr weak( shared );
WPtr test( std::move( weak ) );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( !weak );
CPPUNIT_ASSERT( shared == test );
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testMoveConsCastC2P( )
{
auto shared( NewShared< T_TestChild >( ) );
T_WeakPtr< T_TestChild > weak( shared );
WPtr test( std::move( weak ) );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( !weak );
CPPUNIT_ASSERT( (T_TestChild*) shared == (T_Test*) test );
}
void WeakPointerTest::testMoveConsCastP2C( )
{
Ptr shared( NewShared< T_TestChild >( ) );
WPtr weak( shared );
T_WeakPtr< T_TestChild > test( std::move( weak ) );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( !weak );
CPPUNIT_ASSERT( (T_Test*) shared == (T_TestChild*) test );
}
void WeakPointerTest::testMoveConsCastBad( )
{
Ptr shared( NewShared< T_OtherChild >( 12 , 34 ) );
WPtr weak( shared );
try {
T_WeakPtr< T_TestChild > test( std::move( weak ) );
CPPUNIT_FAIL( "std::bad_cast not thrown" );
} catch ( std::bad_cast const& ) {
// OK
}
CPPUNIT_ASSERT( weak );
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testMoveAss( )
{
Ptr shared( NewShared< T_Test >( ) );
WPtr weak( shared );
WPtr test;
test = std::move( weak );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( !weak );
CPPUNIT_ASSERT( shared == test );
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
}
void WeakPointerTest::testMoveAssCastC2P( )
{
auto shared( NewShared< T_TestChild >( ) );
T_WeakPtr< T_TestChild > weak( shared );
WPtr test;
test = std::move( weak );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( !weak );
CPPUNIT_ASSERT( (T_TestChild*) shared == (T_Test*) test );
}
void WeakPointerTest::testMoveAssCastP2C( )
{
Ptr shared( NewShared< T_TestChild >( ) );
WPtr weak( shared );
T_WeakPtr< T_TestChild > test;
test = std::move( weak );
CPPUNIT_ASSERT( test );
CPPUNIT_ASSERT( !weak );
CPPUNIT_ASSERT( (T_Test*) shared == (T_TestChild*) test );
}
void WeakPointerTest::testMoveAssCastBad( )
{
Ptr shared( NewShared< T_OtherChild >( 12 , 34 ) );
WPtr weak( shared );
T_WeakPtr< T_TestChild > test;
try {
test = std::move( weak );
CPPUNIT_FAIL( "std::bad_cast not thrown" );
} catch ( std::bad_cast const& ) {
// OK
}
CPPUNIT_ASSERT( !test );
CPPUNIT_ASSERT( weak );
}
/*----------------------------------------------------------------------------*/
void WeakPointerTest::testSwap( )
{
Ptr stest1( NewShared< T_Test >( 1 ) );
Ptr stest2( NewShared< T_Test >( 2 ) );
WPtr test1( stest1 ) , test2( stest2 );
swap( stest1 , stest2 );
CPPUNIT_ASSERT_EQUAL( 1 , stest2->field );
CPPUNIT_ASSERT_EQUAL( 2 , stest1->field );
}
void WeakPointerTest::testClear( )
{
Ptr shared( NewShared< T_Test >( ) );
WPtr test( shared );
test.clear( );
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testBecomesNull( )
{
WPtr test;
{
Ptr shared( NewShared< T_Test >( ) );
test = shared;
}
CPPUNIT_ASSERT_EQUAL( 1 , T_Test::dCalled );
CPPUNIT_ASSERT( !test );
}
void WeakPointerTest::testMakeOwned( )
{
Ptr shared( NewShared< T_Test >( ) );
WPtr test( shared );
T_OwnPtr< T_Test > otest( shared.makeOwned( ) );
CPPUNIT_ASSERT_EQUAL( 0 , T_Test::dCalled );
CPPUNIT_ASSERT( !test );
}