2 // Region class testing unit
5 // Jordi Mas, jordi@ximian.com
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2004-2006 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Drawing.Imaging;
33 using System.Drawing.Drawing2D;
34 using System.Security.Permissions;
35 using NUnit.Framework;
37 namespace MonoTests.System.Drawing
41 [SecurityPermission (SecurityAction.Deny, UnmanagedCode = true)]
42 public class TestRegion
45 public static void DumpRegion (Region rgn)
47 Matrix matrix = new Matrix ();
48 RectangleF [] rects = rgn.GetRegionScans (matrix);
50 for (int i = 0; i < rects.Length; i++)
51 Console.WriteLine ( rects[i]);
54 private Bitmap bitmap;
55 private Graphics graphic;
58 public void FixtureSetUp ()
60 bitmap = new Bitmap (10, 10);
61 graphic = Graphics.FromImage (bitmap);
65 public void TestBounds()
67 Bitmap bmp = new Bitmap (600, 800);
68 Graphics dc = Graphics.FromImage (bmp);
69 Rectangle rect1, rect2;
73 rect1 = new Rectangle (500, 30, 60, 80);
74 rect2 = new Rectangle (520, 40, 60, 80);
75 rgn1 = new Region(rect1);
76 rgn2 = new Region(rect2);
79 bounds = rgn1.GetBounds (dc);
81 Assert.AreEqual (500, bounds.X);
82 Assert.AreEqual (30, bounds.Y);
83 Assert.AreEqual (80, bounds.Width);
84 Assert.AreEqual (90, bounds.Height);
89 [Category ("NotWorking")]
91 public void TestCloneAndEquals()
93 Bitmap bmp = new Bitmap (600, 800);
94 Graphics dc = Graphics.FromImage (bmp);
95 Rectangle rect1, rect2;
99 Matrix matrix = new Matrix ();
101 rect1 = new Rectangle (500, 30, 60, 80);
102 rect2 = new Rectangle (520, 40, 60, 80);
103 rgn1 = new Region (rect1);
105 rgn2 = rgn1.Clone ();
107 rects = rgn1.GetRegionScans (matrix);
108 rects2 = rgn2.GetRegionScans (matrix);
110 Assert.AreEqual (rects.Length, rects2.Length);
112 for (int i = 0; i < rects.Length; i++) {
114 Assert.AreEqual (rects[i].X, rects[i].X);
115 Assert.AreEqual (rects[i].Y, rects[i].Y);
116 Assert.AreEqual (rects[i].Width, rects[i].Width);
117 Assert.AreEqual (rects[i].Height, rects[i].Height);
120 Assert.AreEqual (true, rgn1.Equals (rgn2, dc));
123 /*Tests infinite, empty, etc*/
126 [Category ("NotWorking")]
128 public void TestInfiniteAndEmpty()
130 Bitmap bmp = new Bitmap (600, 800);
131 Graphics dc = Graphics.FromImage (bmp);
132 Rectangle rect1, rect2;
135 Matrix matrix = new Matrix ();
137 rect1 = new Rectangle (500, 30, 60, 80);
138 rect2 = new Rectangle (520, 40, 60, 80);
139 rgn1 = new Region (rect1);
142 Assert.AreEqual (false, rgn1.IsEmpty (dc));
143 Assert.AreEqual (false, rgn1.IsInfinite (dc));
146 Assert.AreEqual (true, rgn1.IsEmpty (dc));
148 rgn1 = new Region (rect1);
150 rgn1.MakeInfinite ();
151 rects = rgn1.GetRegionScans (matrix);
153 Assert.AreEqual (1, rects.Length);
154 Assert.AreEqual (-4194304, rects[0].X);
155 Assert.AreEqual (-4194304, rects[0].Y);
156 Assert.AreEqual (8388608, rects[0].Width);
157 Assert.AreEqual (8388608, rects[0].Height);
158 Assert.AreEqual (true, rgn1.IsInfinite (dc));
164 [Category ("NotWorking")]
166 public void TestUnionGroup1 ()
168 Bitmap bmp = new Bitmap (600, 800);
169 Graphics dc = Graphics.FromImage (bmp);
170 Matrix matrix = new Matrix ();
171 Rectangle rect1, rect2, rect3, rect4;
172 Region rgn1, rgn2, rgn3, rgn4;
175 rect1 = new Rectangle (500, 30, 60, 80);
176 rect2 = new Rectangle (520, 40, 60, 80);
177 rgn1 = new Region(rect1);
178 rgn2 = new Region(rect2);
180 rects = rgn1.GetRegionScans (matrix);
182 Assert.AreEqual (3, rects.Length);
183 Assert.AreEqual (500, rects[0].X);
184 Assert.AreEqual (30, rects[0].Y);
185 Assert.AreEqual (60, rects[0].Width);
186 Assert.AreEqual (10, rects[0].Height);
188 Assert.AreEqual (500, rects[1].X);
189 Assert.AreEqual (40, rects[1].Y);
190 Assert.AreEqual (80, rects[1].Width);
191 Assert.AreEqual (70, rects[1].Height);
193 Assert.AreEqual (520, rects[2].X);
194 Assert.AreEqual (110, rects[2].Y);
195 Assert.AreEqual (60, rects[2].Width);
196 Assert.AreEqual (10, rects[2].Height);
198 rect1 = new Rectangle (20, 180, 40, 50);
199 rect2 = new Rectangle (50, 190, 40, 50);
200 rect3 = new Rectangle (70, 210, 30, 50);
201 rgn1 = new Region (rect1);
202 rgn2 = new Region (rect2);
203 rgn3 = new Region (rect3);
207 rects = rgn1.GetRegionScans (matrix);
208 Assert.AreEqual (5, rects.Length);
210 Assert.AreEqual (20, rects[0].X);
211 Assert.AreEqual (180, rects[0].Y);
212 Assert.AreEqual (40, rects[0].Width);
213 Assert.AreEqual (10, rects[0].Height);
215 Assert.AreEqual (20, rects[1].X);
216 Assert.AreEqual (190, rects[1].Y);
217 Assert.AreEqual (70, rects[1].Width);
218 Assert.AreEqual (20, rects[1].Height);
220 Assert.AreEqual (20, rects[2].X);
221 Assert.AreEqual (210, rects[2].Y);
222 Assert.AreEqual (80, rects[2].Width);
223 Assert.AreEqual (20, rects[2].Height);
225 Assert.AreEqual (50, rects[3].X);
226 Assert.AreEqual (230, rects[3].Y);
227 Assert.AreEqual (50, rects[3].Width);
228 Assert.AreEqual (10, rects[3].Height);
230 Assert.AreEqual (70, rects[4].X);
231 Assert.AreEqual (240, rects[4].Y);
232 Assert.AreEqual (30, rects[4].Width);
233 Assert.AreEqual (20, rects[4].Height);
235 rect1 = new Rectangle (20, 330, 40, 50);
236 rect2 = new Rectangle (50, 340, 40, 50);
237 rect3 = new Rectangle (70, 360, 30, 50);
238 rect4 = new Rectangle (80, 400, 30, 10);
239 rgn1 = new Region (rect1);
240 rgn2 = new Region (rect2);
241 rgn3 = new Region (rect3);
242 rgn4 = new Region (rect4);
248 rects = rgn1.GetRegionScans (matrix);
250 Assert.AreEqual (6, rects.Length);
252 Assert.AreEqual (20, rects[0].X);
253 Assert.AreEqual (330, rects[0].Y);
254 Assert.AreEqual (40, rects[0].Width);
255 Assert.AreEqual (10, rects[0].Height);
257 Assert.AreEqual (20, rects[1].X);
258 Assert.AreEqual (340, rects[1].Y);
259 Assert.AreEqual (70, rects[1].Width);
260 Assert.AreEqual (20, rects[1].Height);
262 Assert.AreEqual (20, rects[2].X);
263 Assert.AreEqual (360, rects[2].Y);
264 Assert.AreEqual (80, rects[2].Width);
265 Assert.AreEqual (20, rects[2].Height);
267 Assert.AreEqual (50, rects[3].X);
268 Assert.AreEqual (380, rects[3].Y);
269 Assert.AreEqual (50, rects[3].Width);
270 Assert.AreEqual (10, rects[3].Height);
272 Assert.AreEqual (70, rects[4].X);
273 Assert.AreEqual (390, rects[4].Y);
274 Assert.AreEqual (30, rects[4].Width);
275 Assert.AreEqual (10, rects[4].Height);
277 Assert.AreEqual (70, rects[5].X);
278 Assert.AreEqual (400, rects[5].Y);
279 Assert.AreEqual (40, rects[5].Width);
280 Assert.AreEqual (10, rects[5].Height);
282 rect1 = new Rectangle (10, 20, 50, 50);
283 rect2 = new Rectangle (100, 100, 60, 60);
284 rect3 = new Rectangle (200, 200, 80, 80);
286 rgn1 = new Region (rect1);
290 rects = rgn1.GetRegionScans (matrix);
292 Assert.AreEqual (3, rects.Length);
294 Assert.AreEqual (10, rects[0].X);
295 Assert.AreEqual (20, rects[0].Y);
296 Assert.AreEqual (50, rects[0].Width);
297 Assert.AreEqual (50, rects[0].Height);
299 Assert.AreEqual (100, rects[1].X);
300 Assert.AreEqual (100, rects[1].Y);
301 Assert.AreEqual (60, rects[1].Width);
302 Assert.AreEqual (60, rects[1].Height);
304 Assert.AreEqual (200, rects[2].X);
305 Assert.AreEqual (200, rects[2].Y);
306 Assert.AreEqual (80, rects[2].Width);
307 Assert.AreEqual (80, rects[2].Height);
310 void AssertEqualRectangles (RectangleF rect1, RectangleF rect2, string text)
312 Assert.AreEqual (rect1.X, rect2.X, text + ".X");
313 Assert.AreEqual (rect1.Y, rect2.Y, text + ".Y");
314 Assert.AreEqual (rect1.Width, rect2.Width, text + ".Width");
315 Assert.AreEqual (rect1.Height, rect2.Height, text + ".Height");
320 [Category ("NotWorking")]
322 public void TestUnionGroup2 ()
325 Region r1 = new Region ();
326 Rectangle rect2 = Rectangle.Empty;
327 Rectangle rect1 = Rectangle.Empty;
328 Rectangle rect3 = Rectangle.Empty;
329 Rectangle rect4 = Rectangle.Empty;
331 { // TEST1: Not intersecting rects. Union just adds them
333 rect1 = new Rectangle (20, 20, 20, 20);
334 rect2 = new Rectangle (20, 80, 20, 10);
335 rect3 = new Rectangle (60, 60, 30, 10);
337 r1 = new Region (rect1);
341 rects = r1.GetRegionScans (new Matrix ());
342 Assert.AreEqual (3, rects.Length, "TUG1Test1");
343 AssertEqualRectangles (new RectangleF (20, 20, 20, 20), rects[0], "TUG1Test2");
344 AssertEqualRectangles (new RectangleF (60, 60, 30, 10), rects[1], "TUG1Test3");
345 AssertEqualRectangles (new RectangleF (20, 80, 20, 10), rects[2], "TUG1Test4");
348 { // TEST2: Intersecting from the right
360 rect1 = new Rectangle (10, 10, 100, 100);
361 rect2 = new Rectangle (40, 60, 100, 20);
362 r1 = new Region (rect1);
365 rects = r1.GetRegionScans (new Matrix ());
366 Assert.AreEqual (3, rects.Length, "TUG2Test1");
367 AssertEqualRectangles (new RectangleF (10, 10, 100, 50), rects[0], "TUG2Test2");
368 AssertEqualRectangles (new RectangleF (10, 60, 130, 20), rects[1], "TUG2Test3");
369 AssertEqualRectangles (new RectangleF (10, 80, 100, 30), rects[2], "TUG2Test4");
372 { // TEST3: Intersecting from the right
384 rect1 = new Rectangle (70, 10, 100, 100);
385 rect2 = new Rectangle (40, 60, 100, 20);
387 r1 = new Region (rect1);
390 rects = r1.GetRegionScans (new Matrix ());
391 Assert.AreEqual (3, rects.Length, "TUG3Test1");
392 AssertEqualRectangles (new RectangleF (70, 10, 100, 50), rects[0], "TUG3Test2");
393 AssertEqualRectangles (new RectangleF (40, 60, 130, 20), rects[1], "TUG3Test3");
394 AssertEqualRectangles (new RectangleF (70, 80, 100, 30), rects[2], "TUG3Test4");
397 { // TEST4: Intersecting from the top
410 rect1 = new Rectangle (40, 100, 100, 100);
411 rect2 = new Rectangle (70, 80, 50, 40);
412 r1 = new Region (rect1);
415 rects = r1.GetRegionScans (new Matrix ());
416 Assert.AreEqual (2, rects.Length, "TUG4Test1");
417 AssertEqualRectangles (new RectangleF (70, 80, 50, 20), rects[0], "TUG4Test2");
418 AssertEqualRectangles (new RectangleF (40, 100, 100, 100), rects[1], "TUG4Test3");
421 { // TEST5: Intersecting from the bottom
434 rect1 = new Rectangle (40, 10, 100, 100);
435 rect2 = new Rectangle (70, 80, 50, 40);
437 r1 = new Region (rect1);
440 rects = r1.GetRegionScans (new Matrix ());
441 Assert.AreEqual (2, rects.Length, "TUG5Test1");
442 AssertEqualRectangles (new RectangleF (40, 10, 100, 100), rects[0], "TUG5Test2");
443 AssertEqualRectangles (new RectangleF (70, 110, 50, 10), rects[1], "TUG5Test3");
446 { // TEST6: Multiple regions, two separted by zero pixels
448 rect1 = new Rectangle (30, 30, 80, 80);
449 rect2 = new Rectangle (45, 45, 200, 200);
450 rect3 = new Rectangle (160, 260, 10, 10);
451 rect4 = new Rectangle (170, 260, 10, 10);
453 r1 = new Region (rect1);
458 rects = r1.GetRegionScans (new Matrix ());
459 Assert.AreEqual (4, rects.Length, "TUG6Test1");
460 AssertEqualRectangles (new RectangleF (30, 30, 80, 15), rects[0], "TUG6Test2");
461 AssertEqualRectangles (new RectangleF (30, 45, 215, 65), rects[1], "TUG6Test3");
462 AssertEqualRectangles (new RectangleF (45, 110, 200, 135), rects[2], "TUG6Test4");
463 AssertEqualRectangles (new RectangleF (160, 260, 20, 10), rects[3], "TUG6Test5");
470 [Category ("NotWorking")]
472 public void TestComplementGroup1 ()
475 Region r1 = new Region ();
476 Region r2 = new Region ();
477 Rectangle rect1 = Rectangle.Empty;
478 Rectangle rect2 = Rectangle.Empty;
479 Rectangle rect3 = Rectangle.Empty;
480 Rectangle rect4 = Rectangle.Empty;
481 Rectangle rect5 = Rectangle.Empty;
482 Rectangle rect6 = Rectangle.Empty;
483 Rectangle rect7 = Rectangle.Empty;
488 rect1 = new Rectangle (20, 20, 20, 20);
489 rect2 = new Rectangle (20, 80, 20, 10);
490 rect3 = new Rectangle (60, 60, 30, 10);
492 r1 = new Region (rect1);
493 r2 = new Region (rect2);
497 rects = r1.GetRegionScans (new Matrix ());
498 Assert.AreEqual (2, rects.Length, "TCG1Test1");
499 AssertEqualRectangles (new RectangleF (60, 60, 30, 10), rects[0], "TCG1Test2");
500 AssertEqualRectangles (new RectangleF (20, 80, 20, 10), rects[1], "TCG1Test3");
506 rect1 = new Rectangle (10, 10, 100, 100);
507 rect2 = new Rectangle (40, 60, 100, 20);
509 r1 = new Region (rect1);
510 r1.Complement (rect2);
512 rects = r1.GetRegionScans (new Matrix ());
513 Assert.AreEqual (1, rects.Length, "TCG2Test1");
514 AssertEqualRectangles (new RectangleF (110, 60, 30, 20), rects[0], "TCG2Test2");
519 rect1 = new Rectangle (70, 10, 100, 100);
520 rect2 = new Rectangle (40, 60, 100, 20);
522 r1 = new Region (rect1);
523 r1.Complement (rect2);
525 rects = r1.GetRegionScans (new Matrix ());
526 Assert.AreEqual (1, rects.Length, "TCG3Test1");
527 AssertEqualRectangles (new RectangleF (40, 60, 30, 20), rects[0], "TCG3Test2");
532 rect1 = new Rectangle (40, 100, 100, 100);
533 rect2 = new Rectangle (70, 80, 50, 40);
535 r1 = new Region (rect1);
536 r1.Complement (rect2);
538 rects = r1.GetRegionScans (new Matrix ());
539 Assert.AreEqual (1, rects.Length, "TCG4Test1");
540 AssertEqualRectangles (new RectangleF (70, 80, 50, 20), rects[0], "TCG4Test2");
545 rect1 = new Rectangle (40, 10, 100, 100);
546 rect2 = new Rectangle (70, 80, 50, 40);
548 r1 = new Region (rect1);
549 r1.Complement (rect2);
551 rects = r1.GetRegionScans (new Matrix ());
552 Assert.AreEqual (1, rects.Length, "TCG5Test1");
553 AssertEqualRectangles (new RectangleF (70, 110, 50, 10), rects[0], "TCG5Test2");
556 { // TEST6: Multiple regions
558 rect1 = new Rectangle (30, 30, 80, 80);
559 rect2 = new Rectangle (45, 45, 200, 200);
560 rect3 = new Rectangle (160, 260, 10, 10);
561 rect4 = new Rectangle (170, 260, 10, 10);
563 r1 = new Region (rect1);
564 r1.Complement (rect2);
565 r1.Complement (rect3);
566 r1.Complement (rect4);
568 rects = r1.GetRegionScans (new Matrix ());
569 Assert.AreEqual (1, rects.Length, "TCG6Test1");
570 AssertEqualRectangles (new RectangleF (170, 260, 10, 10), rects[0], "TCG6Test2");
577 [Category ("NotWorking")]
579 public void TestComplementGroup2 ()
582 Bitmap bmp = new Bitmap (600, 800);
583 Graphics dc = Graphics.FromImage (bmp);
584 Matrix matrix = new Matrix ();
585 Rectangle rect1, rect2;
589 rect1 = new Rectangle (20, 30, 60, 80);
590 rect2 = new Rectangle (50, 40, 60, 80);
591 rgn1 = new Region (rect1);
592 rgn2 = new Region (rect2);
593 dc.DrawRectangle (Pens.Green, rect1);
594 dc.DrawRectangle (Pens.Red, rect2);
595 rgn1.Complement (rgn2);
596 dc.FillRegion (Brushes.Blue, rgn1);
597 dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
599 rects = rgn1.GetRegionScans (matrix);
601 Assert.AreEqual (2, rects.Length);
603 Assert.AreEqual (80, rects[0].X);
604 Assert.AreEqual (40, rects[0].Y);
605 Assert.AreEqual (30, rects[0].Width);
606 Assert.AreEqual (70, rects[0].Height);
608 Assert.AreEqual (50, rects[1].X);
609 Assert.AreEqual (110, rects[1].Y);
610 Assert.AreEqual (60, rects[1].Width);
611 Assert.AreEqual (10, rects[1].Height);
618 [Category ("NotWorking")]
620 public void TestExcludeGroup1 ()
623 Region r1 = new Region ();
624 Region r2 = new Region ();
625 Rectangle rect1 = Rectangle.Empty;
626 Rectangle rect2 = Rectangle.Empty;
627 Rectangle rect3 = Rectangle.Empty;
628 Rectangle rect4 = Rectangle.Empty;
629 Rectangle rect5 = Rectangle.Empty;
630 Rectangle rect6 = Rectangle.Empty;
631 Rectangle rect7 = Rectangle.Empty;
634 { // TEST1: Not intersecting rects. Exclude just adds them
636 rect1 = new Rectangle (20, 20, 20, 20);
637 rect2 = new Rectangle (20, 80, 20, 10);
638 rect3 = new Rectangle (60, 60, 30, 10);
640 r1 = new Region (rect1);
641 r2 = new Region (rect2);
645 rects = r1.GetRegionScans (new Matrix ());
646 Assert.AreEqual (1, rects.Length, "TEG1Test1");
647 AssertEqualRectangles (new RectangleF (20, 20, 20, 20), rects[0], "TEG1Test2");
650 { // TEST2: Excluding from the right
662 rect1 = new Rectangle (10, 10, 100, 100);
663 rect2 = new Rectangle (40, 60, 100, 20);
664 r1 = new Region (rect1);
667 rects = r1.GetRegionScans (new Matrix ());
668 Assert.AreEqual (3, rects.Length, "TEG2Test1");
669 AssertEqualRectangles (new RectangleF (10, 10, 100, 50), rects[0], "TEG2Test2");
670 AssertEqualRectangles (new RectangleF (10, 60, 30, 20), rects[1], "TEG2Test3");
671 AssertEqualRectangles (new RectangleF (10, 80, 100, 30), rects[2], "TEG2Test4");
675 { // TEST3: Intersecting from the right
687 rect1 = new Rectangle (70, 10, 100, 100);
688 rect2 = new Rectangle (40, 60, 100, 20);
690 r1 = new Region (rect1);
693 rects = r1.GetRegionScans (new Matrix ());
694 Assert.AreEqual (3, rects.Length, "TEG3Test1");
695 AssertEqualRectangles (new RectangleF (70, 10, 100, 50), rects[0], "TEG3Test2");
696 AssertEqualRectangles (new RectangleF (140, 60, 30, 20), rects[1], "TEG3Test3");
697 AssertEqualRectangles (new RectangleF (70, 80, 100, 30), rects[2], "TEG3Test4");
701 { // TEST4: Intersecting from the top
714 rect1 = new Rectangle (40, 100, 100, 100);
715 rect2 = new Rectangle (70, 80, 50, 40);
717 r1 = new Region (rect1);
720 rects = r1.GetRegionScans (new Matrix ());
721 Assert.AreEqual (3, rects.Length, "TEG4Test1");
722 AssertEqualRectangles (new RectangleF (40, 100, 30, 20), rects[0], "TEG4Test2");
723 AssertEqualRectangles (new RectangleF (120, 100, 20, 20), rects[1], "TEG4Test3");
724 AssertEqualRectangles (new RectangleF (40, 120, 100, 80), rects[2], "TEG4Test4");
728 { // TEST5: Intersecting from the bottom
741 rect1 = new Rectangle (40, 10, 100, 100);
742 rect2 = new Rectangle (70, 80, 50, 40);
744 r1 = new Region (rect1);
747 rects = r1.GetRegionScans (new Matrix ());
748 Assert.AreEqual (3, rects.Length, "TEG5Test1");
749 AssertEqualRectangles (new RectangleF (40, 10, 100, 70), rects[0], "TEG5Test2");
750 AssertEqualRectangles (new RectangleF (40, 80, 30, 30), rects[1], "TEG5Test3");
751 AssertEqualRectangles (new RectangleF (120, 80, 20, 30), rects[2], "TEG5Test4");
755 { // TEST6: Multiple regions
757 rect1 = new Rectangle (30, 30, 80, 80);
758 rect2 = new Rectangle (45, 45, 200, 200);
759 rect3 = new Rectangle (160, 260, 10, 10);
760 rect4 = new Rectangle (170, 260, 10, 10);
762 r1 = new Region (rect1);
767 rects = r1.GetRegionScans (new Matrix ());
768 Assert.AreEqual (2, rects.Length, "TEG6Test1");
769 AssertEqualRectangles (new RectangleF (30, 30, 80, 15), rects[0], "TEG6Test2");
770 AssertEqualRectangles (new RectangleF (30, 45, 15, 65), rects[1], "TEG6Test3");
774 { // TEST7: Intersecting from the top with a larger rect
787 rect1 = new Rectangle (50, 100, 100, 100);
788 rect2 = new Rectangle (30, 70, 150, 40);
790 r1 = new Region (rect1);
793 rects = r1.GetRegionScans (new Matrix ());
794 Assert.AreEqual (1, rects.Length, "TEG7Test1");
795 AssertEqualRectangles (new RectangleF (50, 110, 100, 90), rects[0], "TEG7Test2");
798 { // TEST8: Intersecting from the right with a larger rect
813 rect1 = new Rectangle (70, 60, 100, 70);
814 rect2 = new Rectangle (40, 10, 100, 150);
816 r1 = new Region (rect1);
819 rects = r1.GetRegionScans (new Matrix ());
820 Assert.AreEqual (1, rects.Length, "TEG8Test1");
821 AssertEqualRectangles (new RectangleF (140, 60, 30, 70), rects[0], "TEG8Test2");
825 { // TEST9: Intersecting from the left with a larger rect
842 rect1 = new Rectangle (70, 60, 100, 70);
843 rect2 = new Rectangle (100, 10, 100, 150);
845 r1 = new Region (rect1);
848 rects = r1.GetRegionScans (new Matrix ());
849 Assert.AreEqual (1, rects.Length, "TEG9Test1");
850 AssertEqualRectangles (new RectangleF (70, 60, 30, 70), rects[0], "TEG9Test2");
854 { // TEST10: Intersecting from the bottom with a larger rect
861 * --------------------
864 * |------------------|
868 rect1 = new Rectangle (20, 20, 100, 100);
869 rect2 = new Rectangle (10, 80, 140, 150);
871 r1 = new Region (rect1);
874 rects = r1.GetRegionScans (new Matrix ());
875 Assert.AreEqual (1, rects.Length, "TEG10Test1");
876 AssertEqualRectangles (new RectangleF (20, 20, 100, 60), rects[0], "TEG10Test2");
884 [Category ("NotWorking")]
886 public void TestExcludeGroup2 ()
888 Bitmap bmp = new Bitmap (600, 800);
889 Graphics dc = Graphics.FromImage (bmp);
890 Matrix matrix = new Matrix ();
891 Rectangle rect1, rect2;
895 rect1 = new Rectangle (130, 30, 60, 80);
896 rect2 = new Rectangle (170, 40, 60, 80);
897 rgn1 = new Region (rect1);
898 rgn1.Exclude (rect2);
899 rects = rgn1.GetRegionScans (matrix);
901 Assert.AreEqual (2, rects.Length);
903 Assert.AreEqual (130, rects[0].X);
904 Assert.AreEqual (30, rects[0].Y);
905 Assert.AreEqual (60, rects[0].Width);
906 Assert.AreEqual (10, rects[0].Height);
908 Assert.AreEqual (130, rects[1].X);
909 Assert.AreEqual (40, rects[1].Y);
910 Assert.AreEqual (40, rects[1].Width);
911 Assert.AreEqual (70, rects[1].Height);
916 [Category ("NotWorking")]
918 public void TestIntersect()
922 Bitmap bmp = new Bitmap (600, 800);
923 Graphics dc = Graphics.FromImage (bmp);
924 Matrix matrix = new Matrix ();
926 RectangleF rect3, rect4;
929 /* Two simple areas */
930 Rectangle rect1 = new Rectangle (260, 30, 60, 80);
931 Rectangle rect2 = new Rectangle (290, 40, 60, 80);
932 Region rgn1 = new Region (rect1);
933 Region rgn2 = new Region (rect2);
934 rgn1.Intersect (rgn2);
936 rects = rgn1.GetRegionScans (matrix);
937 Assert.AreEqual (1, rects.Length);
939 Assert.AreEqual (290, rects[0].X);
940 Assert.AreEqual (40, rects[0].Y);
941 Assert.AreEqual (30, rects[0].Width);
942 Assert.AreEqual (70, rects[0].Height);
945 rect1 = new Rectangle (20, 330, 40, 50);
946 rect2 = new Rectangle (50, 340, 40, 50);
947 rect3 = new Rectangle (70, 360, 30, 50);
948 rect4 = new Rectangle (80, 400, 30, 10);
949 rgn1 = new Region (rect1);
950 rgn2 = new Region (rect2);
951 rgn3 = new Region (rect3);
952 rgn4 = new Region (rect4);
954 rgn1.Intersect (rgn2);
955 rgn1.Intersect (rgn3);
956 rgn1.Intersect (rgn4);
957 rects = rgn1.GetRegionScans (matrix);
958 Assert.AreEqual (0, rects.Length);
963 [Category ("NotWorking")]
965 public void TestXor()
967 Bitmap bmp = new Bitmap (600, 800);
968 Graphics dc = Graphics.FromImage (bmp);
969 Matrix matrix = new Matrix ();
972 Rectangle rect1 = new Rectangle (380, 30, 60, 80);
973 Rectangle rect2 = new Rectangle (410, 40, 60, 80);
974 Region rgn1 = new Region (rect1);
975 Region rgn2 = new Region (rect2);
979 rects = rgn1.GetRegionScans (matrix);
981 Assert.AreEqual (4, rects.Length);
983 Assert.AreEqual (380, rects[0].X);
984 Assert.AreEqual (30, rects[0].Y);
985 Assert.AreEqual (60, rects[0].Width);
986 Assert.AreEqual (10, rects[0].Height);
988 Assert.AreEqual (380, rects[1].X);
989 Assert.AreEqual (40, rects[1].Y);
990 Assert.AreEqual (30, rects[1].Width);
991 Assert.AreEqual (70, rects[1].Height);
993 Assert.AreEqual (440, rects[2].X);
994 Assert.AreEqual (40, rects[2].Y);
995 Assert.AreEqual (30, rects[2].Width);
996 Assert.AreEqual (70, rects[2].Height);
998 Assert.AreEqual (410, rects[3].X);
999 Assert.AreEqual (110, rects[3].Y);
1000 Assert.AreEqual (60, rects[3].Width);
1001 Assert.AreEqual (10, rects[3].Height);
1006 public void TestIsVisible()
1008 Bitmap bmp = new Bitmap (600, 800);
1009 Graphics dc = Graphics.FromImage (bmp);
1010 Rectangle rect1, rect2;
1012 Matrix matrix = new Matrix ();
1014 rect1 = new Rectangle (500, 30, 60, 80);
1015 rect2 = new Rectangle (520, 40, 60, 80);
1017 rgn1 = new Region (new RectangleF (0, 0, 10,10));
1018 Assert.AreEqual (false, rgn1.IsVisible (0,0,0,1));
1020 rgn1 = new Region (rect1);
1021 Assert.AreEqual (false, rgn1.IsVisible (500,29));
1022 Assert.AreEqual (true, rgn1.IsVisible (500,30));
1023 Assert.AreEqual (true, rgn1.IsVisible (rect1));
1024 Assert.AreEqual (true, rgn1.IsVisible (rect2));
1025 Assert.AreEqual (false, rgn1.IsVisible (new Rectangle (50,50,2,5)));
1027 Rectangle r = new Rectangle (1,1, 2,1);
1028 rgn2 = new Region (r);
1029 Assert.AreEqual (true, rgn2.IsVisible (r));
1030 Assert.AreEqual (true, rgn2.IsVisible (new Rectangle (1,1, 2,2)));
1031 Assert.AreEqual (true, rgn2.IsVisible (new Rectangle (1,1, 10,10)));
1032 Assert.AreEqual (true, rgn2.IsVisible (new Rectangle (1,1, 1,1)));
1033 Assert.AreEqual (false, rgn2.IsVisible (new Rectangle (2,2, 1,1)));
1034 Assert.AreEqual (false, rgn2.IsVisible (new Rectangle (0,0, 1,1)));
1035 Assert.AreEqual (false, rgn2.IsVisible (new Rectangle (3,3, 1,1)));
1037 Assert.AreEqual (false, rgn2.IsVisible (0,0));
1038 Assert.AreEqual (false, rgn2.IsVisible (1,0));
1039 Assert.AreEqual (false, rgn2.IsVisible (2,0));
1040 Assert.AreEqual (false, rgn2.IsVisible (3,0));
1041 Assert.AreEqual (false, rgn2.IsVisible (0,1));
1042 Assert.AreEqual (true, rgn2.IsVisible (1,1));
1043 Assert.AreEqual (true, rgn2.IsVisible (2,1));
1044 Assert.AreEqual (false, rgn2.IsVisible (3,1));
1045 Assert.AreEqual (false, rgn2.IsVisible (0,2));
1046 Assert.AreEqual (false, rgn2.IsVisible (1,2));
1047 Assert.AreEqual (false, rgn2.IsVisible (2,2));
1048 Assert.AreEqual (false, rgn2.IsVisible (3,2));
1055 [Category ("NotWorking")]
1057 public void TestTranslate()
1059 Region rgn1 = new Region (new RectangleF (10, 10, 120,120));
1060 rgn1.Translate (30,20);
1061 Matrix matrix = new Matrix ();
1063 RectangleF [] rects = rgn1.GetRegionScans (matrix);
1065 Assert.AreEqual (1, rects.Length);
1067 Assert.AreEqual (40, rects[0].X);
1068 Assert.AreEqual (30, rects[0].Y);
1069 Assert.AreEqual (120, rects[0].Width);
1070 Assert.AreEqual (120, rects[0].Height);
1074 [ExpectedException (typeof (ArgumentNullException))]
1076 [Category ("NotWorking")]
1078 public void Constructor_GraphicsPath_Null ()
1080 GraphicsPath gp = null;
1081 Region r = new Region (gp);
1085 [ExpectedException (typeof (ArgumentNullException))]
1087 [Category ("NotWorking")]
1089 public void Constructor_RegionData_Null ()
1091 RegionData rd = null;
1092 Region r = new Region (rd);
1096 [ExpectedException (typeof (ArgumentNullException))]
1097 public void Union_GraphicsPath_Null ()
1099 GraphicsPath gp = null;
1100 new Region ().Union (gp);
1104 [ExpectedException (typeof (ArgumentNullException))]
1105 public void Union_Region_Null ()
1108 new Region ().Union (r);
1112 public void Union_Region_Infinite ()
1114 // default ctor creates an infinite region
1115 Region r = new Region ();
1116 CheckEmpty ("default .ctor", r);
1117 // union-ing to infinity doesn't change the results
1118 r.Union (new Rectangle (10, 10, 100, 100));
1119 CheckEmpty ("U infinity", r);
1123 [ExpectedException (typeof (ArgumentNullException))]
1124 public void Intersect_GraphicsPath_Null ()
1126 GraphicsPath gp = null;
1127 new Region ().Intersect (gp);
1131 [ExpectedException (typeof (ArgumentNullException))]
1132 public void Intersect_Region_Null ()
1135 new Region ().Intersect (r);
1139 [ExpectedException (typeof (ArgumentNullException))]
1140 public void Complement_GraphicsPath_Null ()
1142 GraphicsPath gp = null;
1143 new Region ().Complement (gp);
1147 [ExpectedException (typeof (ArgumentNullException))]
1148 public void Complement_Region_Null ()
1151 new Region ().Complement (r);
1155 [ExpectedException (typeof (ArgumentNullException))]
1156 public void Exclude_GraphicsPath_Null ()
1158 GraphicsPath gp = null;
1159 new Region ().Exclude (gp);
1163 [ExpectedException (typeof (ArgumentNullException))]
1164 public void Exclude_Region_Null ()
1167 new Region ().Exclude (r);
1171 [ExpectedException (typeof (ArgumentNullException))]
1172 public void Xor_GraphicsPath_Null ()
1174 GraphicsPath gp = null;
1175 new Region ().Xor (gp);
1179 [ExpectedException (typeof (ArgumentNullException))]
1180 public void Xor_Region_Null ()
1183 new Region ().Xor (r);
1187 [ExpectedException (typeof (ArgumentNullException))]
1188 public void GetBounds_Null ()
1190 new Region ().GetBounds (null);
1195 [Category ("NotWorking")]
1197 public void IsVisible_IntIntNull ()
1199 Assert.IsTrue (new Region ().IsVisible (0, 0, null));
1204 [Category ("NotWorking")]
1206 public void IsVisible_IntIntIntIntNull ()
1208 Assert.IsFalse (new Region ().IsVisible (0, 0, 0, 0, null));
1213 [Category ("NotWorking")]
1215 public void IsVisible_PointNull ()
1217 Point p = new Point ();
1218 Assert.IsTrue (new Region ().IsVisible (p, null));
1223 [Category ("NotWorking")]
1225 public void IsVisible_PointFNull ()
1227 PointF p = new PointF ();
1228 Assert.IsTrue (new Region ().IsVisible (p, null));
1233 [Category ("NotWorking")]
1235 public void IsVisible_RectangleNull ()
1237 Rectangle r = new Rectangle ();
1238 Assert.IsFalse (new Region ().IsVisible (r, null));
1243 [Category ("NotWorking")]
1245 public void IsVisible_RectangleFNull ()
1247 RectangleF r = new RectangleF ();
1248 Assert.IsFalse (new Region ().IsVisible (r, null));
1253 [Category ("NotWorking")]
1255 public void IsVisible_SingleSingleNull ()
1257 Assert.IsTrue (new Region ().IsVisible (0f, 0f, null));
1262 [Category ("NotWorking")]
1264 public void IsVisible_SingleSingleSingleSingleNull ()
1266 Assert.IsFalse (new Region ().IsVisible (0f, 0f, 0f, 0f, null));
1270 [ExpectedException (typeof (ArgumentNullException))]
1271 public void IsEmpty_Null ()
1273 new Region ().IsEmpty (null);
1277 [ExpectedException (typeof (ArgumentNullException))]
1278 public void IsInfinite_Null ()
1280 new Region ().IsInfinite (null);
1285 [Category ("NotWorking")]
1287 [ExpectedException (typeof (ArgumentNullException))]
1288 public void Equals_NullGraphics ()
1290 new Region ().Equals (null, Graphics.FromImage (new Bitmap (10, 10)));
1294 [ExpectedException (typeof (ArgumentNullException))]
1295 public void Equals_RegionNull ()
1297 new Region ().Equals (new Region (), null);
1301 [ExpectedException (typeof (ArgumentNullException))]
1302 [Category ("NotWorking")] // caused regression in SWF
1303 public void GetHrgn_Null ()
1305 new Region ().GetHrgn (null);
1310 [Category ("NotWorking")]
1312 [ExpectedException (typeof (ArgumentNullException))]
1313 public void GetRegionScans_Null ()
1315 new Region ().GetRegionScans (null);
1319 [ExpectedException (typeof (ArgumentNullException))]
1320 public void Transform_Null ()
1322 new Region ().Transform (null);
1325 // an "empty ctor" Region is infinite
1326 private void CheckEmpty (string prefix, Region region)
1328 Assert.IsFalse (region.IsEmpty (graphic), prefix + "IsEmpty");
1329 Assert.IsTrue (region.IsInfinite (graphic), prefix + "graphic");
1331 RectangleF rect = region.GetBounds (graphic);
1332 Assert.AreEqual (-4194304f, rect.X, prefix + "GetBounds.X");
1333 Assert.AreEqual (-4194304f, rect.Y, prefix + "GetBounds.Y");
1334 Assert.AreEqual (8388608f, rect.Width, prefix + "GetBounds.Width");
1335 Assert.AreEqual (8388608f, rect.Height, prefix + "GetBounds.Height");
1340 [Category ("NotWorking")]
1342 public void Region_Empty ()
1344 Region region = new Region ();
1345 CheckEmpty ("Empty.", region);
1347 Region clone = region.Clone ();
1348 CheckEmpty ("Clone.", region);
1350 RegionData data = region.GetRegionData ();
1351 Region r2 = new Region (data);
1352 CheckEmpty ("RegionData.", region);
1356 [Category ("NotWorking")]
1357 public void Region_Infinite_MultipleRectangles ()
1359 Region region = new Region ();
1360 Assert.IsTrue (region.IsInfinite (graphic), "Empty.IsInfinite");
1362 GraphicsPath gp = new GraphicsPath ();
1363 gp.AddRectangle (new Rectangle (-4194304, -4194304, 8388608, 8388608));
1364 region = new Region (gp);
1365 Assert.IsTrue (region.IsInfinite (graphic), "OneRectangle.IsInfinite");
1367 gp.AddRectangle (new Rectangle (1, 1, 2, 2));
1368 region = new Region (gp);
1369 Assert.IsFalse (region.IsInfinite (graphic), "TwoOverlappingRectangle.IsInfinite");
1371 gp = new GraphicsPath ();
1372 gp.AddRectangle (new Rectangle (-4194304, -4194304, 4194304, 8388608));
1373 gp.AddRectangle (new Rectangle (0, -4194304, 4194304, 8388608));
1374 Assert.IsFalse (region.IsInfinite (graphic), "TwoSideBySideRectangle.IsInfinite");
1379 [Category ("NotWorking")]
1381 public void Rectangle_GetRegionScans ()
1383 Matrix matrix = new Matrix ();
1384 GraphicsPath gp = new GraphicsPath ();
1385 gp.AddRectangle (new Rectangle (10, 10, 10, 10));
1386 Region region = new Region (gp);
1387 Assert.AreEqual (1, region.GetRegionScans (matrix).Length, "1");
1389 gp.AddRectangle (new Rectangle (20, 20, 20, 20));
1390 region = new Region (gp);
1391 Assert.AreEqual (2, region.GetRegionScans (matrix).Length, "2");
1395 public void ExcludeFromInfinity ()
1397 Region r = new Region ();
1398 Assert.IsTrue (r.IsInfinite (graphic), "before");
1399 r.Exclude (new Rectangle (5, 5, 10, 10));
1400 Assert.IsFalse (r.IsInfinite (graphic), "after");
1401 RectangleF bounds = r.GetBounds (graphic);
1402 Assert.AreEqual (-4194304, bounds.X, "X");
1403 Assert.AreEqual (-4194304, bounds.Y, "Y");
1404 Assert.AreEqual (8388608, bounds.Width, "Width");
1405 Assert.AreEqual (8388608, bounds.Height, "Height");
1411 [Category ("NotWorking")]
1413 // the test cases in this fixture aren't restricted wrt running unmanaged code
1414 public class RegionTestUnmanaged {
1416 private Bitmap bitmap;
1417 private Graphics graphic;
1420 public void FixtureSetUp ()
1422 bitmap = new Bitmap (10, 10);
1423 graphic = Graphics.FromImage (bitmap);
1427 public void GetHrgn_Infinite_MakeEmpty ()
1429 Region r = new Region ();
1430 Assert.IsFalse (r.IsEmpty (graphic), "!Empty");
1431 Assert.IsTrue (r.IsInfinite (graphic), "Infinite");
1432 Assert.AreEqual (IntPtr.Zero, r.GetHrgn (graphic), "Handle==0");
1435 Assert.IsTrue (r.IsEmpty (graphic), "Empty");
1436 Assert.IsFalse (r.IsInfinite (graphic), "!Infinite");
1437 Assert.IsFalse (r.GetHrgn (graphic) == IntPtr.Zero, "Handle!=0");
1441 public void GetHrgn_Empty_MakeInfinite ()
1443 Region r = new Region (new GraphicsPath ());
1444 Assert.IsTrue (r.IsEmpty (graphic), "Empty");
1445 Assert.IsFalse (r.IsInfinite (graphic), "!Infinite");
1446 Assert.IsFalse (r.GetHrgn (graphic) == IntPtr.Zero, "Handle!=0");
1449 Assert.IsFalse (r.IsEmpty (graphic), "!Empty");
1450 Assert.IsTrue (r.IsInfinite (graphic), "Infinite");
1451 Assert.AreEqual (IntPtr.Zero, r.GetHrgn (graphic), "Handle==0");
1455 public void GetHrgn_FromHrgn ()
1457 Region r1 = new Region (new GraphicsPath ());
1458 IntPtr h1 = r1.GetHrgn (graphic);
1459 Assert.IsFalse (h1 == IntPtr.Zero, "Handle_1!=0");
1461 Region r2 = Region.FromHrgn (h1);
1462 IntPtr h2 = r2.GetHrgn (graphic);
1463 Assert.IsFalse (h2 == IntPtr.Zero, "Handle_2!=0");
1464 Assert.IsFalse (h1 == h2, "Handle_1!=Handle_2");
1468 [ExpectedException (typeof (ArgumentException))]
1469 public void FromHrgn_Zero ()
1471 Region.FromHrgn (IntPtr.Zero);