WindowsBase: fix Rect.Union() and add Rect.Union test cases
authorArmin Sander <armin@replicator.org>
Fri, 8 Jun 2012 13:23:27 +0000 (15:23 +0200)
committerArmin Sander <armin@replicator.org>
Fri, 8 Jun 2012 13:23:27 +0000 (15:23 +0200)
mcs/class/WindowsBase/System.Windows/Rect.cs
mcs/class/WindowsBase/Test/System.Windows/RectTest.cs

index 4cf00e73576b78c9d2c2507d65be3dda6efd4f73..2c5f3c0e6192b5dd5d9a6464fec52bb8206b4687 100644 (file)
@@ -278,10 +278,15 @@ namespace System.Windows {
                
                public void Union(Rect rect)
                {
-                       x = Math.Min (x, rect.x);
-                       y = Math.Min (y, rect.y);
-                       width = Math.Max (Right, rect.Right) - x;
-                       height = Math.Max (Bottom, rect.Bottom) - y;
+                       var left = Math.Min (Left, rect.Left);
+                       var top = Math.Min (Top, rect.Top);
+                       var right = Math.Max (Right, rect.Right);
+                       var bottom = Math.Max (Bottom, rect.Bottom);
+                       
+                       x = left;
+                       y = top;
+                       width = right - left;
+                       height = bottom - top;
                }
 
                public void Union(Point point)
index e5a4635f73e58e0c5a44677c411c492e952ace1c..e83008d4452c91ba8e6e4ffe00dc566eaba6f6e5 100644 (file)
@@ -594,10 +594,12 @@ namespace MonoTests.System.Windows {
                        // crosses bottom side
                        r = new Rect (0, 0, 50, 50);
                        r.Intersect (new Rect (5, 5, 10, 50));
+                       Assert.AreEqual(new Rect(5, 5, 10, 45), r);
 
                        // crosses left side
                        r = new Rect (0, 0, 50, 50);
                        r.Intersect (new Rect (-5, 5, 10, 10));
+                       Assert.AreEqual(new Rect(0, 5, 5, 10), r);
 
                        // completely outside (top)
                        r = new Rect (0, 0, 50, 50);
@@ -620,6 +622,56 @@ namespace MonoTests.System.Windows {
                        Assert.AreEqual (Rect.Empty, r);
                }
 
+               [Test]
+               public void Union()
+               {
+                       Rect r;
+                       
+                       // fully contained
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(10, 10, 10, 10));
+                       Assert.AreEqual(new Rect(0, 0, 50, 50), r);
+
+                       // crosses top side
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(5, -5, 10, 10));
+                       Assert.AreEqual(new Rect(0, -5, 50, 55), r);
+
+                       // crosses right side
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(5, 5, 50, 10));
+                       Assert.AreEqual(new Rect(0, 0, 55, 50), r);
+
+                       // crosses bottom side
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(5, 5, 10, 50));
+                       Assert.AreEqual(new Rect(0, 0, 50, 55), r);
+
+                       // crosses left side
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(-5, 5, 10, 10));
+                       Assert.AreEqual(new Rect(-5, 0, 55, 50), r);
+
+                       // completely outside (top)
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(5, -5, 1, 1));
+                       Assert.AreEqual(new Rect(0, -5, 50, 55), r);
+
+                       // completely outside (right)
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(75, 5, 1, 1));
+                       Assert.AreEqual(new Rect(0, 0, 76, 50), r);
+
+                       // completely outside (bottom)
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(5, 75, 1, 1));
+                       Assert.AreEqual(new Rect(0,0, 50, 76), r);
+
+                       // completely outside (left)
+                       r = new Rect(0, 0, 50, 50);
+                       r.Union(new Rect(-25, 5, 1, 1));
+                       Assert.AreEqual(new Rect(-25, 0, 75, 50), r);
+               }
 
                [Test]
                public void Equals_Operator ()