| 0 |      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_circ.cpp
 | 
|  |     15 | // Overview:
 | 
|  |     16 | // Test methods of CCirBuffer and CCirBuf template class.
 | 
|  |     17 | // API Information:
 | 
|  |     18 | // CCirBuffer, CCirBuf.
 | 
|  |     19 | // Details:
 | 
|  |     20 | // - Create a circular buffer, add integers to the circular buffer and check that 
 | 
|  |     21 | // they are added as specified.
 | 
|  |     22 | // - Verify Remove and Add work as expected.
 | 
|  |     23 | // - Check that all the added objects are removed.
 | 
|  |     24 | // - Create a circular buffer, add concrete data type object one, many at a time to the 
 | 
|  |     25 | // circular buffer and check that they are added as specified.
 | 
|  |     26 | // - Remove the concrete data type object one, many at a time from the circular buffer
 | 
|  |     27 | // and check that they are removed as expected.
 | 
|  |     28 | // - Check that all the added objects are removed.
 | 
|  |     29 | // - Create a circular buffer, add 8-bit unsigned character object one, many at a time
 | 
|  |     30 | // to the circular buffer and check that they are added as specified.
 | 
|  |     31 | // - Remove multiple 8-bit unsigned character objects from the circular buffer and 
 | 
|  |     32 | // check the added and removed objects are same.
 | 
|  |     33 | // - Create a circular buffer of unsigned integers, add single, multiple objects to the 
 | 
|  |     34 | // buffer and check that they are added as specified.
 | 
|  |     35 | // - Remove multiple objects from the circular buffer and check the added and removed 
 | 
|  |     36 | // objects are same.
 | 
|  |     37 | // - Create a circular buffer, add multiple signed integer objects to it, remove 
 | 
|  |     38 | // the objects and verify that the added objects are removed.
 | 
|  |     39 | // - Create a circular buffer, add integers to the circular buffer and check that 
 | 
|  |     40 | // they are added as specified.
 | 
|  |     41 | // - Verify Remove works as expected.
 | 
|  |     42 | // - Test whether the heap has been corrupted by all the tests.
 | 
|  |     43 | // Platforms/Drives/Compatibility:
 | 
|  |     44 | // All 
 | 
|  |     45 | // Assumptions/Requirement/Pre-requisites:
 | 
|  |     46 | // Failures and causes:
 | 
|  |     47 | // Base Port information:
 | 
|  |     48 | // 
 | 
|  |     49 | //
 | 
|  |     50 | 
 | 
|  |     51 | #include <e32test.h>
 | 
|  |     52 | 
 | 
|  |     53 | class VTester
 | 
|  |     54 | 	{
 | 
|  |     55 | public:
 | 
|  |     56 | 	VTester(){a=b=c=d=0;}
 | 
|  |     57 | 	VTester(TInt anInt){a=b=c=d=anInt;}
 | 
|  |     58 | 	VTester& operator=(TInt anInt){a=b=c=d=anInt;return *this;}
 | 
|  |     59 | 	TBool operator==(const VTester& aVal) const{if (a==aVal.a && b==aVal.b && c==aVal.c && d==aVal.d) return 1; else return 0;}
 | 
|  |     60 | 	TBool operator==(const TInt& aVal) const{if (a==aVal && b==aVal && c==aVal && d==aVal) return 1; else return 0;}
 | 
|  |     61 | public:
 | 
|  |     62 | 	TInt a;
 | 
|  |     63 | 	TInt b;
 | 
|  |     64 | 	TInt c;
 | 
|  |     65 | 	TInt d;
 | 
|  |     66 | 	};
 | 
|  |     67 | 
 | 
|  |     68 | LOCAL_D RTest test(_L("T_CIRC"));
 | 
|  |     69 | LOCAL_D TText8* theCharArray=(TText8*)"abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!\xA3$%^&*()\0";
 | 
|  |     70 | 
 | 
|  |     71 | LOCAL_C void TestInt()
 | 
|  |     72 | //
 | 
|  |     73 | // Test with unsigned integers
 | 
|  |     74 | //
 | 
