Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

290 lines
6.7 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2000 Microsoft Corporation
//
// Module Name:
// ListTest.cpp
//
// Description:
// Main file for the application used to test CList
//
// Documentation:
// No documention for the test harness.
//
// Maintained By:
// Vij Vasu (Vvasu) 08-MAR-2000
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
#if DBG==1 || defined( _DEBUG )
#define DEBUG
#endif
#include <windows.h>
HINSTANCE g_hInstance;
LPVOID g_GlobalMemoryList = NULL; // Global memory tracking list
// For the debugging macros.
#include "debug.h"
// For printf
#include <stdio.h>
// For CList
#include "CList.h"
// Globals
int g_nPrintDepth = 1;
DEFINE_MODULE( "ListTest" )
// Test class
class CTestClass
{
public:
static int ms_nObjectNo;
int m_nId;
CTestClass()
{
++ms_nObjectNo;
m_nId = ms_nObjectNo;
wprintf( L"%*cConstructing CTestClass object %d\n", g_nPrintDepth, L' ', ms_nObjectNo );
}
CTestClass( const CTestClass & src )
{
++ms_nObjectNo;
m_nId = src.m_nId;
wprintf( L"%*cConstructing CTestClass object %d\n", g_nPrintDepth, L' ', ms_nObjectNo );
}
~CTestClass()
{
wprintf( L"%*cDestroying CTestClass object %d\n", g_nPrintDepth, L' ', ms_nObjectNo );
--ms_nObjectNo;
}
private:
const CTestClass & operator=( const CTestClass & );
}; //*** class CTestClass
int CTestClass::ms_nObjectNo = 0;
void PrintId( CList< CTestClass >::CIterator & iter )
{
wprintf( L"%d", iter->m_nId );
}
void PrintId( CList< CTestClass * >::CIterator & iter )
{
wprintf( L"%d", (*iter)->m_nId );
}
void PrintId( CList< int >::CIterator & iter )
{
wprintf( L"%d", *iter );
}
template< class t_Ty > void PrintForwardList( CList<t_Ty> & l )
{
g_nPrintDepth += 4;
wprintf( L"%*cPrinting forward list element ids...\n", g_nPrintDepth, L' ' );
CList<t_Ty>::CIterator s = l.CiBegin();
CList<t_Ty>::CIterator e = l.CiEnd();
wprintf( L"%*c+ ", g_nPrintDepth, L' ' );
while( s != e )
{
PrintId( s );
wprintf( L" " );
++s;
}
wprintf( L" +\n" );
g_nPrintDepth -= 4;
}
template< class t_Ty > void PrintReverseList( CList<t_Ty> & l )
{
g_nPrintDepth += 4;
wprintf( L"%*cPrinting reverse list element ids...\n", g_nPrintDepth, L' ' );
CList<t_Ty>::CIterator s = l.CiEnd();
CList<t_Ty>::CIterator e = l.CiEnd();
wprintf( L"%*c+ ", g_nPrintDepth, L' ' );
--s;
while( s != e )
{
PrintId( s );
wprintf( L" " );
--s;
}
wprintf( L"+\n" );
g_nPrintDepth -= 4;
}
template< class t_Ty > void CheckSize( CList<t_Ty> & l, int size )
{
if ( l.CGetSize() != size )
{
wprintf( L"%*cERROR: The list should be %d. It is %d.\n", g_nPrintDepth, L' ', size, l.CGetSize() );
throw L"List size";
}
}
// Test a list of integers
template< class t_Ty > void TestList( t_Ty array[], int arrSize )
{
int idx;
wprintf( L"%*c|-------------------------------------------------------------------|\n", g_nPrintDepth, L' ' );
g_nPrintDepth += 4;
wprintf( L"\n%*cConstructing empty list.\n", g_nPrintDepth, L' ' );
CList<t_Ty> l;
CheckSize( l, 0 );
{
CList<t_Ty>::CIterator b = l.CiBegin();
CList<t_Ty>::CIterator e = l.CiEnd();
wprintf( L"\n%*cChecking if beginning and end of empty list are the same... ", g_nPrintDepth, L' ' );
if ( ( b == e ) && !( b != e ) )
{
wprintf( L"Passed\n" );
}
else
{
wprintf( L"Failed\n" );
throw L"Empty list iterator";
}
}
wprintf( L"\n%*cPrinting empty list...\n", g_nPrintDepth, L' ' );
PrintForwardList( l );
PrintReverseList( l );
{
wprintf( L"\n%*cAdding one element to list\n", g_nPrintDepth, L' ' );
l.Append( array[0] );
CheckSize( l, 1 );
PrintForwardList( l );
PrintReverseList( l );
}
{
wprintf( L"\n%*cAdding %d more elements\n", g_nPrintDepth, L' ', arrSize - 1 );
CList<t_Ty>::CIterator iter = l.CiBegin();
for ( idx = 1; idx < arrSize; )
{
l.InsertAfter( iter, array[idx] );
++iter;
++idx;
CheckSize( l, idx );
}
PrintForwardList( l );
PrintReverseList( l );
}
{
wprintf( L"\n%*cDeleting elements\n", g_nPrintDepth, L' ', arrSize - 1 );
CList<t_Ty>::CIterator iter = l.CiBegin();
CList<t_Ty>::CIterator end = l.CiEnd();
idx = arrSize;
while( iter != end )
{
--idx;
l.DeleteAndMoveToNext( iter );
CheckSize( l, idx );
}
PrintForwardList( l );
PrintReverseList( l );
}
g_nPrintDepth -= 4;
wprintf( L"%*c|-------------------------------------------------------------------|\n", g_nPrintDepth, L' ' );
}
int __cdecl wmain( void )
{
int nRetVal = 0;
g_hInstance = GetModuleHandle( NULL );
TraceInitializeProcess( NULL, NULL );
TraceCreateMemoryList( g_GlobalMemoryList );
g_tfModule = mtfMEMORYLEAKS;
try
{
{
wprintf( L"%*cTesting CTestClass list.\n", g_nPrintDepth, L' ' );
CTestClass arr[ 4 ];
TestList< CTestClass >( arr, 4 );
}
{
wprintf( L"\n%*cTesting CTestClass pointer list.\n", g_nPrintDepth, L' ' );
CTestClass * arr[ 5 ];
int idx;
for ( idx = 0; idx < 5; ++idx )
arr[idx] = new CTestClass;
TestList< CTestClass * >( arr, 5 );
for ( idx = 0; idx < 5; ++idx )
delete arr[idx];
}
{
int arr[] = { 1, 2, 3, 4 };
wprintf( L"\n%*cTesting int list.\n", g_nPrintDepth, L' ' );
TestList< int >( arr, sizeof( arr ) / sizeof( arr[0] ) );
}
}
catch( WCHAR * pszTestName )
{
wprintf( L"Test '%s' failed.\n", pszTestName );
}
catch( ... )
{
wprintf( L"Caught an unknown exception.\n" );
nRetVal = 1;
}
TraceTerminateMemoryList( g_GlobalMemoryList );
TraceTerminateProcess( NULL, NULL );
return nRetVal;
}