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