2006-03-28 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Tue, 28 Mar 2006 20:27:16 +0000 (20:27 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Tue, 28 Mar 2006 20:27:16 +0000 (20:27 -0000)
* TestGraphics.cs: Add new test cases for clipping.

svn path=/trunk/mcs/; revision=58673

mcs/class/System.Drawing/Test/System.Drawing/ChangeLog
mcs/class/System.Drawing/Test/System.Drawing/TestGraphics.cs

index 3a7e6db9ba7f9fc524b0fe1f6f76ec265f495a03..33367075286b0e4d18c45b5e87a1195badac2a31 100644 (file)
@@ -1,3 +1,7 @@
+2006-03-28  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * TestGraphics.cs: Add new test cases for clipping.
+
 2006-03-25  Sebastien Pouliot  <sebastien@ximian.com>
 
        * RegionDataTest.cs: Add test cases for GetRegionData when a region is
index b93688af1b4e03eebf661438e813e0e1ed19746d..9597782fe2911f5362a55c6a0046bcbe0f8ac895 100644 (file)
@@ -1,11 +1,11 @@
 //
 // Graphics class testing unit
 //
-// Author:
+// Authors:
 //   Jordi Mas, jordi@ximian.com
+//   Sebastien Pouliot  <sebastien@ximian.com>
 //
-//
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2005-2006 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -27,8 +27,6 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-
-
 using NUnit.Framework;
 using System;
 using System.Drawing;
@@ -44,15 +42,6 @@ namespace MonoTests.System.Drawing
        {
                private RectangleF[] rects;
 
-               [TearDown]
-               public void TearDown () {}
-
-               [SetUp]
-               public void SetUp ()
-               {
-
-               }
-
                [Test]
                public void DefaultProperties ()
                {
@@ -117,6 +106,17 @@ namespace MonoTests.System.Drawing
                        AssertEquals ("Clip3", 40, rects[0].Y);
                        AssertEquals ("Clip4", 210, rects[0].Width);
                        AssertEquals ("Clip5", 220, rects[0].Height);
+               }\r
+\r
+               [Test]\r
+               public void Clip_NotAReference ()\r
+               {\r
+                       Bitmap bmp = new Bitmap (200, 200);\r
+                       Graphics g = Graphics.FromImage (bmp);\r
+                       Assert ("IsInfinite", g.Clip.IsInfinite (g));\r
+                       g.Clip.IsEmpty (g);\r
+                       Assert ("!IsEmpty", !g.Clip.IsEmpty (g));\r
+                       Assert ("IsInfinite-2", g.Clip.IsInfinite (g));\r
                }
 
                [Test]
@@ -304,7 +304,242 @@ namespace MonoTests.System.Drawing
                public void FromImage ()
                {
                        Graphics g = Graphics.FromImage (null);
-               }               
+               }\r
+\r
+               private Graphics Get (int w, int h)\r
+               {\r
+                       Bitmap bitmap = new Bitmap (w, h);\r
+                       Graphics g = Graphics.FromImage (bitmap);\r
+                       g.Clip = new Region (new Rectangle (0, 0, w, h));\r
+                       return g;\r
+               }\r
+\r
+               private void Compare (string msg, RectangleF b1, RectangleF b2)\r
+               {\r
+                       AssertEquals (msg + ".compare.X", b1.X, b2.X);\r
+                       AssertEquals (msg + ".compare.Y", b1.Y, b2.Y);\r
+                       AssertEquals (msg + ".compare.Width", b1.Width, b2.Width);\r
+                       AssertEquals (msg + ".compare.Height", b1.Height, b2.Height);\r
+               }\r
+\r
+               [Test]\r
+               public void Clip_GetBounds ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       RectangleF bounds = g.Clip.GetBounds (g);\r
+                       AssertEquals ("X", 0, bounds.X);\r
+                       AssertEquals ("Y", 0, bounds.Y);\r
+                       AssertEquals ("Width", 16, bounds.Width);\r
+                       AssertEquals ("Height", 16, bounds.Height);\r
+                       Assert ("Identity", g.Transform.IsIdentity);\r
+                       g.Dispose ();\r
+               }\r
+\r
+               [Test]\r
+               public void Clip_TranslateTransform ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.TranslateTransform (12.22f, 10.10f);\r
+                       RectangleF bounds = g.Clip.GetBounds (g);\r
+                       Compare ("translate", bounds, g.ClipBounds);\r
+                       AssertEquals ("translate.X", -12.22, bounds.X);\r
+                       AssertEquals ("translate.Y", -10.10, bounds.Y);\r
+                       AssertEquals ("translate.Width", 16, bounds.Width);\r
+                       AssertEquals ("translate.Height", 16, bounds.Height);\r
+                       float[] elements = g.Transform.Elements;\r
+                       AssertEquals ("translate.0", 1, elements[0]);\r
+                       AssertEquals ("translate.1", 0, elements[1]);\r
+                       AssertEquals ("translate.2", 0, elements[2]);\r
+                       AssertEquals ("translate.3", 1, elements[3]);\r
+                       AssertEquals ("translate.4", 12.22, elements[4]);\r
+                       AssertEquals ("translate.5", 10.10, elements[5]);\r
+\r
+                       g.ResetTransform ();\r
+                       bounds = g.Clip.GetBounds (g);\r
+                       Compare ("reset", bounds, g.ClipBounds);\r
+                       AssertEquals ("reset.X", 0, bounds.X);\r
+                       AssertEquals ("reset.Y", 0, bounds.Y);\r
+                       AssertEquals ("reset.Width", 16, bounds.Width);\r
+                       AssertEquals ("reset.Height", 16, bounds.Height);\r
+                       Assert ("Identity", g.Transform.IsIdentity);\r
+                       g.Dispose ();\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (ArgumentException))]\r
+               public void Transform_NonInvertibleMatrix ()\r
+               {\r
+                       Matrix matrix = new Matrix (123, 24, 82, 16, 47, 30);\r
+                       Assert ("IsInvertible", !matrix.IsInvertible);\r
+                       Graphics g = Get (16, 16);\r
+                       g.Transform = matrix;\r
+               }\r
+\r
+               private void CheckBounds (string msg, RectangleF bounds, float x, float y, float w, float h)\r
+               {\r
+                       AssertEquals (msg + ".X", x, bounds.X, 0.1);\r
+                       AssertEquals (msg + ".Y", y, bounds.Y, 0.1);\r
+                       AssertEquals (msg + ".Width", w, bounds.Width, 0.1);\r
+                       AssertEquals (msg + ".Height", h, bounds.Height, 0.1);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       CheckBounds ("graphics.ClipBounds", g.ClipBounds, 0, 0, 16, 16);\r
+                       CheckBounds ("graphics.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 16, 16);\r
+\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       CheckBounds ("clip.ClipBounds", g.ClipBounds, 0, 0, 8, 8);\r
+                       CheckBounds ("clip.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Rotate ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       g.RotateTransform (90);\r
+                       CheckBounds ("rotate.ClipBounds", g.ClipBounds, 0, -8, 8, 8);\r
+                       CheckBounds ("rotate.Clip.GetBounds", g.Clip.GetBounds (g), 0, -8, 8, 8);\r
+\r
+                       g.Transform = new Matrix ();\r
+                       CheckBounds ("identity.ClipBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+                       CheckBounds ("identity.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Scale ()\r
+               {\r
+                       RectangleF clip = new Rectangle (0, 0, 8, 8);\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (clip);\r
+                       g.ScaleTransform (0.25f, 0.5f);\r
+                       CheckBounds ("scale.ClipBounds", g.ClipBounds, 0, 0, 32, 16);\r
+                       CheckBounds ("scale.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 32, 16);\r
+\r
+                       g.SetClip (clip);\r
+                       CheckBounds ("setclip.ClipBounds", g.ClipBounds, 0, 0, 8, 8);\r
+                       CheckBounds ("setclip.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Translate ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       Region clone = g.Clip.Clone ();\r
+                       g.TranslateTransform (8, 8);\r
+                       CheckBounds ("translate.ClipBounds", g.ClipBounds, -8, -8, 8, 8);\r
+                       CheckBounds ("translate.Clip.GetBounds", g.Clip.GetBounds (g), -8, -8, 8, 8);\r
+\r
+                       g.SetClip (clone, CombineMode.Replace);\r
+                       CheckBounds ("setclip.ClipBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+                       CheckBounds ("setclip.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Transform_Translation ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       g.Transform = new Matrix (1, 0, 0, 1, 8, 8);\r
+                       CheckBounds ("transform.ClipBounds", g.ClipBounds, -8, -8, 8, 8);\r
+                       CheckBounds ("transform.Clip.GetBounds", g.Clip.GetBounds (g), -8, -8, 8, 8);\r
+\r
+                       g.ResetTransform ();\r
+                       CheckBounds ("reset.ClipBounds", g.ClipBounds, 0, 0, 8, 8);\r
+                       CheckBounds ("reset.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Transform_Scale ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       g.Transform = new Matrix (0.5f, 0, 0, 0.25f, 0, 0);\r
+                       CheckBounds ("scale.ClipBounds", g.ClipBounds, 0, 0, 16, 32);\r
+                       CheckBounds ("scale.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 16, 32);\r
+\r
+                       g.ResetClip ();\r
+                       // see next test for ClipBounds\r
+                       CheckBounds ("resetclip.Clip.GetBounds", g.Clip.GetBounds (g), -4194304, -4194304, 8388608, 8388608);\r
+                       Assert ("IsInfinite", g.Clip.IsInfinite (g));\r
+               }\r
+\r
+               [Test]\r
+               [Category ("NotWorking")]\r
+               public void ClipBounds_Transform_Scale_Strange ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       g.Transform = new Matrix (0.5f, 0, 0, 0.25f, 0, 0);\r
+                       CheckBounds ("scale.ClipBounds", g.ClipBounds, 0, 0, 16, 32);\r
+                       CheckBounds ("scale.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 16, 32);\r
+\r
+                       g.ResetClip ();\r
+                       // note: strange case where g.ClipBounds and g.Clip.GetBounds are different\r
+                       CheckBounds ("resetclip.ClipBounds", g.ClipBounds, -8388608, -16777216, 16777216, 33554432);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Multiply ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       g.Transform = new Matrix (1, 0, 0, 1, 8, 8);\r
+                       g.MultiplyTransform (g.Transform);\r
+                       CheckBounds ("multiply.ClipBounds", g.ClipBounds, -16, -16, 8, 8);\r
+                       CheckBounds ("multiply.Clip.GetBounds", g.Clip.GetBounds (g), -16, -16, 8, 8);\r
+\r
+                       g.ResetTransform ();\r
+                       CheckBounds ("reset.ClipBounds", g.ClipBounds, 0, 0, 8, 8);\r
+                       CheckBounds ("reset.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+               }\r
+\r
+               [Test]\r
+               public void ClipBounds_Cumulative_Effects ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       CheckBounds ("graphics.ClipBounds", g.ClipBounds, 0, 0, 16, 16);\r
+                       CheckBounds ("graphics.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 16, 16);\r
+\r
+                       g.Clip = new Region (new Rectangle (0, 0, 8, 8));\r
+                       CheckBounds ("clip.ClipBounds", g.ClipBounds, 0, 0, 8, 8);\r
+                       CheckBounds ("clip.Clip.GetBounds", g.Clip.GetBounds (g), 0, 0, 8, 8);\r
+\r
+                       g.RotateTransform (90);\r
+                       CheckBounds ("rotate.ClipBounds", g.ClipBounds, 0, -8, 8, 8);\r
+                       CheckBounds ("rotate.Clip.GetBounds", g.Clip.GetBounds (g), 0, -8, 8, 8);\r
+\r
+                       g.ScaleTransform (0.25f, 0.5f);\r
+                       CheckBounds ("scale.ClipBounds", g.ClipBounds, 0, -16, 32, 16);\r
+                       CheckBounds ("scale.Clip.GetBounds", g.Clip.GetBounds (g), 0, -16, 32, 16);\r
+\r
+                       g.TranslateTransform (8, 8);\r
+                       CheckBounds ("translate.ClipBounds", g.ClipBounds, -8, -24, 32, 16);\r
+                       CheckBounds ("translate.Clip.GetBounds", g.Clip.GetBounds (g), -8, -24, 32, 16);\r
+                       \r
+                       g.MultiplyTransform (g.Transform);\r
+                       CheckBounds ("multiply.ClipBounds", g.ClipBounds, -104, -56, 64, 64);\r
+                       CheckBounds ("multiply.Clip.GetBounds", g.Clip.GetBounds (g), -104, -56, 64, 64);\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (ArgumentException))]\r
+               public void ScaleTransform_X0 ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.ScaleTransform (0, 1);\r
+               }\r
+\r
+               [Test]\r
+               [ExpectedException (typeof (ArgumentException))]\r
+               public void ScaleTransform_Y0 ()\r
+               {\r
+                       Graphics g = Get (16, 16);\r
+                       g.ScaleTransform (1, 0);\r
+               }\r
        }
 }
-