--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/buffer/t_que.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,1985 @@
+// 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
+