Remove invalid tests for image palettes in GdiPlusTest (#5671)
[mono.git] / mcs / class / System.Drawing / Test / System.Drawing / TestImage.cs
1 //
2 // Image class testing unit
3 //
4 // Authors:
5 //      Jordi Mas i Hernàndez (jmas@softcatala.org>
6 //      Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 // (C) 2005 Ximian, Inc.  http://www.ximian.com
9 // Copyright (C) 2005-2007 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 //
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using System;
32 using System.Drawing;
33 using System.Drawing.Imaging;
34 using System.IO;
35 using System.Reflection;
36 using System.Security.Permissions;
37 using System.Xml.Serialization;
38 using NUnit.Framework;
39
40 namespace MonoTests.System.Drawing{
41
42         [TestFixture]
43         public class ImageTest {
44
45                 private string fname;
46                 private bool callback;
47
48                 [TestFixtureSetUp]
49                 public void FixtureSetup ()
50                 {
51                         fname = Path.GetTempFileName ();
52                 }
53
54                 [TestFixtureTearDown]
55                 public void FixtureTearDown ()
56                 {
57                         try {
58                                 File.Delete (fname);
59                         }
60                         catch {
61                         }
62                 }
63
64                 [SetUp]
65                 public void SetUp ()
66                 {
67                         callback = false;
68                 }
69
70                 [Test]
71                 public void FileDoesNotExists ()
72                 {
73                         Assert.Throws<FileNotFoundException> (() => Image.FromFile ("FileDoesNotExists.jpg"));
74                 }
75
76                 private bool CallbackTrue ()
77                 {
78                         callback = true;
79                         return true;
80                 }
81
82                 private bool CallbackFalse ()
83                 {
84                         callback = true;
85                         return false;
86                 }
87
88                 [Test]
89                 public void GetThumbnailImage_NullCallback_Tiff ()
90                 {
91                         using (Bitmap bmp = new Bitmap (10, 10)) {
92                                 // according to documentation a callback is mandatory
93                                 Image tn = bmp.GetThumbnailImage (10, 5, null, IntPtr.Zero);
94                                 Assert.AreEqual (5, tn.Height, "Height");
95                                 Assert.AreEqual (10, tn.Width, "Width");
96                                 Assert.IsFalse (callback, "Callback called");
97                                 tn.Save (fname, ImageFormat.Tiff);
98                         }
99                 }
100
101                 [Test]
102                 public void GetThumbnailImage_Height_Zero ()
103                 {
104                         using (Bitmap bmp = new Bitmap (10, 10)) {
105                                 Assert.Throws<OutOfMemoryException> (() => bmp.GetThumbnailImage (5, 0, new Image.GetThumbnailImageAbort (CallbackFalse), IntPtr.Zero));
106                         }
107                 }
108
109                 [Test]
110                 public void GetThumbnailImage_Width_Negative ()
111                 {
112                         using (Bitmap bmp = new Bitmap (10, 10)) {
113                                 Assert.Throws<OutOfMemoryException> (() => bmp.GetThumbnailImage (-5, 5, new Image.GetThumbnailImageAbort (CallbackFalse), IntPtr.Zero));
114                         }
115                 }
116
117                 [Test]
118                 public void GetThumbnailImage_CallbackData_Invalid ()
119                 {
120                         using (Bitmap bmp = new Bitmap (10, 10)) {
121                                 // according to documentation IntPtr.Zero must be supplied as data
122                                 Image tn = bmp.GetThumbnailImage (5, 5, new Image.GetThumbnailImageAbort (CallbackFalse), (IntPtr)Int32.MaxValue);
123                                 Assert.AreEqual (5, tn.Height, "Height");
124                                 Assert.AreEqual (5, tn.Width, "Width");
125                                 Assert.IsFalse (callback, "Callback called");
126                                 tn.Save (fname, ImageFormat.Tiff);
127                         }
128                 }
129
130                 [Test]
131                 public void GetThumbnailImage_SameSize_Bmp ()
132                 {
133                         using (Bitmap bmp = new Bitmap (10, 10)) {
134                                 Image tn = bmp.GetThumbnailImage (10, 10, new Image.GetThumbnailImageAbort (CallbackFalse), IntPtr.Zero);
135                                 Assert.AreEqual (10, tn.Height, "Height");
136                                 Assert.AreEqual (10, tn.Width, "Width");
137                                 Assert.IsFalse (callback, "Callback called");
138                                 tn.Save (fname, ImageFormat.Bmp);
139                         }
140                 }
141
142                 [Test]
143                 public void GetThumbnailImage_Smaller_Gif ()
144                 {
145                         using (Bitmap bmp = new Bitmap (10, 10)) {
146                                 Image tn = bmp.GetThumbnailImage (4, 4, new Image.GetThumbnailImageAbort (CallbackTrue), IntPtr.Zero);
147                                 Assert.AreEqual (4, tn.Height, "Height");
148                                 Assert.AreEqual (4, tn.Width, "Width");
149                                 Assert.IsFalse (callback, "Callback called");
150                                 tn.Save (fname, ImageFormat.Gif);
151                         }
152                 }
153
154                 [Test]
155                 public void GetThumbnailImage_Bigger_Png ()
156                 {
157                         using (Bitmap bmp = new Bitmap (10, 10)) {
158                                 Image tn = bmp.GetThumbnailImage (40, 40, new Image.GetThumbnailImageAbort (CallbackTrue), IntPtr.Zero);
159                                 Assert.AreEqual (40, tn.Height, "Height");
160                                 Assert.AreEqual (40, tn.Width, "Width");
161                                 Assert.IsFalse (callback, "Callback called");
162                                 tn.Save (fname, ImageFormat.Png);
163                         }
164                 }
165
166                 [Test]
167                 public void Stream_Unlocked ()
168                 {
169                         try {
170                                 Image img = null;
171                                 using (MemoryStream ms = new MemoryStream ()) {
172                                         using (Bitmap bmp = new Bitmap (10, 10)) {
173                                                 bmp.Save (ms, ImageFormat.Png);
174                                         }
175                                         ms.Position = 0;
176                                         img = Image.FromStream (ms);
177                                 }
178                                 // stream isn't available anymore
179                                 ((Bitmap) img).MakeTransparent (Color.Transparent);
180                         }
181                         catch (OutOfMemoryException) {
182                                 int p = (int) Environment.OSVersion.Platform;
183                                 // libgdiplus (UNIX) doesn't lazy load the image so the
184                                 // stream may be freed (and this exception will never occur)
185                                 if ((p == 4) || (p == 128) || (p == 6))
186                                         throw;
187                         }
188                 }
189
190                 [Test]
191                 public void Stream_Locked ()
192                 {
193                         Image img = null;
194                         using (MemoryStream ms = new MemoryStream ()) {
195                                 using (Bitmap bmp = new Bitmap (10, 10)) {
196                                         bmp.Save (ms, ImageFormat.Png);
197                                 }
198                                 ms.Position = 0;
199                                 img = Image.FromStream (ms);
200                                 // stream is available
201                                 ((Bitmap) img).MakeTransparent (Color.Transparent);
202                         }
203                 }
204
205                 [Test]
206                 [Category ("NotWorking")]       // http://bugzilla.ximian.com/show_bug.cgi?id=80558
207                 public void XmlSerialize ()
208                 {
209                         new XmlSerializer (typeof (Image));
210                 }
211
212                 private void Wmf (Image img)
213                 {
214                         Assert.IsFalse (img is Bitmap, "Bitmap");
215                         Assert.IsTrue (img is Metafile, "Metafile");
216                         // as Image
217                         Assert.AreEqual (327683, img.Flags, "Flags");
218                         Assert.IsTrue (img.RawFormat.Equals (ImageFormat.Wmf), "Wmf");
219                         Assert.IsNull (img.Tag, "Tag");
220                 }
221
222                 [Test]
223                 public void FromFile_Metafile_Wmf ()
224                 {
225                         string filename = TestBitmap.getInFile ("bitmaps/telescope_01.wmf");
226                         using (Image img = Image.FromFile (filename)) {
227                                 Wmf (img);
228                         }
229                 }
230
231                 [Test]
232                 public void FromStream_Metafile_Wmf ()
233                 {
234                         string filename = TestBitmap.getInFile ("bitmaps/telescope_01.wmf");
235                         using (FileStream fs = File.OpenRead (filename)) {
236                                 using (Image img = Image.FromStream (fs)) {
237                                         Wmf (img);
238                                 }
239                         }
240                 }
241
242                 [Test]
243                 [Category ("NotWorking")] // https://bugzilla.novell.com/show_bug.cgi?id=338779
244                 public void FromStream_Metafile_Wmf_NotOrigin ()
245                 {
246                         string filename = TestBitmap.getInFile ("bitmaps/telescope_01.wmf");
247                         using (FileStream fs = File.OpenRead (filename)) {
248                                 fs.Position = fs.Length / 2;
249                                 Assert.Throws<ArgumentException> (() => Image.FromStream (fs));
250                         }
251                 }
252
253                 private void Emf (Image img)
254                 {
255                         Assert.IsFalse (img is Bitmap, "Bitmap");
256                         Assert.IsTrue (img is Metafile, "Metafile");
257                         // as Image
258                         Assert.AreEqual (327683, img.Flags, "Flags");
259                         Assert.IsTrue (img.RawFormat.Equals (ImageFormat.Emf), "Emf");
260                         Assert.IsNull (img.Tag, "Tag");
261                 }
262
263                 [Test]
264                 public void FromFile_Metafile_Emf ()
265                 {
266                         string filename = TestBitmap.getInFile ("bitmaps/milkmateya01.emf");
267                         using (Image img = Image.FromFile (filename)) {
268                                 Emf (img);
269                         }
270                 }
271
272                 [Test]
273                 public void FromStream_Metafile_Emf ()
274                 {
275                         string filename = TestBitmap.getInFile ("bitmaps/milkmateya01.emf");
276                         using (FileStream fs = File.OpenRead (filename)) {
277                                 using (Image img = Image.FromStream (fs)) {
278                                         Emf (img);
279                                 }
280                         }
281                 }
282
283                 [Test]
284                 [Category ("NotWorking")] // https://bugzilla.novell.com/show_bug.cgi?id=338779
285                 public void FromStream_Metafile_Emf_NotOrigin ()
286                 {
287                         string filename = TestBitmap.getInFile ("bitmaps/milkmateya01.emf");
288                         using (FileStream fs = File.OpenRead (filename)) {
289                                 fs.Position = fs.Length / 2;
290                                 Assert.Throws<ArgumentException> (() => Image.FromStream (fs));
291                         }
292                 }
293
294                 [Test]
295                 public void FromFile_Invalid ()
296                 {
297                         string filename = Assembly.GetExecutingAssembly ().Location;
298                         Assert.Throws<OutOfMemoryException> (() => Image.FromFile (filename));
299                 }
300
301                 [Test]
302                 public void FromStream_Invalid ()
303                 {
304                         string filename = Assembly.GetExecutingAssembly ().Location;
305                         using (FileStream fs = File.OpenRead (filename)) {
306                                 Assert.Throws<ArgumentException> (() => Image.FromStream (fs));
307                         }
308                 }
309
310                 private Bitmap GetBitmap ()
311                 {
312                         Bitmap bmp = new Bitmap (20, 10, PixelFormat.Format24bppRgb);
313                         using (Graphics g = Graphics.FromImage (bmp))
314                         {
315                                 Pen pen = new Pen (Color.Black, 3);
316                                 g.DrawRectangle (pen, 0, 0, 5, 10);
317                         }
318                         return bmp;
319                 }
320
321                 [Test]
322                 public void StreamSaveLoad ()
323                 {
324                         using (MemoryStream ms = new MemoryStream ()) {
325                                 using (Bitmap bmp = GetBitmap ()) {
326                                         Assert.AreEqual (0, ms.Position, "Position-1");
327                                         bmp.Save (ms, ImageFormat.Bmp);
328                                         Assert.IsTrue (ms.Position > 0, "Position-2");
329
330                                         ms.Position = ms.Length;
331                                         Assert.AreEqual (ms.Length, ms.Position, "Position-3");
332
333                                         Bitmap bmp2 = (Bitmap)Image.FromStream (ms);
334                                         Assert.IsTrue (ms.Position > 20, "Position-4");
335
336                                         Assert.IsTrue (bmp2.RawFormat.Equals (ImageFormat.Bmp), "Bmp");
337
338                                         Assert.AreEqual (bmp.GetPixel (0, 0), bmp2.GetPixel (0, 0), "0,0");
339                                         Assert.AreEqual (bmp.GetPixel (10, 0), bmp2.GetPixel (10, 0), "10,0");
340                                 }
341                         }
342                 }
343
344                 [Test]
345                 public void StreamJunkSaveLoad ()
346                 {
347                         using (MemoryStream ms = new MemoryStream ()) {
348                                 // junk
349                                 ms.WriteByte (0xff);
350                                 ms.WriteByte (0xef);
351                                 Assert.AreEqual (2, ms.Position, "Position-1");
352
353                                 using (Bitmap bmp = GetBitmap ()) {
354                                         bmp.Save (ms, ImageFormat.Bmp);
355                                         Assert.IsTrue (ms.Position > 2, "Position-2");
356                                         // exception here
357                                         Assert.Throws<ArgumentException> (() => Image.FromStream (ms));
358                                 }
359                         }
360                 }
361
362                 [Test]
363                 public void XmlSerialization ()
364                 {
365                         new XmlSerializer (typeof (Image));
366                 }
367         }
368 }