kerneltest/e32test/buffer/t_regn.cpp
changeset 0 a41df078684a
child 43 c1f20ce4abcf
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1994-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_regn.cpp
       
    15 // Overview:
       
    16 // Test fixed and variable clipping regions.
       
    17 // API Information:
       
    18 // TRegionFix, RRegion .
       
    19 // Details:
       
    20 // - Construct some expandable clipping regions, add some rectangles, check the region 
       
    21 // matches the rectangles, clear the region, add some rectangles to the region and 
       
    22 // check the region matches the rectangles.
       
    23 // - Copy one region to another, using the Copy method and the copy constructor,
       
    24 // and check the region matches the rectangles.
       
    25 // - Create a some fixed clipping regions, add some rectangles, check the region
       
    26 // matches the rectangles, clear the region, add some rectangles, and check the
       
    27 // region matches the rectangles.
       
    28 // - Copy one fixed region to another, using the Copy method and the copy constructor,
       
    29 // and check the region matches the rectangles.
       
    30 // - Test TRegionFix creation and error handling using Clear, Count, AddRect, CheckError
       
    31 // and Tidy methods
       
    32 // - Test adding rectangles, via AddRect, to an RRegion object. Verify the results 
       
    33 // via the Count, BoundingRect and IsEmpty methods.
       
    34 // - Test subtracting rectangles, via SubRect, from an RRegion object. Verify the 
       
    35 // results via the Count, BoundingRect and SubRegion methods.
       
    36 // - Test subtracting regions, via AddRect and SubRegion, from an RRegion object. 
       
    37 // Verify the results via the Count, BoundingRect, Clear, Copy, and SubRect methods.
       
    38 // - Test the RRegion Tidy method. Verify the results via the Count, AddRect, 
       
    39 // BoundingRect and Clear methods.
       
    40 // - Test the RRegion CheckSpare method. Verify the results via the AddRect, Tidy,
       
    41 // Clear and SubRect methods.
       
    42 // - Test the RRegion Offset method. Verify the results via the AddRect, Move,
       
    43 // Clear, IsEmpty and RectangleList methods.
       
    44 // - Test the RRegion Intersection and Intersect methods. Verify the results via 
       
    45 // the AddRect, Count, IsEmpty and RectangleList methods.
       
    46 // - Test the RRegion Union method. Verify the results via the AddRect, Count,
       
    47 // Copy, Offset and BoundingRect methods.
       
    48 // - Test the RRegion ClipRect method. Verify the results via the AddRect, Count,
       
    49 // and BoundingRect methods.
       
    50 // - Test the RRegion and TRgionFix Contains methods. Verify the results via the 
       
    51 // AddRect method.
       
    52 // - Test the RRegion ForceError and CheckError methods. Verify the results via the 
       
    53 // AddRect, Copy, Count, SubRect, Clear and BoundingRect methods.
       
    54 // - Test the RRegion  and RRegionBuf sort method.
       
    55 // - Construct some regions with pre-allocated buffer (RRegionBuf), add some rectangles, 
       
    56 // get a pointer to the array of rectangles defining this region and check the 
       
    57 // rectangles are as expected.
       
    58 // Platforms/Drives/Compatibility:
       
    59 // All 
       
    60 // Assumptions/Requirement/Pre-requisites:
       
    61 // Failures and causes:
       
    62 // Base Port information:
       
    63 // 
       
    64 //
       
    65 
       
    66 #include <e32test.h>
       
    67 
       
    68 LOCAL_D RTest test(_L("T_REGN"));
       
    69 
       
    70 class TestRRegion
       
    71 	{
       
    72 public:
       
    73 	TestRRegion(TInt tlx, TInt tly, TInt brx, TInt bry);
       
    74 	void TestSet();
       
    75 	void TestRegionFix();
       
    76 	void TestAddRect();
       
    77 	void TestSubRect();
       
    78 	void TestSubRegion();
       
    79 	void TestTidy();
       
    80 	void TestSpare();
       
    81 	void TestOffset();
       
    82 	void TestIntersection();
       
    83 	void TestUnion();
       
    84 	void TestClipRect();
       
    85 	void TestContains();
       
    86 	void TestIntersects();
       
    87 	void TestErrors();
       
    88 	void doTestSort(RRegion &aRegion);
       
    89 	void TestSort();
       
    90 	void doTestRegionBuf(RRegion &aRegion);
       
    91 	void TestRegionBuf();
       
    92 private:
       
    93 	void DoTestSet(TRegion** rgn,TInt rgnArraySize);
       
    94 	void CheckRectRegion(const TRegion& region,const TRect& rect);
       
    95 private:
       
    96 	TRect rect[4];
       
    97 	TRect bounds;
       
    98 	TRect xrect;
       
    99 	};
       
   100 
       
   101 // Region test code
       
   102 TestRRegion::TestRRegion(TInt tlx, TInt tly, TInt brx, TInt bry)
       
   103 	{
       
   104 	rect[0]=TRect( tlx, tly, brx, bry);
       
   105 	rect[1]=TRect(-brx,-bry,-tlx,-tly);
       
   106 	rect[2]=TRect( tlx,-bry, brx,-tly);
       
   107 	rect[3]=TRect(-brx, tly,-tlx, bry);
       
   108 	bounds=TRect(-brx,-bry,brx,bry);
       
   109 	xrect=TRect(-(tlx/2+brx/2),-(tly/2+bry/2),tlx/2+brx/2,tly/2+bry/2);
       
   110 	}
       
   111 
       
   112 void TestRRegion::CheckRectRegion(const TRegion& region,const TRect& rect)
       
   113 // Check the region matches the rectangle
       
   114 	{
       
   115 	const TRect* rlist;
       
   116 
       
   117 	if (rect.IsEmpty())
       
   118 		test(region.Count()==0);
       
   119 	else
       
   120 		{
       
   121 		test(region.Count()==1);
       
   122 		rlist=region.RectangleList();
       
   123 		test(rlist[0]==rect);
       
   124 		test(region[0]==rect);
       
   125 		}
       
   126 	}
       
   127 
       
   128 void TestRRegion::DoTestSet(TRegion** rgn,TInt rgnArraySize)
       
   129 	{
       
   130 	TInt index; 
       
   131 	for(index=0;index<rgnArraySize;index++)
       
   132 		rgn[index]->AddRect(rect[index]);
       
   133 	for(index=0;index<rgnArraySize;index++)
       
   134 		CheckRectRegion(*rgn[index],rect[index]);
       
   135 	for(index=0;index<rgnArraySize;index++)
       
   136 		{
       
   137 		rgn[index]->Clear();
       
   138 		rgn[index]->AddRect(rect[index]);
       
   139 		}
       
   140 	for(index=0;index<rgnArraySize;index++)
       
   141 		CheckRectRegion(*rgn[index],rect[index]);
       
   142 	}
       
   143 
       
   144 void TestRRegion::TestSet()
       
   145 	{
       
   146 	TUint index; 
       
   147 
       
   148 	RRegion xrgn(rect[0]);
       
   149 	CheckRectRegion(xrgn,rect[0]);
       
   150 	xrgn.Close();
       
   151 //
       
   152 	RRegion rgn[5];
       
   153 	TRegion* prgn[5]={&rgn[0],&rgn[1],&rgn[2],&rgn[3],&rgn[4]};
       
   154 	DoTestSet(&prgn[0],(sizeof(rgn)/sizeof(rgn[0])));
       
   155 	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
       
   156 		{
       
   157 		RRegion rgn1;
       
   158 		rgn1.Copy(rgn[index]);
       
   159 		CheckRectRegion(rgn1,rect[index]);
       
   160 		RRegion rgn2(rgn[index]);
       
   161 		CheckRectRegion(rgn2,rect[index]);
       
   162 		rgn[index].Close();
       
   163 		rgn1.Close();
       
   164 		}
       
   165 //
       
   166 	TRegionFix<5> rgnf[5];
       
   167 	TRegion* prgnf[5]={&rgnf[0],&rgnf[1],&rgnf[2],&rgnf[3],&rgnf[4]};
       
   168 	DoTestSet(&prgnf[0],(sizeof(rgnf)/sizeof(rgnf[0])));
       
   169 	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
       
   170 		{
       
   171 		TRegionFix<5> rgn1;
       
   172 		rgn1.Copy(rgnf[index]);
       
   173 		CheckRectRegion(rgn1,rect[index]);
       
   174 		TRegionFix<5> rgn2(rgnf[index]);
       
   175 		CheckRectRegion(rgn2,rect[index]);
       
   176 		}
       
   177 	}
       
   178 
       
   179 void TestRRegion::TestRegionFix()
       
   180 //
       
   181 // Test TRegionFix creation and error handling
       
   182 //
       
   183 	{
       
   184 	TRegionFix<1> rgnf(rect[0]);
       
   185 	CheckRectRegion(rgnf,rect[0]);
       
   186 	rgnf.Clear();
       
   187 	test(rgnf.Count()==0);
       
   188 	rgnf.AddRect(TRect(0,0,2,2));
       
   189 	test(rgnf.CheckError()==FALSE);
       
   190 	rgnf.AddRect(TRect(2,2,4,4));	// Should cause error, rgnf can only hold 1 rectangle
       
   191 	test(rgnf.CheckError()==TRUE && rgnf.Count()==0);
       
   192 	rgnf.Clear();
       
   193 	test(rgnf.CheckError()==FALSE && rgnf.Count()==0);
       
   194 //
       
   195 	TRegionFix<10> rgnf2;
       
   196 	TInt index;
       
   197 	for(index=0;index<10;index++)
       
   198 		{
       
   199 		rgnf2.AddRect(TRect(index*4,0,index*4+2,10));
       
   200 		test(rgnf2.Count()==(index+1));
       
   201 		TRegionFix<10> rgnf4(rgnf2);	// Test copy constructor
       
   202 		TRegionFix<10> rgnf5;
       
   203 		rgnf5=rgnf2;					// Test assignment
       
   204 		test(rgnf4.Count()==(index+1));
       
   205 		for(TInt index2=0;index2<=index;index2++)
       
   206 			test(rgnf2[index2]==rgnf4[index2] && rgnf2[index2]==rgnf5[index2]);
       
   207 		}
       
   208 	rgnf2.AddRect(TRect(-10,-10,0,0));	// Should push it over the edge
       
   209 	test(rgnf2.CheckError()==TRUE && rgnf2.Count()==0);
       
   210 //
       
   211 	TRegionFix<5> rgnf3;
       
   212 	for(index=0;index<4;index++)
       
   213 		{
       
   214 		rgnf3.AddRect(TRect(index*4,index*4,index*4+8,index*4+8));
       
   215 		if (index==3)
       
   216 			test(rgnf3.CheckError()==TRUE);
       
   217 		else
       
   218 			{			
       
   219 			rgnf3.Tidy();
       
   220 			if (index>0)
       
   221 				test(rgnf3.Count()==(index+2));
       
   222 			}
       
   223 		}
       
   224 	}
       
   225 
       
   226 void TestRRegion::TestAddRect()
       
   227 	{
       
   228 	RRegion rgn;
       
   229 	TInt index,i;
       
   230 
       
   231 	if (!rect[0].IsEmpty())
       
   232 		{
       
   233 		for(index=0;index<4;index++)
       
   234 			{
       
   235 			for(i=0;i<=index;i++)
       
   236 				rgn.AddRect(rect[index]);
       
   237 			test(rgn.Count()==(index+1));
       
   238 			}
       
   239 		test(rgn.BoundingRect()==bounds);
       
   240 		if (!xrect.IsEmpty())
       
   241 			{
       
   242 			rgn.AddRect(xrect);
       
   243 			TInt count = rgn.Count();
       
   244 			test( (count > 4) && (count <= 9) );
       
   245 			}
       
   246 		}
       
   247 	rgn.AddRect(bounds);
       
   248 	test(rgn.Count()==1);
       
   249 	rgn.Close();
       
   250 	}
       
   251 
       
   252 void TestRRegion::TestSubRect()
       
   253 	{
       
   254 	TRect rect1(-rect[0].iBr.iX,-rect[0].iBr.iY,rect[0].iBr.iX,rect[0].iBr.iY);
       
   255 	RRegion rgn;
       
   256 	RRegion subRgn;
       
   257 	RRegion rgn2;
       
   258 	TInt index;
       
   259 
       
   260 	if (!rect[0].IsEmpty())
       
   261 		{
       
   262 		rgn.AddRect(rect1);
       
   263 		for(index=0;index<4;index++)
       
   264 			rgn.SubRect(rect[index],&subRgn);
       
   265 		if (rect[0].iTl.iX==0)	// Special case region, all rects join in the middle
       
   266 			{
       
   267 			test(rgn.Count()==0);
       
   268 			test(subRgn.Count()==4);
       
   269 			}
       
   270 		else
       
   271 			{
       
   272 			test(rgn.Count()==3);
       
   273 			test(subRgn.Count()==4);
       
   274 			test(rgn.BoundingRect()==subRgn.BoundingRect());
       
   275 			rgn.SubRect(xrect);
       
   276 			test(rgn.Count()==4);
       
   277 			rgn2.Copy(rgn);
       
   278 			subRgn.Clear();
       
   279 			rgn.SubRect(rgn.BoundingRect(),&subRgn);
       
   280 			test(rgn.Count()==0);
       
   281 			rgn2.SubRegion(subRgn,&rgn);
       
   282 			test(rgn2.Count()==0);
       
   283 			subRgn.SubRegion(rgn);
       
   284 			test(subRgn.Count()==0);
       
   285 			}
       
   286 		}
       
   287 	rgn.Close();
       
   288 	rgn2.Close();
       
   289 	subRgn.Close();
       
   290 	}
       
   291 
       
   292 void TestRRegion::TestSubRegion()
       
   293 	{
       
   294 	TRect rect1(-rect[0].iBr.iX,-rect[0].iBr.iY,rect[0].iBr.iX,rect[0].iBr.iY);
       
   295 	RRegion rgn,subRgn;
       
   296 	RRegion rgn2;
       
   297 	TInt index;
       
   298 
       
   299 	if (!rect[0].IsEmpty())
       
   300 		{
       
   301 		rgn.AddRect(rect1);
       
   302 		for(index=0;index<4;index++)
       
   303 			rgn2.AddRect(rect[index]);
       
   304 		rgn.SubRegion(rgn2,&subRgn);
       
   305 		if (rect[0].iTl.iX==0)	// Special case region, all rects join in the middle
       
   306 			{
       
   307 			test(rgn.Count()==0);
       
   308 			test(subRgn.Count()==4);
       
   309 			}
       
   310 		else
       
   311 			{
       
   312 			test(rgn.Count()==3);
       
   313 			test(subRgn.Count()==4);
       
   314 			test(rgn.BoundingRect()==subRgn.BoundingRect());
       
   315 			rgn2.Clear();
       
   316 			rgn2.AddRect(xrect);
       
   317 			rgn.SubRegion(rgn2);
       
   318 			test(rgn.Count()==4);
       
   319 			rgn2.Copy(rgn);
       
   320 			subRgn.Clear();
       
   321 			rgn.SubRect(rgn.BoundingRect(),&subRgn);
       
   322 			test(rgn.Count()==0);
       
   323 			rgn2.SubRegion(subRgn,&rgn);
       
   324 			test(rgn2.Count()==0);
       
   325 			subRgn.SubRegion(rgn);
       
   326 			test(subRgn.Count()==0);
       
   327 			}
       
   328 		}
       
   329 	rgn.Close();
       
   330 	rgn2.Close();
       
   331 	subRgn.Close();
       
   332 	}
       
   333 
       
   334 void TestRRegion::TestTidy()
       
   335 	{
       
   336 	RRegion rgn;
       
   337 	TInt loop;
       
   338 	TRect const rlist[8]={	// 8 Rectangles that form a square with the centre rectangle missing
       
   339 		TRect(10,10,20,20),
       
   340 		TRect(20,10,30,20),
       
   341 		TRect(30,10,40,20),
       
   342 
       
   343 		TRect(10,20,20,30),
       
   344 		TRect(30,20,40,30),
       
   345 
       
   346 		TRect(10,30,20,40),
       
   347 		TRect(20,30,30,40),
       
   348 		TRect(30,30,40,40)};
       
   349 	TRect const rect1(rlist[0].iTl.iX,rlist[0].iTl.iY,rlist[2].iBr.iX,rlist[2].iBr.iY);
       
   350 	TRect const rect2(rlist[0].iTl.iX,rlist[0].iTl.iY,rlist[7].iBr.iX,rlist[7].iBr.iY);
       
   351 
       
   352 // Add 3 adjoining rectangles and tidy them
       
   353 	for(loop=0;loop<3;loop++)
       
   354 		rgn.AddRect(rlist[loop]);
       
   355 	test(rgn.Count()==3);
       
   356 	rgn.Tidy();
       
   357 	test(rgn.Count()==1);
       
   358 	test(rgn[0]==rect1);
       
   359 // Same again but add the adjoining rectangles in reverse order
       
   360 	rgn.Clear();
       
   361 	for(loop=2;loop>=0;loop--)
       
   362 		rgn.AddRect(rlist[loop]);
       
   363 	test(rgn.Count()==3);
       
   364 	rgn.Tidy();
       
   365 	test(rgn.Count()==1);
       
   366 	test(rgn[0]==rect1);
       
   367 // Now add 8 rectangles that should tidy down to 4
       
   368 	rgn.Clear();
       
   369 	for(loop=0;loop<8;loop++)
       
   370 		rgn.AddRect(rlist[loop]);
       
   371 	test(rgn.Count()==8);
       
   372 	rgn.Tidy();
       
   373 	test(rgn.Count()==4);
       
   374 	test(rgn.BoundingRect()==rect2);
       
   375 // ...and in reverse
       
   376 	rgn.Clear();
       
   377 	for(loop=7;loop>=0;loop--)
       
   378 		rgn.AddRect(rlist[loop]);
       
   379 	test(rgn.Count()==8);
       
   380 	rgn.Tidy();
       
   381 	test(rgn.Count()==4);
       
   382 	test(rgn.BoundingRect()==rect2);
       
   383 	rgn.Close();
       
   384 	}
       
   385 
       
   386 void TestRRegion::TestSpare()
       
   387 	{
       
   388 	TInt gran[5]={1,2,4,20,100};
       
   389 	RRegion rgn[5]={gran[0],gran[1],gran[2],gran[3],gran[4]};
       
   390     TUint index;
       
   391 	TInt loop,spare;
       
   392 	TRect rect1(0,0,1,1);
       
   393 	TRect rect;
       
   394 
       
   395 	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
       
   396 		{
       
   397 		test(rgn[index].CheckSpare()==0);
       
   398 		rgn[index].AddRect(rect1);
       
   399 		test(rgn[index].CheckSpare()==(gran[index]-1));
       
   400 		rgn[index].Tidy();
       
   401 		test(rgn[index].CheckSpare()<gran[index]);
       
   402 		rgn[index].Clear();
       
   403 		test(rgn[index].CheckSpare()==0);
       
   404 		}
       
   405 	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
       
   406 		{
       
   407 		spare=0;
       
   408 		for(loop=0;loop<30;loop++)
       
   409 			{
       
   410 			rect.iTl.iX=rect.iTl.iY=loop;
       
   411 			rect.iBr.iX=rect.iBr.iY=loop+1;
       
   412 			rgn[index].AddRect(rect);
       
   413 			if (spare==0)
       
   414 				spare=gran[index];
       
   415 			spare--;
       
   416 			test(rgn[index].CheckSpare()==spare);
       
   417 			}
       
   418 		do
       
   419 			{
       
   420 			loop--;
       
   421 			rect.iTl.iX=rect.iTl.iY=loop;
       
   422 			rect.iBr.iX=rect.iBr.iY=loop+1;
       
   423 			rgn[index].SubRect(rect);
       
   424 			spare++;
       
   425 			test(rgn[index].CheckSpare()==spare);
       
   426 			} while(loop>0);
       
   427 		}
       
   428 	for(index=0;index<(sizeof(rgn)/sizeof(rgn[0]));index++)
       
   429 		rgn[index].Close();
       
   430 	}
       
   431 
       
   432 void TestRRegion::TestOffset()
       
   433 	{
       
   434 	RRegion rgn;
       
   435 	const TRect* rlist;
       
   436 	TRect r;
       
   437 	TUint index;
       
   438 
       
   439 	for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
       
   440 		{
       
   441 		rgn.Clear();
       
   442 		rgn.AddRect(rect[index]);
       
   443 		r=rect[index];
       
   444 		r.Move(1,1);
       
   445 		rgn.Offset(1,1);
       
   446 		if (rect[index].IsEmpty())
       
   447 			test(rgn.Count()==0);
       
   448 		else
       
   449 			{
       
   450 			test(rgn.Count()==1);
       
   451 			rlist=rgn.RectangleList();
       
   452 			test(rlist[0]==r);
       
   453 			}
       
   454 		}
       
   455 	rgn.Close();
       
   456 	}
       
   457 
       
   458 void TestRRegion::TestIntersection()
       
   459 	{
       
   460 	RRegion rgn1,rgn2,tmp_rgn;
       
   461 	const TRect* rlist;
       
   462 	TUint index;
       
   463 
       
   464 	rgn1.AddRect(xrect);
       
   465 	rgn2.Copy(rgn1);
       
   466 	if (!rgn1.IsEmpty())
       
   467 		{
       
   468 		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
       
   469 			tmp_rgn.AddRect(rect[index]);
       
   470 		rgn2.Intersection(rgn1,tmp_rgn);
       
   471 		test(rgn2.Count()==4);
       
   472 		rlist=rgn2.RectangleList();
       
   473 		for(index=0;index<(TUint)rgn2.Count();index++)
       
   474 			{
       
   475 			test(rlist[index].iTl.iX==xrect.iTl.iX || rlist[index].iTl.iX==rect[0].iTl.iX);
       
   476 			test(rlist[index].iTl.iY==xrect.iTl.iY || rlist[index].iTl.iY==rect[0].iTl.iY);
       
   477 			test(rlist[index].iBr.iX==xrect.iBr.iX || rlist[index].iBr.iX==(-rect[0].iTl.iX));
       
   478 			test(rlist[index].iBr.iY==xrect.iBr.iY || rlist[index].iBr.iY==(-rect[0].iTl.iY));
       
   479 			}
       
   480 		rgn1.Intersect(tmp_rgn);
       
   481 		test(rgn1.Count()==4);
       
   482 		rlist=rgn1.RectangleList();
       
   483 		for(index=0;index<(TUint)rgn1.Count();index++)
       
   484 			{
       
   485 			test(rlist[index].iTl.iX==xrect.iTl.iX || rlist[index].iTl.iX==rect[0].iTl.iX);
       
   486 			test(rlist[index].iTl.iY==xrect.iTl.iY || rlist[index].iTl.iY==rect[0].iTl.iY);
       
   487 			test(rlist[index].iBr.iX==xrect.iBr.iX || rlist[index].iBr.iX==(-rect[0].iTl.iX));
       
   488 			test(rlist[index].iBr.iY==xrect.iBr.iY || rlist[index].iBr.iY==(-rect[0].iTl.iY));
       
   489 			}
       
   490 		}
       
   491 	rgn1.Close();
       
   492 	rgn2.Close();
       
   493 	tmp_rgn.Close();
       
   494 	}
       
   495 
       
   496 void TestRRegion::TestUnion()
       
   497 	{
       
   498 	RRegion rgn1,rgn2,rgn3,tmp_rgn;
       
   499 	TRect bounds, rgn1Bounds;
       
   500 	TUint index;
       
   501 
       
   502 	// Test RRegion (always has a dynamic buffer).
       
   503 	rgn1.AddRect(xrect);
       
   504 	if (!rgn1.IsEmpty())
       
   505 		{
       
   506 		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
       
   507 			tmp_rgn.AddRect(rect[index]);
       
   508 		test(tmp_rgn.Count()==4);
       
   509 		rgn1.Union(tmp_rgn);
       
   510 		test(rgn1.Count()==7);
       
   511 		rgn1Bounds = rgn1.BoundingRect();
       
   512 		rgn2.Copy(rgn1);
       
   513 		rgn2.Offset(3,5);
       
   514 		rgn3.Copy(rgn1);
       
   515 		rgn3.Offset(5,7);
       
   516 		rgn3.Union(rgn2);
       
   517 		test(rgn3.Count()==17);
       
   518 		bounds=rgn1.BoundingRect();
       
   519 		rgn1.Union(rgn2);
       
   520 		bounds.Resize(3,5);
       
   521 		test(rgn1.BoundingRect()==bounds);
       
   522 		rgn1Bounds.Shrink(3,5);
       
   523 		rgn1Bounds.Resize(8,12);
       
   524 		test(rgn3.BoundingRect()==rgn1Bounds);
       
   525 		}
       
   526 	rgn1.Close();
       
   527 	rgn2.Close();
       
   528 	rgn3.Close();
       
   529 	tmp_rgn.Close();
       
   530 
       
   531 	RRegionBuf<8> rgnBuf1,rgnBuf2,rgnBuf3,tmp_rgnBuf;
       
   532 
       
   533 	// Test RRegionBuf (can transform from using a static to using a dynamic buffer).
       
   534 	rgnBuf1.AddRect(xrect);
       
   535 	if (!rgnBuf1.IsEmpty())
       
   536 		{
       
   537 		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
       
   538 			tmp_rgnBuf.AddRect(rect[index]);
       
   539 		test(tmp_rgnBuf.Count()==4);
       
   540 		rgnBuf1.Union(tmp_rgnBuf);
       
   541 		test(rgnBuf1.Count()==7);
       
   542 		rgn1Bounds = rgnBuf1.BoundingRect();
       
   543 		rgnBuf2.Copy(rgnBuf1);
       
   544 		rgnBuf2.Offset(3,5);
       
   545 		rgnBuf3.Copy(rgnBuf1);
       
   546 		rgnBuf3.Offset(5,7);
       
   547 		rgnBuf3.Union(rgnBuf2);
       
   548 		test(rgnBuf3.Count()==17);
       
   549 		bounds=rgnBuf1.BoundingRect();
       
   550 		rgnBuf1.Union(rgnBuf2);
       
   551 		bounds.Resize(3,5);
       
   552 		test(rgnBuf1.BoundingRect()==bounds);
       
   553 		rgn1Bounds.Shrink(3,5);
       
   554 		rgn1Bounds.Resize(8,12);
       
   555 		test(rgnBuf3.BoundingRect()==rgn1Bounds);
       
   556 		}
       
   557 	rgnBuf1.Close();
       
   558 	rgnBuf2.Close();
       
   559 	rgnBuf3.Close();
       
   560 	tmp_rgnBuf.Close();
       
   561 	}
       
   562 
       
   563 void TestRRegion::TestClipRect()
       
   564 	{
       
   565 	RRegion rgn1(xrect);
       
   566 	if (!rgn1.IsEmpty())
       
   567 		{
       
   568 		TUint index;
       
   569 		for(index=0;index<(sizeof(rect)/sizeof(rect[0]));index++)
       
   570 			rgn1.AddRect(rect[index]);
       
   571 		TRect clip=rgn1.BoundingRect();
       
   572 		rgn1.ClipRect(clip);
       
   573 		test(clip==rgn1.BoundingRect());
       
   574 		clip.iTl.iX>>=1;
       
   575 		clip.iTl.iY>>=1;
       
   576 		clip.iBr.iX>>=1;
       
   577 		clip.iBr.iY>>=1;
       
   578 		rgn1.ClipRect(clip);
       
   579 		test(clip==rgn1.BoundingRect());
       
   580 		clip.iTl.iX=clip.iBr.iX;
       
   581 		rgn1.ClipRect(clip);
       
   582 		test(rgn1.Count()==0);
       
   583 		}
       
   584 	rgn1.Close();
       
   585 	}
       
   586 
       
   587 void TestRRegion::TestContains()
       
   588 	{
       
   589 	RRegion rgn;
       
   590 	rgn.AddRect(TRect(10,10,20,20));
       
   591 	rgn.AddRect(TRect(10,20,50,30));
       
   592 	test(rgn.Contains(TPoint(10,10)));
       
   593 	test(rgn.Contains(TPoint(49,29)));
       
   594 	test(rgn.Contains(TPoint(15,15)));
       
   595 	test(rgn.Contains(TPoint(31,22)));
       
   596 	test(rgn.Contains(TPoint(50,30))==EFalse);
       
   597 	test(rgn.Contains(TPoint(-100,-30))==EFalse);
       
   598 	test(rgn.Contains(TPoint(200,20))==EFalse);
       
   599 	test(rgn.Contains(TPoint(15,30000))==EFalse);
       
   600 	rgn.Close();
       
   601 	TRegionFix<1> rgn2(TRect(20,20,25,25));
       
   602 	test(rgn2.Contains(TPoint(20,20)));
       
   603 	test(rgn2.Contains(TPoint(22,23)));
       
   604  	test(rgn2.Contains(TPoint(0,0))==EFalse);
       
   605 	test(rgn2.Contains(TPoint(25,25))==EFalse);
       
   606 	test(rgn2.Contains(TPoint(30,30))==EFalse);
       
   607 	}
       
   608 
       
   609 void TestRRegion::TestIntersects()
       
   610 	{
       
   611 	RRegion rgn;
       
   612 	rgn.AddRect(TRect(10,10,20,20));
       
   613 	rgn.AddRect(TRect(10,20,50,30));
       
   614 	test(rgn.Intersects(TRect(10,10,20,20)));
       
   615 	test(rgn.Intersects(TRect(5,5,15,15)));
       
   616 	test(rgn.Intersects(TRect(10,20,50,30)));
       
   617 	test(rgn.Intersects(TRect(10,10,20,20)));
       
   618 	test(rgn.Intersects(TRect(40,10,60,30)));
       
   619 	test(rgn.Intersects(TRect(0,0,10,10))==EFalse);
       
   620 	test(rgn.Intersects(TRect(30,10,40,20))==EFalse);
       
   621 	rgn.Close();
       
   622 	TRegionFix<1> rgn2(TRect(20,20,30,30));
       
   623 	test(rgn2.Intersects(TRect(20,20,30,30)));
       
   624 	test(rgn2.Intersects(TRect(15,25,25,35)));
       
   625 	test(rgn2.Intersects(TRect(25,15,35,25)));
       
   626 	test(rgn2.Intersects(TRect(15,15,25,25)));
       
   627 	test(rgn2.Intersects(TRect(25,25,35,35)));
       
   628 	test(rgn2.Intersects(TRect(10,20,20,30))==EFalse);
       
   629 	test(rgn2.Intersects(TRect(30,20,40,30))==EFalse);
       
   630 	test(rgn2.Intersects(TRect(20,10,30,20))==EFalse);
       
   631 	test(rgn2.Intersects(TRect(20,30,30,40))==EFalse);
       
   632 	// empty rectangles
       
   633 	test(rgn2.Intersects(TRect(30,30,20,20))==EFalse);
       
   634 	TRegionFix<1> rgn3(TRect(30,30,20,20));
       
   635 	test(rgn3.Intersects(TRect(30,30,20,20))==EFalse);
       
   636 	test(rgn3.Intersects(TRect(20,20,30,30))==EFalse);
       
   637 	}
       
   638 
       
   639 void TestRRegion::TestErrors()
       
   640 	{
       
   641 	RRegion rgnErr,rgnErr2;
       
   642 	RRegion rgn;
       
   643 	TRect rect(1,2,3,4),rect2;
       
   644 	const TRect* rList;
       
   645 	TPoint pnt;
       
   646 
       
   647 	rgnErr.ForceError();
       
   648 	rgn.AddRect(rect);
       
   649 	rgnErr.Copy(rgn);
       
   650 	test(rgnErr.CheckError()==EFalse);
       
   651 	test(rgnErr.Count()==1);
       
   652 
       
   653 	rgnErr.ForceError();
       
   654 	test(rgnErr.CheckError()==TRUE);
       
   655 	rgnErr.AddRect(rect);
       
   656 	rgnErr.AddRect(TRect(2,3,4,5));
       
   657 	test(rgnErr.CheckError()==TRUE);
       
   658 	rgnErr.SubRect(rect);
       
   659 	test(rgnErr.CheckError()==TRUE);
       
   660 	rgn.Copy(rgnErr);
       
   661 	test(rgn.CheckError()==TRUE);
       
   662 	rgnErr.Offset(1,2);
       
   663 	rgnErr.Offset(pnt);
       
   664 	test(rgnErr.CheckError()==TRUE);
       
   665 
       
   666 	rgn.Union(rgnErr);
       
   667 	test(rgn.CheckError()==TRUE);
       
   668 	rgnErr.AddRect(rect);
       
   669 	test(rgnErr.CheckError()==TRUE);
       
   670 	rgn.Clear();
       
   671 	rgn.AddRect(rect);
       
   672 	rgnErr.Union(rgn);
       
   673 	test(rgnErr.CheckError()==TRUE);
       
   674 	rgn.Clear();
       
   675 	test(rgn.CheckError()==FALSE);
       
   676 
       
   677 	rgnErr2.Clear();
       
   678 	rgnErr2.AddRect(rect);
       
   679 	rgn.Intersection(rgnErr,rgnErr2);
       
   680 	test(rgn.CheckError()==TRUE);
       
   681 	rgn.Clear();
       
   682 	rgn.Intersection(rgnErr2,rgnErr);
       
   683 	test(rgn.CheckError()==TRUE);
       
   684 	rgnErr2.ForceError();
       
   685 	rgn.Clear();
       
   686 	rgn.Intersection(rgnErr2,rgnErr);
       
   687 	test(rgn.CheckError()==TRUE);
       
   688 	rgn.Clear();
       
   689 	rgn.AddRect(rect);
       
   690 	rgn.Intersect(rgnErr);
       
   691 	test(rgn.CheckError()==TRUE);
       
   692 	rgn.Clear();
       
   693 	rgn.AddRect(rect);
       
   694 	rgnErr.Intersect(rgn);
       
   695 	test(rgnErr.CheckError()==TRUE);
       
   696 	test(rgn.CheckError()==FALSE);
       
   697 
       
   698 	test(rgnErr.IsEmpty()==FALSE);
       
   699 
       
   700 	rgn.Clear();
       
   701 	rgn.AddRect(rect);
       
   702 	rgn.SubRegion(rgnErr);
       
   703 	test(rgn.CheckError()==TRUE);
       
   704 	test(rgnErr.CheckError()==TRUE);
       
   705 
       
   706 	rgnErr.ClipRect(rect);
       
   707 	test(rgnErr.CheckError()==TRUE);
       
   708 	rgnErr.Tidy();
       
   709 	test(rgnErr.CheckError()==TRUE);
       
   710 	rect2=rgnErr.BoundingRect();
       
   711 	test(rect2.iTl.iX==0 && rect2.iBr.iY==0);
       
   712 
       
   713 	test(rgnErr.Count()==0);
       
   714 	rList=rgnErr.RectangleList();
       
   715 	rgn.Close();
       
   716 	rgnErr.Close();
       
   717 	rgnErr2.Close();
       
   718 	}
       
   719 
       
   720 void TestRRegion::doTestSort(RRegion &rgn)
       
   721 	{
       
   722 	TInt loop,loop2;
       
   723 	TRect const rlist[8]={	// 8 Rectangles that form a square with the centre rectangle missing
       
   724 		TRect(20,30,30,40),
       
   725 		TRect(20,10,30,20),
       
   726 		TRect(10,20,20,30),
       
   727 		TRect(30,20,40,30),
       
   728 		TRect(10,30,20,40),
       
   729 		TRect(30,30,40,40),
       
   730 		TRect(10,10,20,20),
       
   731 		TRect(30,10,40,20)};
       
   732 	TRect sorted[8];
       
   733 	TRect const* plist;
       
   734 	TRect tmp;
       
   735 
       
   736 // Work out wot the sorted list should be
       
   737 	for(loop=0;loop<8;loop++)
       
   738 		sorted[loop]=rlist[loop];
       
   739 	for(loop=0;loop<8;loop++)
       
   740 		{
       
   741 restart:
       
   742 		for(loop2=loop+1;loop2<8;loop2++)
       
   743 			{
       
   744 			if (sorted[loop2].iTl.iY>sorted[loop].iTl.iY)
       
   745 				continue;
       
   746 			if (sorted[loop2].iTl.iY==sorted[loop].iTl.iY && sorted[loop2].iTl.iX>sorted[loop].iTl.iX)
       
   747 				continue;
       
   748 			tmp=sorted[loop];
       
   749 			sorted[loop]=sorted[loop2];
       
   750 			sorted[loop2]=tmp;
       
   751 			goto restart;
       
   752 			}	
       
   753 		}
       
   754 	for(loop=0;loop<8;loop++)
       
   755 		rgn.AddRect(rlist[loop]);
       
   756 	rgn.Sort();
       
   757 	plist=rgn.RectangleList();
       
   758 	for(loop=0;loop<8;loop++)
       
   759 		test(plist[loop]==sorted[loop]);
       
   760 	rgn.Close();
       
   761 	}
       
   762 
       
   763 void TestRRegion::TestSort()
       
   764 	{
       
   765 	RRegion rgn;
       
   766 	doTestSort(rgn);
       
   767 	RRegionBuf<1> rgnBuf;
       
   768 	doTestSort(rgnBuf);
       
   769 	}
       
   770 
       
   771 void TestRRegion::doTestRegionBuf(RRegion &aRegion)
       
   772 	{
       
   773 	for(TInt index=0;index<8;index++)
       
   774 		{
       
   775 		aRegion.AddRect(TRect(index*2,index*2,index*2+2,index*2+2));
       
   776 		test(aRegion.Count()==(index+1));
       
   777 		const TRect *pr=aRegion.RectangleList();
       
   778 		for(TInt index2=0;index2<=index;index2++)
       
   779 			test(pr[index2]==TRect(index2*2,index2*2,index2*2+2,index2*2+2));
       
   780 		}
       
   781 	aRegion.Close();
       
   782 	}
       
   783 
       
   784 void TestRRegion::TestRegionBuf()
       
   785 	{
       
   786 	RRegionBuf<1> rgn(TRect(1,2,3,4));
       
   787 	test(rgn[0]==TRect(1,2,3,4));
       
   788 	RRegionBuf<1> rgn1;
       
   789 	doTestRegionBuf(rgn1);
       
   790 	RRegionBuf<2> rgn2;
       
   791 	doTestRegionBuf(rgn2);
       
   792 	RRegionBuf<5> rgn5;
       
   793 	doTestRegionBuf(rgn5);
       
   794 	RRegionBuf<10> rgn10;
       
   795 	doTestRegionBuf(rgn10);
       
   796 	}
       
   797 
       
   798 // Top level test code
       
   799 LOCAL_C void test_region(TestRRegion t)
       
   800 	{
       
   801 	test.Start(_L("Setting values"));
       
   802 	t.TestSet();
       
   803 	test.Next(_L("TRegionFix"));
       
   804 	t.TestRegionFix();
       
   805 	test.Next(_L("AddRect"));
       
   806 	t.TestAddRect();
       
   807 	test.Next(_L("SubRect"));
       
   808 	t.TestSubRect();
       
   809 	test.Next(_L("SubRegion"));
       
   810 	t.TestSubRegion();
       
   811 	test.Next(_L("Tidy"));
       
   812 	t.TestTidy();
       
   813 	test.Next(_L("Spare"));
       
   814 	t.TestSpare();
       
   815 	test.Next(_L("Offset"));
       
   816 	t.TestOffset();
       
   817 	test.Next(_L("Intersection"));
       
   818 	t.TestIntersection();
       
   819 	test.Next(_L("Union"));
       
   820 	t.TestUnion();
       
   821 	test.Next(_L("Clip rect"));
       
   822 	t.TestClipRect();
       
   823 	test.Next(_L("Contains"));
       
   824 	t.TestContains();
       
   825 	test.Next(_L("Intersects"));
       
   826 	t.TestIntersects();
       
   827 	test.Next(_L("Errors"));
       
   828 	t.TestErrors();
       
   829 	test.Next(_L("Sort"));
       
   830 	t.TestSort();
       
   831 	test.Next(_L("RegionBuf"));
       
   832 	t.TestRegionBuf();
       
   833 	test.End();
       
   834 	}
       
   835 
       
   836 GLDEF_C TInt E32Main()
       
   837 //
       
   838 // Main
       
   839 //
       
   840     {
       
   841 
       
   842 	test.Title();
       
   843 	__UHEAP_MARK;
       
   844 	TestRRegion t1(10,20,30,40);
       
   845 	TestRRegion t2(0,0,1,1);
       
   846 	TestRRegion t3(1,1,1,1);
       
   847 	TestRRegion t4(1000000,2000000,3000000,4000000);
       
   848 
       
   849 	test.Start(_L("class RRegion 1"));
       
   850 	test_region(t1);
       
   851 	test.Next(_L("class RRegion 2"));
       
   852 	test_region(t2);
       
   853 	test.Next(_L("class RRegion 3"));
       
   854 	test_region(t3);
       
   855 	test.Next(_L("class RRegion 4"));
       
   856 	test_region(t4);
       
   857 	test.End();
       
   858 	__UHEAP_MARKEND;
       
   859 	return(0);
       
   860     }
       
   861 
       
   862