#include "../user32api.h"

INT
Test_ScrollDC(PTESTINFO pti)
{
	HWND hWnd, hWnd2;
	HDC hDC;
	HRGN hrgn;
	RECT rcClip;

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

	/* Assert that no update region is there */
	hrgn = CreateRectRgn(0,0,0,0);
	ASSERT(GetUpdateRgn(hWnd, hrgn, FALSE) == NULLREGION);

    /* Test normal scrolling */
	TEST(ScrollDC(hDC, 0, 0, NULL, NULL, hrgn, NULL) == TRUE);

    /* Scroll with invalid update region */
	DeleteObject(hrgn);
	TEST(ScrollDC(hDC, 50, 0, NULL, NULL, hrgn, NULL) == FALSE);
	hrgn = CreateRectRgn(0,0,0,0);
	TEST(GetUpdateRgn(hWnd, hrgn, FALSE) == NULLREGION);

    /* Scroll with invalid update rect pointer */
	TEST(ScrollDC(hDC, 50, 0, NULL, NULL, NULL, (PRECT)1) == 0);
	TEST(GetUpdateRgn(hWnd, hrgn, FALSE) == NULLREGION);

    /* Scroll with a clip rect */
    rcClip.left = 50; rcClip.top = 0; rcClip.right = 100; rcClip.bottom = 100;
	TEST(ScrollDC(hDC, 50, 0, NULL, &rcClip, hrgn, NULL) == TRUE);
	TEST(GetUpdateRgn(hWnd, hrgn, FALSE) == NULLREGION);

    /* Scroll with a clip rect */
    rcClip.left = 50; rcClip.top = 0; rcClip.right = 100; rcClip.bottom = 100;
	TEST(ScrollDC(hDC, 50, 50, NULL, &rcClip, hrgn, NULL) == TRUE);
	TEST(GetUpdateRgn(hWnd, hrgn, FALSE) == NULLREGION);

	/* Overlap with another window */
	hWnd2 = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
	                    30, 160, 100, 100,
	                    NULL, NULL, g_hInstance, 0);
	UpdateWindow(hWnd2);

    /* Cleanup */
	ReleaseDC(hWnd, hDC);
    DestroyWindow(hWnd);
    DestroyWindow(hWnd2);

	return APISTATUS_NORMAL;
}
