[ROSTESTS:APITESTS]
[reactos.git] / rostests / apitests / gdi32 / CombineRgn.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for ...
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include <apitest.h>
9
10 #include <wingdi.h>
11
12 void Test_CombineRgn_Params()
13 {
14 HRGN hrgn1, hrgn2, hrgn3;
15
16 hrgn1 = CreateRectRgn(0, 0, 0, 0);
17 hrgn2 = CreateRectRgn(0, 0, 10, 10);
18 hrgn3 = CreateRectRgn(5, 5, 20, 20);
19
20 SetLastError(0xbadbabe);
21 ok_long(CombineRgn(NULL, NULL, NULL, 0), ERROR);
22 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, 0), ERROR);
23 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, 6), ERROR);
24 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_PARAMETER), "wrong error: %ld\n", GetLastError());
25
26 }
27
28 void Test_CombineRgn_COPY()
29 {
30 HRGN hrgn1, hrgn2, hrgn3;
31
32 hrgn1 = CreateRectRgn(0, 0, 0, 0);
33 hrgn2 = CreateRectRgn(0, 0, 10, 10);
34 hrgn3 = CreateRectRgn(5, 5, 20, 20);
35
36 SetLastError(0xbadbabe);
37 ok_long(CombineRgn(NULL, NULL, NULL, RGN_COPY), ERROR);
38 ok_long(CombineRgn(NULL, hrgn1, NULL, RGN_COPY), ERROR);
39 ok_long(CombineRgn(NULL, NULL, hrgn1, RGN_COPY), ERROR);
40 ok_long(CombineRgn(NULL, hrgn1, hrgn2, RGN_COPY), ERROR);
41 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
42
43 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_COPY), SIMPLEREGION);
44 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
45
46 ok_long(CombineRgn(hrgn1, hrgn1, NULL, RGN_COPY), SIMPLEREGION);
47 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
48
49 ok_long(CombineRgn(hrgn1, hrgn3, GetStockObject(BLACK_PEN), RGN_COPY), SIMPLEREGION);
50 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
51
52 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_COPY), ERROR);
53 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
54
55 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_COPY), ERROR);
56 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
57
58 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_COPY), ERROR);
59 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
60
61 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
62
63 }
64
65 void Test_CombineRgn_AND()
66 {
67 HRGN hrgn1, hrgn2, hrgn3;
68
69 hrgn1 = CreateRectRgn(0, 0, 0, 0);
70 hrgn2 = CreateRectRgn(0, 0, 10, 10);
71 hrgn3 = CreateRectRgn(5, 5, 20, 20);
72
73 SetLastError(0xbadbabe);
74 ok_long(CombineRgn(NULL, NULL, NULL, RGN_AND), ERROR);
75 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_AND), ERROR);
76 ok_long(CombineRgn(hrgn1, hrgn2, NULL, RGN_AND), ERROR);
77 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_AND), ERROR);
78 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_AND), ERROR);
79 ok_long(CombineRgn(hrgn1, hrgn2, GetStockObject(BLACK_PEN), RGN_AND), ERROR);
80 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
81
82
83 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_AND), SIMPLEREGION);
84 SetRectRgn(hrgn2, 5, 5, 10, 10);
85 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
86
87 SetRectRgn(hrgn2, 0, 0, 5, 5);
88 SetRectRgn(hrgn3, 5, 0, 10, 5);
89 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_AND), NULLREGION);
90 SetRectRgn(hrgn2, 0, 0, 0, 0);
91 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
92
93 SetRectRgn(hrgn2, 0, 0, 20, 20);
94 SetRectRgn(hrgn3, 5, 5, 10, 10);
95 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_AND), SIMPLEREGION);
96 SetRectRgn(hrgn2, 5, 5, 10, 10);
97 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
98
99
100 SetRectRgn(hrgn2, 0, 0, 30, 10);
101 SetRectRgn(hrgn3, 10, 10, 20, 30);
102 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_OR), COMPLEXREGION);
103 SetRectRgn(hrgn2, 10, 0, 30, 30);
104 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_AND), COMPLEXREGION);
105 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_AND), COMPLEXREGION);
106 SetRectRgn(hrgn2, 10, 10, 30, 30);
107 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_AND), SIMPLEREGION);
108 SetRectRgn(hrgn2, 0, 0, 10, 10);
109 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_AND), NULLREGION);
110
111 SetRectRgn(hrgn1, 0, 0, 30, 10);
112 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_AND), SIMPLEREGION);
113
114 }
115
116 void Test_CombineRgn_OR()
117 {
118 HRGN hrgn1, hrgn2, hrgn3;
119
120 hrgn1 = CreateRectRgn(0, 0, 0, 0);
121 hrgn2 = CreateRectRgn(0, 0, 5, 5);
122 hrgn3 = CreateRectRgn(5, 0, 10, 5);
123 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_OR), SIMPLEREGION);
124 SetRectRgn(hrgn2, 0, 0, 10, 5);
125 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
126
127 SetRectRgn(hrgn2, 0, 0, 10, 10);
128 SetRectRgn(hrgn3, 10, 10, 20, 20);
129 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_OR), COMPLEXREGION);
130 SetRectRgn(hrgn2, 10, 0, 20, 10);
131 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_OR), COMPLEXREGION);
132 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_OR), COMPLEXREGION);
133 SetRectRgn(hrgn2, 0, 10, 10, 20);
134 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_OR), SIMPLEREGION);
135 SetRectRgn(hrgn2, 0, 0, 20, 20);
136 ok(EqualRgn(hrgn1, hrgn2), "Region is not correct\n");
137
138 }
139
140 void Test_CombineRgn_DIFF()
141 {
142 HRGN hrgn1, hrgn2, hrgn3;
143
144 hrgn1 = CreateRectRgn(0, 0, 0, 0);
145 hrgn2 = CreateRectRgn(0, 0, 10, 10);
146 hrgn3 = CreateRectRgn(5, 0, 10, 5);
147
148 SetLastError(0xbadbabe);
149 ok_long(CombineRgn(NULL, NULL, NULL, RGN_DIFF), ERROR);
150 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_DIFF), ERROR);
151 ok_long(CombineRgn(hrgn1, hrgn2, NULL, RGN_DIFF), ERROR);
152 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_DIFF), ERROR);
153 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_DIFF), ERROR);
154 ok_long(CombineRgn(hrgn1, hrgn2, GetStockObject(BLACK_PEN), RGN_DIFF), ERROR);
155 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
156
157 ok_long(CombineRgn(hrgn1, hrgn1, hrgn1, RGN_DIFF), NULLREGION);
158 ok_long(CombineRgn(hrgn1, hrgn2, hrgn2, RGN_DIFF), NULLREGION);
159 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_DIFF), NULLREGION);
160
161 ok_long(CombineRgn(hrgn1, hrgn2, hrgn1, RGN_DIFF), SIMPLEREGION);
162 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_DIFF), COMPLEXREGION);
163 ok_long(CombineRgn(hrgn1, hrgn1, hrgn3, RGN_DIFF), COMPLEXREGION);
164 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_DIFF), NULLREGION);
165
166
167 }
168
169 void Test_CombineRgn_XOR()
170 {
171 HRGN hrgn1, hrgn2, hrgn3, hrgn4;
172
173 hrgn1 = CreateRectRgn(0, 0, 0, 0);
174 hrgn2 = CreateRectRgn(0, 0, 5, 5);
175 hrgn3 = CreateRectRgn(5, 5, 10, 10);
176 hrgn4 = CreateRectRgn(0, 0, 0, 0);
177
178 SetLastError(0xbadbabe);
179 ok_long(CombineRgn(NULL, NULL, NULL, RGN_XOR), ERROR);
180 ok_long(CombineRgn(hrgn1, NULL, NULL, RGN_XOR), ERROR);
181 ok_long(CombineRgn(hrgn1, hrgn2, NULL, RGN_XOR), ERROR);
182 ok_long(CombineRgn(hrgn1, NULL, hrgn2, RGN_XOR), ERROR);
183 ok_long(CombineRgn(hrgn1, GetStockObject(BLACK_PEN), hrgn2, RGN_XOR), ERROR);
184 ok_long(CombineRgn(hrgn1, hrgn2, GetStockObject(BLACK_PEN), RGN_XOR), ERROR);
185 ok((GetLastError() == 0xbadbabe) || (GetLastError() == ERROR_INVALID_HANDLE), "wrong error: %ld\n", GetLastError());
186
187 ok_long(CombineRgn(hrgn1, hrgn2, hrgn3, RGN_XOR), COMPLEXREGION);
188 ok_long(CombineRgn(hrgn4, hrgn2, hrgn3, RGN_OR), COMPLEXREGION);
189 ok(EqualRgn(hrgn1, hrgn4), "Region is not correct\n");
190
191 ok_long(CombineRgn(hrgn1, hrgn1, hrgn2, RGN_XOR), SIMPLEREGION);
192 ok(EqualRgn(hrgn1, hrgn3), "Region is not correct\n");
193 ok_long(CombineRgn(hrgn1, hrgn1, hrgn3, RGN_XOR), NULLREGION);
194
195
196 }
197
198 START_TEST(CombineRgn)
199 {
200 Test_CombineRgn_Params();
201 Test_CombineRgn_COPY();
202 Test_CombineRgn_AND();
203 Test_CombineRgn_OR();
204 Test_CombineRgn_DIFF();
205 Test_CombineRgn_XOR();
206 }
207