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