2 * Unit test suite for rich edit control 1.0
4 * Copyright 2006 Google (Thomas Kho)
5 * Copyright 2007 Matt Finnicum
6 * Copyright 2007 Dmitry Timoshkov
7 * Copyright 2007 Alex VillacĂs Lasso
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include <wine/test.h>
36 static HMODULE hmoduleRichEdit
;
38 static HWND
new_window(LPCTSTR lpClassName
, DWORD dwStyle
, HWND parent
) {
40 hwnd
= CreateWindow(lpClassName
, NULL
, dwStyle
|WS_POPUP
|WS_HSCROLL
|WS_VSCROLL
41 |WS_VISIBLE
, 0, 0, 200, 60, parent
, NULL
,
42 hmoduleRichEdit
, NULL
);
43 ok(hwnd
!= NULL
, "class: %s, error: %d\n", lpClassName
, (int) GetLastError());
47 static HWND
new_richedit(HWND parent
) {
48 return new_window(RICHEDIT_CLASS10A
, ES_MULTILINE
, parent
);
51 static void test_WM_SETTEXT()
53 HWND hwndRichEdit
= new_richedit(NULL
);
54 const char * TestItem1
= "TestSomeText";
55 const char * TestItem2
= "TestSomeText\r";
56 const char * TestItem3
= "TestSomeText\rSomeMoreText\r";
57 const char * TestItem4
= "TestSomeText\n\nTestSomeText";
58 const char * TestItem5
= "TestSomeText\r\r\nTestSomeText";
59 const char * TestItem6
= "TestSomeText\r\r\n\rTestSomeText";
60 const char * TestItem7
= "TestSomeText\r\n\r\r\n\rTestSomeText";
61 const char * TestItem8
= "TestSomeText\r\n";
62 const char * TestItem9
= "TestSomeText\r\nSomeMoreText\r\n";
63 const char * TestItem10
= "TestSomeText\r\n\r\nTestSomeText";
64 const char * TestItem11
= "TestSomeText TestSomeText";
65 const char * TestItem12
= "TestSomeText \r\nTestSomeText";
66 const char * TestItem13
= "TestSomeText\r\n \r\nTestSomeText";
67 const char * TestItem14
= "TestSomeText\n";
68 const char * TestItem15
= "TestSomeText\r\r\r";
69 const char * TestItem16
= "TestSomeText\r\r\rSomeMoreText";
73 /* This test attempts to show that WM_SETTEXT on a riched32 control does not
74 attempt to modify the text that is pasted into the control, and should
75 return it as is. In particular, \r\r\n is NOT converted, unlike riched20.
76 Currently, builtin riched32 mangles solitary \r or \n when not part of
79 For riched32, the rules for breaking lines seem to be the following:
80 - \r\n is one line break. This is the normal case.
81 - \r{0,N}\n is one line break. In particular, \n by itself is a line break.
82 - \n{1,N} are that many line breaks.
83 - \r with text or other characters (except \n) past it, is a line break. That
84 is, a run of \r{N} without a terminating \n is considered N line breaks
85 - \r at the end of the text is NOT a line break. This differs from riched20,
86 where \r at the end of the text is a proper line break. This causes
87 TestItem2 to fail its test.
90 #define TEST_SETTEXT(a, b, nlines, is_todo, is_todo2) \
91 result = SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) a); \
92 ok (result == 1, "WM_SETTEXT returned %ld instead of 1\n", result); \
93 result = SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buf); \
94 ok (result == lstrlen(buf), \
95 "WM_GETTEXT returned %ld instead of expected %u\n", \
96 result, lstrlen(buf)); \
97 result = strcmp(b, buf); \
98 if (is_todo) todo_wine { \
100 "WM_SETTEXT round trip: strcmp = %ld\n", result); \
103 "WM_SETTEXT round trip: strcmp = %ld\n", result); \
105 result = SendMessage(hwndRichEdit, EM_GETLINECOUNT, 0, 0); \
106 if (is_todo2) todo_wine { \
107 ok(result == nlines, "EM_GETLINECOUNT returned %ld, expected %d\n", result, nlines); \
109 ok(result == nlines, "EM_GETLINECOUNT returned %ld, expected %d\n", result, nlines); \
112 TEST_SETTEXT(TestItem1
, TestItem1
, 1, 0, 0)
113 TEST_SETTEXT(TestItem2
, TestItem2
, 1, 0, 0)
114 TEST_SETTEXT(TestItem3
, TestItem3
, 2, 0, 0)
115 TEST_SETTEXT(TestItem4
, TestItem4
, 3, 0, 0)
116 TEST_SETTEXT(TestItem5
, TestItem5
, 2, 0, 0)
117 TEST_SETTEXT(TestItem6
, TestItem6
, 3, 0, 0)
118 TEST_SETTEXT(TestItem7
, TestItem7
, 4, 0, 0)
119 TEST_SETTEXT(TestItem8
, TestItem8
, 2, 0, 0)
120 TEST_SETTEXT(TestItem9
, TestItem9
, 3, 0, 0)
121 TEST_SETTEXT(TestItem10
, TestItem10
, 3, 0, 0)
122 TEST_SETTEXT(TestItem11
, TestItem11
, 1, 0, 0)
123 TEST_SETTEXT(TestItem12
, TestItem12
, 2, 0, 0)
124 TEST_SETTEXT(TestItem13
, TestItem13
, 3, 0, 0)
125 TEST_SETTEXT(TestItem14
, TestItem14
, 2, 0, 0)
126 TEST_SETTEXT(TestItem15
, TestItem15
, 3, 0, 0)
127 TEST_SETTEXT(TestItem16
, TestItem16
, 4, 0, 0)
130 DestroyWindow(hwndRichEdit
);
133 static void test_WM_GETTEXTLENGTH(void)
135 HWND hwndRichEdit
= new_richedit(NULL
);
136 static const char text3
[] = "aaa\r\nbbb\r\nccc\r\nddd\r\neee";
137 static const char text4
[] = "aaa\r\nbbb\r\nccc\r\nddd\r\neee\r\n";
140 /* Test for WM_GETTEXTLENGTH */
141 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) text3
);
142 result
= SendMessage(hwndRichEdit
, WM_GETTEXTLENGTH
, 0, 0);
143 ok(result
== lstrlen(text3
),
144 "WM_GETTEXTLENGTH reports incorrect length %d, expected %d\n",
145 result
, lstrlen(text3
));
147 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) text4
);
148 result
= SendMessage(hwndRichEdit
, WM_GETTEXTLENGTH
, 0, 0);
149 ok(result
== lstrlen(text4
),
150 "WM_GETTEXTLENGTH reports incorrect length %d, expected %d\n",
151 result
, lstrlen(text4
));
153 DestroyWindow(hwndRichEdit
);
156 static DWORD CALLBACK
test_EM_STREAMIN_esCallback(DWORD_PTR dwCookie
,
161 const char** str
= (const char**)dwCookie
;
162 int size
= strlen(*str
);
168 memcpy(pbBuff
, *str
, *pcb
);
175 static void test_EM_STREAMIN(void)
177 HWND hwndRichEdit
= new_richedit(NULL
);
180 char buffer
[1024] = {0};
182 const char * streamText0
= "{\\rtf1 TestSomeText}";
183 const char * streamText0a
= "{\\rtf1 TestSomeText\\par}";
184 const char * streamText0b
= "{\\rtf1 TestSomeText\\par\\par}";
186 const char * streamText1
=
187 "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang12298{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 System;}}\r\n" \
188 "\\viewkind4\\uc1\\pard\\f0\\fs17 TestSomeText\\par\r\n" \
191 /* This should be accepted in richedit 1.0 emulation. See bug #8326 */
192 const char * streamText2
=
193 "{{\\colortbl;\\red0\\green255\\blue102;\\red255\\green255\\blue255;" \
194 "\\red170\\green255\\blue255;\\red255\\green238\\blue0;\\red51\\green255" \
195 "\\blue221;\\red238\\green238\\blue238;}\\tx0 \\tx424 \\tx848 \\tx1272 " \
196 "\\tx1696 \\tx2120 \\tx2544 \\tx2968 \\tx3392 \\tx3816 \\tx4240 \\tx4664 " \
197 "\\tx5088 \\tx5512 \\tx5936 \\tx6360 \\tx6784 \\tx7208 \\tx7632 \\tx8056 " \
198 "\\tx8480 \\tx8904 \\tx9328 \\tx9752 \\tx10176 \\tx10600 \\tx11024 " \
199 "\\tx11448 \\tx11872 \\tx12296 \\tx12720 \\tx13144 \\cf2 RichEdit1\\line }";
201 const char * streamText3
= "RichEdit1";
203 /* Minimal test without \par at the end */
204 es
.dwCookie
= (DWORD_PTR
)&streamText0
;
206 es
.pfnCallback
= test_EM_STREAMIN_esCallback
;
207 SendMessage(hwndRichEdit
, EM_STREAMIN
,
208 (WPARAM
)(SF_RTF
), (LPARAM
)&es
);
210 result
= SendMessage(hwndRichEdit
, WM_GETTEXT
, 1024, (LPARAM
) buffer
);
212 "EM_STREAMIN: Test 0 returned %ld, expected 12\n", result
);
213 result
= strcmp (buffer
,"TestSomeText");
215 "EM_STREAMIN: Test 0 set wrong text: Result: %s\n",buffer
);
216 ok(es
.dwError
== 0, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es
.dwError
, 0);
218 /* Native richedit 2.0 ignores last \par */
219 es
.dwCookie
= (DWORD_PTR
)&streamText0a
;
221 es
.pfnCallback
= test_EM_STREAMIN_esCallback
;
222 SendMessage(hwndRichEdit
, EM_STREAMIN
,
223 (WPARAM
)(SF_RTF
), (LPARAM
)&es
);
225 result
= SendMessage(hwndRichEdit
, WM_GETTEXT
, 1024, (LPARAM
) buffer
);
227 "EM_STREAMIN: Test 0-a returned %ld, expected 12\n", result
);
228 result
= strcmp (buffer
,"TestSomeText");
230 "EM_STREAMIN: Test 0-a set wrong text: Result: %s\n",buffer
);
231 ok(es
.dwError
== 0, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es
.dwError
, 0);
233 /* Native richedit 2.0 ignores last \par, next-to-last \par appears */
234 es
.dwCookie
= (DWORD_PTR
)&streamText0b
;
236 es
.pfnCallback
= test_EM_STREAMIN_esCallback
;
237 SendMessage(hwndRichEdit
, EM_STREAMIN
,
238 (WPARAM
)(SF_RTF
), (LPARAM
)&es
);
240 result
= SendMessage(hwndRichEdit
, WM_GETTEXT
, 1024, (LPARAM
) buffer
);
242 "EM_STREAMIN: Test 0-b returned %ld, expected 14\n", result
);
243 result
= strcmp (buffer
,"TestSomeText\r\n");
245 "EM_STREAMIN: Test 0-b set wrong text: Result: %s\n",buffer
);
246 ok(es
.dwError
== 0, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es
.dwError
, 0);
248 es
.dwCookie
= (DWORD_PTR
)&streamText1
;
250 es
.pfnCallback
= test_EM_STREAMIN_esCallback
;
251 SendMessage(hwndRichEdit
, EM_STREAMIN
,
252 (WPARAM
)(SF_RTF
), (LPARAM
)&es
);
254 result
= SendMessage(hwndRichEdit
, WM_GETTEXT
, 1024, (LPARAM
) buffer
);
256 "EM_STREAMIN: Test 1 returned %ld, expected 12\n", result
);
257 result
= strcmp (buffer
,"TestSomeText");
259 "EM_STREAMIN: Test 1 set wrong text: Result: %s\n",buffer
);
260 ok(es
.dwError
== 0, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es
.dwError
, 0);
263 es
.dwCookie
= (DWORD_PTR
)&streamText2
;
265 SendMessage(hwndRichEdit
, EM_STREAMIN
,
266 (WPARAM
)(SF_RTF
), (LPARAM
)&es
);
268 result
= SendMessage(hwndRichEdit
, WM_GETTEXT
, 1024, (LPARAM
) buffer
);
271 "EM_STREAMIN: Test 2 returned %ld, expected 9\n", result
);
273 result
= strcmp (buffer
,"RichEdit1");
276 "EM_STREAMIN: Test 2 set wrong text: Result: %s\n",buffer
);
278 ok(es
.dwError
== 0, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es
.dwError
, 0);
280 es
.dwCookie
= (DWORD_PTR
)&streamText3
;
282 SendMessage(hwndRichEdit
, EM_STREAMIN
,
283 (WPARAM
)(SF_RTF
), (LPARAM
)&es
);
285 result
= SendMessage(hwndRichEdit
, WM_GETTEXT
, 1024, (LPARAM
) buffer
);
287 "EM_STREAMIN: Test 3 returned %ld, expected 0\n", result
);
288 ok (strlen(buffer
) == 0,
289 "EM_STREAMIN: Test 3 set wrong text: Result: %s\n",buffer
);
290 ok(es
.dwError
== -16, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es
.dwError
, -16);
292 DestroyWindow(hwndRichEdit
);
295 static DWORD CALLBACK
test_WM_SETTEXT_esCallback(DWORD_PTR dwCookie
,
300 char** str
= (char**)dwCookie
;
303 memcpy(*str
, pbBuff
, *pcb
);
309 static void test_EM_STREAMOUT(void)
311 HWND hwndRichEdit
= new_richedit(NULL
);
314 char buf
[1024] = {0};
317 const char * TestItem1
= "TestSomeText";
318 const char * TestItem2
= "TestSomeText\r";
319 const char * TestItem3
= "TestSomeText\r\n";
321 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) TestItem1
);
323 es
.dwCookie
= (DWORD_PTR
)&p
;
325 es
.pfnCallback
= test_WM_SETTEXT_esCallback
;
326 memset(buf
, 0, sizeof(buf
));
327 SendMessage(hwndRichEdit
, EM_STREAMOUT
,
328 (WPARAM
)(SF_TEXT
), (LPARAM
)&es
);
330 ok(r
== 12, "streamed text length is %d, expecting 12\n", r
);
331 ok(strcmp(buf
, TestItem1
) == 0,
332 "streamed text different, got %s\n", buf
);
334 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) TestItem2
);
336 es
.dwCookie
= (DWORD_PTR
)&p
;
338 es
.pfnCallback
= test_WM_SETTEXT_esCallback
;
339 memset(buf
, 0, sizeof(buf
));
340 SendMessage(hwndRichEdit
, EM_STREAMOUT
,
341 (WPARAM
)(SF_TEXT
), (LPARAM
)&es
);
344 ok(r
== 13, "streamed text length is %d, expecting 13\n", r
);
345 ok(strcmp(buf
, TestItem2
) == 0,
346 "streamed text different, got %s\n", buf
);
348 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) TestItem3
);
350 es
.dwCookie
= (DWORD_PTR
)&p
;
352 es
.pfnCallback
= test_WM_SETTEXT_esCallback
;
353 memset(buf
, 0, sizeof(buf
));
354 SendMessage(hwndRichEdit
, EM_STREAMOUT
,
355 (WPARAM
)(SF_TEXT
), (LPARAM
)&es
);
357 ok(r
== 14, "streamed text length is %d, expecting 14\n", r
);
358 ok(strcmp(buf
, TestItem3
) == 0,
359 "streamed text different, got %s\n", buf
);
361 DestroyWindow(hwndRichEdit
);
364 static const struct getline_s
{
370 {0, 10, "foo bar\r\n", 0},
375 /* Buffer smaller than line length */
376 {0, 2, "foo bar\r", 0},
377 {0, 1, "foo bar\r", 0},
378 {0, 0, "foo bar\r", 0}
381 static void test_EM_GETLINE(void)
384 HWND hwndRichEdit
= new_richedit(NULL
);
385 static const int nBuf
= 1024;
386 char dest
[1024], origdest
[1024];
387 const char text
[] = "foo bar\r\n"
391 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) text
);
393 memset(origdest
, 0xBB, nBuf
);
394 for (i
= 0; i
< sizeof(gl
)/sizeof(struct getline_s
); i
++)
397 int expected_nCopied
= min(gl
[i
].buffer_len
, strlen(gl
[i
].text
));
398 int expected_bytes_written
= min(gl
[i
].buffer_len
, strlen(gl
[i
].text
) + 1);
399 memset(dest
, 0xBB, nBuf
);
400 *(WORD
*) dest
= gl
[i
].buffer_len
;
402 /* EM_GETLINE appends a "\r\0" to the end of the line
403 * nCopied counts up to and including the '\r' */
404 nCopied
= SendMessage(hwndRichEdit
, EM_GETLINE
, gl
[i
].line
, (LPARAM
) dest
);
405 if (gl
[i
].wine_todo
) todo_wine
{
406 ok(nCopied
== expected_nCopied
, "%d: %d!=%d\n", i
, nCopied
,
409 ok(nCopied
== expected_nCopied
, "%d: %d!=%d\n", i
, nCopied
,
411 /* two special cases since a parameter is passed via dest */
412 if (gl
[i
].buffer_len
== 0)
413 ok(!dest
[0] && !dest
[1] && !strncmp(dest
+2, origdest
+2, nBuf
-2),
415 else if (gl
[i
].buffer_len
== 1)
416 ok(dest
[0] == gl
[i
].text
[0] && !dest
[1] &&
417 !strncmp(dest
+2, origdest
+2, nBuf
-2), "buffer_len=1\n");
420 if (gl
[i
].wine_todo
) todo_wine
{
421 ok(!strncmp(dest
, gl
[i
].text
, expected_bytes_written
),
422 "%d: expected_bytes_written=%d\n", i
, expected_bytes_written
);
423 ok(!strncmp(dest
+ expected_bytes_written
, origdest
424 + expected_bytes_written
, nBuf
- expected_bytes_written
),
425 "%d: expected_bytes_written=%d\n", i
, expected_bytes_written
);
429 ok(!strncmp(dest
, gl
[i
].text
, expected_bytes_written
),
430 "%d: expected_bytes_written=%d\n", i
, expected_bytes_written
);
431 ok(!strncmp(dest
+ expected_bytes_written
, origdest
432 + expected_bytes_written
, nBuf
- expected_bytes_written
),
433 "%d: expected_bytes_written=%d\n", i
, expected_bytes_written
);
438 DestroyWindow(hwndRichEdit
);
441 static void test_EM_LINELENGTH(void)
443 HWND hwndRichEdit
= new_richedit(NULL
);
448 "richedit1\r\r\r\r\r\n";
449 int offset_test
[10][2] = {
458 {40, 9}, /* <----- in the middle of the \r run, but run not counted */
464 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
) text
);
466 for (i
= 0; i
< 10; i
++) {
467 result
= SendMessage(hwndRichEdit
, EM_LINELENGTH
, offset_test
[i
][0], 0);
468 ok(result
== offset_test
[i
][1], "Length of line at offset %d is %ld, expected %d\n",
469 offset_test
[i
][0], result
, offset_test
[i
][1]);
472 DestroyWindow(hwndRichEdit
);
475 static void test_EM_GETTEXTRANGE(void)
477 HWND hwndRichEdit
= new_richedit(NULL
);
478 const char * text1
= "foo bar\r\nfoo bar";
479 const char * text2
= "foo bar\rfoo bar";
480 const char * expect1
= "bar\r\nfoo";
481 const char * expect2
= "bar\rfoo";
482 char buffer
[1024] = {0};
484 TEXTRANGEA textRange
;
486 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
)text1
);
488 textRange
.lpstrText
= buffer
;
489 textRange
.chrg
.cpMin
= 4;
490 textRange
.chrg
.cpMax
= 12;
491 result
= SendMessage(hwndRichEdit
, EM_GETTEXTRANGE
, 0, (LPARAM
)&textRange
);
492 ok(result
== 8, "EM_GETTEXTRANGE returned %ld, expected %d\n",
493 result
, strlen(expect1
));
494 ok(!strcmp(expect1
, buffer
), "EM_GETTEXTRANGE filled %s\n", buffer
);
496 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
)text2
);
498 textRange
.lpstrText
= buffer
;
499 textRange
.chrg
.cpMin
= 4;
500 textRange
.chrg
.cpMax
= 11;
501 result
= SendMessage(hwndRichEdit
, EM_GETTEXTRANGE
, 0, (LPARAM
)&textRange
);
502 ok(result
== 7, "EM_GETTEXTRANGE returned %ld, expected %d\n",
503 result
, strlen(expect2
));
505 ok(!strcmp(expect2
, buffer
), "EM_GETTEXTRANGE filled %s\n", buffer
);
508 DestroyWindow(hwndRichEdit
);
511 static void test_EM_GETSELTEXT(void)
513 HWND hwndRichEdit
= new_richedit(NULL
);
514 const char * text1
= "foo bar\r\nfoo bar";
515 const char * text2
= "foo bar\rfoo bar";
516 const char * expect1
= "bar\r\nfoo";
517 const char * expect2
= "bar\rfoo";
518 char buffer
[1024] = {0};
521 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
)text1
);
523 SendMessage(hwndRichEdit
, EM_SETSEL
, 4, 12);
524 result
= SendMessage(hwndRichEdit
, EM_GETSELTEXT
, 0, (LPARAM
)buffer
);
525 ok(result
== 8, "EM_GETTEXTRANGE returned %ld, expected %d\n",
526 result
, strlen(expect1
));
527 ok(!strcmp(expect1
, buffer
), "EM_GETTEXTRANGE filled %s\n", buffer
);
529 SendMessage(hwndRichEdit
, WM_SETTEXT
, 0, (LPARAM
)text2
);
531 SendMessage(hwndRichEdit
, EM_SETSEL
, 4, 11);
532 result
= SendMessage(hwndRichEdit
, EM_GETSELTEXT
, 0, (LPARAM
)buffer
);
533 ok(result
== 7, "EM_GETTEXTRANGE returned %ld, expected %d\n",
534 result
, strlen(expect2
));
536 ok(!strcmp(expect2
, buffer
), "EM_GETTEXTRANGE filled %s\n", buffer
);
539 DestroyWindow(hwndRichEdit
);
547 /* Must explicitly LoadLibrary(). The test has no references to functions in
548 * RICHED32.DLL, so the linker doesn't actually link to it. */
549 hmoduleRichEdit
= LoadLibrary("RICHED32.DLL");
550 ok(hmoduleRichEdit
!= NULL
, "error: %d\n", (int) GetLastError());
553 test_EM_GETTEXTRANGE();
554 test_EM_GETSELTEXT();
555 test_WM_GETTEXTLENGTH();
559 test_EM_LINELENGTH();
561 /* Set the environment variable WINETEST_RICHED32 to keep windows
562 * responsive and open for 30 seconds. This is useful for debugging.
564 * The message pump uses PeekMessage() to empty the queue and then sleeps for
565 * 50ms before retrying the queue. */
566 end
= time(NULL
) + 30;
567 if (getenv( "WINETEST_RICHED32" )) {
568 while (time(NULL
) < end
) {
569 if (PeekMessage(&msg
, NULL
, 0, 0, PM_REMOVE
)) {
570 TranslateMessage(&msg
);
571 DispatchMessage(&msg
);
579 ok(FreeLibrary(hmoduleRichEdit
) != 0, "error: %d\n", (int) GetLastError());