[gdiplus_winetest]
[reactos.git] / rostests / winetests / gdiplus / pen.c
index ad484ce..0bdf280 100644 (file)
@@ -33,21 +33,28 @@ static void test_startup(void)
     Status status;
     struct GdiplusStartupInput gdiplusStartupInput;
     ULONG_PTR gdiplusToken;
+    int gpversion;
 
-    gdiplusStartupInput.GdiplusVersion              = 1;
     gdiplusStartupInput.DebugEventCallback          = NULL;
     gdiplusStartupInput.SuppressBackgroundThread    = 0;
     gdiplusStartupInput.SuppressExternalCodecs      = 0;
 
-    status = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
-    expect(Ok, status);
-    GdiplusShutdown(gdiplusToken);
-
-    gdiplusStartupInput.GdiplusVersion = 2;
-
-    status = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
-    expect(UnsupportedGdiplusVersion, status);
-    GdiplusShutdown(gdiplusToken);
+    for (gpversion=1; gpversion<256; gpversion++)
+    {
+        gdiplusStartupInput.GdiplusVersion = gpversion;
+        status = GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
+        ok(status == Ok || status == UnsupportedGdiplusVersion,
+            "GdiplusStartup returned %x\n", status);
+        GdiplusShutdown(gdiplusToken);
+        if (status != Ok)
+        {
+            gpversion--;
+            break;
+        }
+    }
+
+    ok(gpversion > 0 && gpversion <= 2, "unexpected gdiplus version %i\n", gpversion);
+    trace("gdiplus version is %i\n", gpversion);
 
     status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
 
@@ -219,13 +226,140 @@ static void test_dasharray(void)
     /* Try to set with count = 0. */
     GdipSetPenDashStyle(pen, DashStyleDot);
     status = GdipSetPenDashArray(pen, dashes, 0);
-    expect(OutOfMemory, status);
+    ok(status == OutOfMemory || status == InvalidParameter,
+       "Expected OutOfMemory or InvalidParameter, got %.8x\n", status);
     GdipGetPenDashStyle(pen, &style);
     expect(DashStyleDot, style);
 
     GdipDeletePen(pen);
 }
 
+static void test_customcap(void)
+{
+    GpPen *pen;
+    GpStatus status;
+    GpCustomLineCap *custom;
+
+    status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
+    expect(Ok, status);
+
+    /* NULL args */
+    status = GdipGetPenCustomStartCap(NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipGetPenCustomStartCap(pen, NULL);
+    expect(InvalidParameter, status);
+    status = GdipGetPenCustomStartCap(NULL, &custom);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPenCustomEndCap(NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipGetPenCustomEndCap(pen, NULL);
+    expect(InvalidParameter, status);
+    status = GdipGetPenCustomEndCap(NULL, &custom);
+    expect(InvalidParameter, status);
+
+    /* native crashes on pen == NULL, custom != NULL */
+    status = GdipSetPenCustomStartCap(NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipSetPenCustomStartCap(pen, NULL);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPenCustomEndCap(NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipSetPenCustomEndCap(pen, NULL);
+    expect(InvalidParameter, status);
+
+    /* get without setting previously */
+    custom = (GpCustomLineCap*)0xdeadbeef;
+    status = GdipGetPenCustomEndCap(pen, &custom);
+    expect(Ok, status);
+    ok(custom == NULL,"Expect CustomCap == NULL\n");
+
+    custom = (GpCustomLineCap*)0xdeadbeef;
+    status = GdipGetPenCustomStartCap(pen, &custom);
+    expect(Ok, status);
+    ok(custom == NULL,"Expect CustomCap == NULL\n");
+
+    GdipDeletePen(pen);
+}
+
+static void test_penfilltype(void)
+{
+    GpPen *pen;
+    GpSolidFill *solid;
+    GpLineGradient *line;
+    GpPointF a, b;
+    GpStatus status;
+    GpPenType type;
+
+    /* NULL */
+    status = GdipGetPenFillType(NULL, NULL);
+    expect(InvalidParameter, status);
+
+    status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
+    expect(Ok, status);
+    status = GdipGetPenFillType(pen, NULL);
+    expect(InvalidParameter, status);
+
+    /* created with GdipCreatePen1() */
+    status = GdipGetPenFillType(pen, &type);
+    expect(Ok, status);
+    expect(PenTypeSolidColor, type);
+    GdipDeletePen(pen);
+
+    /* based on SolidBrush */
+    status = GdipCreateSolidFill((ARGB)0xffff00ff, &solid);
+    expect(Ok, status);
+    status = GdipCreatePen2((GpBrush*)solid, 10.0f, UnitPixel, &pen);
+    expect(Ok, status);
+    status = GdipGetPenFillType(pen, &type);
+    expect(Ok, status);
+    expect(PenTypeSolidColor, type);
+    GdipDeletePen(pen);
+    GdipDeleteBrush((GpBrush*)solid);
+
+    /* based on LinearGradientBrush */
+    a.X = a.Y = 0.0;
+    b.X = b.Y = 10.0;
+    status = GdipCreateLineBrush(&a, &b, (ARGB)0xffff00ff, (ARGB)0xffff0000,
+                                 WrapModeTile, &line);
+    expect(Ok, status);
+    status = GdipCreatePen2((GpBrush*)line, 10.0f, UnitPixel, &pen);
+    expect(Ok, status);
+    status = GdipGetPenFillType(pen, &type);
+    expect(Ok, status);
+    expect(PenTypeLinearGradient, type);
+    GdipDeletePen(pen);
+    GdipDeleteBrush((GpBrush*)line);
+}
+
+static void test_compoundarray(void)
+{
+    GpStatus status;
+    GpPen *pen;
+    static const REAL testvalues[] = {0.2, 0.4, 0.6, 0.8};
+
+    status = GdipSetPenCompoundArray(NULL, testvalues, 4);
+    expect(InvalidParameter, status);
+
+    status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen);
+    expect(Ok, status);
+
+    status = GdipSetPenCompoundArray(pen, NULL, 4);
+    expect(InvalidParameter, status);
+    status = GdipSetPenCompoundArray(pen, testvalues, 3);
+    expect(InvalidParameter, status);
+    status = GdipSetPenCompoundArray(pen, testvalues, 0);
+    expect(InvalidParameter, status);
+    status = GdipSetPenCompoundArray(pen, testvalues, -2);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPenCompoundArray(pen, testvalues, 4);
+    todo_wine expect(Ok, status);
+
+    GdipDeletePen(pen);
+}
+
 START_TEST(pen)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -244,6 +378,9 @@ START_TEST(pen)
     test_constructor_destructor2();
     test_brushfill();
     test_dasharray();
+    test_customcap();
+    test_penfilltype();
+    test_compoundarray();
 
     GdiplusShutdown(gdiplusToken);
 }