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