4 * Copyright (c) 2004 Zach Gorman
5 * Copyright 2007,2016 Dmitry Timoshkov
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/test.h"
31 #define MODIFIED(rect) (rect.left == 10 && rect.right != 100 && rect.top == 10 && rect.bottom != 100)
32 #define EMPTY(rect) (rect.left == rect.right && rect.bottom == rect.top)
34 static void test_DrawTextCalcRect(void)
38 HFONT hFont
, hOldFont
;
40 static CHAR text
[] = "Example text for testing DrawText in "
42 static WCHAR textW
[] = {'W','i','d','e',' ','c','h','a','r',' ',
43 's','t','r','i','n','g','\0'};
44 static CHAR emptystring
[] = "";
45 static WCHAR emptystringW
[] = { 0 };
46 static CHAR wordbreak_text
[] = "line1 line2";
47 static WCHAR wordbreak_textW
[] = {'l','i','n','e','1',' ','l','i','n','e','2',0};
48 static char tabstring
[] = "one\ttwo";
49 INT textlen
, textheight
, heightcheck
;
50 RECT rect
= { 0, 0, 100, 0 }, rect2
;
53 BOOL conform_xp
= TRUE
;
56 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
57 0, 0, 200, 200, 0, 0, 0, NULL
);
58 ok(hwnd
!= 0, "CreateWindowExA error %u\n", GetLastError());
60 ok(hdc
!= 0, "GetDC error %u\n", GetLastError());
61 trace("hdc %p\n", hdc
);
62 textlen
= lstrlenA(text
);
64 /* LOGFONT initialization */
65 memset(&lf
, 0, sizeof(lf
));
66 lf
.lfCharSet
= ANSI_CHARSET
;
67 lf
.lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
68 lf
.lfWeight
= FW_DONTCARE
;
69 lf
.lfHeight
= 0; /* mapping mode dependent */
70 lf
.lfQuality
= DEFAULT_QUALITY
;
71 lstrcpyA(lf
.lfFaceName
, "Arial");
73 /* DrawText in MM_HIENGLISH with DT_CALCRECT */
74 SetMapMode(hdc
, MM_HIENGLISH
);
75 lf
.lfHeight
= 100 * 9 / 72; /* 9 point */
76 hFont
= CreateFontIndirectA(&lf
);
77 ok(hFont
!= 0, "CreateFontIndirectA error %u\n",
79 hOldFont
= SelectObject(hdc
, hFont
);
81 textheight
= DrawTextA(hdc
, text
, textlen
, &rect
, DT_CALCRECT
|
82 DT_EXTERNALLEADING
| DT_WORDBREAK
| DT_NOCLIP
| DT_LEFT
|
84 ok( textheight
, "DrawTextA error %u\n", GetLastError());
86 trace("MM_HIENGLISH rect.bottom %d\n", rect
.bottom
);
87 ok(rect
.bottom
< 0, "In MM_HIENGLISH, DrawText with "
88 "DT_CALCRECT should return a negative rectangle bottom. "
89 "(bot=%d)\n", rect
.bottom
);
91 SelectObject(hdc
, hOldFont
);
92 ret
= DeleteObject(hFont
);
93 ok( ret
, "DeleteObject error %u\n", GetLastError());
96 /* DrawText in MM_TEXT with DT_CALCRECT */
97 SetMapMode(hdc
, MM_TEXT
);
98 lf
.lfHeight
= -MulDiv(9, GetDeviceCaps(hdc
,
99 LOGPIXELSY
), 72); /* 9 point */
100 hFont
= CreateFontIndirectA(&lf
);
101 ok(hFont
!= 0, "CreateFontIndirectA error %u\n",
103 hOldFont
= SelectObject(hdc
, hFont
);
105 textheight
= DrawTextA(hdc
, text
, textlen
, &rect
, DT_CALCRECT
|
106 DT_EXTERNALLEADING
| DT_WORDBREAK
| DT_NOCLIP
| DT_LEFT
|
108 ok( textheight
, "DrawTextA error %u\n", GetLastError());
110 trace("MM_TEXT rect.bottom %d\n", rect
.bottom
);
111 ok(rect
.bottom
> 0, "In MM_TEXT, DrawText with DT_CALCRECT "
112 "should return a positive rectangle bottom. (bot=%d)\n",
115 /* empty or null text should in some cases calc an empty rectangle */
117 SetRect( &rect
, 10,10, 100, 100);
118 heightcheck
= textheight
= DrawTextExA(hdc
, text
, 0, &rect
, DT_CALCRECT
, NULL
);
119 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
120 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
121 ok(textheight
==0,"Got textheight from DrawTextExA\n");
123 SetRect( &rect
, 10,10, 100, 100);
124 textheight
= DrawTextA(hdc
, text
, 0, &rect
, DT_CALCRECT
);
125 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
126 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
128 ok(textheight
==0,"Got textheight from DrawTextA\n");
129 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
131 SetRect( &rect
, 10,10, 100, 100);
133 heightcheck
= textheight
= DrawTextExA(hdc
, emptystring
, -1, &rect
, DT_CALCRECT
, NULL
);
134 ok(EMPTY(rect
), "rectangle should be empty got %s\n", wine_dbgstr_rect(&rect
));
135 ok(textheight
!=0,"Failed to get textheight from DrawTextExA\n");
137 SetRect( &rect
, 10,10, 100, 100);
138 textheight
= DrawTextA(hdc
, emptystring
, -1, &rect
, DT_CALCRECT
);
139 ok(EMPTY(rect
), "rectangle should be empty got %s\n", wine_dbgstr_rect(&rect
));
140 ok(textheight
!=0,"Failed to get textheight from DrawTextA\n");
141 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
143 SetRect( &rect
, 10,10, 100, 100);
145 heightcheck
= textheight
= DrawTextExA(hdc
, NULL
, -1, &rect
, DT_CALCRECT
, NULL
);
146 ok(EMPTY(rect
), "rectangle should be empty got %s\n", wine_dbgstr_rect(&rect
));
147 if (!textheight
) /* Windows NT 4 */
150 win_skip("XP conformity failed, skipping XP tests. Probably winNT\n");
154 ok(textheight
!=0,"Failed to get textheight from DrawTextExA\n");
156 SetRect( &rect
, 10,10, 100, 100);
157 textheight
= DrawTextA(hdc
, NULL
, -1, &rect
, DT_CALCRECT
);
158 ok(EMPTY(rect
), "rectangle should be empty got %s\n", wine_dbgstr_rect(&rect
));
160 ok(textheight
!=0,"Failed to get textheight from DrawTextA\n");
161 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
163 SetRect( &rect
, 10,10, 100, 100);
164 heightcheck
= textheight
= DrawTextExA(hdc
, NULL
, 0, &rect
, DT_CALCRECT
, NULL
);
165 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
166 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
168 ok(textheight
==0,"Got textheight from DrawTextExA\n");
170 SetRect( &rect
, 10,10, 100, 100);
171 textheight
= DrawTextA(hdc
, NULL
, 0, &rect
, DT_CALCRECT
);
172 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
173 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
175 ok(textheight
==0,"Got textheight from DrawTextA\n");
176 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
178 /* DT_SINGLELINE tests */
180 SetRect( &rect
, 10,10, 100, 100);
181 heightcheck
= textheight
= DrawTextExA(hdc
, text
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
182 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
183 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
185 ok(textheight
==0,"Got textheight from DrawTextExA\n");
187 SetRect( &rect
, 10,10, 100, 100);
188 textheight
= DrawTextA(hdc
, text
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
189 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
190 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
192 ok(textheight
==0,"Got textheight from DrawTextA\n");
193 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
195 SetRect( &rect
, 10,10, 100, 100);
197 heightcheck
= textheight
= DrawTextExA(hdc
, emptystring
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
198 ok(!EMPTY(rect
) && MODIFIED(rect
), "rectangle should be modified got %s\n",
199 wine_dbgstr_rect(&rect
));
200 ok(textheight
!=0,"Failed to get textheight from DrawTextExA\n");
202 SetRect( &rect
, 10,10, 100, 100);
203 textheight
= DrawTextA(hdc
, emptystring
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
204 ok(!EMPTY(rect
) && MODIFIED (rect
), "rectangle should be modified got %s\n",
205 wine_dbgstr_rect(&rect
));
206 ok(textheight
!=0,"Failed to get textheight from DrawTextA\n");
207 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
209 SetRect( &rect
, 10,10, 100, 100);
211 heightcheck
= textheight
= DrawTextExA(hdc
, NULL
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
212 ok(!EMPTY(rect
) && MODIFIED(rect
), "rectangle should be modified got %s\n",
213 wine_dbgstr_rect(&rect
));
215 ok(textheight
!=0,"Failed to get textheight from DrawTextExA\n");
217 SetRect( &rect
, 10,10, 100, 100);
218 textheight
= DrawTextA(hdc
, NULL
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
219 ok(!EMPTY(rect
) && MODIFIED(rect
), "rectangle should be modified got %s\n",
220 wine_dbgstr_rect(&rect
));
222 ok(textheight
!=0,"Failed to get textheight from DrawTextA\n");
223 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
225 SetRect( &rect
, 10,10, 100, 100);
226 heightcheck
= textheight
= DrawTextExA(hdc
, NULL
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
227 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
228 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
230 ok(textheight
==0,"Got textheight from DrawTextExA\n");
232 SetRect( &rect
, 10,10, 100, 100);
233 textheight
= DrawTextA(hdc
, NULL
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
234 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
235 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
237 ok(textheight
==0,"Got textheight from DrawTextA\n");
238 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
240 /* further tests with 0 count, NULL and empty strings */
241 heightcheck
= textheight
= DrawTextA(hdc
, text
, 0, &rect
, 0);
243 ok(textheight
==0,"Got textheight from DrawTextA\n");
244 textheight
= DrawTextExA(hdc
, text
, 0, &rect
, 0, NULL
);
246 ok(textheight
==0,"Got textheight from DrawTextExA\n");
247 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
248 heightcheck
= textheight
= DrawTextA(hdc
, emptystring
, 0, &rect
, 0);
250 ok(textheight
==0,"Got textheight from DrawTextA\n");
251 textheight
= DrawTextExA(hdc
, emptystring
, 0, &rect
, 0, NULL
);
253 ok(textheight
==0,"Got textheight from DrawTextExA\n");
254 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
255 heightcheck
= textheight
= DrawTextA(hdc
, NULL
, 0, &rect
, 0);
257 ok(textheight
==0,"Got textheight from DrawTextA\n");
258 textheight
= DrawTextExA(hdc
, NULL
, 0, &rect
, 0, NULL
);
260 ok(textheight
==0,"Got textheight from DrawTextExA\n");
261 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
262 heightcheck
= textheight
= DrawTextA(hdc
, emptystring
, -1, &rect
, 0);
263 ok(textheight
!=0,"Failed to get textheight from DrawTextA\n");
264 textheight
= DrawTextExA(hdc
, emptystring
, -1, &rect
, 0, NULL
);
265 ok(textheight
!=0,"Failed to get textheight from DrawTextExA\n");
266 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
267 heightcheck
= textheight
= DrawTextA(hdc
, NULL
, -1, &rect
, 0);
269 ok(textheight
!=0,"Failed to get textheight from DrawTextA\n");
270 textheight
= DrawTextExA(hdc
, NULL
, -1, &rect
, 0, NULL
);
272 ok(textheight
!=0,"Failed to get textheight from DrawTextExA\n");
273 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
274 heightcheck
= textheight
= DrawTextA(hdc
, NULL
, 10, &rect
, 0);
275 ok(textheight
==0,"Got textheight from DrawTextA\n");
276 textheight
= DrawTextExA(hdc
, NULL
, 10, &rect
, 0, NULL
);
277 ok(textheight
==0,"Got textheight from DrawTextA\n");
278 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
280 /* When offset to top is zero, return 1 */
282 textheight
= DrawTextExW(hdc
, textW
, -1, &rect
, DT_SINGLELINE
| DT_CALCRECT
| DT_BOTTOM
, NULL
);
283 ok(textheight
== 1, "Expect returned height:1 got:%d\n", textheight
);
285 SetRect(&rect
, 0, 100, 0, 100);
286 textheight
= DrawTextExW(hdc
, textW
, -1, &rect
, DT_SINGLELINE
| DT_CALCRECT
| DT_BOTTOM
, NULL
);
287 ok(textheight
== 1, "Expect returned height:1 got:%d\n", textheight
);
290 textheight
= DrawTextExW(hdc
, textW
, -1, &rect
, DT_SINGLELINE
| DT_CALCRECT
| DT_TOP
, NULL
);
291 /* Set top to text height and bottom zero, so bottom of drawn text to top is zero when DT_VCENTER is used */
292 SetRect(&rect
, 0, textheight
, 0, 0);
293 textheight
= DrawTextExW(hdc
, textW
, -1, &rect
, DT_SINGLELINE
| DT_CALCRECT
| DT_VCENTER
, NULL
);
294 ok(textheight
== 1, "Expect returned height:1 got:%d\n", textheight
);
296 /* invalid dtp size test */
297 dtp
.cbSize
= -1; /* Invalid */
298 dtp
.uiLengthDrawn
= 1337;
299 textheight
= DrawTextExA(hdc
, text
, 0, &rect
, 0, &dtp
);
300 ok(textheight
==0,"Got textheight from DrawTextExA\n");
301 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
302 dtp
.uiLengthDrawn
= 1337;
303 textheight
= DrawTextExA(hdc
, emptystring
, 0, &rect
, 0, &dtp
);
304 ok(textheight
==0,"Got textheight from DrawTextExA\n");
305 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
306 dtp
.uiLengthDrawn
= 1337;
307 textheight
= DrawTextExA(hdc
, NULL
, 0, &rect
, 0, &dtp
);
308 ok(textheight
==0,"Got textheight from DrawTextExA\n");
309 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
310 dtp
.uiLengthDrawn
= 1337;
311 textheight
= DrawTextExA(hdc
, emptystring
, -1, &rect
, 0, &dtp
);
312 ok(textheight
==0,"Got textheight from DrawTextExA\n");
313 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
314 dtp
.uiLengthDrawn
= 1337;
315 textheight
= DrawTextExA(hdc
, NULL
, -1, &rect
, 0, &dtp
);
316 ok(textheight
==0,"Got textheight from DrawTextExA\n");
317 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
319 /* Margin calculations */
320 dtp
.cbSize
= sizeof(dtp
);
322 dtp
.iRightMargin
= 0;
324 DrawTextExA(hdc
, text
, -1, &rect
, DT_CALCRECT
, &dtp
);
325 textlen
= rect
.right
; /* Width without margin */
328 DrawTextExA(hdc
, text
, -1, &rect
, DT_CALCRECT
, &dtp
);
329 ok(rect
.right
==dtp
.iLeftMargin
+textlen
,"Incorrect left margin calculated rc(%d,%d)\n", rect
.left
, rect
.right
);
331 dtp
.iRightMargin
= 8;
333 DrawTextExA(hdc
, text
, -1, &rect
, DT_CALCRECT
, &dtp
);
334 ok(rect
.right
==dtp
.iRightMargin
+textlen
,"Incorrect right margin calculated rc(%d,%d)\n", rect
.left
, rect
.right
);
336 /* Wide char versions */
337 SetRect( &rect
, 10,10, 100, 100);
339 heightcheck
= textheight
= DrawTextExW(hdc
, textW
, 0, &rect
, DT_CALCRECT
, NULL
);
340 if( GetLastError() != ERROR_CALL_NOT_IMPLEMENTED
) {
341 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
342 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
343 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
345 SetRect( &rect
, 10,10, 100, 100);
346 textheight
= DrawTextW(hdc
, textW
, 0, &rect
, DT_CALCRECT
);
347 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
348 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
349 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
350 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
352 SetRect( &rect
, 10,10, 100, 100);
353 heightcheck
= textheight
= DrawTextExW(hdc
, emptystringW
, -1, &rect
, DT_CALCRECT
, NULL
);
354 ok(EMPTY(rect
), "rectangle should be empty got %s\n", wine_dbgstr_rect(&rect
));
355 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
357 SetRect( &rect
, 10,10, 100, 100);
358 textheight
= DrawTextW(hdc
, emptystringW
, -1, &rect
, DT_CALCRECT
);
359 ok(EMPTY(rect
), "rectangle should be empty got %s\n", wine_dbgstr_rect(&rect
));
360 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
361 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
363 SetRect( &rect
, 10,10, 100, 100);
364 heightcheck
= textheight
= DrawTextExW(hdc
, NULL
, 0, &rect
, DT_CALCRECT
, NULL
);
365 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
366 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
367 if (textheight
) /* windows 2000 */
370 win_skip("XP conformity failed, skipping XP tests. Probably win 2000\n");
374 ok(textheight
==0,"Got textheight from DrawTextExW\n");
376 SetRect( &rect
, 10,10, 100, 100);
377 textheight
= DrawTextW(hdc
, NULL
, 0, &rect
, DT_CALCRECT
);
378 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
379 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
381 ok(textheight
==0,"Got textheight from DrawTextW\n");
382 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
386 SetRect( &rect
, 10,10, 100, 100);
387 heightcheck
= textheight
= DrawTextExW(hdc
, NULL
, -1, &rect
, DT_CALCRECT
, NULL
);
388 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
389 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
390 ok(textheight
==0,"Got textheight from DrawTextExW\n");
392 SetRect( &rect
, 10,10, 100, 100);
393 textheight
= DrawTextW(hdc
, NULL
, -1, &rect
, DT_CALCRECT
);
394 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
395 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
396 ok(textheight
==0,"Got textheight from DrawTextW\n");
397 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
401 /* DT_SINGLELINE tests */
403 heightcheck
= textheight
= DrawTextExW(hdc
, textW
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
404 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
405 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
406 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
408 SetRect( &rect
, 10,10, 100, 100);
409 textheight
= DrawTextW(hdc
, textW
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
410 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
411 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
412 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
413 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
415 SetRect( &rect
, 10,10, 100, 100);
416 heightcheck
= textheight
= DrawTextExW(hdc
, emptystringW
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
417 ok(!EMPTY(rect
) && MODIFIED(rect
), "rectangle should be modified got %s\n",
418 wine_dbgstr_rect(&rect
));
419 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
421 SetRect( &rect
, 10,10, 100, 100);
422 textheight
= DrawTextW(hdc
, emptystringW
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
423 ok(!EMPTY(rect
) && MODIFIED(rect
), "rectangle should be modified got %s\n",
424 wine_dbgstr_rect(&rect
));
425 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
426 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
430 SetRect( &rect
, 10,10, 100, 100);
431 heightcheck
= textheight
= DrawTextExW(hdc
, NULL
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
432 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
433 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
434 ok(textheight
==0,"Got textheight from DrawTextExW\n");
436 SetRect( &rect
, 10,10, 100, 100);
437 textheight
= DrawTextW(hdc
, NULL
, -1, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
438 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
439 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
440 ok(textheight
==0,"Got textheight from DrawTextW\n");
441 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
444 SetRect( &rect
, 10,10, 100, 100);
445 heightcheck
= textheight
= DrawTextExW(hdc
, NULL
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
, NULL
);
446 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
447 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
449 ok(textheight
==0,"Got textheight from DrawTextExW\n");
451 SetRect( &rect
, 10,10, 100, 100);
452 textheight
= DrawTextW(hdc
, NULL
, 0, &rect
, DT_CALCRECT
|DT_SINGLELINE
);
453 ok(!IsRectEmpty(&rect
) && !MODIFIED(rect
),
454 "rectangle should NOT be empty and NOT modified got %s\n", wine_dbgstr_rect(&rect
));
456 ok(textheight
==0,"Got textheight from DrawTextW\n");
457 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
459 /* further tests with NULL and empty strings */
460 heightcheck
= textheight
= DrawTextW(hdc
, textW
, 0, &rect
, 0);
461 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
462 textheight
= DrawTextExW(hdc
, textW
, 0, &rect
, 0, NULL
);
463 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
464 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
465 heightcheck
= textheight
= DrawTextW(hdc
, emptystringW
, 0, &rect
, 0);
466 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
467 textheight
= DrawTextExW(hdc
, emptystringW
, 0, &rect
, 0, NULL
);
468 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
469 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
470 heightcheck
= textheight
= DrawTextW(hdc
, NULL
, 0, &rect
, 0);
472 ok(textheight
==0,"Got textheight from DrawTextW\n");
473 textheight
= DrawTextExW(hdc
, NULL
, 0, &rect
, 0, NULL
);
475 ok(textheight
==0,"Got textheight from DrawTextExW\n");
476 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
477 heightcheck
= textheight
= DrawTextW(hdc
, emptystringW
, -1, &rect
, 0);
478 ok(textheight
!=0,"Failed to get textheight from DrawTextW\n");
479 textheight
= DrawTextExW(hdc
, emptystringW
, -1, &rect
, 0, NULL
);
480 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
481 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
484 heightcheck
= textheight
= DrawTextW(hdc
, NULL
, -1, &rect
, 0);
485 ok(textheight
==0,"Got textheight from DrawTextW\n");
486 textheight
= DrawTextExW(hdc
, NULL
, -1, &rect
, 0, NULL
);
487 ok(textheight
==0,"Got textheight from DrawTextExW\n");
488 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
489 heightcheck
= textheight
= DrawTextW(hdc
, NULL
, 10, &rect
, 0);
490 ok(textheight
==0,"Got textheight from DrawTextW\n");
491 textheight
= DrawTextExW(hdc
, NULL
, 10, &rect
, 0, NULL
);
492 ok(textheight
==0,"Got textheight from DrawTextW\n");
493 ok(textheight
== heightcheck
,"DrawTextEx and DrawText differ in return\n");
496 dtp
.cbSize
= -1; /* Invalid */
497 dtp
.uiLengthDrawn
= 1337;
498 textheight
= DrawTextExW(hdc
, textW
, 0, &rect
, 0, &dtp
);
499 ok(textheight
!=0,"Failed to get textheight from DrawTextExW\n");
500 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
501 dtp
.uiLengthDrawn
= 1337;
502 textheight
= DrawTextExW(hdc
, emptystringW
, 0, &rect
, 0, &dtp
);
504 ok(textheight
==0,"Got textheight from DrawTextExW\n");
505 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
506 dtp
.uiLengthDrawn
= 1337;
507 textheight
= DrawTextExW(hdc
, NULL
, 0, &rect
, 0, &dtp
);
509 ok(textheight
==0,"Got textheight from DrawTextExW\n");
510 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
511 dtp
.uiLengthDrawn
= 1337;
512 textheight
= DrawTextExW(hdc
, emptystringW
, -1, &rect
, 0, &dtp
);
513 ok(textheight
==0,"Got textheight from DrawTextExW\n");
514 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
517 dtp
.uiLengthDrawn
= 1337;
518 textheight
= DrawTextExW(hdc
, NULL
, -1, &rect
, 0, &dtp
);
519 ok(textheight
==0,"Got textheight from DrawTextExW\n");
520 ok(dtp
.uiLengthDrawn
==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp
.uiLengthDrawn
);
524 /* More test cases from bug 12226 */
526 textheight
= DrawTextA(hdc
, emptystring
, -1, &rect
, DT_CALCRECT
| DT_LEFT
| DT_SINGLELINE
);
527 ok(textheight
, "DrawTextA error %u\n", GetLastError());
528 ok(0 == rect
.left
, "expected 0, got %d\n", rect
.left
);
529 ok(0 == rect
.right
, "expected 0, got %d\n", rect
.right
);
530 ok(0 == rect
.top
, "expected 0, got %d\n", rect
.top
);
531 ok(rect
.bottom
, "rect.bottom should not be 0\n");
534 textheight
= DrawTextW(hdc
, emptystringW
, -1, &rect
, DT_CALCRECT
| DT_LEFT
| DT_SINGLELINE
);
535 if (!textheight
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
537 win_skip( "DrawTextW not implemented\n" );
541 ok(textheight
, "DrawTextW error %u\n", GetLastError());
542 ok(0 == rect
.left
, "expected 0, got %d\n", rect
.left
);
543 ok(0 == rect
.right
, "expected 0, got %d\n", rect
.right
);
544 ok(0 == rect
.top
, "expected 0, got %d\n", rect
.top
);
545 ok(rect
.bottom
, "rect.bottom should not be 0\n");
548 SetRect(&rect
, 0, 0, 1, 1);
549 heightcheck
= DrawTextA(hdc
, wordbreak_text
, -1, &rect
, DT_CALCRECT
);
550 SetRect(&rect
, 0, 0, 1, 1);
551 textheight
= DrawTextA(hdc
, wordbreak_text
, -1, &rect
, DT_CALCRECT
| DT_WORDBREAK
);
552 ok(textheight
== heightcheck
* 2, "Got unexpected textheight %d, expected %d.\n",
553 textheight
, heightcheck
* 2);
554 SetRect(&rect
, 0, 0, 1, 1);
555 textheight
= DrawTextA(hdc
, wordbreak_text
, -1, &rect
, DT_CALCRECT
| DT_WORDBREAK
| DT_EDITCONTROL
);
556 ok(textheight
>= heightcheck
* 6, "Got unexpected textheight %d, expected at least %d.\n",
557 textheight
, heightcheck
* 6);
559 SetRect(&rect
, 0, 0, 1, 1);
560 heightcheck
= DrawTextW(hdc
, wordbreak_textW
, -1, &rect
, DT_CALCRECT
);
561 SetRect(&rect
, 0, 0, 1, 1);
562 textheight
= DrawTextW(hdc
, wordbreak_textW
, -1, &rect
, DT_CALCRECT
| DT_WORDBREAK
);
563 ok(textheight
== heightcheck
* 2, "Got unexpected textheight %d, expected %d.\n",
564 textheight
, heightcheck
* 2);
565 SetRect(&rect
, 0, 0, 1, 1);
566 textheight
= DrawTextW(hdc
, wordbreak_textW
, -1, &rect
, DT_CALCRECT
| DT_WORDBREAK
| DT_EDITCONTROL
);
567 ok(textheight
>= heightcheck
* 6, "Got unexpected textheight %d, expected at least %d.\n",
568 textheight
, heightcheck
* 6);
570 /* DT_TABSTOP | DT_EXPANDTABS tests */
571 SetRect( &rect
, 0,0, 10, 10);
572 textheight
= DrawTextA(hdc
, tabstring
, -1, &rect
, DT_TABSTOP
| DT_EXPANDTABS
);
573 ok(textheight
>= heightcheck
, "Got unexpected textheight %d\n", textheight
);
575 SetRect( &rect
, 0,0, 10, 10);
576 memset(&dtp
, 0, sizeof(dtp
));
577 dtp
.cbSize
= sizeof(dtp
);
578 textheight
= DrawTextExA(hdc
, tabstring
, -1, &rect
, DT_CALCRECT
, &dtp
);
579 ok(textheight
>= heightcheck
, "Got unexpected textheight %d\n", textheight
);
580 ok(dtp
.iTabLength
== 0, "invalid dtp.iTabLength = %i\n",dtp
.iTabLength
);
582 SetRect( &rect2
, 0,0, 10, 10);
583 memset(&dtp
, 0, sizeof(dtp
));
584 dtp
.cbSize
= sizeof(dtp
);
585 textheight
= DrawTextExA(hdc
, tabstring
, -1, &rect2
, DT_CALCRECT
| DT_TABSTOP
| DT_EXPANDTABS
, &dtp
);
586 ok(textheight
>= heightcheck
, "Got unexpected textheight %d\n", textheight
);
587 ok(dtp
.iTabLength
== 0, "invalid dtp.iTabLength = %i\n",dtp
.iTabLength
);
588 ok(rect
.left
== rect2
.left
&& rect
.right
!= rect2
.right
&& rect
.top
== rect2
.top
&& rect
.bottom
== rect2
.bottom
,
589 "incorrect rect %s rect2 %s\n", wine_dbgstr_rect(&rect
), wine_dbgstr_rect(&rect2
));
591 SetRect( &rect
, 0,0, 10, 10);
592 memset(&dtp
, 0, sizeof(dtp
));
593 dtp
.cbSize
= sizeof(dtp
);
595 textheight
= DrawTextExA(hdc
, tabstring
, -1, &rect
, DT_CALCRECT
| DT_TABSTOP
| DT_EXPANDTABS
, &dtp
);
596 ok(textheight
>= heightcheck
, "Got unexpected textheight %d\n", textheight
);
597 ok(dtp
.iTabLength
== 8, "invalid dtp.iTabLength = %i\n",dtp
.iTabLength
);
598 ok(rect
.left
== rect2
.left
, "unexpected value %d, got %d\n", rect
.left
, rect2
.left
);
599 /* XP, 2003 appear to not give the same values. */
600 ok(rect
.right
== rect2
.right
|| broken(rect
.right
> rect2
.right
), "unexpected value %d, got %d\n",rect
.right
, rect2
.right
);
601 ok(rect
.top
== rect2
.top
, "unexpected value %d, got %d\n", rect
.top
, rect2
.top
);
602 ok(rect
.bottom
== rect2
.bottom
, "unexpected value %d, got %d\n", rect
.bottom
, rect2
.bottom
);
605 SelectObject(hdc
, hOldFont
);
606 ret
= DeleteObject(hFont
);
607 ok( ret
, "DeleteObject error %u\n", GetLastError());
610 ret
= ReleaseDC(hwnd
, hdc
);
611 ok( ret
, "ReleaseDC error %u\n", GetLastError());
612 ret
= DestroyWindow(hwnd
);
613 ok( ret
, "DestroyWindow error %u\n", GetLastError());
616 /* replace tabs by \t */
617 static void strfmt( const char *str
, char *strout
)
620 for(i
=0,j
=0;i
<=strlen(str
);i
++,j
++)
621 if((strout
[j
]=str
[i
])=='\t') {
628 #define TABTEST( tabval, tabcount, string, _exp) \
629 { int i; char strdisp[64];\
630 for(i=0;i<8;i++) tabs[i]=(i+1)*(tabval); \
631 extent = GetTabbedTextExtentA( hdc, string, strlen( string), (tabcount), tabs); \
632 strfmt( string, strdisp); \
633 /* trace( "Extent is %08lx\n", extent); */\
634 ok( extent == _exp, "Test case \"%s\". Text extent is 0x%x, expected 0x%x tab %d tabcount %d\n", \
635 strdisp, extent, _exp, tabval, tabcount); \
639 static void test_TabbedText(void)
646 INT tabs
[8], cx
, cy
, tab
, tabcount
,t
,align
;
649 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
650 0, 0, 200, 200, 0, 0, 0, NULL
);
651 ok(hwnd
!= 0, "CreateWindowExA error %u\n", GetLastError());
653 ok(hdc
!= 0, "GetDC error %u\n", GetLastError());
655 ret
= GetTextMetricsA( hdc
, &tm
);
656 ok( ret
, "GetTextMetrics error %u\n", GetLastError());
658 extent
= GetTabbedTextExtentA( hdc
, "x", 0, 1, tabs
);
659 ok( extent
== 0, "GetTabbedTextExtentA returned non-zero on nCount == 0\n");
661 extent
= GetTabbedTextExtentA( hdc
, "x", 1, 1, tabs
);
662 cx
= LOWORD( extent
);
663 cy
= HIWORD( extent
);
664 trace( "cx is %d cy is %d\n", cx
, cy
);
667 for( t
=-1; t
<=1; t
++) { /* slightly adjust the 4 char tabstop, to
668 catch the one off errors */
670 /* test the special case tabcount =1 and the general array (80 of tabs */
671 for( tabcount
= 1; tabcount
<= 8; tabcount
+=7) {
672 TABTEST( align
* tab
, tabcount
, "\t", MAKELONG(tab
, cy
))
673 TABTEST( align
* tab
, tabcount
, "xxx\t", MAKELONG(tab
, cy
))
674 TABTEST( align
* tab
, tabcount
, "\tx", MAKELONG(tab
+cx
, cy
))
675 TABTEST( align
* tab
, tabcount
, "\t\t", MAKELONG(tab
*2, cy
))
676 TABTEST( align
* tab
, tabcount
, "\tx\t", MAKELONG(tab
*2, cy
))
677 TABTEST( align
* tab
, tabcount
, "x\tx", MAKELONG(tab
+cx
, cy
))
678 TABTEST( align
* tab
, tabcount
, "xx\tx", MAKELONG(tab
+cx
, cy
))
679 TABTEST( align
* tab
, tabcount
, "xxx\tx", MAKELONG(tab
+cx
, cy
))
680 TABTEST( align
* tab
, tabcount
, "xxxx\tx", MAKELONG(t
>0 ? tab
+ cx
: 2*tab
+cx
, cy
))
681 TABTEST( align
* tab
, tabcount
, "xxxxx\tx", MAKELONG(2*tab
+cx
, cy
))
685 for( t
=-1; t
<=1; t
++) { /* slightly adjust the 4 char tabstop, to
686 catch the one off errors */
688 /* test the special case tabcount =1 and the general array (8) of tabs */
689 for( tabcount
= 1; tabcount
<= 8; tabcount
+=7) {
690 TABTEST( align
* tab
, tabcount
, "\t", MAKELONG(tab
, cy
))
691 TABTEST( align
* tab
, tabcount
, "xxx\t", MAKELONG(tab
, cy
))
692 TABTEST( align
* tab
, tabcount
, "\tx", MAKELONG(tab
, cy
))
693 TABTEST( align
* tab
, tabcount
, "\t\t", MAKELONG(tab
*2, cy
))
694 TABTEST( align
* tab
, tabcount
, "\tx\t", MAKELONG(tab
*2, cy
))
695 TABTEST( align
* tab
, tabcount
, "x\tx", MAKELONG(tab
, cy
))
696 TABTEST( align
* tab
, tabcount
, "xx\tx", MAKELONG(tab
, cy
))
697 TABTEST( align
* tab
, tabcount
, "xxx\tx", MAKELONG(4 * cx
>= tab
? 2*tab
:tab
, cy
))
698 TABTEST( align
* tab
, tabcount
, "xxxx\tx", MAKELONG(2*tab
, cy
))
699 TABTEST( align
* tab
, tabcount
, "xxxxx\tx", MAKELONG(2*tab
, cy
))
703 ReleaseDC( hwnd
, hdc
);
704 DestroyWindow( hwnd
);
707 static void test_DrawState(void)
709 static const char text
[] = "Sample text string";
714 hwnd
= CreateWindowExA(0, "static", NULL
, WS_POPUP
,
715 0, 0, 200, 200, 0, 0, 0, NULL
);
721 SetLastError(0xdeadbeef);
722 ret
= DrawStateA(hdc
, GetStockObject(DKGRAY_BRUSH
), NULL
, (LPARAM
)text
, strlen(text
),
723 0, 0, 10, 10, DST_TEXT
);
724 ok(ret
, "DrawState error %u\n", GetLastError());
726 SetLastError(0xdeadbeef);
727 ret
= DrawStateA(hdc
, GetStockObject(DKGRAY_BRUSH
), NULL
, (LPARAM
)text
, 0,
728 0, 0, 10, 10, DST_TEXT
);
729 ok(ret
, "DrawState error %u\n", GetLastError());
731 SetLastError(0xdeadbeef);
732 ret
= DrawStateA(hdc
, GetStockObject(DKGRAY_BRUSH
), NULL
, 0, strlen(text
),
733 0, 0, 10, 10, DST_TEXT
);
734 ok(!ret
|| broken(ret
) /* win98 */, "DrawState succeeded\n");
735 ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
737 SetLastError(0xdeadbeef);
738 ret
= DrawStateA(hdc
, GetStockObject(DKGRAY_BRUSH
), NULL
, 0, 0,
739 0, 0, 10, 10, DST_TEXT
);
740 ok(!ret
|| broken(ret
) /* win98 */, "DrawState succeeded\n");
741 ok(GetLastError() == 0xdeadbeef, "not expected error %u\n", GetLastError());
743 ReleaseDC(hwnd
, hdc
);
747 static void test_CharToOem_OemToChar(void)
749 static const WCHAR helloWorldW
[] = {'H','e','l','l','o',' ','W','o','r','l','d',0};
750 static const WCHAR emptyW
[] = {0};
751 static const char helloWorld
[] = "Hello World";
758 { FALSE
, FALSE
, FALSE
},
759 { TRUE
, FALSE
, FALSE
},
760 { FALSE
, TRUE
, FALSE
},
761 { TRUE
, TRUE
, TRUE
},
768 for (i
= 0; i
< ARRAY_SIZE(tests
); i
++)
770 const char *expected
= tests
[i
].ret
? helloWorld
: "";
771 const char *src
= tests
[i
].src
? helloWorld
: NULL
;
772 char buf
[64], *dst
= tests
[i
].dst
? buf
: NULL
;
774 memset(buf
, 0, sizeof(buf
));
775 ret
= CharToOemA(src
, dst
);
776 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
777 ok(!strcmp(buf
, expected
), "test %d: got '%s'\n", i
, buf
);
779 memset(buf
, 0, sizeof(buf
));
780 ret
= CharToOemBuffA(src
, dst
, sizeof(helloWorld
));
781 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
782 ok(!strcmp(buf
, expected
), "test %d: got '%s'\n", i
, buf
);
784 memset(buf
, 0, sizeof(buf
));
785 ret
= OemToCharA(src
, dst
);
786 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
787 ok(!strcmp(buf
, expected
), "test %d: got '%s'\n", i
, buf
);
789 memset(buf
, 0, sizeof(buf
));
790 ret
= OemToCharBuffA(src
, dst
, sizeof(helloWorld
));
791 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
792 ok(!strcmp(buf
, expected
), "test %d: got '%s'\n", i
, buf
);
795 for (i
= 0; i
< ARRAY_SIZE(tests
); i
++)
797 const char *expected
= tests
[i
].ret
? helloWorld
: "";
798 const WCHAR
*src
= tests
[i
].src
? helloWorldW
: NULL
;
799 char buf
[64], *dst
= tests
[i
].dst
? buf
: NULL
;
801 memset(buf
, 0, sizeof(buf
));
802 ret
= CharToOemW(src
, dst
);
803 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
804 ok(!strcmp(buf
, expected
), "test %d: got '%s'\n", i
, buf
);
806 memset(buf
, 0, sizeof(buf
));
807 ret
= CharToOemBuffW(src
, dst
, ARRAY_SIZE(helloWorldW
));
808 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
809 ok(!strcmp(buf
, expected
), "test %d: got '%s'\n", i
, buf
);
812 for (i
= 0; i
< ARRAY_SIZE(tests
); i
++)
814 const WCHAR
*expected
= tests
[i
].ret
? helloWorldW
: emptyW
;
815 const char *src
= tests
[i
].src
? helloWorld
: NULL
;
816 WCHAR buf
[64], *dst
= tests
[i
].dst
? buf
: NULL
;
818 memset(buf
, 0, sizeof(buf
));
819 ret
= OemToCharW(src
, dst
);
820 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
821 ok(!lstrcmpW(buf
, expected
), "test %d: got '%s'\n", i
, wine_dbgstr_w(buf
));
823 memset(buf
, 0, sizeof(buf
));
824 ret
= OemToCharBuffW(src
, dst
, sizeof(helloWorld
));
825 ok(ret
== tests
[i
].ret
, "test %d: expected %d, got %d\n", i
, tests
[i
].ret
, ret
);
826 ok(!lstrcmpW(buf
, expected
), "test %d: got '%s'\n", i
, wine_dbgstr_w(buf
));
829 for (i
= 0; i
< 0x100; i
++)
832 ret
= OemToCharBuffW( &oem
, &uni
, 1 );
833 ok( ret
, "%02x: returns FALSE\n", i
);
834 MultiByteToWideChar( CP_OEMCP
, MB_PRECOMPOSED
| MB_USEGLYPHCHARS
, &oem
, 1, &expect
, 1 );
835 ok( uni
== expect
, "%02x: got %04x expected %04x\n", i
, uni
, expect
);
842 test_DrawTextCalcRect();
844 test_CharToOem_OemToChar();