[GDI32_APITEST]
[reactos.git] / rostests / apitests / gdi32 / GetObject.c
index b519a1a..1b2f016 100644 (file)
@@ -5,10 +5,11 @@
  * PROGRAMMERS:     Timo Kreuzer
  */
 
-#include <stdio.h>
-#include <wine/test.h>
-#include <windows.h>
+#include <apitest.h>
+
+#include <wingdi.h>
 #include <winddi.h>
+#include <winuser.h>
 #include <include/ntgdityp.h>
 #include <include/ntgdihdl.h>
 
@@ -18,21 +19,23 @@ Test_General(void)
        struct
        {
                LOGBRUSH logbrush;
-               BYTE additional[5];
+               BYTE additional[600];
        } TestStruct;
        PLOGBRUSH plogbrush;
        HBRUSH hBrush;
+       HPEN hpen;
        INT ret;
 
        /* Test null pointer and invalid handles */
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectA(0, 0, NULL) == 0, "\n");
        ok(GetObjectA((HANDLE)-1, 0, NULL) == 0, "\n");
+
+       /* Test invalid habdles of different types */
        ok(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0, "\n");
        ok(GetLastError() == ERROR_SUCCESS, "\n");
        ok(GetObjectA((HANDLE)0x00380000, 10, &TestStruct) == 0, "\n");
        ok(GetLastError() == ERROR_SUCCESS, "\n");
-
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectA((HANDLE)0x00010000, 0, NULL) == 0, "\n");
        ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
@@ -84,7 +87,6 @@ Test_General(void)
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectA((HANDLE)0x00160000, 0, NULL) == 0, "\n");
        ok(GetLastError() == ERROR_SUCCESS, "\n");
-
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0, "\n");
        ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
@@ -126,10 +128,19 @@ Test_General(void)
        plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);
        //ok(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0, "\n"); // fails on win7
 
-    /* Test invalid buffer */
-       SetLastError(ERROR_SUCCESS);
-       ok(GetObjectA(hBrush, sizeof(LOGBRUSH), (PVOID)0xc0000000) == 0, "\n");
-       ok(GetLastError() == ERROR_NOACCESS, "expected ERROR_NOACCESS, got %ld\n", GetLastError());
+       /* Test invalid buffer */
+       SetLastError(0xbadbad00);
+       ok(GetObjectA(GetStockObject(WHITE_BRUSH), sizeof(LOGBRUSH), (PVOID)0xc0000000) == 0, "\n");
+    ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+       SetLastError(0xbadbad00);
+       ok(GetObjectW(GetStockObject(BLACK_PEN), sizeof(LOGPEN), (PVOID)0xc0000000) == 0, "\n");
+    ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+       SetLastError(0xbadbad00);
+       ok(GetObjectW(GetStockObject(21), sizeof(BITMAP), (PVOID)0xc0000000) == 0, "\n");
+    ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+       SetLastError(0xbadbad00);
+       ok(GetObjectW(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), (PVOID)0xc0000000) == 0, "\n");
+       ok(GetLastError() == 0xbadbad00, "wrong error: %ld\n", GetLastError());
        SetLastError(ERROR_SUCCESS);
        _SEH2_TRY
        {
@@ -140,13 +151,38 @@ Test_General(void)
            ret = -1;
        }
        _SEH2_END
-
        ok(ret == -1, "should have got an exception\n");
 
-       SetLastError(ERROR_SUCCESS);
-       ok(GetObjectW(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), (PVOID)0xc0000000) == 0, "\n");
-       ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
+       ok(GetObjectW(GetStockObject(SYSTEM_FONT), 0x50000000, &TestStruct) == 356, "\n");
+       ok(GetObjectW(GetStockObject(WHITE_BRUSH), 0x50000000, &TestStruct) == sizeof(LOGBRUSH), "\n");
+
 
+       /* Test buffer size of 0 */
+       SetLastError(0xbadbad00);
+       hBrush = CreateSolidBrush(123);
+       ok(hBrush != NULL, "Failed to create brush\n");
+       ok_long(GetObjectA(hBrush, 0, &TestStruct), sizeof(LOGBRUSH));
+       ok_err(0xbadbad00);
+       DeleteObject(hBrush);
+       SetLastError(0xbadbad00);
+       hpen = CreatePen(PS_SOLID, 1, 123);
+       ok(hpen != NULL, "Failed to create pen\n");
+       ok_long(GetObjectA(hpen, 0, &TestStruct), 0);
+    ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+       SetLastError(0xbadbad00);
+       TestStruct.logbrush.lbStyle = BS_SOLID;
+       TestStruct.logbrush.lbColor = RGB(1,2,3);
+       TestStruct.logbrush.lbHatch = 0;
+       hpen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID, 1, &TestStruct.logbrush, 0, NULL);
+       ok(hpen != NULL, "Failed to create pen\n");
+       ok_long(GetObjectA(hpen, 0, &TestStruct), 0);
+    ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+       SetLastError(0xbadbad00);
+       ok(GetObjectW(GetStockObject(SYSTEM_FONT), 0, &TestStruct) == 0, "\n");
+       ok_err(0xbadbad00);
+       SetLastError(0xbadbad00);
+       ok(GetObjectW(GetStockObject(21), 0, &TestStruct) == 0, "\n");
+       ok_err(0xbadbad00);
 
 }
 
