xref: /haiku/src/tests/kits/interface/bregion/RegionExclude.cpp (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
1bc0ea15dSStefano Ceccherini /*
2571d840aSOliver Tappe 	$Id: RegionExclude.cpp 4235 2003-08-06 06:46:06Z jackburton $
3bc0ea15dSStefano Ceccherini 
4*2ca13760SColdfirex 	This file implements the exclude test for the Haiku BRegion
5bc0ea15dSStefano Ceccherini 	code.
6bc0ea15dSStefano Ceccherini 
7bc0ea15dSStefano Ceccherini 	*/
8bc0ea15dSStefano Ceccherini 
9bc0ea15dSStefano Ceccherini 
10bc0ea15dSStefano Ceccherini #include "RegionExclude.h"
11bc0ea15dSStefano Ceccherini #include <Region.h>
12bc0ea15dSStefano Ceccherini #include <Rect.h>
13bc0ea15dSStefano Ceccherini 
1477aa0e2aSOliver Tappe #include <assert.h>
1577aa0e2aSOliver Tappe 
16bc0ea15dSStefano Ceccherini 
17bc0ea15dSStefano Ceccherini /*
18bc0ea15dSStefano Ceccherini  *  Method:  RegionExclude::RegionExclude()
19bc0ea15dSStefano Ceccherini  *   Descr:  This is the constructor for this class.
20bc0ea15dSStefano Ceccherini  */
21bc0ea15dSStefano Ceccherini 
RegionExclude(std::string name)22bc0ea15dSStefano Ceccherini RegionExclude::RegionExclude(std::string name) :
23bc0ea15dSStefano Ceccherini 	RegionTestcase(name)
24bc0ea15dSStefano Ceccherini {
25bc0ea15dSStefano Ceccherini 	}
26bc0ea15dSStefano Ceccherini 
27bc0ea15dSStefano Ceccherini 
28bc0ea15dSStefano Ceccherini /*
29bc0ea15dSStefano Ceccherini  *  Method:  RegionExclude::~RegionExclude()
30bc0ea15dSStefano Ceccherini  *   Descr:  This is the destructor for this class.
31bc0ea15dSStefano Ceccherini  */
32bc0ea15dSStefano Ceccherini 
~RegionExclude()33bc0ea15dSStefano Ceccherini RegionExclude::~RegionExclude()
34bc0ea15dSStefano Ceccherini {
35bc0ea15dSStefano Ceccherini 	}
36bc0ea15dSStefano Ceccherini 
37bc0ea15dSStefano Ceccherini 
38bc0ea15dSStefano Ceccherini /*
39bc0ea15dSStefano Ceccherini  *  Method:  RegionExclude::CheckExclude()
40bc0ea15dSStefano Ceccherini  *   Descr:  This member function checks that the result region is in fact
41bc0ea15dSStefano Ceccherini  *           region A with region B excluded.
42bc0ea15dSStefano Ceccherini  */
43bc0ea15dSStefano Ceccherini 
CheckExclude(BRegion * resultRegion,BRegion * testRegionA,BRegion * testRegionB)44bc0ea15dSStefano Ceccherini void RegionExclude::CheckExclude(BRegion *resultRegion, BRegion *testRegionA,
45bc0ea15dSStefano Ceccherini                                  BRegion *testRegionB)
46bc0ea15dSStefano Ceccherini {
47bc0ea15dSStefano Ceccherini 	bool resultRegionEmpty = RegionIsEmpty(resultRegion);
48bc0ea15dSStefano Ceccherini 	bool testRegionAEmpty = RegionIsEmpty(testRegionA);
49bc0ea15dSStefano Ceccherini 	bool testRegionBEmpty = RegionIsEmpty(testRegionB);
50bc0ea15dSStefano Ceccherini 
51bc0ea15dSStefano Ceccherini 	if (RegionsAreEqual(testRegionA, testRegionB)) {
52bc0ea15dSStefano Ceccherini 		assert(resultRegionEmpty);
53bc0ea15dSStefano Ceccherini 	}
54bc0ea15dSStefano Ceccherini 
55bc0ea15dSStefano Ceccherini 	if (RegionsAreEqual(resultRegion, testRegionA)) {
56bc0ea15dSStefano Ceccherini 		BRegion tempRegion(*testRegionA);
57bc0ea15dSStefano Ceccherini 		tempRegion.IntersectWith(testRegionB);
58bc0ea15dSStefano Ceccherini 		assert(RegionIsEmpty(&tempRegion));
59bc0ea15dSStefano Ceccherini 	}
60bc0ea15dSStefano Ceccherini 
61bc0ea15dSStefano Ceccherini 	if (RegionsAreEqual(resultRegion, testRegionB)) {
62bc0ea15dSStefano Ceccherini 		assert(resultRegionEmpty);
63bc0ea15dSStefano Ceccherini 		assert(testRegionAEmpty);
64bc0ea15dSStefano Ceccherini 		assert(testRegionBEmpty);
65bc0ea15dSStefano Ceccherini 	}
66bc0ea15dSStefano Ceccherini 
67bc0ea15dSStefano Ceccherini 	if ((!resultRegionEmpty) && (!testRegionAEmpty) && (!testRegionBEmpty)) {
68bc0ea15dSStefano Ceccherini 		BRect resultRegionFrame(resultRegion->Frame());
69bc0ea15dSStefano Ceccherini 		BRect testRegionAFrame(testRegionA->Frame());
70bc0ea15dSStefano Ceccherini 		BRect testRegionBFrame(testRegionB->Frame());
71bc0ea15dSStefano Ceccherini 
72bc0ea15dSStefano Ceccherini 		if (!testRegionAFrame.Intersects(testRegionBFrame)) {
73bc0ea15dSStefano Ceccherini 			assert(testRegionAFrame == resultRegionFrame);
74bc0ea15dSStefano Ceccherini 			assert(RegionsAreEqual(resultRegion, testRegionA));
75bc0ea15dSStefano Ceccherini 		} else {
76bc0ea15dSStefano Ceccherini 			assert(testRegionAFrame.Contains(resultRegionFrame));
77bc0ea15dSStefano Ceccherini 		}
78bc0ea15dSStefano Ceccherini 	}
79bc0ea15dSStefano Ceccherini 
80bc0ea15dSStefano Ceccherini 	if (testRegionBEmpty) {
81bc0ea15dSStefano Ceccherini 		assert(RegionsAreEqual(resultRegion, testRegionA));
82bc0ea15dSStefano Ceccherini 	} else {
83bc0ea15dSStefano Ceccherini 		assert(!RegionsAreEqual(resultRegion, testRegionB));
84bc0ea15dSStefano Ceccherini 		for(int i = 0; i < testRegionB->CountRects(); i++) {
85bc0ea15dSStefano Ceccherini 			BRect tempRect = testRegionB->RectAt(i);
86bc0ea15dSStefano Ceccherini 
87bc0ea15dSStefano Ceccherini 			assert(testRegionB->Intersects(tempRect));
88bc0ea15dSStefano Ceccherini 			assert(!resultRegion->Intersects(tempRect));
89bc0ea15dSStefano Ceccherini 
90bc0ea15dSStefano Ceccherini 			BPoint *pointArray;
91bc0ea15dSStefano Ceccherini 			int numPoints = GetPointsInRect(tempRect, &pointArray);
92bc0ea15dSStefano Ceccherini 			for (int j = 0; j < numPoints; j++) {
93bc0ea15dSStefano Ceccherini 				assert(testRegionB->Contains(pointArray[j]));
94bc0ea15dSStefano Ceccherini 				assert(!resultRegion->Contains(pointArray[j]));
95bc0ea15dSStefano Ceccherini 			}
96bc0ea15dSStefano Ceccherini 		}
97bc0ea15dSStefano Ceccherini 	}
98bc0ea15dSStefano Ceccherini 
99bc0ea15dSStefano Ceccherini 	if (testRegionAEmpty) {
100bc0ea15dSStefano Ceccherini 		assert(resultRegionEmpty);
101bc0ea15dSStefano Ceccherini 	} else {
102bc0ea15dSStefano Ceccherini 		for(int i = 0; i < testRegionA->CountRects(); i++) {
103bc0ea15dSStefano Ceccherini 			BRect tempRect = testRegionA->RectAt(i);
104bc0ea15dSStefano Ceccherini 
105bc0ea15dSStefano Ceccherini 			assert(testRegionA->Intersects(tempRect));
106bc0ea15dSStefano Ceccherini 			if (!testRegionB->Intersects(tempRect)) {
107bc0ea15dSStefano Ceccherini 				assert(resultRegion->Intersects(tempRect));
108bc0ea15dSStefano Ceccherini 			}
109bc0ea15dSStefano Ceccherini 
110bc0ea15dSStefano Ceccherini 			BPoint *pointArray;
111bc0ea15dSStefano Ceccherini 			int numPoints = GetPointsInRect(tempRect, &pointArray);
112bc0ea15dSStefano Ceccherini 			for (int j = 0; j < numPoints; j++) {
113bc0ea15dSStefano Ceccherini 				assert(testRegionA->Contains(pointArray[j]));
114bc0ea15dSStefano Ceccherini 				if (testRegionB->Contains(pointArray[j])) {
115bc0ea15dSStefano Ceccherini 					assert(!resultRegion->Contains(pointArray[j]));
116bc0ea15dSStefano Ceccherini 				} else {
117bc0ea15dSStefano Ceccherini 					assert(resultRegion->Contains(pointArray[j]));
118bc0ea15dSStefano Ceccherini 				}
119bc0ea15dSStefano Ceccherini 			}
120bc0ea15dSStefano Ceccherini 		}
121bc0ea15dSStefano Ceccherini 	}
122bc0ea15dSStefano Ceccherini 
123bc0ea15dSStefano Ceccherini 	if (resultRegionEmpty) {
124bc0ea15dSStefano Ceccherini 		BRegion tempRegion(*testRegionA);
125bc0ea15dSStefano Ceccherini 		tempRegion.IntersectWith(testRegionB);
126bc0ea15dSStefano Ceccherini 		assert(RegionsAreEqual(&tempRegion, testRegionA));
127bc0ea15dSStefano Ceccherini 	} else {
128bc0ea15dSStefano Ceccherini 		assert(!RegionsAreEqual(resultRegion, testRegionB));
129bc0ea15dSStefano Ceccherini 		for(int i = 0; i < resultRegion->CountRects(); i++) {
130bc0ea15dSStefano Ceccherini 			BRect tempRect = resultRegion->RectAt(i);
131bc0ea15dSStefano Ceccherini 
132bc0ea15dSStefano Ceccherini 			assert(resultRegion->Intersects(tempRect));
133bc0ea15dSStefano Ceccherini 			assert(testRegionA->Intersects(tempRect));
134bc0ea15dSStefano Ceccherini 			assert(!testRegionB->Intersects(tempRect));
135bc0ea15dSStefano Ceccherini 
136bc0ea15dSStefano Ceccherini 			BPoint *pointArray;
137bc0ea15dSStefano Ceccherini 			int numPoints = GetPointsInRect(tempRect, &pointArray);
138bc0ea15dSStefano Ceccherini 			for (int j = 0; j < numPoints; j++) {
139bc0ea15dSStefano Ceccherini 				assert(resultRegion->Contains(pointArray[j]));
140bc0ea15dSStefano Ceccherini 				assert(testRegionA->Contains(pointArray[j]));
141bc0ea15dSStefano Ceccherini 				assert(!testRegionB->Contains(pointArray[j]));
142bc0ea15dSStefano Ceccherini 			}
143bc0ea15dSStefano Ceccherini 		}
144bc0ea15dSStefano Ceccherini 	}
145bc0ea15dSStefano Ceccherini }
146bc0ea15dSStefano Ceccherini 
147bc0ea15dSStefano Ceccherini 
148bc0ea15dSStefano Ceccherini /*
149bc0ea15dSStefano Ceccherini  *  Method:  RegionExclude::testOneRegion()
150bc0ea15dSStefano Ceccherini  *   Descr:  This member function performs a test on a single passed in
151bc0ea15dSStefano Ceccherini  *           region.
152bc0ea15dSStefano Ceccherini  */
153bc0ea15dSStefano Ceccherini 
testOneRegion(BRegion * testRegion)154bc0ea15dSStefano Ceccherini void RegionExclude::testOneRegion(BRegion *testRegion)
155bc0ea15dSStefano Ceccherini {
156bc0ea15dSStefano Ceccherini 
157bc0ea15dSStefano Ceccherini }
158bc0ea15dSStefano Ceccherini 
159bc0ea15dSStefano Ceccherini 
160bc0ea15dSStefano Ceccherini /*
161bc0ea15dSStefano Ceccherini  *  Method:  RegionExclude::testTwoRegions()
162bc0ea15dSStefano Ceccherini  *   Descr:  This member function performs a test on two regions passed in.
163bc0ea15dSStefano Ceccherini  */
164bc0ea15dSStefano Ceccherini 
testTwoRegions(BRegion * testRegionA,BRegion * testRegionB)165bc0ea15dSStefano Ceccherini void RegionExclude::testTwoRegions(BRegion *testRegionA, BRegion *testRegionB)
166bc0ea15dSStefano Ceccherini {
167bc0ea15dSStefano Ceccherini 	BRegion tempRegion1(*testRegionA);
168bc0ea15dSStefano Ceccherini 	CheckFrame(&tempRegion1);
169bc0ea15dSStefano Ceccherini 	assert(RegionsAreEqual(&tempRegion1, testRegionA));
170bc0ea15dSStefano Ceccherini 
171bc0ea15dSStefano Ceccherini 	tempRegion1.Exclude(testRegionB);
172bc0ea15dSStefano Ceccherini 	CheckFrame(&tempRegion1);
173bc0ea15dSStefano Ceccherini 	CheckExclude(&tempRegion1, testRegionA, testRegionB);
174bc0ea15dSStefano Ceccherini 
175bc0ea15dSStefano Ceccherini 	tempRegion1 = *testRegionA;
176bc0ea15dSStefano Ceccherini 	CheckFrame(&tempRegion1);
177bc0ea15dSStefano Ceccherini 	assert(RegionsAreEqual(&tempRegion1, testRegionA));
178bc0ea15dSStefano Ceccherini 
179bc0ea15dSStefano Ceccherini 	for(int i = 0; i < testRegionB->CountRects(); i++) {
180bc0ea15dSStefano Ceccherini 		tempRegion1.Exclude(testRegionB->RectAt(i));
181bc0ea15dSStefano Ceccherini 		CheckFrame(&tempRegion1);
182bc0ea15dSStefano Ceccherini 	}
183bc0ea15dSStefano Ceccherini 	CheckExclude(&tempRegion1, testRegionA, testRegionB);
184bc0ea15dSStefano Ceccherini }
185bc0ea15dSStefano Ceccherini 
186bc0ea15dSStefano Ceccherini 
187bc0ea15dSStefano Ceccherini /*
188bc0ea15dSStefano Ceccherini  *  Method:  RegionExclude::suite()
189bc0ea15dSStefano Ceccherini  *   Descr:  This static member function returns a test caller for performing
190bc0ea15dSStefano Ceccherini  *           all combinations of "RegionExclude".
191bc0ea15dSStefano Ceccherini  */
192bc0ea15dSStefano Ceccherini 
suite(void)193bc0ea15dSStefano Ceccherini  Test *RegionExclude::suite(void)
194bc0ea15dSStefano Ceccherini {
195bc0ea15dSStefano Ceccherini 	typedef CppUnit::TestCaller<RegionExclude>
196bc0ea15dSStefano Ceccherini 		RegionExcludeCaller;
197bc0ea15dSStefano Ceccherini 
198bc0ea15dSStefano Ceccherini 	return(new RegionExcludeCaller("BRegion::Exclude Test", &RegionExclude::PerformTest));
199bc0ea15dSStefano Ceccherini 	}
200