os/kernelhwsrv/kerneltest/e32test/buffer/t_circ.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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