@@ -195,7 +231,7 @@ Test_Bitmap(void)
 void
 Test_Dibsection(void)
 {
-       BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
+       BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 16, BI_RGB, 0, 10, 10, 0,0}};
        HBITMAP hBitmap;
        BITMAP bitmap;
        DIBSECTION dibsection;
@@ -212,25 +248,25 @@ Test_Dibsection(void)
        ok(GetObjectW((HANDLE)((UINT_PTR)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP), "\n");
 
        SetLastError(ERROR_SUCCESS);
-       ok(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP), "\n");
-       ok(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP), "\n");
-       ok(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP), "\n");
-       ok(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP), "\n");
-       ok(GetObject(hBitmap, 0, &dibsection) == 0, "\n");
-       ok(GetObject(hBitmap, 5, &dibsection) == 0, "\n");
-       ok(GetObject(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP), "\n");
-       ok(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP), "\n");
-       ok(bitmap.bmType == 0, "\n");
-       ok(bitmap.bmWidth == 10, "\n");
-       ok(bitmap.bmHeight == 9, "\n");
-       ok(bitmap.bmWidthBytes == 12, "\n");
-       ok(bitmap.bmPlanes == 1, "\n");
-       ok(bitmap.bmBitsPixel == 8, "\n");
+       ok_long(GetObject(hBitmap, sizeof(DIBSECTION), NULL), sizeof(BITMAP));
+       ok_long(GetObject(hBitmap, 0, NULL), sizeof(BITMAP));
+       ok_long(GetObject(hBitmap, 5, NULL), sizeof(BITMAP));
+       ok_long(GetObject(hBitmap, -5, NULL), sizeof(BITMAP));
+       ok_long(GetObject(hBitmap, 0, &dibsection), 0);
+       ok_long(GetObject(hBitmap, 5, &dibsection), 0);
+       ok_long(GetObject(hBitmap, sizeof(BITMAP), &bitmap), sizeof(BITMAP));
+       ok_long(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap), sizeof(BITMAP));
+       ok_long(bitmap.bmType, 0);
+       ok_long(bitmap.bmWidth, 10);
+       ok_long(bitmap.bmHeight, 9);
+       ok_long(bitmap.bmWidthBytes, 20);
+       ok_long(bitmap.bmPlanes, 1);
+       ok_long(bitmap.bmBitsPixel, 16);
        ok(bitmap.bmBits == pData, "\n");
-       ok(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION), "\n");
-       ok(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION), "\n");
-       ok(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION), "\n");
-       ok(GetLastError() == ERROR_SUCCESS, "\n");
+       ok_long(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection), sizeof(DIBSECTION));
+       ok_long(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection), sizeof(DIBSECTION));
+       ok_long(GetObject(hBitmap, -5, &dibsection), sizeof(DIBSECTION));
+       ok_err(ERROR_SUCCESS);
        DeleteObject(hBitmap);
        ReleaseDC(0, hDC);
 }
@@ -314,6 +350,58 @@ Test_Brush(void)
        ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
 }
 
