[APOTESTS]
[reactos.git] / rostests / apitests / win32nt / ntgdi / NtGdiDeleteObjectApp.c
diff --git a/rostests/apitests/win32nt/ntgdi/NtGdiDeleteObjectApp.c b/rostests/apitests/win32nt/ntgdi/NtGdiDeleteObjectApp.c
new file mode 100644 (file)
index 0000000..99fb9bc
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * PURPOSE:         Test for NtGdiDeleteObjectApp
+ * PROGRAMMERS:
+ */
+
+#include <win32nt.h>
+
+START_TEST(NtGdiDeleteObjectApp)
+{
+    HDC hdc;
+    HBITMAP hbmp;
+    HBRUSH hbrush;
+    HPEN hpen;
+
+    /* Try to delete 0 */
+    SetLastError(0);
+    TEST(NtGdiDeleteObjectApp(0) == 0);
+    TEST(GetLastError() == 0);
+
+    /* Try to delete something with a stockbit */
+    SetLastError(0);
+    TEST(NtGdiDeleteObjectApp((PVOID)(GDI_HANDLE_STOCK_MASK | 0x1234)) == 1);
+    TEST(GetLastError() == 0);
+
+    /* Delete a compatible DC */
+    SetLastError(0);
+    hdc = CreateCompatibleDC(NULL);
+    ASSERT(GdiIsHandleValid(hdc) == 1);
+    TEST(NtGdiDeleteObjectApp(hdc) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hdc) == 0);
+
+    /* Delete a display DC */
+    SetLastError(0);
+    hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
+    ASSERT(GdiIsHandleValid(hdc) == 1);
+    TEST((hpen=SelectObject(hdc, GetStockObject(WHITE_PEN))) != NULL);
+    SelectObject(hdc, hpen);
+    TEST(NtGdiDeleteObjectApp(hdc) != 0);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hdc) == 1);
+    TEST(SelectObject(hdc, GetStockObject(WHITE_PEN)) == NULL);
+    TESTX(GetLastError() == ERROR_INVALID_PARAMETER, "GetLasterror returned 0x%08x\n", (unsigned int)GetLastError());
+
+    /* Once more */
+    SetLastError(0);
+    hdc = GetDC(0);
+    ASSERT(GdiIsHandleValid(hdc) == 1);
+    TEST(NtGdiDeleteObjectApp(hdc) != 0);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hdc) == 1);
+    TEST(SelectObject(hdc, GetStockObject(WHITE_PEN)) == NULL);
+    TESTX(GetLastError() == ERROR_INVALID_PARAMETER, "GetLasterror returned 0x%08x\n", (unsigned int)GetLastError());
+    /* Make sure */
+    TEST(NtUserCallOneParam((DWORD_PTR)hdc, ONEPARAM_ROUTINE_RELEASEDC) == 0);
+
+    /* Delete a brush */
+    SetLastError(0);
+    hbrush = CreateSolidBrush(0x123456);
+    ASSERT(GdiIsHandleValid(hbrush) == 1);
+    TEST(NtGdiDeleteObjectApp(hbrush) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbrush) == 0);
+
+    /* Try to delete a stock brush */
+    SetLastError(0);
+    hbrush = GetStockObject(BLACK_BRUSH);
+    ASSERT(GdiIsHandleValid(hbrush) == 1);
+    TEST(NtGdiDeleteObjectApp(hbrush) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbrush) == 1);
+
+    /* Delete a bitmap */
+    SetLastError(0);
+    hbmp = CreateBitmap(10, 10, 1, 1, NULL);
+    ASSERT(GdiIsHandleValid(hbmp) == 1);
+    TEST(NtGdiDeleteObjectApp(hbmp) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbmp) == 0);
+
+    /* Create a DC for further use */
+    hdc = CreateCompatibleDC(NULL);
+    ASSERT(hdc);
+
+    /* Try to delete a brush that is selected into a DC */
+    SetLastError(0);
+    hbrush = CreateSolidBrush(0x123456);
+    ASSERT(GdiIsHandleValid(hbrush) == 1);
+    TEST(NtGdiSelectBrush(hdc, hbrush) != NULL);
+    TEST(NtGdiDeleteObjectApp(hbrush) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbrush) == 1);
+
+    /* Try to delete a bitmap that is selected into a DC */
+    SetLastError(0);
+    hbmp = CreateBitmap(10, 10, 1, 1, NULL);
+    ASSERT(GdiIsHandleValid(hbmp) == 1);
+    TEST(NtGdiSelectBitmap(hdc, hbmp) != NULL);
+
+    TEST(NtGdiDeleteObjectApp(hbmp) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbmp) == 1);
+
+    /* Bitmap get's deleted as soon as we dereference it */
+    NtGdiSelectBitmap(hdc, GetStockObject(DEFAULT_BITMAP));
+    TEST(GdiIsHandleValid(hbmp) == 0);
+
+    TEST(NtGdiDeleteObjectApp(hbmp) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbmp) == 0);
+
+    /* Try to delete a brush that is selected into a DC */
+    SetLastError(0);
+    hbrush = CreateSolidBrush(123);
+    ASSERT(GdiIsHandleValid(hbrush) == 1);
+    TEST(NtGdiSelectBrush(hdc, hbrush) != NULL);
+
+    TEST(NtGdiDeleteObjectApp(hbrush) == 1);
+    TEST(GetLastError() == 0);
+    TEST(GdiIsHandleValid(hbrush) == 1);
+}