2006-08-12 Duncan Mak <duncan@novell.com>
[mono.git] / mcs / class / System.Drawing / Test / System.Drawing / GDIPlusTest.cs
1 //
2 // Direct GDI+ API unit tests
3 //
4 // Authors:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System;
30 using System.Drawing;
31 using System.Drawing.Drawing2D;
32 using System.Drawing.Imaging;
33 using System.Runtime.InteropServices;
34 using NUnit.Framework;
35
36 namespace MonoTests.System.Drawing {
37
38         [TestFixture]
39         public class GDIPlusTest {
40
41                 // FontFamily
42                 [Test]
43                 public void DeleteFontFamily ()
44                 {
45                         // invalid image pointer (null)
46                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteFontFamily (IntPtr.Zero), "null");
47
48                         IntPtr font_family;
49                         GDIPlus.GdipCreateFontFamilyFromName ("Arial", IntPtr.Zero, out font_family);
50                         Assert.IsTrue (font_family != IntPtr.Zero, "GDIGdipCreateFontFamilyFromName");
51                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (font_family), "first");
52                 }
53
54                 [Test]
55                 [Category ("NotWorking")]
56                 public void DeleteFontFamily_DoubleDispose ()
57                 {
58                         IntPtr font_family;
59                         GDIPlus.GdipGetGenericFontFamilySerif (out font_family);
60                         // first dispose
61                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (font_family), "first");
62                         // second dispose
63                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (font_family), "second");
64                 }
65
66                 // Font
67                 [Test]
68                 public void CreateFont ()
69                 {
70                         IntPtr family;
71                         GDIPlus.GdipCreateFontFamilyFromName ("Arial", IntPtr.Zero, out family);
72                         Assert.IsTrue (family != IntPtr.Zero, "family");
73
74                         IntPtr font;
75                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateFont (family, 10f, FontStyle.Regular, GraphicsUnit.Point, out font), "GdipCreateFont");
76                         Assert.IsTrue (font != IntPtr.Zero, "font");
77
78                         LOGFONT lf = new LOGFONT ();
79                         lf.lfCharSet = 1;
80                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetLogFont (font, IntPtr.Zero, (object) lf), "GdipGetLogFont-null-graphics");
81                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet-null-graphics");
82                         // other lf members looks like garbage
83
84                         IntPtr image;
85                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
86                         Assert.IsTrue (image != IntPtr.Zero, "image");
87
88                         IntPtr graphics;
89                         GDIPlus.GdipGetImageGraphicsContext (image, out graphics);
90                         Assert.IsTrue (graphics != IntPtr.Zero, "graphics");
91
92                         lf.lfCharSet = 1;
93                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetLogFont (IntPtr.Zero, graphics, (object) lf), "GdipGetLogFont-null");
94                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet-null");
95
96                         lf.lfCharSet = 1;
97                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetLogFont (font, graphics, (object) lf), "GdipGetLogFont");
98                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet");
99                         // strangely this is 1 in the managed side
100
101                         lf.lfCharSet = 2;
102                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetLogFont (font, graphics, (object) lf), "GdipGetLogFont-2");
103                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet");
104                         // strangely this is 2 in the managed side
105
106                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFont (font), "GdipDeleteFont");
107                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteFont (IntPtr.Zero), "GdipDeleteFont-null");
108
109                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (family), "GdipDeleteFontFamily");
110                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
111                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteGraphics (graphics), "GdipDeleteGraphics");
112                 }
113
114                 // Bitmap
115                 [Test]
116                 public void CreateBitmapFromScan0 ()
117                 {
118                         IntPtr bmp;
119                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateBitmapFromScan0 (-1, 10, 10, PixelFormat.Format32bppArgb, IntPtr.Zero, out bmp), "negative width");
120                 }
121
122                 // Brush
123                 [Test]
124                 public void DeleteBrush ()
125                 {
126                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteBrush (IntPtr.Zero), "GdipDeleteBrush");
127                 }
128
129                 // Graphics
130                 [Test]
131                 public void Graphics ()
132                 {
133                         IntPtr graphics;
134                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetImageGraphicsContext (IntPtr.Zero, out graphics), "GdipGetImageGraphicsContext");
135
136                         IntPtr image;
137                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
138                         Assert.IsTrue (image != IntPtr.Zero, "image");
139
140                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetImageGraphicsContext (image, out graphics), "GdipGetImageGraphicsContext");
141                         Assert.IsTrue (graphics != IntPtr.Zero, "graphics");
142                         
143
144                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteGraphics (graphics), "GdipDeleteGraphics");
145                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteGraphics (IntPtr.Zero), "GdipDeleteGraphics-null");
146
147                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
148                 }
149
150                 // GraphicsPath
151                 [Test]
152                 public void GetPointCount_Zero ()
153                 {
154                         IntPtr path;
155                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
156                         Assert.IsTrue (path != IntPtr.Zero, "Handle");
157
158                         int count;
159                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPointCount (IntPtr.Zero, out count), "GdipGetPointCount-null");
160                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPointCount (path, out count), "GdipGetPointCount");
161                         Assert.AreEqual (0, count, "Count");
162
163                         PointF[] points = new PointF[count];
164                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathPoints (IntPtr.Zero, points, count), "GdipGetPathPoints-null-1");
165                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathPoints (path, null, count), "GdipGetPathPoints-null-2");
166                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathPoints (path, points, count), "GdipGetPathPoints");
167                         // can't get the points if the count is zero!
168
169                         byte[] types = new byte[count];
170                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathTypes (IntPtr.Zero, types, count), "GdipGetPathTypes-null-1");
171                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathTypes (path, null, count), "GdipGetPathTypes-null-2");
172                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathTypes (path, types, count), "GdipGetPathTypes");
173                         // can't get the types if the count is zero!
174
175                         PointF[] pts_2f = new PointF[2] { new PointF (2f, 4f), new PointF (10f, 30f) };
176                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine2 (IntPtr.Zero, pts_2f, pts_2f.Length), "GdipAddPathLine2-null-path");
177                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine2 (path, null, pts_2f.Length), "GdipAddPathLine2-null-points");
178                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine2 (path, pts_2f, -1), "GdipAddPathLine2-negative-count");
179                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine2 (path, pts_2f, pts_2f.Length), "GdipAddPathLine2");
180
181                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPointCount (path, out count), "GdipGetPointCount");
182                         Assert.AreEqual (2, count, "Count");
183
184                         points = new PointF[count];
185                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathPoints (path, points, count), "GdipGetPathPoints-ok");
186
187                         types = new byte[count];
188                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathTypes (path, types, count), "GdipGetPathTypes-ok");
189
190                         Assert.AreEqual (Status.Ok, GDIPlus.GdipResetPath (path), "GdipResetPath");
191                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipResetPath (IntPtr.Zero), "GdipResetPath-null");
192
193                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
194                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeletePath (IntPtr.Zero), "GdipDeletePath-null");
195                 }
196
197                 [Test]
198                 public void Widen ()
199                 {
200                         IntPtr pen;
201                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePen1 (0, 0f, Unit.UnitWorld, out pen), "GdipCreatePen1");
202
203                         IntPtr path;
204                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
205
206                         IntPtr matrix;
207                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix (out matrix), "GdipCreateMatrix");
208
209                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipWidenPath (IntPtr.Zero, pen, matrix, 1.0f), "GdipWidenPath-null-path");
210                         // empty path
211                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipWidenPath (path, pen, matrix, 1.0f), "GdipWidenPath");
212
213                         // add something to the path
214                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine (IntPtr.Zero, 1, 1, 10, 10), "GdipAddPathLine");
215                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine (path, 1, 1, 10, 10), "GdipAddPathLine");
216
217                         int count;
218                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPointCount (path, out count), "GdipGetPointCount");
219                         Assert.AreEqual (2, count, "Count");
220
221                         Assert.AreEqual (Status.Ok, GDIPlus.GdipWidenPath (path, pen, matrix, 1.0f), "GdipWidenPath-2");
222
223                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
224                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
225                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePen (pen), "GdipDeletePen");
226                 }
227
228                 // Matrix
229                 [Test]
230                 public void Matrix ()
231                 {
232                         IntPtr matrix;
233                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix (out matrix), "GdipCreateMatrix");
234                         Assert.IsTrue (matrix != IntPtr.Zero, "Handle");
235
236                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteMatrix (IntPtr.Zero), "GdipDeleteMatrix-null");
237                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
238                 }
239
240                 // Image
241                 [Test]
242                 public void DisposeImage ()
243                 {
244                         // invalid image pointer (null)
245                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDisposeImage (IntPtr.Zero), "null");
246
247                         IntPtr image;
248                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
249                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "first");
250                 }
251
252                 [Test]
253                 [Category ("NotWorking")]
254                 public void DisposeImage_Dual ()
255                 {
256                         IntPtr image;
257                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
258                         // first dispose
259                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "first");
260                         // second dispose
261                         Assert.AreEqual (Status.ObjectBusy, GDIPlus.GdipDisposeImage (image), "second");
262                 }
263
264                 [Test]
265                 [Category ("NotWorking")] // libgdiplus doesn't implement GdipGetImageThumbnail (it is done inside S.D)
266                 public void GetImageThumbnail ()
267                 {
268                         IntPtr ptr;
269
270                         // invalid image pointer (null)
271                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetImageThumbnail (IntPtr.Zero, 10, 10, out ptr, IntPtr.Zero, IntPtr.Zero));
272
273                         IntPtr image;
274                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
275                         try {
276                                 // invalid width (0)
277                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 0, 10, out ptr, IntPtr.Zero, IntPtr.Zero));
278                                 // invalid width (negative)
279                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 0x8000000, 10, out ptr, IntPtr.Zero, IntPtr.Zero));
280                                 // invalid height (0)
281                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 10, 0, out ptr, IntPtr.Zero, IntPtr.Zero));
282                                 // invalid height (negative)
283                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 10, 0x8000000, out ptr, IntPtr.Zero, IntPtr.Zero));
284                         }
285                         finally {
286                                 GDIPlus.GdipDisposeImage (image);
287                         }
288                 }
289
290                 // PathGradientBrush
291                 [Test]
292                 public void CreatePathGradient ()
293                 {
294                         PointF[] points = null;
295                         IntPtr brush;
296                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 0, WrapMode.Clamp, out brush), "null");
297
298                         points = new PointF [0];
299                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 0, WrapMode.Clamp, out brush), "empty");
300
301                         points = new PointF[1];
302                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 1, WrapMode.Clamp, out brush), "one");
303
304                         points = new PointF[2] { new PointF (1, 2), new PointF (20, 30) };
305                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathGradient (points, 2, WrapMode.Clamp, out brush), "two");
306                         Assert.IsTrue (brush != IntPtr.Zero, "Handle");
307
308                         int count;
309                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathGradientBlendCount (brush, out count), "GdipGetPathGradientBlendCount");
310                         Assert.AreEqual (1, count, "blend count");
311
312                         int[] colors = new int[count];
313                         float[] positions = new float[count];
314                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathGradientPresetBlend (brush, colors, positions, count), "GdipGetPathGradientBlend");
315                         // can't call that for 1 count!
316
317                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
318                 }
319
320                 [Test]
321                 public void CreatePathGradient_FromPath_Line ()
322                 {
323                         IntPtr path;
324                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
325
326                         IntPtr brush;
327                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradientFromPath (IntPtr.Zero, out brush), "null");
328                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradientFromPath (path, out brush), "empty path");
329
330                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine (path, 1, 1, 10, 10), "GdipAddPathLine");
331
332                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathGradientFromPath (path, out brush), "path");
333                         Assert.IsTrue (brush != IntPtr.Zero, "Handle");
334
335                         int count;
336                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathGradientBlendCount (brush, out count), "GdipGetPathGradientBlendCount");
337                         Assert.AreEqual (1, count, "blend count");
338
339                         int[] colors = new int[count];
340                         float[] positions = new float[count];
341                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathGradientPresetBlend (brush, colors, positions, count), "GdipGetPathGradientBlend");
342
343                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
344                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
345                 }
346
347                 [Test]
348                 public void CreatePathGradient_FromPath_Lines ()
349                 {
350                         IntPtr path;
351                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
352
353                         PointF[] pts_2f = new PointF[2] { new PointF (2f, 4f), new PointF (10f, 30f) };
354                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine2 (path, pts_2f, pts_2f.Length), "GdipAddPathLine2");
355
356                         IntPtr brush;
357                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathGradientFromPath (path, out brush), "path");
358                         Assert.IsTrue (brush != IntPtr.Zero, "Handle");
359
360                         int count;
361                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathGradientBlendCount (brush, out count), "GdipGetPathGradientBlendCount");
362                         Assert.AreEqual (1, count, "blend count");
363
364                         int[] colors = new int[count];
365                         float[] positions = new float[count];
366                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathGradientPresetBlend (brush, colors, positions, count), "GdipGetPathGradientBlend");
367
368                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
369                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
370                 }
371
372                 // Pen
373                 [Test]
374                 public void CreatePen ()
375                 {
376                         IntPtr pen;
377                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePen1 (0, 0f, Unit.UnitWorld, out pen), "GdipCreatePen1");
378                         Assert.IsTrue (pen != IntPtr.Zero, "pen");
379
380                         DashStyle ds;
381                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPenDashStyle (pen, out ds), "GdipGetPenDashStyle");
382                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashStyle (IntPtr.Zero, out ds), "GdipGetPenDashStyle-null");
383
384                         ds = DashStyle.Custom;
385                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetPenDashStyle (pen, ds), "GdipSetPenDashStyle");
386                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetPenDashStyle (IntPtr.Zero, ds), "GdipSetPenDashStyle-null");
387
388                         int count;
389                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPenDashCount (pen, out count), "GdipGetPenDashCount");
390                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashCount (IntPtr.Zero, out count), "GdipGetPenDashCount-null");
391                         Assert.AreEqual (0, count, "count");
392
393                         float[] dash = new float[count];
394                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetPenDashArray (pen, dash, count), "GdipGetPenDashArray");
395                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashArray (IntPtr.Zero, dash, count), "GdipGetPenDashArray-null-pen");
396                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashArray (pen, null, count), "GdipGetPenDashArray-null-dash");
397
398                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePen (pen), "GdipDeletePen");
399                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeletePen (IntPtr.Zero), "GdipDeletePen-null");
400                 }
401
402                 // Region
403                 [Test]
404                 public void CreateRegionRgnData ()
405                 {
406                         IntPtr region;
407                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateRegionRgnData (null, 0, out region));
408
409                         byte[] data = new byte[0];
410                         Assert.AreEqual (Status.GenericError, GDIPlus.GdipCreateRegionRgnData (data, 0, out region));
411                 }
412
413                 [Test]
414                 public void DrawingOperations ()
415                 {
416                         IntPtr graphics, image;
417
418                         IntPtr pen;
419                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero,
420                                                            out image);
421
422                         GDIPlus.GdipGetImageGraphicsContext (image, out graphics);
423                         GDIPlus.GdipCreatePen1 (0, 0f, Unit.UnitWorld, out pen);
424
425                         // DrawCurve
426
427                         Assert.AreEqual (Status.InvalidParameter,
428                                          GDIPlus.GdipDrawCurveI (IntPtr.Zero, IntPtr.Zero, null, 0));
429
430                         Assert.AreEqual (Status.InvalidParameter, 
431                                          GDIPlus.GdipDrawCurveI (graphics, pen, new Point [] {}, 0),
432                                          "DrawCurve with no pts");
433                         Assert.AreEqual (Status.InvalidParameter,
434                                          GDIPlus.GdipDrawCurveI (graphics, pen,
435                                                                  new Point [] { new Point (1, 1) }, 1),
436                                          "DrawCurve with 1 pt");
437                         Assert.AreEqual (Status.Ok,
438                                          GDIPlus.GdipDrawCurveI (graphics, pen,
439                                                                  new Point [] { new Point (1, 1),
440                                                                                 new Point (2, 2) }, 2),
441                                          "DrawCurve with 2 pts");
442
443                         // DrawClosedCurve
444
445                         Assert.AreEqual (Status.InvalidParameter, 
446                                          GDIPlus.GdipDrawClosedCurveI (graphics, pen, new Point [] {}, 0),
447                                          "DrawClosedCurve with no pts");
448                         Assert.AreEqual (Status.InvalidParameter,
449                                          GDIPlus.GdipDrawClosedCurveI (graphics, pen,
450                                                                        new Point [] { new Point (1, 1) }, 1),
451                                          "DrawClosedCurve with 1 pt");
452                         Assert.AreEqual (Status.InvalidParameter,
453                                          GDIPlus.GdipDrawClosedCurveI (graphics, pen,
454                                                                        new Point [] { new Point (1, 1),
455                                                                                       new Point (2, 2) }, 2),
456                                          "DrawClosedCurve with 2 pt2");
457
458                         // DrawPolygon
459
460                         Assert.AreEqual (Status.InvalidParameter,
461                                          GDIPlus.GdipDrawPolygonI (graphics, pen, new Point [] {}, 0),
462                                          "DrawPolygon with no pts");
463                         Assert.AreEqual (Status.InvalidParameter,
464                                          GDIPlus.GdipDrawPolygonI (graphics, pen,
465                                                                    new Point [] { new Point (1, 1) }, 1),
466                                          "DrawPolygon with only one pt");
467
468                         GDIPlus.GdipDeletePen (pen);                    
469
470                         // FillClosedCurve
471
472                         IntPtr brush;
473                         GDIPlus.GdipCreateSolidFill (0, out brush);
474
475
476                         Assert.AreEqual (Status.InvalidParameter,
477                                          GDIPlus.GdipFillClosedCurveI (graphics, brush, new Point [] {}, 0),
478                                          "FillClosedCurve with no pts");
479                         Assert.AreEqual (Status.Ok,
480                                          GDIPlus.GdipFillClosedCurveI (graphics, brush, 
481                                                                        new Point [] { new Point (1, 1) }, 1),
482                                          "FillClosedCurve with 1 pt");
483                         Assert.AreEqual (Status.Ok,
484                                          GDIPlus.GdipFillClosedCurveI (graphics, brush,
485                                                                        new Point [] { new Point (1, 1),
486                                                                                       new Point (2, 2) }, 2),
487                                          "FillClosedCurve with 2 pts");
488                         
489                         GDIPlus.GdipDeleteBrush (brush);
490                         
491                         GDIPlus.GdipDeleteGraphics (graphics);
492                         GDIPlus.GdipDisposeImage (image);
493                 }
494         }
495 }