+void
+Test_DIBBrush(void)
+{
+    struct
+    {
+        BITMAPINFOHEADER bmiHeader;
+        WORD wColors[4];
+        BYTE jBuffer[16];
+    } PackedDIB =
+    {
+        {sizeof(BITMAPINFOHEADER), 4, 4, 1, 8, BI_RGB, 0, 1, 1, 4, 0},
+        {1, 7, 3, 1},
+        {0,1,2,3,  1,2,3,0,  2,3,0,1,  3,0,1,2},
+    };
+       LOGBRUSH logbrush;
+       HBRUSH hBrush;
+
+    /* Create a DIB brush */
+    hBrush = CreateDIBPatternBrushPt(&PackedDIB, DIB_PAL_COLORS);
+       ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
+       if (!hBrush) return;
+
+       FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
+       SetLastError(ERROR_SUCCESS);
+
+       ok_long(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush), sizeof(LOGBRUSH));
+       ok_long(logbrush.lbStyle, BS_DIBPATTERN);
+       ok_long(logbrush.lbColor, 0);
+       ok_long(logbrush.lbHatch, (ULONG_PTR)&PackedDIB);
+
+       ok_err(ERROR_SUCCESS);
+       DeleteObject(hBrush);
+
+
+    /* Create a DIB brush with undocumented iUsage 2 */
+    hBrush = CreateDIBPatternBrushPt(&PackedDIB, 2);
+       ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
+       if (!hBrush) return;
+
+       FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
+       SetLastError(ERROR_SUCCESS);
+
+       ok_long(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush), sizeof(LOGBRUSH));
+       ok_long(logbrush.lbStyle, BS_DIBPATTERN);
+       ok_long(logbrush.lbColor, 0);
+       ok_long(logbrush.lbHatch, (ULONG_PTR)&PackedDIB);
+
+       ok_err(ERROR_SUCCESS);
+       DeleteObject(hBrush);
+
+}
+
 void
 Test_Pen(void)
 {
@@ -359,6 +447,7 @@ Test_ExtPen(void)
                EXTLOGPEN extlogpen;
                DWORD dwStyles[50];
        } elpUserStyle;
+       int i;
 
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
@@ -383,9 +472,9 @@ Test_ExtPen(void)
        ok(GetLastError() == ERROR_SUCCESS, "\n");
        ok(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
        ok(GetLastError() ==  ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError());
-    SetLastError(ERROR_SUCCESS);
+    SetLastError(0xbadbad00);
        ok(GetObject(hPen, 0, &extlogpen) == 0, "\n");
-       ok(GetLastError() == ERROR_NOACCESS, "got %ld\n", GetLastError());
+    ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
     SetLastError(ERROR_SUCCESS);
        ok(GetObject(hPen, 4, &extlogpen) == 0, "\n");
        ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
@@ -422,9 +511,8 @@ Test_ExtPen(void)
        hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);
        ok(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD), "\n");
        ok(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD), "\n");
-       ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0, "\n");
-       ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1, "\n");
-       ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15, "\n");
+       for (i = 0; i <= 15; i++)
+               ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[i] == i, "%d\n", i);
        DeleteObject(hPen);
 }
 
@@ -446,6 +534,7 @@ Test_Font(void)
         ENUMLOGFONTW enumlogfontw;
         BYTE bData[270];
        } u;
+       int ret;
 
        FillMemory(&u, sizeof(u), 0x77);
        hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
@@ -531,13 +620,15 @@ Test_Font(void)
        ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &u.enumlogfontexw) == sizeof(ENUMLOGFONTEXW), "\n"); // 348
        ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW) + 1, &u.enumlogfontexw) == sizeof(ENUMLOGFONTEXW) + 1, "\n"); // 348
        ok(GetObjectW(hFont, 355, &u.enumlogfontexdvw) == 355, "\n"); // 419
+
        ok(GetObjectW(hFont, 356, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
+       ret = sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD);
+       ret = GetObjectW(hFont, 357, &u.enumlogfontexdvw);
+       ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n");
+       ok(GetObjectW(hFont, 357, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
        ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW) - 1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
        ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 420
        ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 356!
-
-       ok(GetObjectW(hFont, 356, &u.bData) == 356, "\n");
-       ok(GetObjectW(hFont, 357, &u.bData) == 356, "\n");
        ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
 
        DeleteObject(hFont);
@@ -551,19 +642,18 @@ Test_Colorspace(void)
        SetLastError(ERROR_SUCCESS);
        GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL);
        //ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60, "\n");// FIXME: what structure? fails on win7
-       ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "\n");
+       ok_err(ERROR_INSUFFICIENT_BUFFER);
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0, "\n");
-       ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "\n");
+       ok_err(ERROR_INSUFFICIENT_BUFFER);
        SetLastError(ERROR_SUCCESS);
        ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 327, buffer) == 0, "\n");
-       ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
+       ok_err(ERROR_INSUFFICIENT_BUFFER);
        ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, buffer) == 0, "\n");
-       ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
+       ok_err(ERROR_INVALID_PARAMETER);
 
-       ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, NULL) == 0, "\n");
-       //ok(ret == 0, "Expected ... got %d\n", ret);
-       ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
+       //ok_long(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, NULL), 0); // FIXME: fails on WHS
+       //ok_err(ERROR_INSUFFICIENT_BUFFER);
 }
 
 void
@@ -608,6 +698,7 @@ START_TEST(GetObject)
        Test_Dibsection();
        Test_Palette();
        Test_Brush();
+       Test_DIBBrush();
        Test_Pen();
        Test_ExtPen(); // not implemented yet in ROS
        Test_MetaDC();