/*
 * PROJECT:         ReactOS api tests
 * LICENSE:         GPL - See COPYING in the top level directory
 * PURPOSE:         Test for GetCurrentObject
 * PROGRAMMERS:     Timo Kreuzer
 */

#include "precomp.h"

void Test_GetCurrentObject()
{
	HWND hWnd;
	HDC hDC;
	HBITMAP hBmp;
	HGDIOBJ hObj;

	/* Create a window */
	hWnd = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
	                    CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
	                    NULL, NULL, 0, 0);
	/* Get the DC */
	hDC = GetDC(hWnd);

	/* Test NULL DC */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(NULL, 0);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(NULL, OBJ_BITMAP);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	hObj = GetCurrentObject(NULL, OBJ_BRUSH);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	hObj = GetCurrentObject(NULL, OBJ_COLORSPACE);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	hObj = GetCurrentObject(NULL, OBJ_FONT);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	hObj = GetCurrentObject(NULL, OBJ_PAL);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	hObj = GetCurrentObject(NULL, OBJ_PEN);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Test invalid DC handle */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject((HDC)-123, OBJ_PEN);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject((HDC)-123, OBJ_BITMAP);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Test invalid types */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 0);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject((HDC)-123, 0);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 3);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(NULL, 3);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 4);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 8);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 9);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 10);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 12);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, 13);
	ok(hObj == 0, "Expected 0, got %p\n", hObj);
	ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %lu\n", GetLastError());

	/* Default bitmap */
	SetLastError(ERROR_SUCCESS);
	hBmp = GetCurrentObject(hDC, OBJ_BITMAP);
	ok(GDI_HANDLE_GET_TYPE(hBmp) == GDI_OBJECT_TYPE_BITMAP, "Expected GDI_OBJECT_TYPE_BITMAP, got %lu\n", GDI_HANDLE_GET_TYPE(hBmp));
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Other bitmap */
	SetLastError(ERROR_SUCCESS);
	SelectObject(hDC, GetStockObject(21));
	ok(hBmp == GetCurrentObject(hDC, OBJ_BITMAP), "\n");
	ok(GDI_HANDLE_GET_TYPE(hBmp) == GDI_OBJECT_TYPE_BITMAP, "Expected GDI_OBJECT_TYPE_BITMAP, got %lu\n", GDI_HANDLE_GET_TYPE(hBmp));
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Default brush */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, OBJ_BRUSH);
	ok(hObj == GetStockObject(WHITE_BRUSH), "Expected %p, got %p\n", GetStockObject(WHITE_BRUSH), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Other brush */
	SetLastError(ERROR_SUCCESS);
	SelectObject(hDC, GetStockObject(BLACK_BRUSH));
	hObj = GetCurrentObject(hDC, OBJ_BRUSH);
	ok(hObj == GetStockObject(BLACK_BRUSH), "Expected %p, got %p\n", GetStockObject(BLACK_BRUSH), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Default colorspace */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, OBJ_COLORSPACE);
	ok(hObj == GetStockObject(20), "Expected %p, got %p\n", GetStockObject(20), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Default font */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, OBJ_FONT);
	ok(hObj == GetStockObject(SYSTEM_FONT), "Expected %p, got %p\n", GetStockObject(SYSTEM_FONT), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Other font */
	SetLastError(ERROR_SUCCESS);
	SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT));
	hObj = GetCurrentObject(hDC, OBJ_FONT);
	ok(hObj == GetStockObject(DEFAULT_GUI_FONT), "Expected %p, got %p\n", GetStockObject(DEFAULT_GUI_FONT), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Default palette */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, OBJ_PAL);
	ok(hObj == GetStockObject(DEFAULT_PALETTE), "Expected %p, got %p\n", GetStockObject(DEFAULT_PALETTE), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Default pen */
	SetLastError(ERROR_SUCCESS);
	hObj = GetCurrentObject(hDC, OBJ_PEN);
	ok(hObj == GetStockObject(BLACK_PEN), "Expected %p, got %p\n", GetStockObject(BLACK_PEN), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* Other pen */
	SetLastError(ERROR_SUCCESS);
	SelectObject(hDC, GetStockObject(WHITE_PEN));
	hObj = GetCurrentObject(hDC, OBJ_PEN);
	ok(hObj == GetStockObject(WHITE_PEN), "Expected %p, got %p\n", GetStockObject(WHITE_PEN), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	/* DC pen */
	SetLastError(ERROR_SUCCESS);
	SelectObject(hDC, GetStockObject(DC_PEN));
	hObj = GetCurrentObject(hDC, OBJ_PEN);
	ok(hObj == GetStockObject(DC_PEN), "Expected %p, got %p\n", GetStockObject(DC_PEN), hObj);
	ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", GetLastError());

	ReleaseDC(hWnd, hDC);
	DestroyWindow(hWnd);
}

START_TEST(GetCurrentObject)
{
    Test_GetCurrentObject();
}