1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtUserScrollDC
5 * PROGRAMMERS:
6 */
7
8 #include "../win32nt.h"
9
START_TEST(NtUserScrollDC)10 START_TEST(NtUserScrollDC)
11 {
12 HINSTANCE hinst = GetModuleHandle(NULL);
13 HWND hWnd;
14 HDC hDC;
15 HRGN hRgn, hTmpRgn;
16 RECT rcScroll, rcClip, rcUpdate;
17 RECT rect = {0,0,100,100};
18 INT Result;
19
20 hWnd = CreateWindowA("BUTTON",
21 "Test",
22 BS_PUSHBUTTON | WS_VISIBLE,
23 0,
24 0,
25 50,
26 100,
27 NULL,
28 NULL,
29 hinst,
30 0);
31 ASSERT(hWnd);
32 RedrawWindow(hWnd, &rect, NULL, RDW_UPDATENOW);
33
34 hDC = GetDC(hWnd);
35 ASSERT(hDC);
36
37 hRgn = CreateRectRgn(0,0,10,10);
38
39
40 /* Test inverted clip rect */
41 rcScroll.left = 0;
42 rcScroll.top = 25;
43 rcScroll.right = 100;
44 rcScroll.bottom = 40;
45 rcClip.left = 0;
46 rcClip.top = 35;
47 rcClip.right = -70;
48 rcClip.bottom = -1000;
49 SetLastError(ERROR_SUCCESS);
50 Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate);
51 RTEST(Result == 1);
52 RTEST(GetLastError() == ERROR_SUCCESS);
53
54 /* Test inverted scroll rect */
55 rcScroll.left = 0;
56 rcScroll.top = 25;
57 rcScroll.right = -100;
58 rcScroll.bottom = -40;
59 rcClip.left = 0;
60 rcClip.top = 35;
61 rcClip.right = 70;
62 rcClip.bottom = 1000;
63 SetLastError(ERROR_SUCCESS);
64 Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate);
65 RTEST(Result == 1);
66 RTEST(GetLastError() == ERROR_SUCCESS);
67
68 rcScroll.left = 0;
69 rcScroll.top = 25;
70 rcScroll.right = 100;
71 rcScroll.bottom = 40;
72
73 /* Test invalid update region */
74 SetLastError(ERROR_SUCCESS);
75 Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, (HRGN)0x123456, &rcUpdate);
76 RTEST(Result == 0);
77 TEST(GetLastError() == ERROR_INVALID_HANDLE);
78
79 /* Test invalid dc */
80 SetLastError(ERROR_SUCCESS);
81 Result = NtUserScrollDC((HDC)0x123456, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate);
82 RTEST(Result == 0);
83 RTEST(GetLastError() == ERROR_SUCCESS);
84
85 /* Test invalid update rect */
86 SetLastError(ERROR_SUCCESS);
87 Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, (PVOID)(LONG_PTR)0x80001000);
88 RTEST(Result == 0);
89 RTEST(GetLastError() == ERROR_NOACCESS);
90
91 Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate);
92
93 RTEST(Result == TRUE);
94 RTEST(rcUpdate.left == 0);
95 RTEST(rcUpdate.top == 35);
96 RTEST(rcUpdate.right == 70);
97 RTEST(rcUpdate.bottom == 55);
98
99 hTmpRgn = CreateRectRgn(10,45,70,55);
100 Result = CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR);
101 RTEST(Result == SIMPLEREGION);
102
103 SetRectRgn(hTmpRgn,0,35,70,40);
104 Result = CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR);
105 RTEST(Result == NULLREGION);
106
107 DeleteObject(hTmpRgn);
108
109 /* TODO: Test with another window in front */
110 /* TODO: Test with different viewport extension */
111
112 ReleaseDC(hWnd, hDC);
113 DestroyWindow(hWnd);
114 DeleteObject(hRgn);
115
116 }
117
118