--- /dev/null
+/*
+ * 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);
+}