Added tests for bug 3224518.
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@1095 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
2e1bf19bdd
commit
9fe5e76c73
1 changed files with 1022 additions and 797 deletions
|
@ -54,7 +54,7 @@ unsigned int MimicCOM::s_destructions = 0;
|
|||
class Thingy;
|
||||
|
||||
typedef Loki::SmartPtr< Thingy, RefCounted, DisallowConversion,
|
||||
AssertCheck, DefaultSPStorage, PropagateConst >
|
||||
NoCheck, DefaultSPStorage, PropagateConst >
|
||||
Thingy_DefaultStorage_ptr;
|
||||
|
||||
typedef Loki::SmartPtr< Thingy, RefCounted, DisallowConversion,
|
||||
|
@ -69,18 +69,23 @@ typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion,
|
|||
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr;
|
||||
|
||||
/// @note These 3 are used for testing const policies.
|
||||
typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion,
|
||||
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||
ConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr;
|
||||
|
||||
typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion,
|
||||
AssertCheck, DefaultSPStorage, PropagateConst >
|
||||
ConstBase_RefCount_NoConvert_Assert_Propagate_ptr;
|
||||
/// @note These 4 are used for testing const policies.
|
||||
|
||||
typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion,
|
||||
AssertCheck, DefaultSPStorage, PropagateConst >
|
||||
NonConstBase_RefCount_NoConvert_Assert_Propagate_ptr;
|
||||
NoCheck, DefaultSPStorage, DontPropagateConst >
|
||||
NonConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr;
|
||||
|
||||
typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion,
|
||||
NoCheck, DefaultSPStorage, DontPropagateConst >
|
||||
ConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr;
|
||||
|
||||
typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion,
|
||||
NoCheck, DefaultSPStorage, PropagateConst >
|
||||
ConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr;
|
||||
|
||||
typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion,
|
||||
NoCheck, DefaultSPStorage, PropagateConst >
|
||||
NonConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr;
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -135,11 +140,12 @@ typedef Loki::SmartPtr< MimicCOM, COMRefCounted, DisallowConversion,
|
|||
|
||||
void DoConstConversionTests( void )
|
||||
{
|
||||
cout << "Starting DoConstConversionTests." << endl;
|
||||
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1;
|
||||
ConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( p1 );
|
||||
ConstBase_RefCount_NoConvert_Assert_Propagate_ptr p3( p1 );
|
||||
NonConstBase_RefCount_NoConvert_Assert_Propagate_ptr p4( p1 );
|
||||
NonConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr p1;
|
||||
ConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr p2( p1 );
|
||||
ConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr p3( p1 );
|
||||
NonConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr p4( p1 );
|
||||
|
||||
// p1 = p2; // illegal! converts const to non-const.
|
||||
// p1 = p3; // illegal! converts const to non-const.
|
||||
|
@ -153,18 +159,26 @@ void DoConstConversionTests( void )
|
|||
p4 = p1; // legal, but dubious. Changes const-propagation policy.
|
||||
// p4 = p2; // illegal! converts const to non-const.
|
||||
// p4 = p3; // illegal! converts const to non-const.
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoConstConversionTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoOwnershipConversionTests( void )
|
||||
{
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1;
|
||||
NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p2;
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p3;
|
||||
cout << "Starting DoOwnershipConversionTests." << endl;
|
||||
|
||||
{
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass );
|
||||
NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass );
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p3( new BaseClass );
|
||||
NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p4( new BaseClass );
|
||||
NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p5;
|
||||
NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p6;
|
||||
NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p5( new BaseClass );
|
||||
NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p6( new BaseClass );
|
||||
|
||||
// legal constructions. Each should allow copy with same policies.
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p7( p1 );
|
||||
|
@ -217,23 +231,31 @@ void DoOwnershipConversionTests( void )
|
|||
// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p40( p3 );
|
||||
// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p41( p4 );
|
||||
// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p42( p5 );
|
||||
}
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
|
||||
{
|
||||
// These constructions are legal because the preserve const-ness.
|
||||
ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p43( p5 );
|
||||
ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p44( p43 );
|
||||
const BaseClass * rawP = new BaseClass;
|
||||
ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p43( rawP );
|
||||
ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p44( p43 );
|
||||
rawP = new BaseClass;
|
||||
// These constructions are illegal because the don't preserve constness.
|
||||
// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p45( rawP );
|
||||
// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p46( p43 );
|
||||
ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p47( rawP );
|
||||
|
||||
NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p48;
|
||||
NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p49( new BaseClass );
|
||||
// This assignment is legal because it preserves constness.
|
||||
p48 = p5;
|
||||
p48 = p49;
|
||||
// This assignment is illegal because it won't preserve constness.
|
||||
// p48 = p43;
|
||||
|
||||
// illegal assignements! Can't convert from one ownership policy to another.
|
||||
// illegal assignments! Can't convert from one ownership policy to another.
|
||||
// p1 = p2;
|
||||
// p1 = p3;
|
||||
// p1 = p4;
|
||||
|
@ -266,12 +288,21 @@ void DoOwnershipConversionTests( void )
|
|||
// p6 = p5;
|
||||
}
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoOwnershipConversionTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoInheritanceConversionTests( void )
|
||||
{
|
||||
cout << "Starting DoInheritanceConversionTests." << endl;
|
||||
|
||||
{
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1;
|
||||
PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p2;
|
||||
PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p2( new PublicSubClass );
|
||||
PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p3;
|
||||
|
||||
p1 = p2; // legal. Cast to public base class allowed.
|
||||
|
@ -293,9 +324,18 @@ void DoInheritanceConversionTests( void )
|
|||
// PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p9( p2 );
|
||||
}
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoInheritanceConversionTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoRefCountSwapTests( void )
|
||||
{
|
||||
cout << "Starting DoRefCountSwapTests." << endl;
|
||||
|
||||
{
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass );
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass );
|
||||
|
@ -357,11 +397,19 @@ void DoRefCountSwapTests( void )
|
|||
assert( p2 != p1 );
|
||||
}
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoRefCountSwapTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoRefLinkSwapTests( void )
|
||||
{
|
||||
cout << "Starting DoRefLinkSwapTests." << endl;
|
||||
|
||||
{
|
||||
BaseClass * pBaseClass = new BaseClass;
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p1( pBaseClass );
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass );
|
||||
|
@ -918,10 +966,17 @@ void DoRefLinkSwapTests( void )
|
|||
assert( pA == pA );
|
||||
}
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoRefLinkSwapTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoRefLinkTests( void )
|
||||
{
|
||||
cout << "Starting DoRefLinkTests." << endl;
|
||||
|
||||
const unsigned int ctorCount = BaseClass::GetCtorCount(); (void) ctorCount;
|
||||
const unsigned int dtorCount = BaseClass::GetDtorCount(); (void) dtorCount;
|
||||
|
@ -951,12 +1006,18 @@ void DoRefLinkTests( void )
|
|||
assert( dtorCount + 2 == BaseClass::GetDtorCount() );
|
||||
assert( BaseClass::GetCtorCount() == BaseClass::GetDtorCount() );
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoRefLinkTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoRefCountNullPointerTests( void )
|
||||
{
|
||||
cout << "Starting DoRefCountNullPointerTests." << endl;
|
||||
|
||||
BaseClass * pNull = NULL; (void) pNull;
|
||||
const unsigned int ctorCount = BaseClass::GetCtorCount(); (void) ctorCount;
|
||||
const unsigned int dtorCount = BaseClass::GetDtorCount(); (void) dtorCount;
|
||||
|
@ -965,7 +1026,7 @@ void DoRefCountNullPointerTests( void )
|
|||
{
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p0;
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1;
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( p0 );
|
||||
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2;
|
||||
|
||||
assert( !p0 );
|
||||
assert( !p1 );
|
||||
|
@ -1005,12 +1066,19 @@ void DoRefCountNullPointerTests( void )
|
|||
}
|
||||
assert( ctorCount == BaseClass::GetCtorCount() );
|
||||
assert( dtorCount == BaseClass::GetDtorCount() );
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoRefCountNullPointerTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoRefLinkNullPointerTests( void )
|
||||
{
|
||||
cout << "Starting DoRefLinkNullPointerTests." << endl;
|
||||
|
||||
BaseClass * pNull = NULL; (void) pNull;
|
||||
const unsigned int ctorCount = BaseClass::GetCtorCount(); (void) ctorCount;
|
||||
const unsigned int dtorCount = BaseClass::GetDtorCount(); (void) dtorCount;
|
||||
|
@ -1019,7 +1087,7 @@ void DoRefLinkNullPointerTests( void )
|
|||
{
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p0;
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p1;
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2( p0 );
|
||||
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2;
|
||||
|
||||
assert( !p0 );
|
||||
assert( !p1 );
|
||||
|
@ -1059,12 +1127,18 @@ void DoRefLinkNullPointerTests( void )
|
|||
}
|
||||
assert( ctorCount == BaseClass::GetCtorCount() );
|
||||
assert( dtorCount == BaseClass::GetDtorCount() );
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoRefLinkNullPointerTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoComRefTest( void )
|
||||
{
|
||||
cout << "Starting DoComRefTest." << endl;
|
||||
|
||||
const unsigned int ctorCount = MimicCOM::GetCtorCount(); (void) ctorCount;
|
||||
const unsigned int dtorCount = MimicCOM::GetDtorCount(); (void) dtorCount;
|
||||
|
@ -1090,12 +1164,19 @@ void DoComRefTest( void )
|
|||
}
|
||||
assert( ctorCount+2 == MimicCOM::GetCtorCount() );
|
||||
assert( dtorCount+2 == MimicCOM::GetDtorCount() );
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoComRefTest." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoForwardReferenceTest( void )
|
||||
{
|
||||
cout << "Starting DoForwardReferenceTest." << endl;
|
||||
|
||||
/** @note These lines should cause the compiler to make a warning message
|
||||
about attempting to delete an undefined type. But it should not produce
|
||||
any error messages.
|
||||
|
@ -1112,6 +1193,11 @@ void DoForwardReferenceTest( void )
|
|||
//Thingy_HeapStorage_ptr p5( p4 );
|
||||
//Thingy_HeapStorage_ptr p6;
|
||||
//p6 = p5;
|
||||
|
||||
assert( BaseClass::AllDestroyed() );
|
||||
assert( !BaseClass::ExtraConstructions() );
|
||||
assert( !BaseClass::ExtraDestructions() );
|
||||
cout << "Finished DoForwardReferenceTest." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -1122,25 +1208,63 @@ namespace
|
|||
class Feline
|
||||
{
|
||||
public:
|
||||
virtual ~Feline() {}
|
||||
|
||||
static inline bool AllDestroyed( void )
|
||||
{
|
||||
return ( s_constructions == s_destructions );
|
||||
}
|
||||
|
||||
static inline bool ExtraConstructions( void )
|
||||
{
|
||||
return ( s_constructions > s_destructions );
|
||||
}
|
||||
|
||||
static inline bool ExtraDestructions( void )
|
||||
{
|
||||
return ( s_constructions < s_destructions );
|
||||
}
|
||||
|
||||
static inline unsigned int GetCtorCount( void )
|
||||
{
|
||||
return s_constructions;
|
||||
}
|
||||
|
||||
static inline unsigned int GetDtorCount( void )
|
||||
{
|
||||
return s_destructions;
|
||||
}
|
||||
|
||||
Feline( void ) { s_constructions++; }
|
||||
virtual ~Feline() { s_destructions++; }
|
||||
virtual Feline * Clone( void ) const = 0;
|
||||
|
||||
private:
|
||||
static unsigned int s_constructions;
|
||||
static unsigned int s_destructions;
|
||||
};
|
||||
|
||||
unsigned int Feline::s_constructions = 0;
|
||||
unsigned int Feline::s_destructions = 0;
|
||||
|
||||
class Tiger : public Feline
|
||||
{
|
||||
public:
|
||||
virtual ~Tiger() {}
|
||||
virtual Tiger * Clone( void ) const { return new Tiger( *this ); }
|
||||
};
|
||||
|
||||
class Lion : public Feline
|
||||
{
|
||||
public:
|
||||
virtual ~Lion() {}
|
||||
};
|
||||
|
||||
class Tiger : public Feline
|
||||
{
|
||||
public:
|
||||
virtual ~Tiger() {}
|
||||
virtual Lion * Clone( void ) const { return new Lion( *this ); }
|
||||
};
|
||||
|
||||
class Dog
|
||||
{
|
||||
public:
|
||||
virtual ~Dog() {}
|
||||
virtual Dog * Clone( void ) const { return new Dog( *this ); }
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -1149,11 +1273,14 @@ namespace
|
|||
|
||||
void DoSmartPtrDynamicCastTests( void )
|
||||
{
|
||||
typedef ::Loki::SmartPtr< Feline > FelinePtr;
|
||||
typedef ::Loki::SmartPtr< Lion > LionPtr;
|
||||
typedef ::Loki::SmartPtr< Tiger > TigerPtr;
|
||||
typedef ::Loki::SmartPtr< Dog > DogPtr;
|
||||
cout << "Starting DoSmartPtrDynamicCastTests." << endl;
|
||||
|
||||
typedef ::Loki::SmartPtr< Feline, RefCounted, DisallowConversion, NoCheck > FelinePtr;
|
||||
typedef ::Loki::SmartPtr< Tiger, RefCounted, DisallowConversion, NoCheck > TigerPtr;
|
||||
typedef ::Loki::SmartPtr< Lion, RefCounted, DisallowConversion, NoCheck > LionPtr;
|
||||
typedef ::Loki::SmartPtr< Dog, RefCounted, DisallowConversion, NoCheck > DogPtr;
|
||||
|
||||
{
|
||||
Feline * feline = new Lion;
|
||||
Lion * lion = new Lion;
|
||||
Tiger * tiger = new Tiger;
|
||||
|
@ -1229,6 +1356,103 @@ void DoSmartPtrDynamicCastTests( void )
|
|||
assert( !pDog );
|
||||
}
|
||||
|
||||
assert( Feline::AllDestroyed() );
|
||||
assert( !Feline::ExtraConstructions() );
|
||||
assert( !Feline::ExtraDestructions() );
|
||||
cout << "Finished DoSmartPtrDynamicCastTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/// @note Used for testing exception-throwing policy, and for checking for null-pointer dereference.
|
||||
typedef ::Loki::SmartPtr< Feline, DeepCopy, DisallowConversion, RejectNullStatic, DefaultSPStorage, DontPropagateConst > Feline_DeepCopy_Ptr;
|
||||
typedef ::Loki::SmartPtr< Tiger, DeepCopy, DisallowConversion, RejectNullStatic, DefaultSPStorage, DontPropagateConst > Tiger_DeepCopy_Ptr;
|
||||
typedef ::Loki::SmartPtr< Lion, DeepCopy, DisallowConversion, RejectNullStatic, DefaultSPStorage, DontPropagateConst > Lion_DeepCopy_Ptr;
|
||||
typedef ::Loki::SmartPtr< Dog, DeepCopy, DisallowConversion, RejectNullStatic, DefaultSPStorage, DontPropagateConst > Dog_DeepCopy_Ptr;
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void DoDeepCopyTests( void )
|
||||
{
|
||||
cout << "Starting DoDeepCopyTests." << endl;
|
||||
|
||||
try
|
||||
{
|
||||
const Dog_DeepCopy_Ptr p1( NULL );
|
||||
Dog_DeepCopy_Ptr p2( p1 );
|
||||
assert( false );
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
assert( true );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Dog_DeepCopy_Ptr p1( NULL );
|
||||
Dog_DeepCopy_Ptr p2( p1 );
|
||||
assert( false );
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
assert( true );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
const Dog_DeepCopy_Ptr p1( NULL );
|
||||
Dog_DeepCopy_Ptr p2( NULL );
|
||||
p2 = p1;
|
||||
assert( false );
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
assert( true );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Dog_DeepCopy_Ptr p1( NULL );
|
||||
Dog_DeepCopy_Ptr p2( NULL );
|
||||
p2 = p1;
|
||||
assert( false );
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
assert( true );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Tiger_DeepCopy_Ptr p1( new Tiger );
|
||||
Lion_DeepCopy_Ptr p2( NULL );
|
||||
p2.DynamicCastFrom( p1 );
|
||||
assert( false );
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
assert( true );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
const Tiger_DeepCopy_Ptr p1( new Tiger );
|
||||
Lion_DeepCopy_Ptr p2( NULL );
|
||||
p2.DynamicCastFrom( p1 );
|
||||
assert( false );
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
assert( true );
|
||||
}
|
||||
|
||||
assert( Feline::AllDestroyed() );
|
||||
assert( !Feline::ExtraConstructions() );
|
||||
assert( !Feline::ExtraDestructions() );
|
||||
cout << "Finished DoDeepCopyTests." << endl;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
int main( int argc, const char * argv[] )
|
||||
|
@ -1240,6 +1464,7 @@ int main( int argc, const char * argv[] )
|
|||
doThreadTest = true;
|
||||
}
|
||||
|
||||
DoDeepCopyTests();
|
||||
DoRefLinkTests();
|
||||
DoWeakLeakTest();
|
||||
DoStrongRefCountTests();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue