Author: akhaldi
Date: Sat Mar 5 10:08:10 2016
New Revision: 70928
URL:
http://svn.reactos.org/svn/reactos?rev=70928&view=rev
Log:
[RICHED32_WINETEST] Sync with Wine Staging 1.9.4. CORE-10912
Modified:
trunk/rostests/winetests/riched32/editor.c
Modified: trunk/rostests/winetests/riched32/editor.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/riched32/editor…
==============================================================================
--- trunk/rostests/winetests/riched32/editor.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/riched32/editor.c [iso-8859-1] Sat Mar 5 10:08:10 2016
@@ -29,11 +29,13 @@
#include <winuser.h>
#include <winnls.h>
#include <ole2.h>
+#include <commdlg.h>
#include <richedit.h>
#include <time.h>
#include <wine/test.h>
static HMODULE hmoduleRichEdit;
+static BOOL is_lang_japanese;
static HWND new_window(LPCSTR lpClassName, DWORD dwStyle, HWND parent) {
HWND hwnd;
@@ -128,22 +130,33 @@
static void test_WM_GETTEXTLENGTH(void)
{
HWND hwndRichEdit = new_richedit(NULL);
- static const char text3[] = "aaa\r\nbbb\r\nccc\r\nddd\r\neee";
- static const char text4[] = "aaa\r\nbbb\r\nccc\r\nddd\r\neee\r\n";
+ static const char text1[] = "aaa\r\nbbb\r\nccc\r\nddd\r\neee";
+ static const char text2[] = "aaa\r\nbbb\r\nccc\r\nddd\r\neee\r\n";
+ static const char text3[] = "abcdef\x8e\xf0";
int result;
/* Test for WM_GETTEXTLENGTH */
- SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text3);
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text1);
result = SendMessageA(hwndRichEdit, WM_GETTEXTLENGTH, 0, 0);
- ok(result == lstrlenA(text3),
- "WM_GETTEXTLENGTH reports incorrect length %d, expected %d\n",
- result, lstrlenA(text3));
-
- SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text4);
+ ok(result == lstrlenA(text1),
+ "WM_GETTEXTLENGTH reports incorrect length %d, expected %d\n",
+ result, lstrlenA(text1));
+
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text2);
result = SendMessageA(hwndRichEdit, WM_GETTEXTLENGTH, 0, 0);
- ok(result == lstrlenA(text4),
- "WM_GETTEXTLENGTH reports incorrect length %d, expected %d\n",
- result, lstrlenA(text4));
+ ok(result == lstrlenA(text2),
+ "WM_GETTEXTLENGTH reports incorrect length %d, expected %d\n",
+ result, lstrlenA(text2));
+
+ /* Test with multibyte character */
+ if (!is_lang_japanese)
+ skip("Skip multibyte character tests on non-Japanese platform\n");
+ else
+ {
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text3);
+ result = SendMessageA(hwndRichEdit, WM_GETTEXTLENGTH, 0, 0);
+ ok(result == 8, "WM_GETTEXTLENGTH returned %d, expected 8\n", result);
+ }
DestroyWindow(hwndRichEdit);
}
@@ -497,6 +510,29 @@
offset_test[i][0], result, offset_test[i][1]);
}
+ /* Test with multibyte character */
+ if (!is_lang_japanese)
+ skip("Skip multibyte character tests on non-Japanese platform\n");
+ else
+ {
+ const char *text1 =
+ "wine\n"
+ "richedit\x8e\xf0\n"
+ "wine";
+ static int offset_test1[3][3] = {
+ {0, 4}, /* Line 1: |wine\n */
+ {5, 10, 1}, /* Line 2: |richedit\x8e\xf0\n */
+ {16, 4}, /* Line 3: |wine */
+ };
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text1);
+ for (i = 0; i < sizeof(offset_test1)/sizeof(offset_test1[0]); i++) {
+ result = SendMessageA(hwndRichEdit, EM_LINELENGTH, offset_test1[i][0], 0);
+ todo_wine_if (offset_test1[i][2])
+ ok(result == offset_test1[i][1], "Length of line at offset %d is %ld,
expected %d\n",
+ offset_test1[i][0], result, offset_test1[i][1]);
+ }
+ }
+
DestroyWindow(hwndRichEdit);
}
@@ -538,6 +574,18 @@
ok(!strcmp(expect3, buffer), "EM_GETTEXTRANGE filled %s\n", buffer);
+ /* Test with multibyte character */
+ if (!is_lang_japanese)
+ skip("Skip multibyte character tests on non-Japanese platform\n");
+ else
+ {
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0,
(LPARAM)"abcdef\x8e\xf0ghijk");
+ textRange.chrg.cpMin = 4;
+ textRange.chrg.cpMax = 8;
+ result = SendMessageA(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange);
+ ok(result == 4, "EM_GETTEXTRANGE returned %ld\n", result);
+ todo_wine ok(!strcmp("ef\x8e\xf0", buffer), "EM_GETTEXTRANGE
filled %s\n", buffer);
+ }
DestroyWindow(hwndRichEdit);
}
@@ -556,17 +604,27 @@
SendMessageA(hwndRichEdit, EM_SETSEL, 4, 12);
result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)buffer);
- ok(result == 8, "EM_GETTEXTRANGE returned %ld\n", result);
- ok(!strcmp(expect1, buffer), "EM_GETTEXTRANGE filled %s\n", buffer);
+ ok(result == 8, "EM_GETSELTEXT returned %ld\n", result);
+ ok(!strcmp(expect1, buffer), "EM_GETSELTEXT filled %s\n", buffer);
SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text2);
SendMessageA(hwndRichEdit, EM_SETSEL, 4, 11);
result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)buffer);
- ok(result == 7, "EM_GETTEXTRANGE returned %ld\n", result);
-
- ok(!strcmp(expect2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer);
-
+ ok(result == 7, "EM_GETSELTEXT returned %ld\n", result);
+ ok(!strcmp(expect2, buffer), "EM_GETSELTEXT filled %s\n", buffer);
+
+ /* Test with multibyte character */
+ if (!is_lang_japanese)
+ skip("Skip multibyte character tests on non-Japanese platform\n");
+ else
+ {
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0,
(LPARAM)"abcdef\x8e\xf0ghijk");
+ SendMessageA(hwndRichEdit, EM_SETSEL, 4, 8);
+ result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)buffer);
+ ok(result == 4, "EM_GETSELTEXT returned %ld\n", result);
+ todo_wine ok(!strcmp("ef\x8e\xf0", buffer), "EM_GETSELTEXT filled
%s\n", buffer);
+ }
DestroyWindow(hwndRichEdit);
}
@@ -1200,6 +1258,163 @@
DestroyWindow(hwndRichEdit);
}
+struct exsetsel_s {
+ LONG min;
+ LONG max;
+ LRESULT expected_retval;
+ int expected_getsel_start;
+ int expected_getsel_end;
+ BOOL result_todo;
+ BOOL sel_todo;
+};
+
+static const struct exsetsel_s exsetsel_tests[] = {
+ /* sanity tests */
+ {5, 10, 10, 5, 10, 0, 0 },
+ {15, 17, 17, 15, 17, 0, 0 },
+ /* test cpMax > strlen() */
+ {0, 100, 19, 0, 19, 1, 0 },
+ /* test cpMin < 0 && cpMax >= 0 after cpMax > strlen() */
+ {-1, 1, 17, 17, 17, 1, 0 },
+ /* test cpMin == cpMax */
+ {5, 5, 5, 5, 5, 0, 0 },
+ /* test cpMin < 0 && cpMax >= 0 (bug 4462) */
+ {-1, 0, 5, 5, 5, 0, 0 },
+ {-1, 17, 5, 5, 5, 0, 0 },
+ {-1, 18, 5, 5, 5, 0, 0 },
+ /* test cpMin < 0 && cpMax < 0 */
+ {-1, -1, 17, 17, 17, 0, 0 },
+ {-4, -5, 17, 17, 17, 0, 0 },
+ /* test cpMin >=0 && cpMax < 0 (bug 6814) */
+ {0, -1, 19, 0, 19, 1, 0 },
+ {17, -5, 19, 17, 19, 1, 0 },
+ {18, -3, 19, 17, 19, 1, 1 },
+ /* test if cpMin > cpMax */
+ {15, 19, 19, 15, 19, 1, 0 },
+ {19, 15, 19, 15, 19, 1, 0 },
+ /* cpMin == strlen() && cpMax > cpMin */
+ {17, 18, 17, 17, 17, 1, 1 },
+ {17, 50, 19, 17, 19, 1, 0 },
+};
+
+static void check_EM_EXSETSEL(HWND hwnd, const struct exsetsel_s *setsel, int id) {
+ CHARRANGE cr;
+ LRESULT result;
+ int start, end;
+
+ cr.cpMin = setsel->min;
+ cr.cpMax = setsel->max;
+ result = SendMessageA(hwnd, EM_EXSETSEL, 0, (LPARAM)&cr);
+
+ todo_wine_if (setsel->result_todo)
+ ok(result == setsel->expected_retval, "EM_EXSETSEL(%d): expected: %ld
actual: %ld\n", id, setsel->expected_retval, result);
+
+ SendMessageA(hwnd, EM_GETSEL, (WPARAM)&start, (LPARAM)&end);
+
+ todo_wine_if (setsel->sel_todo)
+ ok(start == setsel->expected_getsel_start && end ==
setsel->expected_getsel_end,
+ "EM_EXSETSEL(%d): expected (%d,%d) actual:(%d,%d)\n",
+ id, setsel->expected_getsel_start, setsel->expected_getsel_end, start,
end);
+}
+
+static void test_EM_EXSETSEL(void)
+{
+ HWND hwndRichEdit = new_richedit(NULL);
+ int i;
+ const int num_tests = sizeof(exsetsel_tests)/sizeof(struct exsetsel_s);
+
+ /* sending some text to the window */
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"testing selection");
+ /* 01234567890123456 */
+
+ for (i = 0; i < num_tests; i++) {
+ check_EM_EXSETSEL(hwndRichEdit, &exsetsel_tests[i], i);
+ }
+
+ if (!is_lang_japanese)
+ skip("Skip multibyte character tests on non-Japanese platform\n");
+ else
+ {
+ CHARRANGE cr;
+ LRESULT result;
+#define MAX_BUF_LEN 1024
+ char bufA[MAX_BUF_LEN] = {0};
+
+ /* Test with multibyte character */
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0,
(LPARAM)"abcdef\x8e\xf0ghijk");
+ /* 012345 6 7 8901 */
+ cr.cpMin = 4, cr.cpMax = 8;
+ result = SendMessageA(hwndRichEdit, EM_EXSETSEL, 0, (LPARAM)&cr);
+ todo_wine ok(result == 7, "EM_EXSETSEL return %ld expected 7\n",
result);
+ result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, sizeof(bufA), (LPARAM)bufA);
+ todo_wine ok(!strcmp(bufA, "ef\x8e\xf0"), "EM_GETSELTEXT return
incorrect string\n");
+ SendMessageA(hwndRichEdit, EM_EXGETSEL, 0, (LPARAM)&cr);
+ ok(cr.cpMin == 4, "Selection start incorrectly: %d expected 4\n",
cr.cpMin);
+ ok(cr.cpMax == 8, "Selection end incorrectly: %d expected 8\n",
cr.cpMax);
+ }
+
+ DestroyWindow(hwndRichEdit);
+}
+
+static void check_EM_SETSEL(HWND hwnd, const struct exsetsel_s *setsel, int id) {
+ LRESULT result;
+ int start, end;
+
+ result = SendMessageA(hwnd, EM_SETSEL, setsel->min, setsel->max);
+
+ todo_wine_if (setsel->result_todo)
+ ok(result == setsel->expected_retval, "EM_SETSEL(%d): expected: %ld
actual: %ld\n", id, setsel->expected_retval, result);
+
+ SendMessageA(hwnd, EM_GETSEL, (WPARAM)&start, (LPARAM)&end);
+
+ todo_wine_if (setsel->sel_todo)
+ ok(start == setsel->expected_getsel_start && end ==
setsel->expected_getsel_end,
+ "EM_SETSEL(%d): expected (%d,%d) actual:(%d,%d)\n",
+ id, setsel->expected_getsel_start, setsel->expected_getsel_end, start,
end);
+}
+
+static void test_EM_SETSEL(void)
+{
+ char buffA[32] = {0};
+ HWND hwndRichEdit = new_richedit(NULL);
+ int i;
+ const int num_tests = sizeof(exsetsel_tests)/sizeof(struct exsetsel_s);
+
+ /* sending some text to the window */
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)"testing selection");
+ /* 01234567890123456 */
+
+ for (i = 0; i < num_tests; i++) {
+ check_EM_SETSEL(hwndRichEdit, &exsetsel_tests[i], i);
+ }
+
+ SendMessageA(hwndRichEdit, EM_SETSEL, 17, 18);
+ buffA[0] = 123;
+ SendMessageA(hwndRichEdit, EM_GETSELTEXT, 0, (LPARAM)buffA);
+ ok(buffA[0] == 0, "selection text %s\n", buffA);
+
+ if (!is_lang_japanese)
+ skip("Skip multibyte character tests on non-Japanese platform\n");
+ else
+ {
+ int sel_start, sel_end;
+ LRESULT result;
+
+ /* Test with multibyte character */
+ SendMessageA(hwndRichEdit, WM_SETTEXT, 0,
(LPARAM)"abcdef\x8e\xf0ghijk");
+ /* 012345 6 7 8901 */
+ result = SendMessageA(hwndRichEdit, EM_SETSEL, 4, 8);
+ todo_wine ok(result == 7, "EM_SETSEL return %ld expected 7\n",
result);
+ result = SendMessageA(hwndRichEdit, EM_GETSELTEXT, sizeof(buffA),
(LPARAM)buffA);
+ todo_wine ok(!strcmp(buffA, "ef\x8e\xf0"), "EM_GETSELTEXT return
incorrect string\n");
+ result = SendMessageA(hwndRichEdit, EM_GETSEL, (WPARAM)&sel_start,
(LPARAM)&sel_end);
+ ok(sel_start == 4, "Selection start incorrectly: %d expected 4\n",
sel_start);
+ ok(sel_end == 8, "Selection end incorrectly: %d expected 8\n",
sel_end);
+ }
+
+ DestroyWindow(hwndRichEdit);
+}
+
START_TEST( editor )
{
MSG msg;
@@ -1210,6 +1425,7 @@
* RICHED32.DLL, so the linker doesn't actually link to it. */
hmoduleRichEdit = LoadLibraryA("riched32.dll");
ok(hmoduleRichEdit != NULL, "error: %d\n", (int) GetLastError());
+ is_lang_japanese = (PRIMARYLANGID(GetUserDefaultLangID()) == LANG_JAPANESE);
test_WM_SETTEXT();
test_EM_GETTEXTRANGE();
@@ -1225,6 +1441,8 @@
test_EM_GETOPTIONS();
test_autoscroll();
test_enter();
+ test_EM_EXSETSEL();
+ test_EM_SETSEL();
/* Set the environment variable WINETEST_RICHED32 to keep windows
* responsive and open for 30 seconds. This is useful for debugging.