|  |     75 | 	{
 | 
|  |     76 | 	
 | 
|  |     77 | 	CCirBuf<TInt>* cbInt=new CCirBuf<TInt>;
 | 
|  |     78 | 	TRAPD(ret,cbInt->SetLengthL(5));
 | 
|  |     79 | 	test(ret==KErrNone);
 | 
|  |     80 | 	TInt one(1);
 | 
|  |     81 | 	TInt two(2);
 | 
|  |     82 | 	TInt three(3);
 | 
|  |     83 | 	TInt four(4);
 | 
|  |     84 | 	TInt five(5);
 | 
|  |     85 | 	TInt six(6);
 | 
|  |     86 | 	TInt dummy;
 | 
|  |     87 | 	TInt numbers[]={7,8,9,10,11,12,13,14,15};
 | 
|  |     88 | 	TInt* numBuf=new TInt[10];
 | 
|  |     89 | 	test(numBuf!=NULL);
 | 
|  |     90 | 	test(cbInt->Add(&one)==1);
 | 
|  |     91 | 	test(cbInt->Add(&two)==1);
 | 
|  |     92 | 	test(cbInt->Add(&three)==1);
 | 
|  |     93 | 	test(cbInt->Add(&four)==1);
 | 
|  |     94 | 	test(cbInt->Add(&five)==1);
 | 
|  |     95 | 	one=two=three=four=0;
 | 
|  |     96 | 	test(cbInt->Add(&six)==0);
 | 
|  |     97 | 	test(cbInt->Remove(&one)==1);
 | 
|  |     98 | 	test(cbInt->Add(&six)==1);
 | 
|  |     99 | 	test(cbInt->Add(&dummy)==0);
 | 
|  |    100 | 	test(cbInt->Remove(&two)==1);
 | 
|  |    101 | 	test(cbInt->Remove(&three)==1);
 | 
|  |    102 | 	test(cbInt->Remove(&four)==1);
 | 
|  |    103 | 	test(one==1);
 | 
|  |    104 | 	test(two==2);
 | 
|  |    105 | 	test(three==3);
 | 
|  |    106 | 	test(four==4);
 | 
|  |    107 | 	test(cbInt->Add(numbers,6)==3);
 | 
|  |    108 | 	test(cbInt->Add(numbers,3)==0);
 | 
|  |    109 | 	test(cbInt->Remove(numBuf,7)==5);
 | 
|  |    110 | 	test(cbInt->Remove(numBuf,5)==0);
 | 
|  |    111 | 	for(TInt j(0);j<5;j++)
 | 
|  |    112 | 		test(numBuf[j]==j+5);
 | 
|  |    113 | 	delete [] numBuf;
 | 
|  |    114 | 	delete cbInt;
 | 
|  |    115 | 	}
 | 
|  |    116 | 
 | 
|  |    117 | LOCAL_C void TestClass()
 | 
|  |    118 | //
 | 
|  |    119 | // Test with objects
 | 
|  |    120 | //
 | 
|  |    121 | 	{
 | 
|  |    122 | 
 | 
|  |    123 | 	CCirBuf<VTester>* cbInt=new CCirBuf<VTester>;
 | 
|  |    124 | 	TRAPD(ret,cbInt->SetLengthL(5));
 | 
|  |    125 | 	test(ret==KErrNone);
 | 
|  |    126 | 	VTester one(1);
 | 
|  |    127 | 	VTester two(2);
 | 
|  |    128 | 	VTester three(3);
 | 
|  |    129 | 	VTester four(4);
 | 
|  |    130 | 	VTester five(5);
 | 
|  |    131 | 	VTester six(6);
 | 
|  |    132 | 	VTester dummy(0xffff);
 | 
|  |    133 | 	VTester numbers[]={7,8,9,10,11,12,13,14,15};
 | 
|  |    134 | 	VTester* numBuf=new VTester[10];
 | 
|  |    135 | 	test(numBuf!=NULL);
 | 
|  |    136 | 	test(cbInt->Add(&one)==1);
 | 
|  |    137 | 	test(cbInt->Add(&two)==1);
 | 
|  |    138 | 	test(cbInt->Add(&three)==1);
 | 
|  |    139 | 	test(cbInt->Add(&four)==1);
 | 
|  |    140 | 	test(cbInt->Add(&five)==1);
 | 
|  |    141 | 	one=two=three=four=0;
 | 
|  |    142 | 	test(cbInt->Add(&six)==0);
 | 
|  |    143 | 	test(cbInt->Remove(&one)==1);
 | 
|  |    144 | 	test(cbInt->Add(&six)==1);
 | 
|  |    145 | 	test(cbInt->Add(&dummy)==0);
 | 
|  |    146 | 	test(cbInt->Remove(&two)==1);
 | 
|  |    147 | 	test(cbInt->Remove(&three)==1);
 | 
|  |    148 | 	test(cbInt->Remove(&four)==1);
 | 
|  |    149 | 	test(one==1);
 | 
|  |    150 | 	test(two==2);
 | 
|  |    151 | 	test(three==3);
 | 
|  |    152 | 	test(four==4);
 | 
|  |    153 | 	test(cbInt->Add(numbers,6)==3);
 | 
|  |    154 | 	test(cbInt->Add(numbers,3)==0);
 | 
|  |    155 | 	test(cbInt->Remove(numBuf,7)==5);
 | 
|  |    156 | 	test(cbInt->Remove(numBuf,5)==0);
 | 
|  |    157 | 	for(TInt j(0);j<5;j++)
 | 
|  |    158 | 		test(numBuf[j]==j+5);
 | 
|  |    159 | 	delete [] numBuf;
 | 
|  |    160 | 	delete cbInt;
 | 
|  |    161 | 	}
 | 
