os/kernelhwsrv/kerneltest/e32test/buffer/t_sque.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // e32test\buffer\t_sque.cpp
    15 // Overview:
    16 // Test single linked list functionality.
    17 // API Information:
    18 // TSglQueLink, TSglQueBase.
    19 // Details:
    20 // - Create specified number of TSglQueLink objects, then delete them. 
    21 // - Create TSglQueBase object with specified offset and without an offset,
    22 // add and remove links to the list, check that the list is empty.
    23 // - Create TSglQueBase object with and without an offset, verify offset, head 
    24 // and last member values are correct.
    25 // - Create TSglQueBase object, insert links using DoAddFirst and DoAddLast and
    26 // remove links using DoRemove, check the results are as expected.
    27 // - Create TSglQueBase object, insert links using DoAddFirst and DoAddLast and
    28 // verify IsEmpty return the correct value. Set and verify the offset.
    29 // - Create TSglQue object, insert TSglQueLink link at front and end of list, test 
    30 // whether the links are inserted at specified location, remove some links.
    31 // - Create TSglQue object, insert links using DoAddFirst and DoAddLast and
    32 // remove links using DoRemove, check the results are as expected.
    33 // - Create TSglQue object, insert links using DoAddFirst and DoAddLast and
    34 // verify IsEmpty return the correct value. Set and verify the offset.
    35 // - Create TSglQue object with and without an offset, verify offset, head 
    36 // and last member values are correct.
    37 // - Create TSglQue object, insert links using AddFirst and AddLast and
    38 // verify results are as expected.
    39 // - Create TSglQue object, insert links using AddFirst and AddLast and
    40 // verify results using IsFirst and IsLast are as expected.
    41 // - Create TSglQue object, insert links using AddFirst and AddLast and
    42 // verify results using First and Last are as expected.
    43 // - Create TSglQue object, insert links using AddLast and delete using Remove,
    44 // verify results are as expected.
    45 // - Create TSglQueIterBase object, with and without an offset, call the 
    46 // DoCurrent, DoPostInc and SetToFirst methods.
    47 // - Create TSglQueIterBase object, with and without an offset, and TSglQue 
    48 // with different offsets, verify results are as expected.
    49 // - Create TSglQueIterBase object, , with and without an offset, use the 
    50 // DoCurrent and DoPostInc methods and verify the results are as expected.
    51 // - Create TSglQueIterBase object, , with and without an offset, use the 
    52 // DoPostInc and SetToFirst methods and verify the results are as expected.
    53 // - Create TSglQueIter object, with and without an offset, iterate using 
    54 // the ++ operator and delete the object.
    55 // - Create TSglQueIter object, with and without an offset, and TSglQue 
    56 // object with different offsets, verify results are as expected.
    57 // - Create TSglQueIter object, with and without an offset, use the 
    58 // DoCurrent and DoPostInc methods and verify the results are as expected.
    59 // - Create TSglQueIter object, with and without an offset, use the 
    60 // DoPostInc and SetToFirst methods and verify the results are as expected.
    61 // - Create TSglQueIter object, with and without an offset, iterate using 
    62 // the ++ operator, use the conversion operator, verify the results are 
    63 // as expected.
    64 // Platforms/Drives/Compatibility:
    65 // All 
    66 // Assumptions/Requirement/Pre-requisites:
    67 // Failures and causes:
    68 // Base Port information:
    69 // 
    70 //
    71 
    72 #include <e32base.h>
    73 #include <e32base_private.h>
    74 #include <e32test.h>
    75 
    76 LOCAL_D RTest test(_L("T_SQUE"));
    77 
    78 #define SIZE 10
    79 #define MAX_OFFSET 10
    80 
    81 struct Item
    82 	{
    83 	TSglQueLink iLink;
    84 	TInt iSpace[MAX_OFFSET]; // Reserve some space
    85 	};
    86 
    87 struct ItemWithOffset
    88 	{
    89 	TInt iSpace[MAX_OFFSET];
    90 	TSglQueLink iLink;
    91 	};
    92 
    93 template<class T>
    94 class TestTQueLink
    95 	{
    96 public:
    97 	void TestQueLink();	// Calls Test: 1
    98 	void Test1();
    99 protected:
   100 	void CreateObjects(TInt aBaseLink);
   101 	void DestroyObjects();
   102 private:
   103 	T* iLink[SIZE];
   104 	};
   105 
   106 template<class T>
   107 void TestTQueLink<T>::CreateObjects(TInt aBaseLink)
   108 	{
   109 	TInt i;
   110 
   111 	for (i=0;i<SIZE;i++)
   112 		iLink[i]=new T;
   113 	if (aBaseLink>=0&&aBaseLink<SIZE)
   114 		(iLink[aBaseLink])->iNext=iLink[aBaseLink];
   115 	}
   116 
   117 template<class T>
   118 void TestTQueLink<T>::DestroyObjects()
   119 	{
   120 	TInt i;
   121 
   122 	for (i=0;i<SIZE;i++)
   123 		delete iLink[i];
   124 	}
   125 
   126 template <class T>
   127 void TestTQueLink<T>::TestQueLink()
   128 	{
   129 	test.Start(_L("Test Enque"));
   130 	Test1();
   131 	test.Next(_L("Finished"));
   132 	test.End();
   133 	}
   134 
   135 template<class T>
   136 void TestTQueLink<T>::Test1()
   137 	{
   138 	test.Start(_L("Create objects"));
   139 	CreateObjects(1);
   140 	test.Next(_L("Destroy objects"));
   141 	DestroyObjects();
   142 	test.End();
   143 	}
   144 
   145 class VSglQueBase : public TSglQueBase
   146 	{
   147 public:
   148 	inline VSglQueBase();
   149 	inline VSglQueBase(TInt anOffset);
   150 	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}
   151 	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
   152 	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
   153 public:
   154 	TSglQueLink** sHead;
   155 	TSglQueLink** sLast;
   156 	TInt* sOffset;
   157 private:
   158 	void SetMembers();
   159 	};
   160 
   161 template <class T>
   162 class VSglQue : public TSglQue<T>
   163 	{
   164 public:
   165 	inline VSglQue();
   166 	inline VSglQue(TInt anOffset);
   167 	inline void sDoAddFirst(TAny* aPtr) {this->DoAddFirst(aPtr);}
   168 	inline void sDoAddLast(TAny* aPtr) {this->DoAddLast(aPtr);}
   169 	inline void sDoRemove(TAny* aPtr) {this->DoRemove(aPtr);}
   170 public:
   171 	TSglQueLink** sHead;
   172 	TSglQueLink** sLast;
   173 	TInt* sOffset;
   174 private:
   175 	void SetMembers();
   176 	};
   177 
   178 inline VSglQueBase::VSglQueBase()
   179 	{
   180 	SetMembers();
   181 	}
   182 
   183 inline VSglQueBase::VSglQueBase(TInt anOffset)
   184 	:TSglQueBase(anOffset)
   185 	{
   186 	SetMembers();
   187 	}
   188 
   189 void VSglQueBase::SetMembers()
   190 	{
   191 	sHead=&iHead;
   192 	sLast=&iLast;
   193 	sOffset=&iOffset;
   194 	}
   195 
   196 template <class T>
   197 VSglQue<T>::VSglQue()
   198 	{
   199 	SetMembers();
   200 	}
   201 
   202 template <class T>
   203 VSglQue<T>::VSglQue(TInt anOffset)
   204 	:TSglQue<T>(anOffset)
   205 	{
   206 	SetMembers();
   207 	}
   208 
   209 template <class T>
   210 void VSglQue<T>::SetMembers()
   211 	{
   212 	sHead=&this->iHead;
   213 	sLast=&this->iLast;
   214 	sOffset=&this->iOffset;
   215 	}
   216 
   217 template<class T>
   218 class TestTQue
   219 	{
   220 public:
   221 	void TestQueBase();
   222 	void TestSglQue();
   223 	void Test1();	// All functions		//TSglQueBase functions
   224 	void Test2();	// Constructors
   225 	void Test3();	// DoAdd's
   226 	void Test4();	// Public functions
   227 	void Test5();	// All functions		//TSglQue
   228 	//void Test6();	// Constructors
   229 	void Test7();	// Add's
   230 	void Test8();	// Is's
   231 	void Test9();	// Get's
   232 	void Test10();	// Add's
   233 private:
   234 	void CallTest3_4();	
   235 	};
   236 
   237 template<class T>
   238 void TestTQue<T>::CallTest3_4()
   239 	{
   240 	test.Next(_L("Test DoAdd's"));
   241 	Test3();
   242 	test.Next(_L("Test public functions"));
   243 	Test4();
   244 	}
   245 
   246 template<class T>
   247 void TestTQue<T>::TestQueBase()
   248 	{
   249 	test.Start(_L("Test all member functions (simply)"));
   250 	Test1();						 
   251 	test.Next(_L("Test Constructors"));
   252 	Test2();
   253 	CallTest3_4();
   254 	test.Next(_L("Finished"));
   255 	test.End();
   256 	}
   257 
   258 template<class T>
   259 void TestTQue<T>::TestSglQue()
   260 	{
   261 	test.Start(_L("Test all member functions (simply)"));
   262 	Test5();
   263 	test.Next(_L("Test Super Class functions"));
   264 	CallTest3_4();
   265 	test.Next(_L("Test Constructors"));
   266 	Test2();
   267 	test.Next(_L("Test Add's"));
   268 	Test7();
   269 	test.Next(_L("Test Is's"));
   270 	Test8();
   271 	test.Next(_L("Test Get's"));
   272 	Test9();
   273 	test.Next(_L("Test Remove"));
   274 	Test10();
   275 	test.Next(_L("Finished"));
   276 	test.End();
   277 	}
   278 
   279 template<class T>
   280 void TestTQue<T>::Test1()
   281 	{
   282 	T* que;
   283 	TSglQueLink link1,link2;
   284 	TInt offset=4;
   285 
   286 	test.Start(_L("Constructors"));
   287 	que=new VSglQueBase(offset);
   288 	delete que;
   289 	que=new VSglQueBase;
   290 	//delete que;
   291 	test.Next(_L("DoAdd's"));
   292 	que->sDoAddFirst(&link1);
   293 	que->sDoAddLast(&link2);
   294 	que->sDoRemove(&link1);
   295 	que->sDoRemove(&link2);
   296 	test.Next(_L("Public"));
   297 	que->IsEmpty();
   298 	que->SetOffset(offset);
   299 	test.Next(_L("Finished"));
   300 	delete que;
   301 	test.End();
   302 	}
   303 
   304 template<class T>
   305 void TestTQue<T>::Test2()
   306 	{
   307 	T* que;
   308 	TInt offset;
   309 
   310 	test.Start(_L("Default constructor"));
   311 	que=new T();
   312 	test(*(que->sOffset)==0);
   313 	test(*(que->sHead)==NULL);
   314 	test(*(que->sLast)==(TSglQueLink*) que->sHead);
   315 	delete que;
   316 	test.Next(_L("Offset constructor"));
   317 	for (offset=0;offset<40;offset+=4)
   318 		{
   319 		que=new T(offset);
   320 		test(*(que->sOffset)==offset);
   321 		test(*(que->sHead)==NULL);
   322 		test(*(que->sLast)==(TSglQueLink*) que->sHead);
   323 		delete que;
   324 		}
   325 	test.Next(_L("Finished"));
   326 	test.End();
   327 	}
   328 
   329 template<class T>
   330 void TestTQue<T>::Test3()
   331 	{
   332 	T* que;
   333 
   334 		{
   335 		TSglQueLink link1,link2,link3,link4;
   336 		test.Start(_L("AddFirst"));
   337 		que=new T();
   338 		test(*(que->sHead)==NULL);
   339 		test(*(que->sLast)==(TSglQueLink*) que->sHead);
   340 		que->sDoAddFirst(&link1);
   341 		test(*(que->sHead)==&link1);
   342 		test(*(que->sLast)==&link1);
   343 		test(link1.iNext==NULL);
   344 		que->sDoAddFirst(&link2);
   345 		test(*(que->sHead)==&link2);
   346 		test(*(que->sLast)==&link1);
   347 		test(link1.iNext==NULL);
   348 		test(link2.iNext==&link1);
   349 		que->sDoAddFirst(&link3);
   350 		test(*(que->sHead)==&link3);
   351 		test(*(que->sLast)==&link1);
   352 		test(link1.iNext==NULL);
   353 		test(link2.iNext==&link1);
   354 		test(link3.iNext==&link2);
   355 		que->sDoAddFirst(&link4);
   356 		test(*(que->sHead)==&link4);
   357 		test(*(que->sLast)==&link1);
   358 		test(link1.iNext==NULL);
   359 		test(link2.iNext==&link1);
   360 		test(link3.iNext==&link2);
   361 		test(link4.iNext==&link3);
   362 		delete que;
   363 		}
   364 	TSglQueLink link1,link2,link3,link4;
   365 	test.Next(_L("AddLast"));
   366 	que=new T();
   367 	test(*(que->sHead)==NULL);
   368 	test(*(que->sLast)==(TSglQueLink*) que->sHead);
   369 	que->sDoAddLast(&link1);
   370 	test(*(que->sHead)==&link1);
   371 	test(*(que->sLast)==&link1);
   372 	test(link1.iNext==NULL);
   373 	que->sDoAddLast(&link2);
   374 	test(*(que->sHead)==&link1);
   375 	test(*(que->sLast)==&link2);
   376 	test(link1.iNext==&link2);
   377 	test(link2.iNext==NULL);
   378 	que->sDoAddLast(&link3);
   379 	test(*(que->sHead)==&link1);
   380 	test(*(que->sLast)==&link3);
   381 	test(link1.iNext==&link2);
   382 	test(link2.iNext==&link3);
   383 	test(link3.iNext==NULL);
   384 	que->sDoAddLast(&link4);
   385 	test(*(que->sHead)==&link1);
   386 	test(*(que->sLast)==&link4);
   387 	test(link1.iNext==&link2);
   388 	test(link2.iNext==&link3);
   389 	test(link3.iNext==&link4);
   390 	test(link4.iNext==NULL);
   391 	test.Next(_L("Remove"));
   392 	que->sDoRemove(&link3);
   393 	test(*(que->sHead)==&link1);
   394 	test(*(que->sLast)==&link4);
   395 	test(link1.iNext==&link2);
   396 	test(link2.iNext==&link4);
   397 	test(link4.iNext==NULL);
   398 	que->sDoRemove(&link4);
   399 	test(*(que->sHead)==&link1);
   400 	test(*(que->sLast)==&link2);
   401 	test(link1.iNext==&link2);
   402 	test(link2.iNext==NULL);
   403 	que->sDoRemove(&link1);
   404 	test(*(que->sHead)==&link2);
   405 	test(*(que->sLast)==&link2);
   406 	test(link2.iNext==NULL);
   407 	que->sDoRemove(&link2);
   408 	test(*(que->sHead)==NULL);
   409 	test(*(que->sLast)==(TSglQueLink*) que->sHead);
   410  	delete que;
   411 	test.Next(_L("Finished"));
   412 	test.End();
   413 	}
   414 
   415 template<class T>
   416 void TestTQue<T>::Test4()
   417 	{
   418 	T* que;
   419 	TInt offset;
   420 
   421 	test.Start(_L("IsEmpty"));
   422 	que=new T();
   423 	test(que->IsEmpty()==TRUE);
   424 	TSglQueLink link1,link2;
   425 	que->sDoAddFirst(&link1);
   426 	test(que->IsEmpty()==FALSE);
   427 	que->sDoRemove(&link1);
   428 	test(que->IsEmpty()==TRUE);
   429 	que->sDoAddLast(&link2);
   430 	test(que->IsEmpty()==FALSE);
   431 	que->sDoAddFirst(&link1);
   432 	test(que->IsEmpty()==FALSE);
   433 	que->sDoRemove(&link2);
   434 	test(que->IsEmpty()==FALSE);
   435 	que->sDoRemove(&link1);
   436 	test(que->IsEmpty()==TRUE);
   437 	test.Next(_L("SetOffset"));
   438 	for (offset=0;offset<40;offset+=4)
   439 		{
   440 		que->SetOffset(offset);
   441 		test(*(que->sOffset)==offset);
   442 		}
   443 	test.Next(_L("Finished"));
   444  	delete que;
   445 	test.End();
   446 	}
   447 
   448 template<class T>
   449 void TestTQue<T>::Test5()
   450 	{
   451 	T* que;
   452 	TSglQueLink link1,link2;
   453 	TInt offset=4;
   454 
   455 	test.Start(_L("Constructors"));
   456 	que=new VSglQue<TSglQueLink>(offset);
   457 	delete que;
   458 	que=new VSglQue<TSglQueLink>;
   459 	test.Next(_L("Add's"));
   460 	que->AddFirst(link1);
   461 	que->AddLast(link2);
   462 	test.Next(_L("Is's"));
   463 	que->IsFirst(&link1);
   464 	que->IsLast(&link1);
   465 	test.Next(_L("Get's"));
   466 	que->First();
   467 	que->Last();
   468 	test.Next(_L("Remove"));
   469 	que->Remove(link1);
   470 	que->Remove(link2);
   471 	test.Next(_L("Finished"));
   472 	delete que;
   473 	test.End();
   474 	}
   475 
   476 /*template<class T>
   477 void TestTQue<T>::Test6()
   478 	{
   479 	T* que;
   480 	TInt offset;
   481 
   482 	test.Start(_L("Default constructor"));
   483 	que=new VSglQue<TSglQueBase>();
   484 	test(*(que->sFirstDelta)==NULL);
   485 	delete que;
   486 	test.Next(_L("Offset constructor"));
   487 	for (offset=0;offset<40;offset+=4)
   488 		{
   489 		que=new VDeltaQueBase(offset);
   490 		test(*(que->sOffset)==offset);
   491 		test(*(que->sFirstDelta)==NULL);
   492 		delete que;
   493 		}
   494 	test.Next(_L("Finished"));
   495 	test.End();
   496 	}*/
   497 
   498 template<class T>
   499 void TestTQue<T>::Test7()
   500 	{
   501 	T* que;
   502 
   503 		{
   504 		TSglQueLink link1,link2,link3,link4;
   505 		test.Start(_L("AddFirst"));
   506 		que=new T();
   507 		test(*(que->sHead)==NULL);
   508 		test(*(que->sLast)==(TSglQueLink*) que->sHead);
   509 		que->AddFirst(link1);
   510 		test(*(que->sHead)==&link1);
   511 		test(*(que->sLast)==&link1);
   512 		test(link1.iNext==NULL);
   513 		que->AddFirst(link2);
   514 		test(*(que->sHead)==&link2);
   515 		test(*(que->sLast)==&link1);
   516 		test(link1.iNext==NULL);
   517 		test(link2.iNext==&link1);
   518 		que->AddFirst(link3);
   519 		test(*(que->sHead)==&link3);
   520 		test(*(que->sLast)==&link1);
   521 		test(link1.iNext==NULL);
   522 		test(link2.iNext==&link1);
   523 		test(link3.iNext==&link2);
   524 		que->AddFirst(link4);
   525 		test(*(que->sHead)==&link4);
   526 		test(*(que->sLast)==&link1);
   527 		test(link1.iNext==NULL);
   528 		test(link2.iNext==&link1);
   529 		test(link3.iNext==&link2);
   530 		test(link4.iNext==&link3);
   531 		delete que;
   532 		}
   533 	TSglQueLink link1,link2,link3,link4;
   534 	test.Next(_L("AddLast"));
   535 	que=new T();
   536 	test.Next(_L("AddLast"));
   537 	que=new T();
   538 	test(*(que->sHead)==NULL);
   539 	test(*(que->sLast)==(TSglQueLink*) que->sHead);
   540 	que->AddLast(link1);
   541 	test(*(que->sHead)==&link1);
   542 	test(*(que->sLast)==&link1);
   543 	test(link1.iNext==NULL);
   544 	que->AddLast(link2);
   545 	test(*(que->sHead)==&link1);
   546 	test(*(que->sLast)==&link2);
   547 	test(link1.iNext==&link2);
   548 	test(link2.iNext==NULL);
   549 	que->AddLast(link3);
   550 	test(*(que->sHead)==&link1);
   551 	test(*(que->sLast)==&link3);
   552 	test(link1.iNext==&link2);
   553 	test(link2.iNext==&link3);
   554 	test(link3.iNext==NULL);
   555 	que->AddLast(link4);
   556 	test(*(que->sHead)==&link1);
   557 	test(*(que->sLast)==&link4);
   558 	test(link1.iNext==&link2);
   559 	test(link2.iNext==&link3);
   560 	test(link3.iNext==&link4);
   561 	test(link4.iNext==NULL);
   562 	delete que;
   563 	test.Next(_L("Finished"));
   564 	test.End();
   565 	}
   566 
   567 template<class T>
   568 void TestTQue<T>::Test8()
   569 	{
   570 	T* que;
   571 
   572 		{
   573 		TSglQueLink link1,link2,link3,link4;
   574 		test.Start(_L("IsFirst"));
   575 		que=new T();
   576 		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
   577 		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
   578 		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
   579 		que->AddFirst(link1);
   580 		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
   581 		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
   582 		test(que->IsFirst((TSglQueLink*) *(que->sLast))==TRUE);
   583 		test(que->IsFirst(&link1)==TRUE);
   584 		que->AddFirst(link2);
   585 		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
   586 		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
   587 		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
   588 		test(que->IsFirst(&link1)==FALSE);
   589 		test(que->IsFirst(&link2)==TRUE);
   590 		que->AddFirst(link3);
   591 		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
   592 		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
   593 		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
   594 		test(que->IsFirst(&link1)==FALSE);
   595 		test(que->IsFirst(&link2)==FALSE);
   596 		test(que->IsFirst(&link3)==TRUE);
   597 		que->AddFirst(link4);
   598 		test(que->IsFirst((TSglQueLink*) que->sHead)==FALSE);
   599 		test(que->IsFirst((TSglQueLink*) *(que->sHead))==TRUE);
   600 		test(que->IsFirst((TSglQueLink*) *(que->sLast))==FALSE);
   601 		test(que->IsFirst(&link1)==FALSE);
   602 		test(que->IsFirst(&link2)==FALSE);
   603 		test(que->IsFirst(&link3)==FALSE);
   604 		test(que->IsFirst(&link4)==TRUE);
   605 		delete que;
   606 		}
   607 	TSglQueLink link1,link2,link3,link4;
   608 	test.Next(_L("IsLast"));
   609 	que=new T();
   610 	test(que->IsLast((TSglQueLink*) que->sHead)==TRUE);
   611 	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
   612 	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
   613 	que->AddLast(link1);
   614 	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
   615 	test(que->IsLast((TSglQueLink*) *(que->sHead))==TRUE);
   616 	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
   617 	test(que->IsLast(&link1)==TRUE);
   618 	que->AddLast(link2);
   619 	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
   620 	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
   621 	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
   622 	test(que->IsLast(&link1)==FALSE);
   623 	test(que->IsLast(&link2)==TRUE);
   624 	que->AddLast(link3);
   625 	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
   626 	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
   627 	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
   628 	test(que->IsLast(&link1)==FALSE);
   629 	test(que->IsLast(&link2)==FALSE);
   630 	test(que->IsLast(&link3)==TRUE);
   631 	que->AddLast(link4);
   632 	test(que->IsLast((TSglQueLink*) que->sHead)==FALSE);
   633 	test(que->IsLast((TSglQueLink*) *(que->sHead))==FALSE);
   634 	test(que->IsLast((TSglQueLink*) *(que->sLast))==TRUE);
   635 	test(que->IsLast(&link1)==FALSE);
   636 	test(que->IsLast(&link2)==FALSE);
   637 	test(que->IsLast(&link3)==FALSE);
   638 	test(que->IsLast(&link4)==TRUE);
   639 	test.Next(_L("Finished"));
   640 	delete que;
   641 	test.End();
   642 	}
   643 
   644 template<class T>
   645 void TestTQue<T>::Test9()
   646 	{
   647 	T* que;
   648 
   649 		{
   650 		TSglQueLink link1,link2,link3,link4;
   651 		test.Start(_L("First"));
   652 		que=new T();
   653 		test(que->First()==NULL);
   654 		que->AddFirst(link1);
   655 		test(que->First()==&link1);
   656 	 	que->AddFirst(link2);
   657 		test(que->First()==&link2);
   658 	 	que->AddFirst(link3);
   659 		test(que->First()==&link3);
   660 	  	que->AddFirst(link4);
   661 		test(que->First()==&link4);
   662 	 	delete que;
   663 		}
   664 	TSglQueLink link1,link2,link3,link4;
   665 	test.Next(_L("Last"));
   666 	que=new T();
   667 	test(que->Last()==(TSglQueLink*) que->sHead);
   668 	que->AddLast(link1);
   669 	test(que->Last()==&link1);
   670  	que->AddLast(link2);
   671 	test(que->Last()==&link2);
   672  	que->AddLast(link3);
   673 	test(que->Last()==&link3);
   674   	que->AddLast(link4);
   675 	test(que->Last()==&link4);
   676 	test.Next(_L("Finished"));
   677  	delete que;
   678 	test.End();
   679 	}
   680 
   681 template<class T>
   682 void TestTQue<T>::Test10()
   683 	{
   684 	T* que;
   685 	TSglQueLink link1,link2,link3,link4;
   686 
   687 	que=new T();
   688 	que->AddLast(link1);
   689 	que->AddLast(link2);
   690 	que->AddLast(link3);
   691 	que->AddLast(link4);
   692 	test(*(que->sHead)==&link1);
   693 	test(*(que->sLast)==&link4);
   694 	test(link1.iNext==&link2);
   695 	test(link2.iNext==&link3);
   696 	test(link3.iNext==&link4);
   697 	test(link4.iNext==NULL);
   698 	que->Remove(link3);
   699 	test(*(que->sHead)==&link1);
   700 	test(*(que->sLast)==&link4);
   701 	test(link1.iNext==&link2);
   702 	test(link2.iNext==&link4);
   703 	test(link4.iNext==NULL);
   704 	que->Remove(link4);
   705 	test(*(que->sHead)==&link1);
   706 	test(*(que->sLast)==&link2);
   707 	test(link1.iNext==&link2);
   708 	test(link2.iNext==NULL);
   709 	que->Remove(link1);
   710 	test(*(que->sHead)==&link2);
   711 	test(*(que->sLast)==&link2);
   712 	test(link2.iNext==NULL);
   713 	que->Remove(link2);
   714 	test(*(que->sHead)==NULL);
   715 	test(*(que->sLast)==(TSglQueLink*) que->sHead);
   716  	delete que;
   717 	}
   718 
   719 class VSglQueIterBase : public TSglQueIterBase
   720 	{
   721 public:
   722 	VSglQueIterBase(TSglQueBase& aQue);
   723 	inline TAny* sDoPostInc() {return DoPostInc();}
   724 	inline TAny* sDoCurrent() {return DoCurrent();}
   725 public:
   726 	TInt* sOffset;
   727 	TSglQueLink** sHead;
   728 	TSglQueLink** sNext;
   729 private:
   730 	void SetMember();
   731 	};
   732 
   733 template <class T>
   734 class VSglQueIter : public TSglQueIter<T>
   735 	{
   736 public:
   737 	VSglQueIter(TSglQue<T>& aQue);
   738 	inline TAny* sDoPostInc() {return this->DoPostInc();}
   739 	inline TAny* sDoCurrent() {return this->DoCurrent();}
   740 public:
   741 	TInt* sOffset;
   742 	TSglQueLink** sHead;
   743 	TSglQueLink** sNext;
   744 private:
   745 	void SetMember();
   746 	};
   747 
   748 VSglQueIterBase::VSglQueIterBase(TSglQueBase& aQue)
   749 	:TSglQueIterBase(aQue)
   750 	{
   751 	SetMember();
   752 	}
   753 
   754 void VSglQueIterBase::SetMember()
   755 	{
   756 	sOffset=&iOffset;
   757 	sHead=&iHead;
   758 	sNext=&iNext;
   759 	}
   760 
   761 template <class T>
   762 VSglQueIter<T>::VSglQueIter(TSglQue<T>& aQue)
   763 	:TSglQueIter<T>(aQue)
   764 	{
   765 	SetMember();
   766 	}
   767 
   768 template <class T>
   769 void VSglQueIter<T>::SetMember()
   770 	{
   771 	sOffset=&this->iOffset;
   772 	sHead=&this->iHead;
   773 	sNext=&this->iNext;
   774 	}
   775 	
   776 template<class T,class Iter>
   777 class TestTQueIter
   778 	{
   779 public:
   780 	void TestIterBase();
   781 	void TestQueIter();
   782 	void Test1();	//All functions			//TSglQueIterBase
   783 	void Test2();	//Constructor
   784 	void Test3();	//Do's
   785 	void Test4();	//Set
   786 	void Test5();	//All functions			//TDblQueIter
   787 	//void Test6();	//Constructors									//Redundant
   788 	void Test7();	//Iterators
   789 private:
   790 	void CallTest2_4();
   791 	};
   792 
   793 template<class T,class Iter>
   794 void TestTQueIter<T,Iter>::CallTest2_4()
   795 	{
   796 	test.Next(_L("Constructors"));
   797 	Test2();
   798 	test.Next(_L("Do's"));
   799 	Test3();
   800 	test.Next(_L("Sets"));
   801 	Test4();
   802 	}
   803 
   804 template<class T,class Iter>
   805 void TestTQueIter<T,Iter>::TestIterBase()
   806 	{
   807 	test.Start(_L("All Methods"));
   808 	Test1();
   809 	CallTest2_4();
   810 	test.Next(_L("Finished"));
   811 	test.End();
   812 	}
   813 
   814 template<class T,class Iter>
   815 void TestTQueIter<T,Iter>::TestQueIter()
   816 	{
   817 	test.Start(_L("All Methods"));
   818 	Test5();
   819 	CallTest2_4();
   820 	test.Next(_L("Iterators"));
   821 	Test7();
   822 	test.Next(_L("Finished"));
   823 	test.End();
   824 	}
   825 
   826 template<class T,class Iter>
   827 void TestTQueIter<T,Iter>::Test1()
   828 	{
   829 	T item1,item2;
   830 	TSglQue<T> que(_FOFF(T,iLink));
   831 	Iter* iter;
   832 
   833 	que.AddFirst(item2);
   834 	que.AddFirst(item1);
   835 	test.Start(_L("Constructor"));
   836 	iter=new Iter(que);
   837 	test.Next(_L("Do's"));
   838 	iter->sDoCurrent();
   839 	iter->sDoPostInc();
   840 	test.Next(_L("Sets"));
   841 	iter->SetToFirst();
   842 	delete iter;
   843 	test.Next(_L("Finished"));
   844 	test.End();
   845 	}
   846 
   847 template<class T,class Iter>
   848 void TestTQueIter<T,Iter>::Test2()
   849 	{
   850 	TSglQue<T>* que;
   851 	TInt offset;
   852  	Iter* iter;
   853 	TSglQueLink* head;
   854 
   855 	for (offset=0;offset<40;offset+=4)
   856 		{
   857 		que=new TSglQue<T>(offset);
   858 		iter=new Iter(*que);
   859 		test(*(iter->sHead)==PtrAdd((TSglQueLink*) que->Last(),offset));
   860 		head=*(iter->sHead);
   861 		test(que->IsFirst((T*) PtrSub(*(iter->sNext),offset)));		//Need to pass a pointer to a item
   862 		test(*(iter->sOffset)==offset);
   863 		delete iter;
   864 		T item;
   865 		que->AddFirst(item);
   866 		iter=new Iter(*que);
   867 		test(*(iter->sHead)==head);
   868 		test(que->IsFirst((T*) PtrSub(*(iter->sNext),offset)));
   869 		test(*(iter->sOffset)==offset);
   870 		delete iter;
   871 		delete que;
   872 		}
   873 	}
   874 
   875 template<class T,class Iter>
   876 void TestTQueIter<T,Iter>::Test3()
   877 	{
   878 	T item1,item2,item3,item4;
   879 	TSglQue<T> que(_FOFF(T,iLink));
   880  	Iter* iter;
   881 				  
   882 	que.AddFirst(item4);
   883 	que.AddFirst(item3);
   884 	que.AddFirst(item2);
   885 	que.AddFirst(item1);
   886 	test.Start(_L("DoPostInc"));
   887 	iter=new Iter(que);
   888 	test(&item1==iter->sDoPostInc());
   889 	test(&item2.iLink==*(iter->sNext));
   890 	test(&item2==iter->sDoPostInc());
   891 	test(&item3.iLink==*(iter->sNext));
   892 	test(&item3==iter->sDoPostInc());
   893 	test(&item4.iLink==*(iter->sNext));
   894 	test(&item4==iter->sDoPostInc());
   895 	test((Item*) *(iter->sNext)==NULL);
   896 	test(iter->sDoPostInc()==NULL);
   897 	delete iter;
   898 	test.Next(_L("DoCurrent"));
   899 	iter=new Iter(que);
   900 	test(&item1==iter->sDoCurrent());
   901 	iter->sDoPostInc();
   902 	test(&item2==iter->sDoCurrent());
   903 	iter->sDoPostInc();
   904 	test(&item3==iter->sDoCurrent());
   905 	iter->sDoPostInc();
   906 	test(&item4==iter->sDoCurrent());
   907 	iter->sDoPostInc();
   908 	test(iter->sDoCurrent()==NULL);
   909 	delete iter;
   910 	test.Next(_L("Finished"));
   911 	test.End();
   912 	}
   913 
   914 template<class T,class Iter>
   915 void TestTQueIter<T,Iter>::Test4()
   916 	{
   917 	T item1,item2,item3,item4;
   918 	TSglQue<T> que(_FOFF(T,iLink));
   919  	Iter* iter;
   920 	TInt i,j;
   921 
   922 	que.AddFirst(item4);
   923 	que.AddFirst(item3);
   924 	que.AddFirst(item2);
   925 	que.AddFirst(item1);
   926 	iter=new Iter(que);
   927 	for(i=0;i<5;i++)
   928 		{
   929 		for(j=0;j<i;j++)
   930 			iter->sDoPostInc();
   931 		iter->SetToFirst();
   932 		test(*(iter->sNext)==&item1.iLink);
   933 		}
   934 	delete iter;
   935 	}
   936 
   937 template<class T,class Iter>
   938 void TestTQueIter<T,Iter>::Test5()
   939 	{
   940 	T item1,item2;
   941 	TSglQue<T> que(_FOFF(T,iLink));
   942 	Iter* iter;
   943 	T* a;
   944 
   945 	que.AddFirst(item2);
   946 	que.AddFirst(item1);
   947 	test.Start(_L("Constructor"));
   948 	iter=new Iter(que);
   949 	test.Next(_L("Iterators"));
   950 	a=*iter;
   951 	(*iter)++;
   952 	delete iter;
   953 	test.Next(_L("Finished"));
   954 	test.End();
   955 	}
   956 
   957 /*template<class T>											//Redundant
   958 void TestTQueIter<T>::Test6()
   959 	{
   960 	Item item;
   961 	TDblQue<Item>* que;
   962 	TInt offset;
   963  	T* iter;
   964 
   965 	for (offset=0;offset<40;offset+=4)
   966 		{
   967 		que=new TDblQue<Item>(offset);
   968 		iter=new T(*que);
   969 		test(que->IsHead((Item*) *(iter->sHead)));
   970 		test(que->IsHead((Item*) *(iter->sNext)));
   971 		test(*(iter->sOffset)==offset);
   972 		delete iter;
   973 		delete que;
   974 		que=new TDblQue<Item>(offset);
   975 		que->AddFirst(item);
   976 		iter=new T(*que);
   977 		test(que->IsHead((Item*) *(iter->sHead)));
   978 		test(*(iter->sNext)==&item.iLink);
   979 		test(*(iter->sOffset)==offset);
   980 		delete iter;
   981 		delete que;
   982 		}
   983 	}*/
   984 
   985 template<class T,class Iter>
   986 void TestTQueIter<T,Iter>::Test7()
   987 	{
   988 	T item1,item2,item3,item4;
   989 	TSglQue<T> que(_FOFF(T,iLink));
   990  	Iter* iter;
   991 				  
   992 	que.AddFirst(item4);
   993 	que.AddFirst(item3);
   994 	que.AddFirst(item2);
   995 	que.AddFirst(item1);
   996 	test.Start(_L("PostFix ++"));
   997 	iter=new Iter(que);
   998 	test(&item1==(*iter)++);
   999 	test(&item2.iLink==*(iter->sNext));
  1000 	test(&item2==(*iter)++);
  1001 	test(&item3.iLink==*(iter->sNext));
  1002 	test(&item3==(*iter)++);
  1003 	test(&item4.iLink==*(iter->sNext));
  1004 	test(&item4==(*iter)++);
  1005 	test((Item*) *(iter->sNext)==NULL);
  1006 	test((*iter)++==NULL);
  1007 	delete iter;
  1008 	test.Next(_L("Conversion Operator"));
  1009 	iter=new Iter(que);
  1010 	test(&item1==*iter);
  1011 	(*iter)++;
  1012 	test(&item2==*iter);
  1013 	(*iter)++;
  1014 	test(&item3==*iter);
  1015 	(*iter)++;
  1016 	test(&item4==*iter);
  1017 	(*iter)++;
  1018 	test(*iter==NULL);
  1019 	delete iter;
  1020 	test.Next(_L("Finished"));
  1021 	test.End();
  1022 	}
  1023 	
  1024 #ifndef _DEBUG
  1025 #pragma warning (disable: 4710)
  1026 #endif
  1027 
  1028 GLDEF_C TInt E32Main()
  1029     {
  1030 
  1031 	TestTQueLink<TSglQueLink>* testSglQueLink;
  1032 	TestTQue<VSglQueBase>* testSglQueBase;
  1033 	TestTQue<VSglQue<TSglQueLink> >* testSglQue;
  1034 	TestTQueIter<Item,VSglQueIterBase>* testSglQueIterBase;
  1035 	TestTQueIter<Item,VSglQueIter<Item> >* testSglQueIter;
  1036 
  1037 	TestTQueIter<ItemWithOffset,VSglQueIterBase>* testSglQueIterBaseOffset;
  1038 	TestTQueIter<ItemWithOffset,VSglQueIter<ItemWithOffset> >* testSglQueIterOffset;
  1039  
  1040 	test.Title();
  1041 	test.Start(_L("class TSglQueLink"));
  1042 	testSglQueLink=new TestTQueLink<TSglQueLink>;
  1043 	testSglQueLink->TestQueLink();
  1044 	delete testSglQueLink;
  1045 
  1046 	test.Next(_L("class TSglQueBase"));
  1047 	testSglQueBase=new TestTQue<VSglQueBase>;
  1048 	testSglQueBase->TestQueBase();
  1049  	delete testSglQueBase;
  1050 
  1051 	test.Next(_L("class TSlgQue"));
  1052 	testSglQue=new TestTQue<VSglQue<TSglQueLink> >;
  1053 	testSglQue->TestSglQue();
  1054  	delete testSglQue;
  1055 
  1056 	test.Next(_L("class TSglQueIterBase"));
  1057 	testSglQueIterBase=new TestTQueIter<Item,VSglQueIterBase>;
  1058 	testSglQueIterBase->TestIterBase();
  1059  	delete testSglQueIterBase;
  1060 
  1061 	test.Next(_L("class TSglQueIter"));
  1062 	testSglQueIter=new TestTQueIter<Item,VSglQueIter<Item> >;
  1063 	testSglQueIter->TestQueIter();
  1064  	delete testSglQueIter;
  1065 
  1066 	test.Next(_L("class TSglQueIterBase with Offset"));
  1067 	testSglQueIterBaseOffset=new TestTQueIter<ItemWithOffset,VSglQueIterBase>;
  1068 	testSglQueIterBaseOffset->TestIterBase();
  1069  	delete testSglQueIterBaseOffset;
  1070 
  1071 	test.Next(_L("class TSglQueIter with Offset"));
  1072 	testSglQueIterOffset=new TestTQueIter<ItemWithOffset,VSglQueIter<ItemWithOffset> >;
  1073 	testSglQueIterOffset->TestQueIter();
  1074  	delete testSglQueIterOffset;
  1075 
  1076 	test.Next(_L("Finished"));
  1077 	test.End();
  1078 	return(KErrNone);
  1079     }
  1080 #pragma warning (default: 4710)
  1081 
  1082