[RAPPS] Stopped GCC whining (fixed GCC build)
[reactos.git] / rostests / apitests / gdi32 / SelectObject.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for SelectObject
5 * PROGRAMMERS: Timo Kreuzer
6 */
7
8 #include <apitest.h>
9
10 #include <stdio.h>
11 #include <wingdi.h>
12 #include <winddi.h>
13 #include <winuser.h>
14 #include <include/ntgdityp.h>
15 #include <include/ntgdihdl.h>
16
17 #define TEST(x) ok(x, #x"\n")
18 #define RTEST(x) ok(x, #x"\n")
19
20 HDC hdc1, hdc2;
21
22 static void
23 Test_SelectObject()
24 {
25 HGDIOBJ hOldObj, hNewObj;
26 // PGDI_TABLE_ENTRY pEntry;
27 // PDC_ATTR pDc_Attr;
28 // HANDLE hcmXform;
29
30 /* Get the Dc_Attr for later testing */
31 // pEntry = &GdiHandleTable[GDI_HANDLE_GET_INDEX(hdc1)];
32 // pDc_Attr = pEntry->UserData;
33 // ok(pDc_Attr != NULL, "Skipping tests.\n");
34 // if (pDc_Attr == NULL) return;
35
36 /* Test incomplete dc handle doesn't work */
37 SetLastError(ERROR_SUCCESS);
38 hNewObj = GetStockObject(GRAY_BRUSH);
39 hOldObj = SelectObject((HDC)GDI_HANDLE_GET_INDEX(hdc1), hNewObj);
40 ok_err(ERROR_INVALID_HANDLE);
41 ok(hOldObj == NULL, "\n");
42 // ok(pDc_Attr->hbrush == GetStockObject(WHITE_BRUSH), "\n");
43 SelectObject(hdc1, hOldObj);
44
45 /* Test incomplete hobj handle works */
46 hNewObj = GetStockObject(GRAY_BRUSH);
47 hOldObj = SelectObject(hdc1, (HGDIOBJ)GDI_HANDLE_GET_INDEX(hNewObj));
48 ok(hOldObj == GetStockObject(WHITE_BRUSH), "\n");
49 // ok(pDc_Attr->hbrush == hNewObj, "\n");
50 SelectObject(hdc1, hOldObj);
51
52 /* Test wrong hDC handle type */
53 SetLastError(ERROR_SUCCESS);
54 hNewObj = GetStockObject(GRAY_BRUSH);
55 hdc2 = (HDC)((UINT_PTR)hdc1 & ~GDI_HANDLE_TYPE_MASK);
56 hdc2 = (HDC)((UINT_PTR)hdc2 | GDI_OBJECT_TYPE_PEN);
57 hOldObj = SelectObject(hdc2, hNewObj);
58 ok_err(ERROR_INVALID_HANDLE);
59 ok(hOldObj == NULL, "\n");
60 // RTEST(pDc_Attr->hbrush == GetStockObject(WHITE_BRUSH));
61
62 /* Test wrong hobj handle type */
63 SetLastError(ERROR_SUCCESS);
64 hNewObj = GetStockObject(GRAY_BRUSH);
65 hNewObj = (HGDIOBJ)((UINT_PTR)hNewObj & ~GDI_HANDLE_TYPE_MASK);
66 hNewObj = (HGDIOBJ)((UINT_PTR)hNewObj | GDI_OBJECT_TYPE_PEN);
67 hOldObj = SelectObject(hdc1, hNewObj);
68 ok_err(ERROR_SUCCESS);
69 ok(hOldObj == NULL, "\n");
70 // RTEST(pDc_Attr->hbrush == GetStockObject(WHITE_BRUSH));
71
72 SetLastError(ERROR_SUCCESS);
73 hNewObj = (HGDIOBJ)0x00761234;
74 hOldObj = SelectObject(hdc1, hNewObj);
75 ok(hOldObj == NULL, "\n");
76 ok_err(ERROR_SUCCESS);
77 SelectObject(hdc1, hOldObj);
78
79 /* Test DC */
80 SetLastError(ERROR_SUCCESS);
81 hOldObj = SelectObject(hdc1, GetDC(NULL));
82 ok(hOldObj == NULL, "\n");
83 ok_err(ERROR_SUCCESS);
84
85
86 /* Test CLIOBJ */
87
88 /* Test PATH */
89
90 /* Test PALETTE */
91 SetLastError(ERROR_SUCCESS);
92 hNewObj = GetStockObject(DEFAULT_PALETTE);
93 hOldObj = SelectObject(hdc1, hNewObj);
94 RTEST(hOldObj == NULL);
95 ok_err(ERROR_INVALID_FUNCTION);
96
97 /* Test COLORSPACE */
98
99 /* Test FONT */
100
101 /* Test PFE */
102
103 /* Test BRUSH */
104 hNewObj = GetStockObject(GRAY_BRUSH);
105 hOldObj = SelectObject(hdc1, hNewObj);
106 RTEST(hOldObj == GetStockObject(WHITE_BRUSH));
107 // RTEST(pDc_Attr->hbrush == hNewObj);
108 RTEST(GDI_HANDLE_GET_TYPE(hOldObj) == GDI_OBJECT_TYPE_BRUSH);
109 SelectObject(hdc1, hOldObj);
110
111 /* Test DC_BRUSH */
112 hNewObj = GetStockObject(DC_BRUSH);
113 hOldObj = SelectObject(hdc1, hNewObj);
114 // RTEST(pDc_Attr->hbrush == hNewObj);
115 SelectObject(hdc1, hOldObj);
116
117 /* Test BRUSH color xform */
118 // hcmXform = (HANDLE)pDc_Attr->hcmXform;
119
120
121 /* Test EMF */
122
123 /* test METAFILE */
124 SetLastError(ERROR_SUCCESS);
125 hNewObj = CreateMetaFile(NULL);
126 ok(hNewObj != 0, "failed to create a meta dc\n");
127 hOldObj = SelectObject(hdc1, hNewObj);
128 RTEST(hOldObj == NULL);
129 ok_err(ERROR_SUCCESS);
130
131 /* Test ENHMETAFILE */
132
133 /* Test EXTPEN */
134
135 /* Test METADC */
136 }
137
138 static void
139 Test_Bitmap()
140 {
141 HBITMAP hbmp, hbmpInvalid, hbmpOld;
142 BYTE bmBits[4] = {0};
143 HDC hdcTmp;
144
145 hbmp = CreateBitmap(2, 2, 1, 1, &bmBits);
146 hbmpInvalid = CreateBitmap(2, 2, 1, 4, &bmBits);
147 if (!hbmp || !hbmpInvalid)
148 {
149 printf("couldn't create bitmaps, skipping\n");
150 return;
151 }
152
153 hbmpOld = SelectObject(hdc1, hbmp);
154 ok(GDI_HANDLE_GET_TYPE(hbmpOld) == GDI_OBJECT_TYPE_BITMAP, "wrong type\n");
155
156 /* Test invalid BITMAP */
157 ok(SelectObject(hdc1, hbmpInvalid) == NULL, "should fail\n");
158
159 /* Test if we get the right bitmap back */
160 hbmpOld = SelectObject(hdc1, hbmpOld);
161 ok(hbmpOld == hbmp, "didn't get the right bitmap back.\n");
162
163 /* Test selecting bitmap into 2 DCs */
164 hbmpOld = SelectObject(hdc1, hbmp);
165 ok(SelectObject(hdc2, hbmp) == NULL, "Should fail.\n");
166
167 /* Test selecting same bitmap twice */
168 hbmpOld = SelectObject(hdc1, hbmp);
169 ok(hbmpOld == hbmp, "didn't get the right bitmap back.\n");
170 SelectObject(hdc1, GetStockObject(DEFAULT_BITMAP));
171
172 /* Test selecting and then deleting the DC */
173 hdcTmp = CreateCompatibleDC(NULL);
174 hbmpOld = SelectObject(hdcTmp, hbmp);
175 ok(hbmpOld == GetStockObject(DEFAULT_BITMAP), "didn't get the right bitmap back.\n");
176 DeleteDC(hdcTmp);
177 hbmpOld = SelectObject(hdc1, hbmp);
178 ok(hbmpOld == GetStockObject(DEFAULT_BITMAP), "didn't get the right bitmap back.\n");
179
180 DeleteObject(hbmp);
181 DeleteObject(hbmpInvalid);
182 }
183
184 static void
185 Test_Pen()
186 {
187 HPEN hpen, hpenOld;
188
189 /* Test PEN */
190 hpen = GetStockObject(GRAY_BRUSH);
191 hpenOld = SelectObject(hdc1, hpen);
192 ok(hpenOld == GetStockObject(WHITE_BRUSH), "Got wrong pen.\n");
193 // RTEST(pDc_Attr->hbrush == hpen);
194 ok(GDI_HANDLE_GET_TYPE(hpenOld) == GDI_OBJECT_TYPE_BRUSH, "wrong type.\n");
195 SelectObject(hdc1, hpenOld);
196 }
197
198 static void
199 Test_Region()
200 {
201 HRGN hrgn, hrgnOld;
202
203 /* Test REGION */
204 SetLastError(ERROR_SUCCESS);
205 hrgn = CreateRectRgn(0,0,0,0);
206 hrgnOld = SelectObject(hdc1, hrgn);
207 ok((UINT_PTR)hrgnOld == NULLREGION, "\n");
208 DeleteObject(hrgn);
209
210 hrgn = CreateRectRgn(0,0,10,10);
211 ok((UINT_PTR)SelectObject(hdc1, hrgn) == SIMPLEREGION, "\n");
212 hrgnOld = CreateRectRgn(5,5,20,20);
213 ok(CombineRgn(hrgn, hrgn, hrgnOld, RGN_OR) == COMPLEXREGION, "\n");
214 DeleteObject(hrgnOld);
215 ok((UINT_PTR)SelectObject(hdc1, hrgn) == SIMPLEREGION, "\n"); // ??? Why this?
216 DeleteObject(hrgn);
217 // ok(IsHandleValid(hrgn) == TRUE, "\n");
218 ok_err(ERROR_SUCCESS);
219 }
220
221 START_TEST(SelectObject)
222 {
223 hdc1 = CreateCompatibleDC(NULL);
224 hdc2 = CreateCompatibleDC(NULL);
225 if (!hdc1 || !hdc2)
226 {
227 printf("couldn't create DCs, skipping all tests\n");
228 return;
229 }
230
231 Test_SelectObject();
232 Test_Bitmap();
233 Test_Pen();
234 Test_Region();
235 }
236