From efbde389c723a6ed239f6a330a5358e725646924 Mon Sep 17 00:00:00 2001 From: Jason Edmeades Date: Thu, 19 Jan 2012 21:35:56 +0000 Subject: [PATCH] richedit: v1.0 richedit uses CR and LF for enter. --- dlls/riched20/editor.c | 6 ++- dlls/riched20/tests/editor.c | 109 ++++++++++++++++++++++++++++++++++++++ dlls/riched32/tests/editor.c | 122 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 235 insertions(+), 2 deletions(-) diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 5dda1ea3c0b..f3764df8a64 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -2180,6 +2180,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) ME_DisplayItem *para = cursor.pPara; int from, to; const WCHAR endl = '\r'; + const WCHAR endlv10[] = {'\r','\n'}; ME_Style *style; if (editor->styleFlags & ES_READONLY) { @@ -2282,7 +2283,10 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) if (shift_is_down) ME_InsertEndRowFromCursor(editor, 0); else - ME_InsertTextFromCursor(editor, 0, &endl, 1, style); + if (!editor->bEmulateVersion10) + ME_InsertTextFromCursor(editor, 0, &endl, 1, style); + else + ME_InsertTextFromCursor(editor, 0, endlv10, 2, style); ME_ReleaseStyle(style); ME_CommitCoalescingUndo(editor); SetCursor(NULL); diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 827f35dffe4..83c24f8c59c 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -7172,6 +7172,114 @@ static void test_EM_FINDWORDBREAK_A(void) DestroyWindow(hwndRichEdit); } +/* + * This test attempts to show the effect of enter on a richedit + * control v1.0 inserts CRLF whereas for higher versions it only + * inserts CR. If shows that EM_GETTEXTEX with GT_USECRLF == WM_GETTEXT + * and also shows that GT_USECRLF has no effect in richedit 1.0, but + * does for higher. The same test is cloned in riched32 and riched20. + */ +static void test_enter(void) +{ + static const struct { + const char *initialtext; + const int cursor; + const char *expectedwmtext; + const char *expectedemtext; + const char *expectedemtextcrlf; + } testenteritems[] = { + { "aaabbb\r\n", 3, "aaa\r\nbbb\r\n", "aaa\rbbb\r", "aaa\r\nbbb\r\n"}, + { "aaabbb\r\n", 6, "aaabbb\r\n\r\n", "aaabbb\r\r", "aaabbb\r\n\r\n"}, + { "aa\rabbb\r\n", 7, "aa\r\nabbb\r\n\r\n", "aa\rabbb\r\r", "aa\r\nabbb\r\n\r\n"}, + { "aa\rabbb\r\n", 3, "aa\r\n\r\nabbb\r\n", "aa\r\rabbb\r", "aa\r\n\r\nabbb\r\n"}, + { "aa\rabbb\r\n", 2, "aa\r\n\r\nabbb\r\n", "aa\r\rabbb\r", "aa\r\n\r\nabbb\r\n"} + }; + + char expectedbuf[1024]; + char resultbuf[1024]; + HWND hwndRichEdit = new_richedit(NULL); + UINT i,j; + + for (i = 0; i < sizeof(testenteritems)/sizeof(testenteritems[0]); i++) { + + char buf[1024] = {0}; + LRESULT result; + GETTEXTEX getText; + const char *expected; + + /* Set the text to the initial text */ + result = SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) testenteritems[i].initialtext); + ok (result == 1, "[%d] WM_SETTEXT returned %ld instead of 1\n", i, result); + + /* Send Enter */ + SendMessage(hwndRichEdit, EM_SETSEL, testenteritems[i].cursor, testenteritems[i].cursor); + simulate_typing_characters(hwndRichEdit, "\r"); + + /* 1. Retrieve with WM_GETTEXT */ + buf[0] = 0x00; + result = SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buf); + expected = testenteritems[i].expectedwmtext; + + resultbuf[0]=0x00; + for (j = 0; j < (UINT)result; j++) + sprintf(resultbuf+strlen(resultbuf), "%02x", buf[j] & 0xFF); + expectedbuf[0] = '\0'; + for (j = 0; j < strlen(expected); j++) + sprintf(expectedbuf+strlen(expectedbuf), "%02x", expected[j] & 0xFF); + + result = strcmp(expected, buf); + ok (result == 0, + "[%d] WM_GETTEXT unexpected '%s' expected '%s'\n", + i, resultbuf, expectedbuf); + + /* 2. Retrieve with EM_GETTEXTEX, GT_DEFAULT */ + getText.cb = sizeof(buf); + getText.flags = GT_DEFAULT; + getText.codepage = CP_ACP; + getText.lpDefaultChar = NULL; + getText.lpUsedDefChar = NULL; + buf[0] = 0x00; + result = SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) buf); + expected = testenteritems[i].expectedemtext; + + resultbuf[0]=0x00; + for (j = 0; j < (UINT)result; j++) + sprintf(resultbuf+strlen(resultbuf), "%02x", buf[j] & 0xFF); + expectedbuf[0] = '\0'; + for (j = 0; j < strlen(expected); j++) + sprintf(expectedbuf+strlen(expectedbuf), "%02x", expected[j] & 0xFF); + + result = strcmp(expected, buf); + ok (result == 0, + "[%d] EM_GETTEXTEX, GT_DEFAULT unexpected '%s', expected '%s'\n", + i, resultbuf, expectedbuf); + + /* 3. Retrieve with EM_GETTEXTEX, GT_USECRLF */ + getText.cb = sizeof(buf); + getText.flags = GT_USECRLF; + getText.codepage = CP_ACP; + getText.lpDefaultChar = NULL; + getText.lpUsedDefChar = NULL; + buf[0] = 0x00; + result = SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) buf); + expected = testenteritems[i].expectedemtextcrlf; + + resultbuf[0]=0x00; + for (j = 0; j < (UINT)result; j++) + sprintf(resultbuf+strlen(resultbuf), "%02x", buf[j] & 0xFF); + expectedbuf[0] = '\0'; + for (j = 0; j < strlen(expected); j++) + sprintf(expectedbuf+strlen(expectedbuf), "%02x", expected[j] & 0xFF); + + result = strcmp(expected, buf); + ok (result == 0, + "[%d] EM_GETTEXTEX, GT_USECRLF unexpected '%s', expected '%s'\n", + i, resultbuf, expectedbuf); + } + + DestroyWindow(hwndRichEdit); +} + START_TEST( editor ) { BOOL ret; @@ -7230,6 +7338,7 @@ START_TEST( editor ) test_dialogmode(); test_EM_FINDWORDBREAK_W(); test_EM_FINDWORDBREAK_A(); + test_enter(); /* Set the environment variable WINETEST_RICHED20 to keep windows * responsive and open for 30 seconds. This is useful for debugging. diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c index 71e510a33a0..5a031e3c612 100644 --- a/dlls/riched32/tests/editor.c +++ b/dlls/riched32/tests/editor.c @@ -22,7 +22,7 @@ */ #include - +#include #include #include #include @@ -1081,6 +1081,125 @@ static void test_autoscroll(void) DestroyWindow(hwnd); } +static void simulate_typing_characters(HWND hwnd, const char* szChars) +{ + int ret; + + while (*szChars != '\0') { + SendMessageA(hwnd, WM_KEYDOWN, *szChars, 1); + ret = SendMessageA(hwnd, WM_CHAR, *szChars, 1); + ok(ret == 0, "WM_CHAR('%c') ret=%d\n", *szChars, ret); + SendMessageA(hwnd, WM_KEYUP, *szChars, 1); + szChars++; + } +} + +/* + * This test attempts to show the effect of enter on a richedit + * control v1.0 inserts CRLF whereas for higher versions it only + * inserts CR. If shows that EM_GETTEXTEX with GT_USECRLF == WM_GETTEXT + * and also shows that GT_USECRLF has no effect in richedit 1.0, but + * does for higher. The same test is cloned in riched32 and riched20. + */ +static void test_enter(void) +{ + static const struct { + const char *initialtext; + const int cursor; + const char *expectedtext; + } testenteritems[] = { + { "aaabbb\r\n", 3, "aaa\r\nbbb\r\n"}, + { "aaabbb\r\n", 6, "aaabbb\r\n\r\n"}, + { "aa\rabbb\r\n", 7, "aa\rabbb\r\n\r\n"}, + { "aa\rabbb\r\n", 3, "aa\r\r\nabbb\r\n"}, + { "aa\rabbb\r\n", 2, "aa\r\n\rabbb\r\n"} + }; + + char expectedbuf[1024]; + char resultbuf[1024]; + HWND hwndRichEdit = new_richedit(NULL); + UINT i,j; + + for (i = 0; i < sizeof(testenteritems)/sizeof(testenteritems[0]); i++) { + + char buf[1024] = {0}; + LRESULT result; + GETTEXTEX getText; + const char *expected; + + /* Set the text to the initial text */ + result = SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) testenteritems[i].initialtext); + ok (result == 1, "[%d] WM_SETTEXT returned %ld instead of 1\n", i, result); + + /* Send Enter */ + SendMessage(hwndRichEdit, EM_SETSEL, testenteritems[i].cursor, testenteritems[i].cursor); + simulate_typing_characters(hwndRichEdit, "\r"); + + /* 1. Retrieve with WM_GETTEXT */ + buf[0] = 0x00; + result = SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buf); + expected = testenteritems[i].expectedtext; + + resultbuf[0]=0x00; + for (j = 0; j < (UINT)result; j++) + sprintf(resultbuf+strlen(resultbuf), "%02x", buf[j] & 0xFF); + expectedbuf[0] = '\0'; + for (j = 0; j < strlen(expected); j++) + sprintf(expectedbuf+strlen(expectedbuf), "%02x", expected[j] & 0xFF); + + result = strcmp(expected, buf); + ok (result == 0, + "[%d] WM_GETTEXT unexpected '%s' expected '%s'\n", + i, resultbuf, expectedbuf); + + /* 2. Retrieve with EM_GETTEXTEX, GT_DEFAULT */ + getText.cb = sizeof(buf); + getText.flags = GT_DEFAULT; + getText.codepage = CP_ACP; + getText.lpDefaultChar = NULL; + getText.lpUsedDefChar = NULL; + buf[0] = 0x00; + result = SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) buf); + expected = testenteritems[i].expectedtext; + + resultbuf[0]=0x00; + for (j = 0; j < (UINT)result; j++) + sprintf(resultbuf+strlen(resultbuf), "%02x", buf[j] & 0xFF); + expectedbuf[0] = '\0'; + for (j = 0; j < strlen(expected); j++) + sprintf(expectedbuf+strlen(expectedbuf), "%02x", expected[j] & 0xFF); + + result = strcmp(expected, buf); + ok (result == 0 || broken(buf[0]==0x00 /* WinNT4 */), + "[%d] EM_GETTEXTEX, GT_DEFAULT unexpected '%s', expected '%s'\n", + i, resultbuf, expectedbuf); + + /* 3. Retrieve with EM_GETTEXTEX, GT_USECRLF */ + getText.cb = sizeof(buf); + getText.flags = GT_USECRLF; + getText.codepage = CP_ACP; + getText.lpDefaultChar = NULL; + getText.lpUsedDefChar = NULL; + buf[0] = 0x00; + result = SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) buf); + expected = testenteritems[i].expectedtext; + + resultbuf[0]=0x00; + for (j = 0; j < (UINT)result; j++) + sprintf(resultbuf+strlen(resultbuf), "%02x", buf[j] & 0xFF); + expectedbuf[0] = '\0'; + for (j = 0; j < strlen(expected); j++) + sprintf(expectedbuf+strlen(expectedbuf), "%02x", expected[j] & 0xFF); + + result = strcmp(expected, buf); + ok (result == 0 || broken(buf[0]==0x00 /* WinNT4 */), + "[%d] EM_GETTEXTEX, GT_USECRLF unexpected '%s', expected '%s'\n", + i, resultbuf, expectedbuf); + } + + DestroyWindow(hwndRichEdit); +} + START_TEST( editor ) { MSG msg; @@ -1105,6 +1224,7 @@ START_TEST( editor ) test_word_wrap(); test_EM_GETOPTIONS(); test_autoscroll(); + test_enter(); /* Set the environment variable WINETEST_RICHED32 to keep windows * responsive and open for 30 seconds. This is useful for debugging. -- 2.11.4.GIT