|  |    162 | 
 | 
|  |    163 | LOCAL_C void TestText()
 | 
|  |    164 | //
 | 
|  |    165 | // Test with text
 | 
|  |    166 | //
 | 
|  |    167 | 	{
 | 
|  |    168 | 
 | 
|  |    169 | 	TInt i,j;
 | 
|  |    170 | 	TInt arraySize=User::StringLength(theCharArray);
 | 
|  |    171 | 	TText8* buf=new TText8[arraySize+1];
 | 
|  |    172 | 	Mem::FillZ(buf,arraySize);
 | 
|  |    173 | 	CCirBuf<TText8>* cbInt=new CCirBuf<TText8>;
 | 
|  |    174 | 	TRAPD(ret,cbInt->SetLengthL(arraySize+11));
 | 
|  |    175 | 	test(ret==KErrNone);
 | 
|  |    176 | 	for (i=0;i<10;i++)
 | 
|  |    177 | 		{
 | 
|  |    178 | 		test(cbInt->Add(theCharArray,arraySize)==arraySize);
 | 
|  |    179 | 		test(cbInt->Add(theCharArray+i)==1);
 | 
|  |    180 | 		test(cbInt->Remove(buf,arraySize)==arraySize);
 | 
|  |    181 | 		}
 | 
|  |    182 | 	TRAP(ret,cbInt->SetLengthL(arraySize*60));
 | 
|  |    183 | 	test(ret==KErrNone);
 | 
|  |    184 | 	for (j=0;j<10;j++)
 | 
|  |    185 | 		{
 | 
|  |    186 | 		for (i=0;i<9;i++)
 | 
|  |    187 | 			test(cbInt->Add(theCharArray,arraySize)==arraySize);
 | 
|  |    188 | 		for (i=0;i<arraySize;i++)
 | 
|  |    189 | 			test(cbInt->Add(theCharArray+i)==1);
 | 
|  |    190 | 		for (i=0;i<5;i++)
 | 
|  |    191 | 			{
 | 
|  |    192 | 			Mem::FillZ(buf,arraySize);
 | 
|  |    193 | 			test(cbInt->Remove(buf,arraySize)==arraySize);
 | 
|  |    194 | 			test(Mem::Compare(buf,arraySize,theCharArray,arraySize)==KErrNone);
 | 
|  |    195 | 			}
 | 
|  |    196 | 		}
 | 
|  |    197 | 	delete [] buf;
 | 
|  |    198 | 	delete cbInt;
 | 
|  |    199 | 	}
 | 
|  |    200 | 
 | 
|  |    201 | void TestBuf()
 | 
|  |    202 | //
 | 
|  |    203 | // Test with buffers
 | 
|  |    204 | //
 | 
