Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// e32test\buffer\t_que.cpp
// Overview:
// Test double linked list functionality.
// API Information:
// TDblQueLinkBase, TDeltaQueLink, TDblQueLink, TPriQueLink,
// TDblQueIterBase, TDblQueIter
// Details:
// - Create many TDblQueLinkBase links, insert links at specified locations
// and check previous and next links are as expected.
// - Create many TDeltaQueLink links, insert these links at specified locations
// and check previous and next links are as expected.
// - Create many TDblQueLink links, insert, remove these links at specified
// locations and check previous and next links are as expected.
// - Create many TPriQueLink links, insert, remove these links at specified
// locations and check previous and next links are as expected.
// - Create TDblQueBase based object without offset, with specified offset
// and check it is constructed as expected.
// - Create TDblQueBase based object, insert and remove TPriQueLink list
// element, set priorities of TPriQueLink list elements, call IsEmpty
// and Reset methods.
// - Create TDblQueBase based object without, with offset and check
// it is constructed as expected
// - Create TDblQueBase based object, insert TDblQueLink links at
// specified locations and check that they are added as expected.
// - Initialise TPriQueLink link with different priorities, insert
// the elements in priority order and check that they are added
// as expected.
// - Create TDblQueBase based object, check the double linked list for empty
// before inserting, after inserting, before/after Deque, before/after Enque,
// after Reset. Verify that results are as expected.
// - Create TDeltaQueBase object without offset, with specified offset
// and check it is constructed as expected. Insert TDeltaQueLink list
// elements at specified distance from the zero point, remove the elements
// at specified distance, decrement the delta value.
// - Create TDeltaQueBase based object, insert TDblQueLink link at specified
// locations and check the previous, next link are as expected.
// - Check the linked list for empty before inserting, after inserting,
// before/after Deque, before/after Enque, after Reset. Verify that results
// are as expected.
// - Create TDeltaQueBase based object, insert links using DoAddDelta method,
// check that links are as expected. Delete links using DoRemove and
// DoRemoveFirst methods and check that links are as expected.
// - Create TDeltaQueBase based object, insert links using DoAddDelta method,
// check the return value of CountDown is as expected. Delete links using
// DoRemoveFirst method and check the return value of CountDown is as expected.
// - Create TDblQue based object, insert links at front and last, call IsHead,
// IsFirst, IsLast, First and Last methods.
// - Create TDblQue object, check list for empty before inserting, after
// inserting, before/after Deque, before/after Enque, after Reset.
// Verify that results are as expected.
// - Create TDblQue based object with offset constructor, insert links at
// specified locations and check it is added as specified.
// - Create TDblQue based object, insert links using AddFirst and AddLast and
// check the links are as expected.
// - Create TDblQue based object, insert links using AddFirst and AddLast and
// check the result of the IsHead, IsFirst and IsLast methods are as expected.
// - Create TDblQue based object, insert links using AddFirst and AddLast, check
// the results are as expected.
// - Create TPriQueLink list without offset, with different offset, check the
// construction is as expected.
// - Create TPriQueLink list and insert many links at different specified location
// and check it is added as specified.
// - Create TPriQueLink link with different priorities, insert the elements in
// priority order and check that they are added as expected.
// - Create TPriQueLink list, check the double linked list for empty before
// inserting, after inserting, before/after Deque, before/after Enque, after Reset.
// Verify that results are as expected.
// - Create TPriQueLink list with different offset, get the list offset and check it
// is as expected.
// - Create TPriQueLink list, insert many links with different priorities check it is
// as expected.
// - Create TDeltaQueLink list, add ,remove links and check the links and check
// it is as expected.
// - Create TDeltaQueLink list and insert many links at different specified location
// and check it is added as specified.
// - Create TDeltaQueLink list, check the double linked list for empty before, after
// inserting, before Deque, after Enque, Reset method call is as expected.
// - Create TDeltaQueLink list, insert links using DoAddDelta method,check that
// links are as expected. Delete links using DoRemove and DoRemoveFirst methods
// and check that links are as expected.
// - Create TDeltaQueLink based object, insert links using DoAddDelta method,
// check the return value of CountDown is as expected. Delete links using
// DoRemoveFirst method and check the return value of CountDown is as expected.
// - Create TDeltaQueLink list with different offset, get and check the offset is
// as expected.
// - Create TDeltaQueLink list, add, remove links at different specified location
// and check it is added and removed successfully.
// - Initialaize TDblQueIterBase based iterator, get the current item in the queue,
// move the current position forward, backward, set the iterator to point to the
// first element, last item and check it is as expected.
// - Create TDblQueIterBase object with offset constructor, insert links at
// specified locations and check it is added as specified.
// - Create TDblQueIterBase object, iterate the list using operators, DoPostInc,
// DoPostDec, DoCurrent and check it is as expected.
// - Create TDblQue based link with specified offset, initialize TDblQueIter
// based iterator, iterate the link and check the offset is as expected.
// - Create TDblQueIter object with offset constructor, insert links at
// specified locations and check it is added as specified.
// - Create TDblQueIter object, iterate the list using operators, DoPostInc,
// DoPostDec, DoCurrent and check it is as expected.
// - Create TDblQueIter based object, insert links using AddFirst and SetToLast,
// using IsHead, check the results are as expected.
// Platforms/Drives/Compatibility:
// All
// Assumptions/Requirement/Pre-requisites:
// Failures and causes:
// Base Port information:
//
//
#include <e32test.h>
LOCAL_D RTest test(_L("T_QUE"));
#ifndef _DEBUG
#pragma warning(disable : 4710) //fuction not expanded
#endif
#define SIZE 10
#define MAX_OFFSET 10
struct Item
{
TDblQueLink iLink;
TInt iSpace[MAX_OFFSET]; // Reserve some space
};
class CItem : public CBase
{
public:
TDblQueLink iLink;
//int iSpac[MAX_OFFSET]; // Reserve some space
};
template<class T>
class TestTQueLink
{
public:
void TestQueLinkBase(); // Calls Test: 1.
void TestQueLink(); // Calls Test: 1,2.
void Test1(); // Test Enque
void Test2(); // Test Deque
protected:
void CreateObjects(TInt aBaseLink);
void DestroyObjects();
private:
void CallTest1();
T* iLink[SIZE];
};
template<class T>
void TestTQueLink<T>::CallTest1()
{
test.Start(_L("Test Enque"));
Test1();
}
template<class T>
void TestTQueLink<T>::CreateObjects(TInt aBaseLink)
{
TInt i;
for (i=0;i<SIZE;i++)
iLink[i]=new T;
if (aBaseLink>=0&&aBaseLink<SIZE)
(iLink[aBaseLink])->iNext=(iLink[aBaseLink])->iPrev=iLink[aBaseLink];
}
template<class T>
void TestTQueLink<T>::DestroyObjects()
{
TInt i;
for (i=0;i<SIZE;i++)
delete iLink[i];
}
template<class T>
void TestTQueLink<T>::TestQueLinkBase()
{
CallTest1();
test.Next(_L("Finished"));
test.End();
}
template <class T>
void TestTQueLink<T>::TestQueLink()
{
CallTest1();
test.Next(_L("Text Deque"));
Test2();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueLink<T>::Test1()
{
CreateObjects(1);
test.Start(_L("Check Next and Prev pointers set corectly."));
iLink[2]->Enque(iLink[1]);
test(iLink[1]->iPrev==iLink[2]);
test(iLink[1]->iNext==iLink[2]);
test(iLink[2]->iPrev==iLink[1]);
test(iLink[2]->iNext==iLink[1]);
iLink[3]->Enque(iLink[2]);
test(iLink[1]->iPrev==iLink[3]);
test(iLink[1]->iNext==iLink[2]);
test(iLink[2]->iPrev==iLink[1]);
test(iLink[2]->iNext==iLink[3]);
test(iLink[3]->iPrev==iLink[2]);
test(iLink[3]->iNext==iLink[1]);
iLink[4]->Enque(iLink[3]);
test(iLink[1]->iPrev==iLink[4]);
test(iLink[1]->iNext==iLink[2]);
test(iLink[2]->iPrev==iLink[1]);
test(iLink[2]->iNext==iLink[3]);
test(iLink[3]->iPrev==iLink[2]);
test(iLink[3]->iNext==iLink[4]);
test(iLink[4]->iPrev==iLink[3]);
test(iLink[4]->iNext==iLink[1]);
iLink[5]->Enque(iLink[2]);
test(iLink[1]->iPrev==iLink[4]);
test(iLink[1]->iNext==iLink[2]);
test(iLink[2]->iPrev==iLink[1]);
test(iLink[2]->iNext==iLink[5]);
test(iLink[5]->iPrev==iLink[2]);
test(iLink[5]->iNext==iLink[3]);
test(iLink[3]->iPrev==iLink[5]);
test(iLink[3]->iNext==iLink[4]);
test(iLink[4]->iPrev==iLink[3]);
test(iLink[4]->iNext==iLink[1]);
test.Next(_L("Finished"));
DestroyObjects();
test.End();
}
template<class T>
void TestTQueLink<T>::Test2()
{
CreateObjects(1);
test.Start(_L("Check Next and Prev pointers set corectly"));
iLink[2]->Enque(iLink[1]);
iLink[3]->Enque(iLink[2]);
iLink[4]->Enque(iLink[3]);
iLink[5]->Enque(iLink[4]);
iLink[5]->Deque();
iLink[5]->Enque(iLink[2]);
test(iLink[1]->iPrev==iLink[4]);
test(iLink[1]->iNext==iLink[2]);
test(iLink[2]->iPrev==iLink[1]);
test(iLink[2]->iNext==iLink[5]);
test(iLink[5]->iPrev==iLink[2]);
test(iLink[5]->iNext==iLink[3]);
test(iLink[3]->iPrev==iLink[5]);
test(iLink[3]->iNext==iLink[4]);
test(iLink[4]->iPrev==iLink[3]);
test(iLink[4]->iNext==iLink[1]);
iLink[3]->Deque();
test(iLink[1]->iPrev==iLink[4]);
test(iLink[1]->iNext==iLink[2]);
test(iLink[2]->iPrev==iLink[1]);
test(iLink[2]->iNext==iLink[5]);
test(iLink[5]->iPrev==iLink[2]);
test(iLink[5]->iNext==iLink[4]);
test(iLink[4]->iPrev==iLink[5]);
test(iLink[4]->iNext==iLink[1]);
iLink[1]->Deque();
test(iLink[2]->iPrev==iLink[4]);
test(iLink[2]->iNext==iLink[5]);
test(iLink[5]->iPrev==iLink[2]);
test(iLink[5]->iNext==iLink[4]);
test(iLink[4]->iPrev==iLink[5]);
test(iLink[4]->iNext==iLink[2]);
iLink[4]->Deque();
test(iLink[2]->iPrev==iLink[5]);
test(iLink[2]->iNext==iLink[5]);
test(iLink[5]->iPrev==iLink[2]);
test(iLink[5]->iNext==iLink[2]);
test.Next(_L("Finished"));
DestroyObjects();
test.End();
}
class VDblQueBase : public TDblQueBase
{
public:
VDblQueBase();
VDblQueBase(TInt anOffset);
inline void sDoAddFirst(TAny* aPtr) {DoAddFirst(aPtr);}
inline void sDoAddLast(TAny* aPtr) {DoAddLast(aPtr);}
inline void sDoAddPriority(TAny* aPtr) {DoAddPriority(aPtr);}
inline void sTestEmpty() const {__DbgTestEmpty();}
TDblQueLink* sHead;
TInt* sOffset;
private:
void SetMembers();
};
class VDeltaQueBase : public TDeltaQueBase
{
public:
VDeltaQueBase();
VDeltaQueBase(TInt anOffset);
inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase
inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
TInt** sFirstDelta;
inline void sDoAddFirst(TAny* aPtr) {DoAddFirst(aPtr);} //From TDblQueBase
inline void sDoAddLast(TAny* aPtr) {DoAddLast(aPtr);}
inline void sDoAddPriority(TAny* aPtr) {DoAddPriority(aPtr);}
TDblQueLink* sHead;
TInt* sOffset;
private:
void SetMembers();
};
template <class T>
class VDblQue : public TDblQue<T>
{
public:
VDblQue();
VDblQue(TInt anOffset);
/*inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase
inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
TInt** sFirstDelta;*/
inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} //From TDblQueBase
inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);}
TDblQueLink* sHead;
TInt* sOffset;
private:
void SetMembers();
};
template <class T>
class VPriQue : public TPriQue<T>
{
public:
VPriQue();
VPriQue(TInt anOffset);
/*inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase
inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
TInt** sFirstDelta;*/
inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} //From TDblQueBase
inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);}
TDblQueLink* sHead;
TInt* sOffset;
private:
void SetMembers();
};
template <class T>
class VDeltaQue : public TDeltaQue<T>
{
public:
VDeltaQue();
VDeltaQue(TInt anOffset);
inline void sDoAddDelta(TAny* aPtr,TInt aDelta) {this->DoAddDelta(aPtr,aDelta);} //From TDeltaQueBase
inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
inline TAny* sDoRemoveFirst() {return this->DoRemoveFirst();}
TInt** sFirstDelta;
inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);} //From TDblQueBase
inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
inline void sDoAddPriority(TAny* aPtr) {this->DoAddPriority(aPtr);}
TDblQueLink* sHead;
TInt* sOffset;
private:
void SetMembers();
};
VDblQueBase::VDblQueBase()
{
SetMembers();
}
VDblQueBase::VDblQueBase(TInt anOffset)
:TDblQueBase(anOffset)
{
SetMembers();
}
void VDblQueBase::SetMembers()
{
sHead=&iHead;
sOffset=&iOffset;
}
VDeltaQueBase::VDeltaQueBase()
{
SetMembers();
}
VDeltaQueBase::VDeltaQueBase(TInt anOffset)
:TDeltaQueBase(anOffset)
{
SetMembers();
}
void VDeltaQueBase::SetMembers()
{
sFirstDelta=&iFirstDelta;
sHead=&iHead;
sOffset=&iOffset;
}
template <class T>
VDblQue<T>::VDblQue()
{
SetMembers();
}
template <class T>
VDblQue<T>::VDblQue(TInt anOffset)
:TDblQue<T>(anOffset)
{
SetMembers();
}
template <class T>
void VDblQue<T>::SetMembers()
{
//sFirstDelta=&iFirstDelta;
sHead=&this->iHead;
sOffset=&this->iOffset;
}
template <class T>
VPriQue<T>::VPriQue()
{
SetMembers();
}
template <class T>
VPriQue<T>::VPriQue(TInt anOffset)
:TPriQue<T>(anOffset)
{
SetMembers();
}
template <class T>
void VPriQue<T>::SetMembers()
{
//sFirstDelta=&iFirstDelta;
sHead=&this->iHead;
sOffset=&this->iOffset;
}
template <class T>
VDeltaQue<T>::VDeltaQue()
{
SetMembers();
}
template <class T>
VDeltaQue<T>::VDeltaQue(TInt anOffset)
:TDeltaQue<T>(anOffset)
{
SetMembers();
}
template <class T>
void VDeltaQue<T>::SetMembers()
{
sFirstDelta=&this->iFirstDelta;
sHead=&this->iHead;
sOffset=&this->iOffset;
}
template<class T>
class TestTQue
{
friend class TestTQueLink<TDblQueLinkBase>;
public:
void TestQueBase();
void TestDeltaBase();
void TestDblQue();
void TestPriQue();
void TestDeltaQue();
void Test1(); // All functions //TDblQueBase functions
void Test2(); // Constructors
void Test3(TBool aTestPri); // DoAdd's
void Test4(); // Public functions
void Test5(); // All functions //TDblDeltaQueBase
void Test6(); // Constructors
void Test7(); // Do's
void Test8(); // CountDown
void Test9(); // All functions //TDblQueBase
void Test10(); // Constructors
void Test11(); // Add's
void Test12(); // Is's
void Test13(); // Get's
void Test14(); // All functions //TPriQue
void Test15(); // Constructors
void Test16(); // Add
void Test17(); // All functions //TDeltaQue
void Test18(); // Constructors
void Test19(); // Add/Remove
private:
void CallTest3_4(TBool aTestPri);
void CallTest7_8();
};
template<class T>
void TestTQue<T>::CallTest3_4(TBool aTestPri)
{
test.Next(_L("Test DoAdd's"));
Test3(aTestPri);
test.Next(_L("Test public functions"));
Test4();
}
template<class T>
void TestTQue<T>::CallTest7_8()
{
test.Next(_L("Test Do's"));
Test7();
test.Next(_L("CountDown"));
Test8();
}
template<class T>
void TestTQue<T>::TestQueBase()
{
test.Start(_L("Test all member functions (simply)"));
Test1();
test.Next(_L("Test Constructors"));
Test2();
CallTest3_4(ETrue);
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::TestDeltaBase()
{
test.Start(_L("Test all member functions (simply)"));
Test5();
CallTest3_4(EFalse);
test.Next(_L("Test Constructors"));
Test6();
CallTest7_8();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::TestDblQue()
{
test.Start(_L("Test all member functions (simply)"));
Test9();
CallTest3_4(EFalse);
test.Next(_L("Test Constructor"));
Test10();
test.Next(_L("Test Add's"));
Test11();
test.Next(_L("Test Is's"));
Test12();
test.Next(_L("Get's"));
Test13();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::TestPriQue()
{
test.Start(_L("Test all member functions (simply)"));
Test14();
CallTest3_4(ETrue);
test.Next(_L("Test Constructor"));
Test15();
test.Next(_L("Test Add"));
Test16();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::TestDeltaQue()
{
test.Start(_L("Test all member functions (simply)"));
Test17();
CallTest3_4(EFalse);
CallTest7_8();
test.Next(_L("Test Constructor"));
Test18();
test.Next(_L("Test Add/Removes"));
Test19();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test1()
{
T* que;
TPriQueLink link1,link2;
TInt offset=4;
test.Start(_L("Constructors"));
que=new VDblQueBase(offset);
delete que;
que=new VDblQueBase;
//delete que;
test.Next(_L("DoAdd's"));
que->sDoAddFirst(&link1);
link1.Deque();
que->sDoAddLast(&link1);
link1.iPriority=1;
link2.iPriority=2;
que->sDoAddPriority(&link2);
test.Next(_L("Public"));
que->IsEmpty();
que->SetOffset(offset);
que->Reset();
test.Next(_L("Finished"));
delete que;
test.End();
}
template<class T>
void TestTQue<T>::Test2()
{
T* que;
TInt offset;
test.Start(_L("Default constructor"));
que=new VDblQueBase();
test(*(que->sOffset)==0);
test(que->sHead->iNext==que->sHead);
test(que->sHead->iPrev==que->sHead);
delete que;
test.Next(_L("Offset constructor"));
for (offset=0;offset<40;offset+=4)
{
que=new VDblQueBase(offset);
test(*(que->sOffset)==offset);
test(que->sHead->iNext==que->sHead);
test(que->sHead->iPrev==que->sHead);
delete que;
}
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test3(TBool aTestPri)
{
T* que;
TDblQueLink link1,link2,link3,link4;
test.Start(_L("AddFirst"));
que=new T();
que->sDoAddFirst(&link1);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==que->sHead);
que->sDoAddFirst(&link2);
test(que->sHead->iNext==&link2);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==que->sHead);
que->sDoAddFirst(&link3);
test(que->sHead->iNext==&link3);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==&link3);
test(link3.iNext==&link2);
test(link3.iPrev==que->sHead);
que->sDoAddFirst(&link4);
test(que->sHead->iNext==&link4);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==&link3);
test(link3.iNext==&link2);
test(link3.iPrev==&link4);
test(link4.iNext==&link3);
test(link4.iPrev==que->sHead);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("AddLast"));
que=new T();
que->sDoAddLast(&link1);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==que->sHead);
que->sDoAddLast(&link2);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link2);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==que->sHead);
test(link2.iPrev==&link1);
que->sDoAddLast(&link3);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link3);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==&link3);
test(link2.iPrev==&link1);
test(link3.iNext==que->sHead);
test(link3.iPrev==&link2);
que->sDoAddLast(&link4);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link4);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==&link3);
test(link2.iPrev==&link1);
test(link3.iNext==&link4);
test(link3.iPrev==&link2);
test(link4.iNext==que->sHead);
test(link4.iPrev==&link3);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("Combined AddFirst and AddLast"));
que=new T();
que->sDoAddFirst(&link1);
que->sDoAddLast(&link2);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link2);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==que->sHead);
test(link2.iPrev==&link1);
que->sDoAddFirst(&link3);
test(que->sHead->iNext==&link3);
test(que->sHead->iPrev==&link2);
test(link1.iNext==&link2);
test(link1.iPrev==&link3);
test(link2.iNext==que->sHead);
test(link2.iPrev==&link1);
test(link3.iNext==&link1);
test(link3.iPrev==que->sHead);
que->sDoAddLast(&link4);
test(que->sHead->iNext==&link3);
test(que->sHead->iPrev==&link4);
test(link1.iNext==&link2);
test(link1.iPrev==&link3);
test(link2.iNext==&link4);
test(link2.iPrev==&link1);
test(link3.iNext==&link1);
test(link3.iPrev==que->sHead);
test(link4.iNext==que->sHead);
test(link4.iPrev==&link2);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
if (aTestPri)
{
TPriQueLink link5,link6,link7,link8,link9,link10;
test.Next(_L("AddPriority"));
que=new T();
link5.iPriority=4;
link6.iPriority=6;
link7.iPriority=8;
que->sDoAddPriority(&link5);
que->sDoAddPriority(&link6);
que->sDoAddPriority(&link7);
test(que->sHead->iNext==&link7);
test(que->sHead->iPrev==&link5);
test(link5.iNext==que->sHead);
test(link5.iPrev==&link6);
test(link6.iNext==&link5);
test(link6.iPrev==&link7);
test(link7.iNext==&link6);
test(link7.iPrev==que->sHead);
link8.iPriority=7;
que->sDoAddPriority(&link8);
test(que->sHead->iNext==&link7);
test(que->sHead->iPrev==&link5);
test(link5.iNext==que->sHead);
test(link5.iPrev==&link6);
test(link6.iNext==&link5);
test(link6.iPrev==&link8);
test(link7.iNext==&link8);
test(link7.iPrev==que->sHead);
test(link8.iPrev==&link7);
test(link8.iNext==&link6);
link9.iPriority=5;
que->sDoAddPriority(&link9);
test(que->sHead->iNext==&link7);
test(que->sHead->iPrev==&link5);
test(link5.iNext==que->sHead);
test(link5.iPrev==&link9);
test(link6.iNext==&link9);
test(link6.iPrev==&link8);
test(link7.iNext==&link8);
test(link7.iPrev==que->sHead);
test(link8.iPrev==&link7);
test(link8.iNext==&link6);
test(link9.iPrev==&link6);
test(link9.iNext==&link5);
link10.iPriority=3;
que->sDoAddPriority(&link10);
test(que->sHead->iNext==&link7);
test(que->sHead->iPrev==&link10);
test(link5.iNext==&link10);
test(link5.iPrev==&link9);
test(link6.iNext==&link9);
test(link6.iPrev==&link8);
test(link7.iNext==&link8);
test(link7.iPrev==que->sHead);
test(link8.iPrev==&link7);
test(link8.iNext==&link6);
test(link9.iPrev==&link6);
test(link9.iNext==&link5);
test(link10.iNext==que->sHead);
test(link10.iPrev==&link5);
link5.Deque();
link6.Deque();
link7.Deque();
link8.Deque();
delete que;
}
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test4()
{
T* que;
TInt offset;
test.Start(_L("IsEmpty"));
que=new T();
test(que->IsEmpty()==TRUE);
TDblQueLink link1,link2;
que->sDoAddFirst(&link1);
test(que->IsEmpty()==FALSE);
link1.Deque();
test(que->IsEmpty()==TRUE);
que->sDoAddLast(&link2);
test(que->IsEmpty()==FALSE);
link1.Enque(&link2);
test(que->IsEmpty()==FALSE);
link2.Deque();
test(que->IsEmpty()==FALSE);
link1.Deque();
test(que->IsEmpty()==TRUE);
test.Next(_L("Reset"));
que->sDoAddFirst(&link1);
test(que->IsEmpty()==FALSE);
que->Reset();
test(que->IsEmpty()==TRUE);
test.Next(_L("SetOffset"));
for (offset=0;offset<40;offset+=4)
{
que->SetOffset(offset);
test(*(que->sOffset)==offset);
}
test.Next(_L("Finished"));
delete que;
test.End();
}
template<class T>
void TestTQue<T>::Test5()
{
T* que;
TDeltaQueLink link1,link2,link3;
TInt offset=4;
test.Start(_L("Constructors"));
que=new VDeltaQueBase(offset);
delete que;
que=new VDeltaQueBase;
test.Next(_L("Do's"));
que->sDoAddDelta(&link1,3);
que->sDoAddDelta(&link2,2);
que->sDoAddDelta(&link3,0);
que->sDoRemoveFirst();
que->sDoRemove(&link2);
test.Next(_L("CountDown"));
que->CountDown();
test.Next(_L("Finished"));
delete que;
test.End();
}
template<class T>
void TestTQue<T>::Test6()
{
T* que;
TInt offset;
test.Start(_L("Default constructor"));
que=new VDeltaQueBase();
test(*(que->sFirstDelta)==NULL);
delete que;
test.Next(_L("Offset constructor"));
for (offset=0;offset<40;offset+=4)
{
que=new VDeltaQueBase(offset);
test(*(que->sOffset)==offset);
test(*(que->sFirstDelta)==NULL);
delete que;
}
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test7()
{
T* que;
TDeltaQueLink link1,link2,link3,link4,link5,link6;
test.Start(_L("DoAddDelta"));
que=new T();
que->sDoAddDelta(&link2,3);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
que->sDoAddDelta(&link5,15);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link5.iDelta==12);
que->sDoAddDelta(&link3,6);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link5.iDelta==9);
que->sDoAddDelta(&link4,10);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->sDoAddDelta(&link1,1);
test(*(que->sFirstDelta)==&link1.iDelta);
test(link1.iDelta==1);
test(link2.iDelta==2);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->sDoAddDelta(&link6,21);
test(*(que->sFirstDelta)==&link1.iDelta);
test(link1.iDelta==1);
test(link2.iDelta==2);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
test(link6.iDelta==6);
test.Next(_L("DoRemove"));
que->sDoRemove(&link6);
test(*(que->sFirstDelta)==&link1.iDelta);
test(link1.iDelta==1);
test(link2.iDelta==2);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->sDoRemove(&link1);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->sDoRemove(&link4);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link5.iDelta==9);
que->sDoRemove(&link3);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link5.iDelta==12);
que->sDoRemove(&link5);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test.Next(_L("DoRemoveFirst"));
test(NULL==que->sDoRemoveFirst());
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
link2.iDelta=1;
test(NULL==que->sDoRemoveFirst());
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==1);
link2.iDelta=0;
test(&link2==que->sDoRemoveFirst());
delete que;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test8()
{
T* que;
TDeltaQueLink link1,link2,link3;
que=new T();
que->sDoAddDelta(&link1,1);
que->sDoAddDelta(&link2,3);
que->sDoAddDelta(&link3,6);
test(que->CountDown()==TRUE);
que->sDoRemoveFirst();
test(que->CountDown()==FALSE);
test(que->CountDown()==TRUE);
que->sDoRemoveFirst();
test(que->CountDown()==FALSE);
test(que->CountDown()==FALSE);
test(que->CountDown()==TRUE);
que->sDoRemoveFirst();
delete que;
}
template<class T>
void TestTQue<T>::Test9()
{
T* que;
TDblQueLink link1,link2;
TInt offset=4;
test.Start(_L("Constructors"));
que=new VDblQue<TDblQueLink>(offset);
delete que;
que=new VDblQue<TDblQueLink>;
test.Next(_L("Add's"));
que->AddFirst(link1);
que->AddLast(link2);
test.Next(_L("Is's"));
que->IsHead(que->sHead);
que->IsFirst(&link1);
que->IsLast(&link2);
test.Next(_L("Get's"));
que->First();
que->Last();
test.Next(_L("Finished"));
delete que;
test.End();
}
template<class T>
void TestTQue<T>::Test10()
{
T* que;
TInt offset;
test.Start(_L("Offset constructor"));
for (offset=0;offset<40;offset+=4)
{
que=new VDblQue<TDblQueLink>(offset);
test(*(que->sOffset)==offset);
delete que;
}
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test11()
{
T* que;
TDblQueLink link1,link2,link3,link4;
test.Start(_L("AddFirst"));
que=new T();
que->AddFirst(link1);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==que->sHead);
que->AddFirst(link2);
test(que->sHead->iNext==&link2);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==que->sHead);
que->AddFirst(link3);
test(que->sHead->iNext==&link3);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==&link3);
test(link3.iNext==&link2);
test(link3.iPrev==que->sHead);
que->AddFirst(link4);
test(que->sHead->iNext==&link4);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==&link3);
test(link3.iNext==&link2);
test(link3.iPrev==&link4);
test(link4.iNext==&link3);
test(link4.iPrev==que->sHead);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("AddLast"));
que=new T();
que->AddLast(link1);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link1);
test(link1.iNext==que->sHead);
test(link1.iPrev==que->sHead);
que->AddLast(link2);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link2);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==que->sHead);
test(link2.iPrev==&link1);
que->AddLast(link3);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link3);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==&link3);
test(link2.iPrev==&link1);
test(link3.iNext==que->sHead);
test(link3.iPrev==&link2);
que->AddLast(link4);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link4);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==&link3);
test(link2.iPrev==&link1);
test(link3.iNext==&link4);
test(link3.iPrev==&link2);
test(link4.iNext==que->sHead);
test(link4.iPrev==&link3);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("Combined AddFirst and AddLast"));
que=new T();
que->AddFirst(link1);
que->AddLast(link2);
test(que->sHead->iNext==&link1);
test(que->sHead->iPrev==&link2);
test(link1.iNext==&link2);
test(link1.iPrev==que->sHead);
test(link2.iNext==que->sHead);
test(link2.iPrev==&link1);
que->AddFirst(link3);
test(que->sHead->iNext==&link3);
test(que->sHead->iPrev==&link2);
test(link1.iNext==&link2);
test(link1.iPrev==&link3);
test(link2.iNext==que->sHead);
test(link2.iPrev==&link1);
test(link3.iNext==&link1);
test(link3.iPrev==que->sHead);
que->AddLast(link4);
test(que->sHead->iNext==&link3);
test(que->sHead->iPrev==&link4);
test(link1.iNext==&link2);
test(link1.iPrev==&link3);
test(link2.iNext==&link4);
test(link2.iPrev==&link1);
test(link3.iNext==&link1);
test(link3.iPrev==que->sHead);
test(link4.iNext==que->sHead);
test(link4.iPrev==&link2);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test12()
{
T* que;
TDblQueLink link1,link2,link3,link4,*head;
que=new T();
que->AddFirst(link1);
que->AddLast(link2);
que->AddLast(link3);
que->AddLast(link4);
head=que->sHead;
test.Start(_L("IsHead"));
test(que->IsHead(head)==TRUE);
test(que->IsHead(&link1)==FALSE);
test(que->IsHead(&link2)==FALSE);
test(que->IsHead(&link3)==FALSE);
test(que->IsHead(&link4)==FALSE);
test.Next(_L("IsFirst"));
test(que->IsFirst(head)==FALSE);
test(que->IsFirst(&link1)==TRUE);
test(que->IsFirst(&link2)==FALSE);
test(que->IsFirst(&link3)==FALSE);
test(que->IsFirst(&link4)==FALSE);
test.Next(_L("IsLast"));
test(que->IsLast(head)==FALSE);
test(que->IsLast(&link1)==FALSE);
test(que->IsLast(&link2)==FALSE);
test(que->IsLast(&link3)==FALSE);
test(que->IsLast(&link4)==TRUE);
delete que;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test13()
{
T* que;
TDblQueLink link1,link2,link3,link4;
test.Start(_L("First"));
que=new T();
que->AddFirst(link1);
test(que->First()==&link1);
que->AddFirst(link2);
test(que->First()==&link2);
que->AddFirst(link3);
test(que->First()==&link3);
que->AddFirst(link4);
test(que->First()==&link4);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("Last"));
que=new T();
que->AddLast(link1);
test(que->Last()==&link1);
que->AddLast(link2);
test(que->Last()==&link2);
que->AddLast(link3);
test(que->Last()==&link3);
que->AddLast(link4);
test(que->Last()==&link4);
link1.Deque();
link2.Deque();
link3.Deque();
link4.Deque();
delete que;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test14()
{
T* que;
TPriQueLink link;
TInt offset=4;
test.Start(_L("Constructors"));
que=new VPriQue<TPriQueLink>(offset);
delete que;
que=new VPriQue<TPriQueLink>;
test.Next(_L("Add"));
que->Add(link);
test.Next(_L("Finished"));
delete que;
test.End();
}
template<class T>
void TestTQue<T>::Test15()
{
T* que;
TInt offset;
test.Start(_L("Offset constructor"));
for (offset=0;offset<40;offset+=4)
{
que=new VPriQue<TPriQueLink>(offset);
test(*(que->sOffset)==offset);
delete que;
}
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test16()
{
T* que;
TPriQueLink link1,link2,link3,link4,link5,link6;
que=new T();
link1.iPriority=4;
link2.iPriority=6;
link3.iPriority=2;
que->sDoAddPriority(&link1);
que->sDoAddPriority(&link2);
que->sDoAddPriority(&link3);
test(que->sHead->iNext==&link2);
test(que->sHead->iPrev==&link3);
test(link1.iNext==&link3);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==que->sHead);
test(link3.iNext==que->sHead);
test(link3.iPrev==&link1);
link4.iPriority=3;
que->sDoAddPriority(&link4);
test(que->sHead->iNext==&link2);
test(que->sHead->iPrev==&link3);
test(link1.iNext==&link4);
test(link1.iPrev==&link2);
test(link2.iNext==&link1);
test(link2.iPrev==que->sHead);
test(link3.iNext==que->sHead);
test(link3.iPrev==&link4);
test(link4.iNext==&link3);
test(link4.iPrev==&link1);
link5.iPriority=5;
que->sDoAddPriority(&link5);
test(que->sHead->iNext==&link2);
test(que->sHead->iPrev==&link3);
test(link1.iNext==&link4);
test(link1.iPrev==&link5);
test(link2.iNext==&link5);
test(link2.iPrev==que->sHead);
test(link3.iNext==que->sHead);
test(link3.iPrev==&link4);
test(link4.iNext==&link3);
test(link4.iPrev==&link1);
test(link5.iNext==&link1);
test(link5.iPrev==&link2);
link6.iPriority=1;
que->sDoAddPriority(&link6);
test(que->sHead->iNext==&link2);
test(que->sHead->iPrev==&link6);
test(link1.iNext==&link4);
test(link1.iPrev==&link5);
test(link2.iNext==&link5);
test(link2.iPrev==que->sHead);
test(link3.iNext==&link6);
test(link3.iPrev==&link4);
test(link4.iNext==&link3);
test(link4.iPrev==&link1);
test(link5.iNext==&link1);
test(link5.iPrev==&link2);
test(link6.iNext==que->sHead);
test(link6.iPrev==&link3);
delete que;
}
template<class T>
void TestTQue<T>::Test17()
{
T* que;
TDeltaQueLink link1,link2;
TInt offset=4;
test.Start(_L("Constructors"));
que=new VDeltaQue<TDeltaQueLink>(offset);
delete que;
que=new VDeltaQue<TDeltaQueLink>;
test.Next(_L("Add/Remove"));
que->Add(link1,0);
que->Add(link2,2);
que->Remove(link2);
que->RemoveFirst();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test18()
{
T* que;
TInt offset;
test.Start(_L("Offset constructor"));
for (offset=0;offset<40;offset+=4)
{
que=new VDeltaQue<TDeltaQueLink>(offset);
test(*(que->sOffset)==offset);
delete que;
}
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQue<T>::Test19()
{
T* que;
TDeltaQueLink link1,link2,link3,link4,link5,link6;
test.Start(_L("Add"));
que=new T();
que->Add(link2,3);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
que->Add(link5,15);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link5.iDelta==12);
que->Add(link3,6);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link5.iDelta==9);
que->Add(link4,10);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->Add(link1,1);
test(*(que->sFirstDelta)==&link1.iDelta);
test(link1.iDelta==1);
test(link2.iDelta==2);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->Add(link6,21);
test(*(que->sFirstDelta)==&link1.iDelta);
test(link1.iDelta==1);
test(link2.iDelta==2);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
test(link6.iDelta==6);
test.Next(_L("Remove"));
que->Remove(link6);
test(*(que->sFirstDelta)==&link1.iDelta);
test(link1.iDelta==1);
test(link2.iDelta==2);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->Remove(link1);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link4.iDelta==4);
test(link5.iDelta==5);
que->Remove(link4);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link3.iDelta==3);
test(link5.iDelta==9);
que->Remove(link3);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test(link5.iDelta==12);
que->Remove(link5);
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
test.Next(_L("RemoveFirst"));
test(NULL==que->RemoveFirst());
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==3);
link2.iDelta=1;
test(NULL==que->RemoveFirst());
test(*(que->sFirstDelta)==&link2.iDelta);
test(link2.iDelta==1);
link2.iDelta=0;
test(&link2==que->RemoveFirst());
test.Next(_L("Finished"));
delete que;
test.End();
}
class VDblQueIterBase : public TDblQueIterBase
{
public:
VDblQueIterBase(TDblQueBase& aQue);
inline TAny* sDoPostInc() {return DoPostInc();}
inline TAny* sDoPostDec() {return DoPostDec();}
inline TAny* sDoCurrent() {return DoCurrent();}
TInt* sOffset;
TDblQueLinkBase** sHead;
TDblQueLinkBase** sNext;
private:
void SetMember();
};
template <class T>
class VDblQueIter : public TDblQueIter<T>
{
public:
VDblQueIter(TDblQueBase& aQue);
inline TAny* sDoPostInc() {return this->DoPostInc();}
inline TAny* sDoPostDec() {return this->DoPostDec();}
inline TAny* sDoCurrent() {return this->DoCurrent();}
TInt* sOffset;
TDblQueLinkBase** sHead;
TDblQueLinkBase** sNext;
private:
void SetMember();
};
VDblQueIterBase::VDblQueIterBase(TDblQueBase& aQue)
:TDblQueIterBase(aQue)
{
SetMember();
}
void VDblQueIterBase::SetMember()
{
sOffset=&iOffset;
sHead=&iHead;
sNext=&iNext;
}
template <class T>
VDblQueIter<T>::VDblQueIter(TDblQueBase& aQue)
:TDblQueIter<T>(aQue)
{
SetMember();
}
template <class T>
void VDblQueIter<T>::SetMember()
{
sOffset=&this->iOffset;
sHead=&this->iHead;
sNext=&this->iNext;
}
template<class T>
class TestTQueIter
{
public:
void TestIterBase();
void TestQueIter();
void Test1(); //All functions //TDblQueIterBase
void Test2(); //Constructors
void Test3(); //Do's
void Test4(); //Set
void Test5(); //All functions //TDblQueIter
void Test1Item();
//void Test6(); //Constructors //Redundant
void Test7(); //Iterators
private:
void CallTest2_4();
};
template<class T>
void TestTQueIter<T>::CallTest2_4()
{
test.Next(_L("Constructors"));
Test2();
test.Next(_L("Do's"));
Test3();
test.Next(_L("Sets"));
Test4();
}
template<class T>
void TestTQueIter<T>::TestIterBase()
{
test.Start(_L("All Methods"));
Test1();
CallTest2_4();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueIter<T>::TestQueIter()
{
test.Start(_L("All Methods"));
Test5();
CallTest2_4();
test.Next(_L("One item in queue"));
Test1Item();
test.Next(_L("Iterators"));
Test7();
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueIter<T>::Test1()
{
Item item1,item2;
TDblQue<Item> que;
T* iter;
que.AddFirst(item2);
que.AddFirst(item1);
test.Start(_L("Constructor"));
iter=new VDblQueIterBase(que);
test.Next(_L("Do's"));
iter->sDoCurrent();
iter->sDoPostInc();
iter->sDoPostDec();
test.Next(_L("Sets"));
iter->SetToFirst();
iter->SetToLast();
delete iter;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueIter<T>::Test2()
{
Item item;
TDblQue<Item>* que;
TInt offset;
T* iter;
for(offset=0;offset<40;offset+=4)
{
que=new TDblQue<Item>(offset);
new(PtrAdd(&item.iLink,offset)) TDblQueLink(); // create the link at this offset
iter=new T(*que);
test(que->IsHead((Item*) PtrSub(*(iter->sHead),offset))); //Need to pass a pointer to a item
test(que->IsHead((Item*) PtrSub(*(iter->sNext),offset)));
test(*(iter->sOffset)==offset);
delete iter;
delete que;
que=new TDblQue<Item>(offset);
new(PtrAdd(&item.iLink,offset)) TDblQueLink(); // create the link at this offset
que->AddFirst(item);
iter=new T(*que);
test(que->IsHead((Item*) PtrSub(*(iter->sHead),offset)));
test(*(iter->sNext)==PtrAdd(&item.iLink,offset)); //Need a pointer to a link
test(*(iter->sOffset)==offset);
PtrAdd(&item.iLink,offset)->Deque();
delete iter;
delete que;
}
}
template<class T>
void TestTQueIter<T>::Test3()
{
Item item1,item2,item3,item4;
TDblQue<Item> que;
T* iter;
que.AddFirst(item4);
que.AddFirst(item3);
que.AddFirst(item2);
que.AddFirst(item1);
test.Start(_L("DoPostInc"));
iter=new T(que);
test(&item1==iter->sDoPostInc());
test(&item2.iLink==*(iter->sNext));
test(&item2==iter->sDoPostInc());
test(&item3.iLink==*(iter->sNext));
test(&item3==iter->sDoPostInc());
test(&item4.iLink==*(iter->sNext));
test(&item4==iter->sDoPostInc());
test(que.IsHead((Item*) *(iter->sNext)));
test(iter->sDoPostInc()==NULL);
delete iter;
test.Next(_L("DoPostDec"));
iter=new T(que);
iter->sDoPostInc();
iter->sDoPostInc();
iter->sDoPostInc();
test(&item4.iLink==*(iter->sNext));
test(&item4==iter->sDoPostDec());
test(&item3.iLink==*(iter->sNext));
test(&item3==iter->sDoPostDec());
test(&item2.iLink==*(iter->sNext));
test(&item2==iter->sDoPostDec());
test(&item1.iLink==*(iter->sNext));
test(&item1==iter->sDoPostDec());
test(que.IsHead((Item*) *(iter->sNext)));
test(iter->sDoPostDec()==NULL);
delete iter;
test.Next(_L("DoCurrent"));
iter=new T(que);
test(&item1==iter->sDoCurrent());
iter->sDoPostInc();
test(&item2==iter->sDoCurrent());
iter->sDoPostInc();
test(&item3==iter->sDoCurrent());
iter->sDoPostInc();
test(&item4==iter->sDoCurrent());
iter->sDoPostInc();
test(iter->sDoCurrent()==NULL);
delete iter;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueIter<T>::Test4()
{
Item item1,item2,item3,item4;
TDblQue<Item> que;
T* iter;
TInt i,j;
que.AddFirst(item4);
que.AddFirst(item3);
que.AddFirst(item2);
que.AddFirst(item1);
test.Start(_L("SetToFirst"));
iter=new T(que);
for(i=0;i<5;i++)
{
for(j=0;j<i;j++)
iter->sDoPostInc();
iter->SetToFirst();
test(*(iter->sNext)==&item1.iLink);
}
delete iter;
test.Next(_L("SetToLast"));
iter=new T(que);
for(i=0;i<5;i++)
{
iter->SetToFirst();
for(j=0;j<i;j++)
iter->sDoPostInc();
iter->SetToLast();
test(*(iter->sNext)==&item4.iLink);
}
delete iter;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueIter<T>::Test5()
{
Item item1,item2;
TDblQue<Item> que;
T* iter;
Item* a;
que.AddFirst(item2);
que.AddFirst(item1);
test.Start(_L("Constructor"));
iter=new T(que);
test.Next(_L("Iterators"));
a=*iter;
test(((*iter)++)==&item1);
test(((*iter)--)==&item2);
test(((*iter)++)==&item1);
test(((*iter)++)==&item2);
test(((*iter)++)==NULL);
test(((*iter)++)==NULL);
test(((*iter)--)==NULL);
test(((*iter)--)==NULL);
iter->Set(item2);
test(((*iter)--)==&item2);
test(((*iter)++)==&item1);
test(((*iter)--)==&item2);
test(((*iter)--)==&item1);
test(((*iter)++)==NULL);
test(((*iter)++)==NULL);
test(((*iter)--)==NULL);
test(((*iter)--)==NULL);
delete iter;
test.Next(_L("Finished"));
test.End();
}
template<class T>
void TestTQueIter<T>::Test1Item()
{
Item item;
TDblQue<Item> que;
T* iter;
test.Start(_L("Constructor"));
iter=new T(que);
que.AddFirst(item);
iter->Set(item);
test.Next(_L("Iterators"));
test(((*iter)++)==&item);
test(((*iter)++)==NULL);
test(((*iter)++)==NULL);
test(((*iter)++)==NULL);
test(((*iter)--)==NULL);
test(((*iter)--)==NULL);
iter->Set(item);
test(((*iter)--)==&item);
test(((*iter)++)==NULL);
test(((*iter)--)==NULL);
test(((*iter)--)==NULL);
test(((*iter)--)==NULL);
test(((*iter)++)==NULL);
test(((*iter)++)==NULL);
delete iter;
test.Next(_L("Finished"));
test.End();
}
/*template<class T> //Redundant
void TestTQueIter<T>::Test6()
{
Item item;
TDblQue<Item>* que;
TInt offset;
T* iter;
for(offset=0;offset<40;offset+=4)
{
que=new TDblQue<Item>(offset);
iter=new T(*que);
test(que->IsHead((Item*) *(iter->sHead)));
test(que->IsHead((Item*) *(iter->sNext)));
test(*(iter->sOffset)==offset);
delete iter;
delete que;
que=new TDblQue<Item>(offset);
que->AddFirst(item);
iter=new T(*que);
test(que->IsHead((Item*) *(iter->sHead)));
test(*(iter->sNext)==&item.iLink);
test(*(iter->sOffset)==offset);
delete iter;
delete que;
}
}*/
template<class T>
void TestTQueIter<T>::Test7()
{
Item item1,item2,item3,item4;
TDblQue<Item> que;
T* iter;
que.AddFirst(item4);
que.AddFirst(item3);
que.AddFirst(item2);
que.AddFirst(item1);
test.Start(_L("PostFix ++"));
iter=new T(que);
test(&item1==(*iter)++);
test(&item2.iLink==*(iter->sNext));
test(&item2==(*iter)++);
test(&item3.iLink==*(iter->sNext));
test(&item3==(*iter)++);
test(&item4.iLink==*(iter->sNext));
test(&item4==(*iter)++);
test(que.IsHead((Item*) *(iter->sNext)));
test((*iter)++==NULL);
delete iter;
test.Next(_L("PostFix --"));
iter=new T(que);
iter->SetToLast();
test(&item4.iLink==*(iter->sNext));
test(&item4==(*iter)--);
test(&item3.iLink==*(iter->sNext));
test(&item3==(*iter)--);
test(&item2.iLink==*(iter->sNext));
test(&item2==(*iter)--);
test(&item1.iLink==*(iter->sNext));
test(&item1==(*iter)--);
test(que.IsHead((Item*) *(iter->sNext)));
test((*iter)--==NULL);
delete iter;
test.Next(_L("Conversion Operator"));
iter=new T(que);
test(&item1==*iter);
(*iter)++;
test(&item2==*iter);
(*iter)++;
test(&item3==*iter);
(*iter)++;
test(&item4==*iter);
(*iter)++;
test(*iter==NULL);
delete iter;
test.Next(_L("Finished"));
test.End();
}
GLDEF_C TInt E32Main()
{
TestTQueLink<TDblQueLinkBase>* testDblQueLinkBase;
TestTQueLink<TDeltaQueLink>* testDeltaQueLink;
TestTQueLink<TDblQueLink>* testDblQueLink;
TestTQueLink<TPriQueLink>* testPriQueLink;
TestTQue<VDblQueBase>* testDblQueBase;
TestTQue<VDeltaQueBase>* testDeltaQueBase;
TestTQue<VDblQue<TDblQueLink> >* testDblQue;
TestTQue<VPriQue<TPriQueLink> >* testPriQue;
TestTQue<VDeltaQue<TDeltaQueLink> >* testDeltaQue;
TestTQueIter<VDblQueIterBase>* testDblQueIterBase;
TestTQueIter<VDblQueIter<Item> >* testDblQueIter;
// Test the queue classes.
test.Title();
test.Start(_L("class TDblQueLinkBase"));
testDblQueLinkBase=new TestTQueLink<TDblQueLinkBase>;
testDblQueLinkBase->TestQueLinkBase();
delete testDblQueLinkBase;
test.Next(_L("class TDeltaQueLink"));
testDeltaQueLink=new TestTQueLink<TDeltaQueLink>;
testDeltaQueLink->TestQueLinkBase();
delete testDeltaQueLink;
test.Next(_L("class TDblQueLink"));
testDblQueLink=new TestTQueLink<TDblQueLink>;
testDblQueLink->TestQueLink();
delete testDblQueLink;
test.Next(_L("class TPriQueLink"));
testPriQueLink=new TestTQueLink<TPriQueLink>;
testPriQueLink->TestQueLink();
delete testPriQueLink;
test.Next(_L("class TDblQueBase"));
testDblQueBase=new TestTQue<VDblQueBase>;
testDblQueBase->TestQueBase();
delete testDblQueBase;
test.Next(_L("class TDeltaQueBase"));
testDeltaQueBase=new TestTQue<VDeltaQueBase>;
testDeltaQueBase->TestDeltaBase();
delete testDeltaQueBase;
test.Next(_L("class TDlbQue"));
testDblQue=new TestTQue<VDblQue<TDblQueLink> >;
testDblQue->TestDblQue();
delete testDblQue;
test.Next(_L("class TPriQue"));
testPriQue=new TestTQue<VPriQue<TPriQueLink> >;
testPriQue->TestPriQue();
delete testPriQue;
test.Next(_L("class TDeltaQue"));
testDeltaQue=new TestTQue<VDeltaQue<TDeltaQueLink> >;
testDeltaQue->TestDeltaQue();
delete testDeltaQue;
test.Next(_L("class TDblQueIterBase"));
testDblQueIterBase=new TestTQueIter<VDblQueIterBase>;
testDblQueIterBase->TestIterBase();
delete testDblQueIterBase;
test.Next(_L("class TDblQueIter"));
testDblQueIter=new TestTQueIter<VDblQueIter<Item> >;
testDblQueIter->TestQueIter();
delete testDblQueIter;
test.Next(_L("Finished"));
test.End();
return(0);
}
#pragma warning(default : 4710) //fuction not expanded