Merge pull request #273 from joncham/bug-getpid
[mono.git] / mcs / class / System.Drawing / Test / System.Drawing / TestImage.cs
index 302f22d0f6e75642e21bd977dbb676b431f7f62f..1b430ae52e212d44aad8662dfd2c850caff888e6 100644 (file)
@@ -6,7 +6,7 @@
 //     Sebastien Pouliot  <sebastien@ximian.com>
 //
 // (C) 2005 Ximian, Inc.  http://www.ximian.com
-// Copyright (C) 2005, 2006 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2005-2007 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
@@ -32,7 +32,9 @@ using System;
 using System.Drawing;
 using System.Drawing.Imaging;
 using System.IO;
+using System.Reflection;
 using System.Security.Permissions;
+using System.Xml.Serialization;
 using NUnit.Framework;
 
 namespace MonoTests.System.Drawing{
@@ -164,5 +166,229 @@ namespace MonoTests.System.Drawing{
                                tn.Save (fname, ImageFormat.Png);
                        }
                }
+
+               [Test]
+#if !NET_2_0
+               [Category ("NotDotNet")] // MS 1.x throws an ArgumentNullException in this case
+#endif
+               public void Stream_Unlocked ()
+               {
+                       try {
+                               Image img = null;
+                               using (MemoryStream ms = new MemoryStream ()) {
+                                       using (Bitmap bmp = new Bitmap (10, 10)) {
+                                               bmp.Save (ms, ImageFormat.Png);
+                                       }
+                                       ms.Position = 0;
+                                       img = Image.FromStream (ms);
+                               }
+                               // stream isn't available anymore
+                               ((Bitmap) img).MakeTransparent (Color.Transparent);
+                       }
+                       catch (OutOfMemoryException) {
+                               int p = (int) Environment.OSVersion.Platform;
+                               // libgdiplus (UNIX) doesn't lazy load the image so the
+                               // stream may be freed (and this exception will never occur)
+                               if ((p == 4) || (p == 128) || (p == 6))
+                                       throw;
+                       }
+               }
+
+               [Test]
+#if !NET_2_0
+               [Category ("NotDotNet")] // MS 1.x throws an ArgumentNullException in this case
+#endif
+               public void Stream_Locked ()
+               {
+                       Image img = null;
+                       using (MemoryStream ms = new MemoryStream ()) {
+                               using (Bitmap bmp = new Bitmap (10, 10)) {
+                                       bmp.Save (ms, ImageFormat.Png);
+                               }
+                               ms.Position = 0;
+                               img = Image.FromStream (ms);
+                               // stream is available
+                               ((Bitmap) img).MakeTransparent (Color.Transparent);
+                       }
+               }
+
+               [Test]
+#if NET_2_0
+               [Category ("NotWorking")]       // http://bugzilla.ximian.com/show_bug.cgi?id=80558
+#else
+               [ExpectedException (typeof (InvalidOperationException))]
+#endif
+               public void XmlSerialize ()
+               {
+                       new XmlSerializer (typeof (Image));
+               }
+
+               private void Wmf (Image img)
+               {
+                       Assert.IsFalse (img is Bitmap, "Bitmap");
+                       Assert.IsTrue (img is Metafile, "Metafile");
+                       // as Image
+                       Assert.AreEqual (327683, img.Flags, "Flags");
+                       Assert.IsTrue (img.RawFormat.Equals (ImageFormat.Wmf), "Wmf");
+#if NET_2_0
+                       Assert.IsNull (img.Tag, "Tag");
+#endif
+               }
+
+               [Test]
+               public void FromFile_Metafile_Wmf ()
+               {
+                       string filename = TestBitmap.getInFile ("bitmaps/telescope_01.wmf");
+                       using (Image img = Image.FromFile (filename)) {
+                               Wmf (img);
+                       }
+               }
+
+               [Test]
+               public void FromStream_Metafile_Wmf ()
+               {
+                       string filename = TestBitmap.getInFile ("bitmaps/telescope_01.wmf");
+                       using (FileStream fs = File.OpenRead (filename)) {
+                               using (Image img = Image.FromStream (fs)) {
+                                       Wmf (img);
+                               }
+                       }
+               }
+
+               [Test]
+               [Category ("NotWorking")] // https://bugzilla.novell.com/show_bug.cgi?id=338779
+               [ExpectedException (typeof (ArgumentException))]
+               public void FromStream_Metafile_Wmf_NotOrigin ()
+               {
+                       string filename = TestBitmap.getInFile ("bitmaps/telescope_01.wmf");
+                       using (FileStream fs = File.OpenRead (filename)) {
+                               fs.Position = fs.Length / 2;
+                               Image.FromStream (fs);
+                       }
+               }
+
+               private void Emf (Image img)
+               {
+                       Assert.IsFalse (img is Bitmap, "Bitmap");
+                       Assert.IsTrue (img is Metafile, "Metafile");
+                       // as Image
+                       Assert.AreEqual (327683, img.Flags, "Flags");
+                       Assert.IsTrue (img.RawFormat.Equals (ImageFormat.Emf), "Emf");
+#if NET_2_0
+                       Assert.IsNull (img.Tag, "Tag");
+#endif
+               }
+
+               [Test]
+               public void FromFile_Metafile_Emf ()
+               {
+                       string filename = TestBitmap.getInFile ("bitmaps/milkmateya01.emf");
+                       using (Image img = Image.FromFile (filename)) {
+                               Emf (img);
+                       }
+               }
+
+               [Test]
+               public void FromStream_Metafile_Emf ()
+               {
+                       string filename = TestBitmap.getInFile ("bitmaps/milkmateya01.emf");
+                       using (FileStream fs = File.OpenRead (filename)) {
+                               using (Image img = Image.FromStream (fs)) {
+                                       Emf (img);
+                               }
+                       }
+               }
+
+               [Test]
+               [Category ("NotWorking")] // https://bugzilla.novell.com/show_bug.cgi?id=338779
+               [ExpectedException (typeof (ArgumentException))]
+               public void FromStream_Metafile_Emf_NotOrigin ()
+               {
+                       string filename = TestBitmap.getInFile ("bitmaps/milkmateya01.emf");
+                       using (FileStream fs = File.OpenRead (filename)) {
+                               fs.Position = fs.Length / 2;
+                               Image.FromStream (fs);
+                       }
+               }
+
+               [Test]
+               [ExpectedException (typeof (OutOfMemoryException))]
+               public void FromFile_Invalid ()
+               {
+                       string filename = Assembly.GetExecutingAssembly ().Location;
+                       Image.FromFile (filename);
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void FromStream_Invalid ()
+               {
+                       string filename = Assembly.GetExecutingAssembly ().Location;
+                       using (FileStream fs = File.OpenRead (filename)) {
+                               Image.FromStream (fs);
+                       }
+               }
+
+               private Bitmap GetBitmap ()
+               {
+                       Bitmap bmp = new Bitmap (20, 10, PixelFormat.Format24bppRgb);
+                       using (Graphics g = Graphics.FromImage (bmp))
+                       {
+                               Pen pen = new Pen (Color.Black, 3);
+                               g.DrawRectangle (pen, 0, 0, 5, 10);
+                       }
+                       return bmp;
+               }
+
+               [Test]
+               public void StreamSaveLoad ()
+               {
+                       using (MemoryStream ms = new MemoryStream ()) {
+                               using (Bitmap bmp = GetBitmap ()) {
+                                       Assert.AreEqual (0, ms.Position, "Position-1");
+                                       bmp.Save (ms, ImageFormat.Bmp);
+                                       Assert.IsTrue (ms.Position > 0, "Position-2");
+
+                                       ms.Position = ms.Length;
+                                       Assert.AreEqual (ms.Length, ms.Position, "Position-3");
+
+                                       Bitmap bmp2 = (Bitmap)Image.FromStream (ms);
+                                       Assert.IsTrue (ms.Position > 20, "Position-4");
+
+                                       Assert.IsTrue (bmp2.RawFormat.Equals (ImageFormat.Bmp), "Bmp");
+
+                                       Assert.AreEqual (bmp.GetPixel (0, 0), bmp2.GetPixel (0, 0), "0,0");
+                                       Assert.AreEqual (bmp.GetPixel (10, 0), bmp2.GetPixel (10, 0), "10,0");
+                               }
+                       }
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void StreamJunkSaveLoad ()
+               {
+                       using (MemoryStream ms = new MemoryStream ()) {
+                               // junk
+                               ms.WriteByte (0xff);
+                               ms.WriteByte (0xef);
+                               Assert.AreEqual (2, ms.Position, "Position-1");
+
+                               using (Bitmap bmp = GetBitmap ()) {
+                                       bmp.Save (ms, ImageFormat.Bmp);
+                                       Assert.IsTrue (ms.Position > 2, "Position-2");
+                                       // exception here
+                                       Image.FromStream (ms);
+                               }
+                       }
+               }
+
+               [Test]
+#if !NET_2_0
+               [ExpectedException (typeof (InvalidOperationException))]
+#endif
+               public void XmlSerialization ()
+               {
+                       new XmlSerializer (typeof (Image));
+               }
        }
 }