|  |    205 | 	{
 | 
|  |    206 | 
 | 
|  |    207 | 	TInt i,j;
 | 
|  |    208 | 	TInt arraySize=User::StringLength(theCharArray);
 | 
|  |    209 | 	TText8* buf=new TText8[arraySize+1];
 | 
|  |    210 | 	Mem::FillZ(buf,arraySize);
 | 
|  |    211 | 	CCirBuffer* cbInt=new CCirBuffer;
 | 
|  |    212 | 	TRAPD(ret,cbInt->SetLengthL(arraySize+11));
 | 
|  |    213 | 	test(ret==KErrNone);
 | 
|  |    214 | 	for (i=0;i<10;i++)
 | 
|  |    215 | 		{
 | 
|  |    216 | 		test(cbInt->Add(theCharArray,arraySize)==arraySize);
 | 
|  |    217 | 		test(cbInt->Add(theCharArray+i)==1);
 | 
|  |    218 | 		test(cbInt->Remove(buf,arraySize)==arraySize);
 | 
|  |    219 | 		}
 | 
|  |    220 | 	TRAP(ret,cbInt->SetLengthL(arraySize*60));
 | 
|  |    221 | 	test(ret==KErrNone);
 | 
|  |    222 | 	for (j=0;j<10;j++)
 | 
|  |    223 | 		{
 | 
|  |    224 | 		for (i=0;i<9;i++)
 | 
|  |    225 | 			test(cbInt->Add(theCharArray,arraySize)==arraySize);
 | 
|  |    226 | 		for (i=0;i<arraySize;i++)
 | 
|  |    227 | 			test(cbInt->Add(theCharArray+i)==1);
 | 
|  |    228 | 		for (i=0;i<5;i++)
 | 
|  |    229 | 			{
 | 
|  |    230 | 			Mem::FillZ(buf,arraySize);
 | 
|  |    231 | 			test(cbInt->Remove(buf,arraySize)==arraySize);
 | 
|  |    232 | 			test(Mem::Compare(buf,arraySize,theCharArray,arraySize)==KErrNone);
 | 
|  |    233 | 			}
 | 
|  |    234 | 		}
 | 
|  |    235 | 	delete [] buf;
 | 
|  |    236 | 	delete cbInt;
 | 
|  |    237 | 	}
 | 
|  |    238 | 
 | 
|  |    239 | LOCAL_C void TestRemove()
 | 
|  |    240 | //
 | 
|  |    241 | // Show remove bug (fixed in rel 050)
 | 
|  |    242 | //
 | 
|  |    243 | {
 | 
|  |    244 | 
 | 
|  |    245 | 	CCirBuf<TInt>* cbInt=new CCirBuf<TInt>; TRAPD(ret,cbInt->SetLengthL(5));
 | 
|  |    246 | 	test(ret==KErrNone);
 | 
|  |    247 | 	TInt numbers[]={1,2,3,4,5};
 | 
|  |    248 | 	TInt* result=new TInt[5];
 | 
|  |    249 | 
 | 
|  |    250 | 	test(cbInt->Add(numbers,5)==5);
 | 
|  |    251 | 	test(cbInt->Remove(result,2)==2);
 | 
|  |    252 | 	test(result[0]==1);
 | 
|  |    253 | 	test(result[1]==2);
 | 
|  |    254 | 	test(cbInt->Remove(result,3)==3);
 | 
|  |    255 | 	test(result[0]==3);
 | 
|  |    256 | 	test(result[1]==4);
 | 
|  |    257 | 	test(result[2]==5);
 | 
|  |    258 | 
 | 
|  |    259 | 	delete [] result;
 | 
|  |    260 | 	delete cbInt;
 | 
|  |    261 | 	}
 | 
|  |    262 | 
 | 
|  |    263 | 
 | 
|  |    264 | TInt E32Main()
 | 
|  |    265 | //
 | 
|  |    266 | // Test CCirBuf<T>
 | 
|  |    267 | //
 | 
|  |    268 |     {
 | 
|  |    269 | 
 | 
|  |    270 | 	test.Title();
 | 
|  |    271 | 	__UHEAP_MARK;
 | 
|  |    272 | //
 | 
|  |    273 | 	test.Start(_L("Testing with built in Type"));
 | 
|  |    274 | 	TestInt();
 | 
|  |    275 | //
 | 
|  |    276 | 	test.Next(_L("Testing with concrete data type"));
 | 
|  |    277 | 	TestClass();
 | 
|  |    278 | //	
 | 
|  |    279 | 	test.Next(_L("Testing with text"));
 | 
|  |    280 | 	TestText();
 | 
|  |    281 | //
 | 
|  |    282 | 	test.Next(_L("Testing character buffer"));
 | 
|  |    283 | 	TestBuf();
 | 
|  |    284 | //
 | 
|  |    285 | 	test.Next(_L("Testing Remove"));
 | 
|  |    286 | 	TestRemove();
 | 
|  |    287 | 
 | 
|  |    288 | 	__UHEAP_MARKEND;
 | 
|  |    289 | 	test.End();
 | 
|  |    290 | 	return(KErrNone);
 | 
|  |    291 | 	}
 | 
|  |    292 | 
 |