diff -r c55016431358 -r 0a7b44b10206 symport/e32test/buffer/t_que.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symport/e32test/buffer/t_que.cpp Thu Jun 25 15:59:54 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 "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-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 + +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 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 +void TestTQueLink::CallTest1() + { + test.Start(_L("Test Enque")); + Test1(); + } + +template +void TestTQueLink::CreateObjects(TInt aBaseLink) + { + TInt i; + + for (i=0;i=0&&aBaseLinkiNext=(iLink[aBaseLink])->iPrev=iLink[aBaseLink]; + } + +template +void TestTQueLink::DestroyObjects() + { + TInt i; + + for (i=0;i +void TestTQueLink::TestQueLinkBase() + { + CallTest1(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueLink::TestQueLink() + { + CallTest1(); + test.Next(_L("Text Deque")); + Test2(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueLink::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 +void TestTQueLink::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 VDblQue : public TDblQue + { +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 VPriQue : public TPriQue + { +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 VDeltaQue : public TDeltaQue + { +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 +VDblQue::VDblQue() + { + SetMembers(); + } + +template +VDblQue::VDblQue(TInt anOffset) + :TDblQue(anOffset) + { + SetMembers(); + } + +template +void VDblQue::SetMembers() + { + //sFirstDelta=&iFirstDelta; + sHead=&this->iHead; + sOffset=&this->iOffset; + } + +template +VPriQue::VPriQue() + { + SetMembers(); + } + +template +VPriQue::VPriQue(TInt anOffset) + :TPriQue(anOffset) + { + SetMembers(); + } + +template +void VPriQue::SetMembers() + { + //sFirstDelta=&iFirstDelta; + sHead=&this->iHead; + sOffset=&this->iOffset; + } + +template +VDeltaQue::VDeltaQue() + { + SetMembers(); + } + +template +VDeltaQue::VDeltaQue(TInt anOffset) + :TDeltaQue(anOffset) + { + SetMembers(); + } + +template +void VDeltaQue::SetMembers() + { + sFirstDelta=&this->iFirstDelta; + sHead=&this->iHead; + sOffset=&this->iOffset; + } + +template +class TestTQue + { +friend class TestTQueLink; +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 +void TestTQue::CallTest3_4(TBool aTestPri) + { + test.Next(_L("Test DoAdd's")); + Test3(aTestPri); + test.Next(_L("Test public functions")); + Test4(); + } + +template +void TestTQue::CallTest7_8() + { + test.Next(_L("Test Do's")); + Test7(); + test.Next(_L("CountDown")); + Test8(); + } + +template +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::Test9() + { + T* que; + TDblQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VDblQue(offset); + delete que; + que=new VDblQue; + 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 +void TestTQue::Test10() + { + T* que; + TInt offset; + + test.Start(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDblQue(offset); + test(*(que->sOffset)==offset); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::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 +void TestTQue::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 +void TestTQue::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 +void TestTQue::Test14() + { + T* que; + TPriQueLink link; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VPriQue(offset); + delete que; + que=new VPriQue; + test.Next(_L("Add")); + que->Add(link); + test.Next(_L("Finished")); + delete que; + test.End(); + } + +template +void TestTQue::Test15() + { + T* que; + TInt offset; + + test.Start(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VPriQue(offset); + test(*(que->sOffset)==offset); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::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 +void TestTQue::Test17() + { + T* que; + TDeltaQueLink link1,link2; + TInt offset=4; + + test.Start(_L("Constructors")); + que=new VDeltaQue(offset); + delete que; + que=new VDeltaQue; + 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 +void TestTQue::Test18() + { + T* que; + TInt offset; + + test.Start(_L("Offset constructor")); + for (offset=0;offset<40;offset+=4) + { + que=new VDeltaQue(offset); + test(*(que->sOffset)==offset); + delete que; + } + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQue::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 VDblQueIter : public TDblQueIter + { +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 +VDblQueIter::VDblQueIter(TDblQueBase& aQue) + :TDblQueIter(aQue) + { + SetMember(); + } + +template +void VDblQueIter::SetMember() + { + sOffset=&this->iOffset; + sHead=&this->iHead; + sNext=&this->iNext; + } + +template +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 +void TestTQueIter::CallTest2_4() + { + test.Next(_L("Constructors")); + Test2(); + test.Next(_L("Do's")); + Test3(); + test.Next(_L("Sets")); + Test4(); + } + +template +void TestTQueIter::TestIterBase() + { + test.Start(_L("All Methods")); + Test1(); + CallTest2_4(); + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::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 +void TestTQueIter::Test1() + { + Item item1,item2; + TDblQue 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 +void TestTQueIter::Test2() + { + Item item; + TDblQue* que; + TInt offset; + T* iter; + + for(offset=0;offset<40;offset+=4) + { + que=new TDblQue(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(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 +void TestTQueIter::Test3() + { + Item item1,item2,item3,item4; + TDblQue 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 +void TestTQueIter::Test4() + { + Item item1,item2,item3,item4; + TDblQue 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;jsDoPostInc(); + 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;jsDoPostInc(); + iter->SetToLast(); + test(*(iter->sNext)==&item4.iLink); + } + delete iter; + test.Next(_L("Finished")); + test.End(); + } + +template +void TestTQueIter::Test5() + { + Item item1,item2; + TDblQue 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 +void TestTQueIter::Test1Item() + { + Item item; + TDblQue 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 //Redundant +void TestTQueIter::Test6() + { + Item item; + TDblQue* que; + TInt offset; + T* iter; + + for(offset=0;offset<40;offset+=4) + { + que=new TDblQue(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(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 +void TestTQueIter::Test7() + { + Item item1,item2,item3,item4; + TDblQue 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* testDblQueLinkBase; + TestTQueLink* testDeltaQueLink; + TestTQueLink* testDblQueLink; + TestTQueLink* testPriQueLink; + TestTQue* testDblQueBase; + TestTQue* testDeltaQueBase; + TestTQue >* testDblQue; + TestTQue >* testPriQue; + TestTQue >* testDeltaQue; + TestTQueIter* testDblQueIterBase; + TestTQueIter >* testDblQueIter; + +// Test the queue classes. + test.Title(); + test.Start(_L("class TDblQueLinkBase")); + testDblQueLinkBase=new TestTQueLink; + testDblQueLinkBase->TestQueLinkBase(); + delete testDblQueLinkBase; + + test.Next(_L("class TDeltaQueLink")); + testDeltaQueLink=new TestTQueLink; + testDeltaQueLink->TestQueLinkBase(); + delete testDeltaQueLink; + + test.Next(_L("class TDblQueLink")); + testDblQueLink=new TestTQueLink; + testDblQueLink->TestQueLink(); + delete testDblQueLink; + + test.Next(_L("class TPriQueLink")); + testPriQueLink=new TestTQueLink; + testPriQueLink->TestQueLink(); + delete testPriQueLink; + + test.Next(_L("class TDblQueBase")); + testDblQueBase=new TestTQue; + testDblQueBase->TestQueBase(); + delete testDblQueBase; + + test.Next(_L("class TDeltaQueBase")); + testDeltaQueBase=new TestTQue; + testDeltaQueBase->TestDeltaBase(); + delete testDeltaQueBase; + + test.Next(_L("class TDlbQue")); + testDblQue=new TestTQue >; + testDblQue->TestDblQue(); + delete testDblQue; + + test.Next(_L("class TPriQue")); + testPriQue=new TestTQue >; + testPriQue->TestPriQue(); + delete testPriQue; + + test.Next(_L("class TDeltaQue")); + testDeltaQue=new TestTQue >; + testDeltaQue->TestDeltaQue(); + delete testDeltaQue; + + test.Next(_L("class TDblQueIterBase")); + testDblQueIterBase=new TestTQueIter; + testDblQueIterBase->TestIterBase(); + delete testDblQueIterBase; + + test.Next(_L("class TDblQueIter")); + testDblQueIter=new TestTQueIter >; + testDblQueIter->TestQueIter(); + delete testDblQueIter; + + test.Next(_L("Finished")); + test.End(); + return(0); + } + +#pragma warning(default : 4710) //fuction not expanded +